diff --git a/contest/views.py b/contest/views.py index f7b080b..162b9b8 100644 --- a/contest/views.py +++ b/contest/views.py @@ -1,6 +1,7 @@ # coding=utf-8 import json import datetime +import redis from django.shortcuts import render from django.db import IntegrityError @@ -8,6 +9,7 @@ from django.utils import dateparse from django.db.models import Q, Sum from django.core.paginator import Paginator from django.utils.timezone import now +from django.conf import settings from rest_framework.views import APIView @@ -383,8 +385,19 @@ def contest_list_page(request, page=1): @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).order_by("sort_index")[:20] - rank = ContestRank.objects.filter(contest_id=contest_id).select_related("user").order_by("-total_ac_number", "total_time") + contest_problems = ContestProblem.objects.filter(contest=contest).order_by("sort_index") + r = redis.Redis(host=settings.REDIS_CACHE["host"], port=settings.REDIS_CACHE["port"], db=settings.REDIS_CACHE["db"]) + 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])) + else: + rank = json.loads(rank) return render(request, "oj/contest/contest_rank.html", {"rank": rank, "contest": contest, "contest_problems": contest_problems, diff --git a/utils/templatetags/contest.py b/utils/templatetags/contest.py index 2667922..cc02908 100644 --- a/utils/templatetags/contest.py +++ b/utils/templatetags/contest.py @@ -1,6 +1,5 @@ # coding=utf-8 -import datetime -from django.utils.timezone import now +import json def get_contest_status(contest): @@ -34,10 +33,11 @@ def get_the_formatted_time(seconds): def get_submission_class(rank, problem): - if str(problem.id) not in rank.submission_info: + submission_info = json.loads(rank["submission_info"]) + if str(problem.id) not in submission_info: return "" else: - submission = rank.submission_info[str(problem.id)] + submission = submission_info[str(problem.id)] if submission["is_ac"]: _class = "alert-success" if submission["is_first_ac"]: @@ -48,10 +48,11 @@ def get_submission_class(rank, problem): def get_submission_content(rank, problem): - if str(problem.id) not in rank.submission_info: + submission_info = json.loads(rank["submission_info"]) + if str(problem.id) not in submission_info: return "" else: - submission = rank.submission_info[str(problem.id)] + submission = submission_info[str(problem.id)] if submission["is_ac"]: r = get_the_formatted_time(submission["ac_time"]) if submission["error_number"]: