From 67de24a5b321e27b66bba99b634269eba2b50c84 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Sun, 27 Sep 2015 20:41:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=AF=94=E8=B5=9B=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 17 +++++++++++++++-- utils/templatetags/contest.py | 13 +++++++------ 2 files changed, 22 insertions(+), 8 deletions(-) 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"]: