diff --git a/contest/views.py b/contest/views.py index db144f4..53075b0 100644 --- a/contest/views.py +++ b/contest/views.py @@ -434,30 +434,41 @@ def contest_list_page(request, page=1): "keyword": keyword, "join": join}) +def _get_rank(contest_id): + rank = ContestRank.objects.filter(contest_id=contest_id). \ + select_related("user"). \ + order_by("-total_ac_number", "total_time"). \ + values("id", "user__id", "user__username", "user__real_name", "user__userprofile__student_id", + "contest_id", "submission_info", "total_submission_number", "total_ac_number", "total_time") + return rank + + @check_user_contest_permission def contest_rank_page(request, contest_id): contest = Contest.objects.get(id=contest_id) contest_problems = ContestProblem.objects.filter(contest=contest, visible=True).order_by("sort_index") - r = get_cache_redis() - cache_key = str(contest_id) + "_rank_cache" - rank = r.get(cache_key) - - if not rank: - rank = ContestRank.objects.filter(contest_id=contest_id). \ - select_related("user"). \ - order_by("-total_ac_number", "total_time"). \ - values("id", "user__id", "user__username", "user__real_name", "contest_id", "submission_info", - "total_submission_number", "total_ac_number", "total_time") - r.set(cache_key, json.dumps([dict(item) for item in rank])) + force_real_time_rank = False + if request.GET.get("force_real_time_rank") == "true" and (request.user.admin_type == SUPER_ADMIN or request.user == contest.created_by): + rank = _get_rank(contest_id) + force_real_time_rank = True else: - rank = json.loads(rank) + r = get_cache_redis() + cache_key = str(contest_id) + "_rank_cache" + rank = r.get(cache_key) + + if not rank: + rank = _get_rank(contest_id) + r.set(cache_key, json.dumps([dict(item) for item in rank])) + else: + rank = json.loads(rank) return render(request, "oj/contest/contest_rank.html", {"rank": rank, "contest": contest, "contest_problems": contest_problems, "auto_refresh": request.GET.get("auto_refresh", None) == "true", - "show_real_name": request.GET.get("show_real_name", None) == "true", }) + "show_real_name": request.GET.get("show_real_name", None) == "true", + "force_real_time_rank": force_real_time_rank}) class ContestTimeAPIView(APIView): diff --git a/template/src/oj/contest/contest_rank.html b/template/src/oj/contest/contest_rank.html index aae0c23..b701a49 100644 --- a/template/src/oj/contest/contest_rank.html +++ b/template/src/oj/contest/contest_rank.html @@ -23,13 +23,12 @@
-

排名( - {% if contest.real_time_rank %} - 实时 - {% else %} - 已封榜 - {% endif %}) +

排名({% if contest.real_time_rank %}实时{% else %}已封榜{% endif %})

+ {% if force_real_time_rank %} + + {% endif %} {% if rank %}