OnlineJudge/utils/shortcuts.py
2015-10-08 14:03:50 +08:00

106 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# coding=utf-8
import hashlib
import time
import random
from django.shortcuts import render
from django.core.paginator import Paginator
from rest_framework.response import Response
def error_page(request, error_reason):
return render(request, "utils/error.html", {"error": error_reason})
def error_response(error_reason):
return Response(data={"code": 1, "data": error_reason})
def serializer_invalid_response(serializer):
for k, v in serializer.errors.iteritems():
return error_response(k + " : " + v[0])
def success_response(data):
return Response(data={"code": 0, "data": data})
def paginate_data(request, query_set, object_serializer):
"""
用于分页的函数
如果 url 里面不含有paging=true那么将返回全部数据。类似
[
{
"username": "1111111",
"password": "123456"
}
]
如果 url 中有 paging=true 的参数,
然后还需要读取其余的两个参数page=[int]需要的页码p
age_size=[int],一页的数据条数
:param query_set 数据库查询结果
:param object_serializer: 序列化单个object的serializer
"""
need_paginate = request.GET.get("paging", None)
# 如果请求的参数里面没有paging=true的话 就返回全部数据
if need_paginate != "true":
if object_serializer:
return object_serializer(query_set, many=True).data
else:
return query_set
page_size = request.GET.get("page_size", None)
if not page_size:
raise ValueError("Error parameter page_size")
try:
page_size = int(page_size)
except Exception:
raise ValueError("Error parameter page_size")
paginator = Paginator(query_set, page_size)
page = request.GET.get("page", None)
try:
current_page = paginator.page(page)
except Exception:
raise ValueError("Error parameter current_page")
if object_serializer:
results = object_serializer(current_page, many=True).data
else:
results = current_page
data = {"results": results,
"previous_page": None,
"next_page": None,
"page_size": page_size,
"current_page": page,
"count": paginator.count,
"total_page": paginator.num_pages}
try:
data["previous_page"] = current_page.previous_page_number()
except Exception:
pass
try:
data["next_page"] = current_page.next_page_number()
except Exception:
pass
return data
def paginate(request, query_set, object_serializer=None):
try:
data= paginate_data(request, query_set, object_serializer)
except Exception:
return error_response(u"参数错误")
return success_response(data)
def rand_str(length=32):
string = hashlib.md5(str(time.time()) + str(random.randrange(1, 987654321234567))).hexdigest()
return string[0:length]