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)