OnlineJudge/utils/shortcuts.py

106 lines
2.9 KiB
Python
Raw Normal View History

# 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):
2015-10-13 01:04:41 +00:00
string = hashlib.md5(str(time.time()) + str(random.randrange(1, 987654321234567)) + str(random.randrange(1, 987654321234567))).hexdigest()
return string[0:length]