增加比赛结果缓存

This commit is contained in:
virusdefender 2015-09-27 20:41:56 +08:00
parent 634bc82024
commit 67de24a5b3
2 changed files with 22 additions and 8 deletions

View File

@ -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,

View File

@ -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"]: