diff --git a/contest/views.py b/contest/views.py
index 162b9b8a..de03d5da 100644
--- a/contest/views.py
+++ b/contest/views.py
@@ -14,7 +14,7 @@ from django.conf import settings
from rest_framework.views import APIView
from utils.shortcuts import (serializer_invalid_response, error_response,
- success_response, paginate, error_page)
+ success_response, paginate, error_page, paginate_data)
from account.models import SUPER_ADMIN, User
from account.decorators import login_required
from group.models import Group
@@ -398,9 +398,26 @@ def contest_rank_page(request, contest_id):
r.set(cache_key, json.dumps([dict(item) for item in rank]))
else:
rank = json.loads(rank)
+
+ try:
+ paging_rank = paginate_data(request, rank, None)
+ if request.GET.get("paging", None):
+ rank = paging_rank["results"]
+ else:
+ rank = paging_rank
+ except Exception as e:
+ return error_page(request, e.message)
+
+ if request.GET.get("paging", None):
+ paging_info = paging_rank
+ paging_info["offset"] = paging_rank["page_size"] * (int(paging_rank["current_page"]) - 1)
+ else:
+ paging_info = {"previous_page": None, "next_page": None, "count": 0, "total_page": 0, "offset": 0}
+
return render(request, "oj/contest/contest_rank.html",
{"rank": rank, "contest": contest,
"contest_problems": contest_problems,
+ "paging_info": paging_info,
"auto_refresh": request.GET.get("auto_refresh", None) == "true",
"show_real_name": request.GET.get("show_real_name", None) == "true",})
diff --git a/template/src/oj/contest/contest_index.html b/template/src/oj/contest/contest_index.html
index 786a21ea..c9d35329 100644
--- a/template/src/oj/contest/contest_index.html
+++ b/template/src/oj/contest/contest_index.html
@@ -15,7 +15,7 @@
提交
- 排名
+ 排名
{% include "oj/contest/_contest_header.html" %}
diff --git a/template/src/oj/contest/contest_problems_list.html b/template/src/oj/contest/contest_problems_list.html
index c0cb58a1..cc918c1b 100644
--- a/template/src/oj/contest/contest_problems_list.html
+++ b/template/src/oj/contest/contest_problems_list.html
@@ -21,7 +21,7 @@
提交
- 排名
+ 排名
diff --git a/template/src/oj/contest/contest_rank.html b/template/src/oj/contest/contest_rank.html
index 1d7b6d4d..09f77c1f 100644
--- a/template/src/oj/contest/contest_rank.html
+++ b/template/src/oj/contest/contest_rank.html
@@ -17,7 +17,7 @@
提交
- 排名
+ 排名
@@ -48,7 +48,7 @@
{% for item in rank %}
- | {{ forloop.counter }} |
+ {{ forloop.counter|add:paging_info.offset}} |
{{ item.user__username }}
@@ -69,8 +69,25 @@
|
+ onchange="if(this.checked){location.href=location.href + '&auto_refresh=true'}else{location.href=location.href=location.href.replace('&auto_refresh=true', '')}">
自动刷新
+
{% else %}
还没有结果
{% endif %}
diff --git a/template/src/oj/contest/no_contest_permission.html b/template/src/oj/contest/no_contest_permission.html
index f99d60ce..29a09448 100644
--- a/template/src/oj/contest/no_contest_permission.html
+++ b/template/src/oj/contest/no_contest_permission.html
@@ -16,7 +16,7 @@
提交
- 排名
+ 排名
{% endif %}
diff --git a/template/src/oj/contest/submissions_list.html b/template/src/oj/contest/submissions_list.html
index c5c37b59..04b2f195 100644
--- a/template/src/oj/contest/submissions_list.html
+++ b/template/src/oj/contest/submissions_list.html
@@ -19,7 +19,7 @@
提交
- 排名
+ 排名
diff --git a/utils/shortcuts.py b/utils/shortcuts.py
index af1d82f0..f650e521 100644
--- a/utils/shortcuts.py
+++ b/utils/shortcuts.py
@@ -26,7 +26,7 @@ def success_response(data):
return Response(data={"code": 0, "data": data})
-def paginate(request, query_set, object_serializer):
+def paginate_data(request, query_set, object_serializer):
"""
用于分页的函数
如果 url 里面不含有paging=true,那么将返回全部数据。类似
@@ -39,38 +39,26 @@ def paginate(request, query_set, object_serializer):
如果 url 中有 paging=true 的参数,
然后还需要读取其余的两个参数,page=[int],需要的页码,p
age_size=[int],一页的数据条数
- 参数错误的时候,返回{"code": 1, "data": u"参数错误"}
- 返回的数据格式
- {
- "code": 0,
- "data": {
- "previous_page": null,
- "results": [
- {
- "username": "1111111",
- "password": "123456"
- }
- ],
- "next_page": 2
- }
- }
+
:param query_set 数据库查询结果
:param object_serializer: 序列化单个object的serializer
- :return response
"""
need_paginate = request.GET.get("paging", None)
# 如果请求的参数里面没有paging=true的话 就返回全部数据
if need_paginate != "true":
- return success_response(data=object_serializer(query_set, many=True).data)
+ 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:
- return error_response(u"参数错误")
+ raise ValueError("Error parameter page_size")
try:
page_size = int(page_size)
except Exception:
- return error_response(u"参数错误")
+ raise ValueError("Error parameter page_size")
paginator = Paginator(query_set, page_size)
page = request.GET.get("page", None)
@@ -78,11 +66,17 @@ def paginate(request, query_set, object_serializer):
try:
current_page = paginator.page(page)
except Exception:
- return error_response(u"参数错误")
+ raise ValueError("Error parameter current_page")
+ if object_serializer:
+ results = object_serializer(current_page, many=True).data
+ else:
+ results = current_page
- data = {"results": object_serializer(current_page, many=True).data,
+ data = {"results": results,
"previous_page": None,
"next_page": None,
+ "page_size": page_size,
+ "current_page": page,
"count": paginator.count,
"total_page": paginator.num_pages}
@@ -96,6 +90,14 @@ def paginate(request, query_set, object_serializer):
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)