From 444cbc4324a3dcad67aee12436e05c347026de15 Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Sat, 12 Sep 2015 22:00:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=AF=94=E8=B5=9B=E6=8E=92?= =?UTF-8?q?=E5=90=8D=E7=9A=84=E5=B0=81=E6=A6=9C=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?rank=E9=A1=B5=E9=9D=A2=E4=BB=8Eredis=E4=B8=AD=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E6=8E=92=E5=90=8D=E4=BF=A1=E6=81=AF=E8=80=8C=E4=B8=8D=E6=98=AF?= =?UTF-8?q?=E5=90=91mysql=E6=9F=A5=E8=AF=A2=EF=BC=8C=E5=B0=81=E6=A6=9C?= =?UTF-8?q?=E5=90=8Eredis=E4=B8=AD=E7=9A=84=E6=95=B0=E6=8D=AE=E4=BE=BF?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E6=9B=B4=E6=96=B0=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/serializers.py | 4 +- contest/views.py | 46 +++++++++++++------ template/src/oj/contest/contest_rank.html | 7 +++ template/src/oj/contest/submissions_list.html | 3 +- 4 files changed, 42 insertions(+), 18 deletions(-) diff --git a/contest/serializers.py b/contest/serializers.py index 65b2fe7d..8f3bf0bc 100644 --- a/contest/serializers.py +++ b/contest/serializers.py @@ -13,7 +13,7 @@ class CreateContestSerializer(serializers.Serializer): description = serializers.CharField(max_length=5000) mode = serializers.IntegerField() contest_type = serializers.IntegerField() - show_rank = serializers.BooleanField() + real_time_rank = serializers.BooleanField() show_user_submission = serializers.BooleanField() password = serializers.CharField(max_length=30, required=False, default=None) start_time = serializers.DateTimeField() @@ -47,7 +47,7 @@ class EditContestSerializer(serializers.Serializer): description = serializers.CharField(max_length=10000) mode = serializers.IntegerField() contest_type = serializers.IntegerField() - show_rank = serializers.BooleanField() + real_time_rank = serializers.BooleanField() show_user_submission = serializers.BooleanField() password = serializers.CharField(max_length=30, required=False, default=None) start_time = serializers.DateTimeField() diff --git a/contest/views.py b/contest/views.py index ad5ccf76..11d22f0f 100644 --- a/contest/views.py +++ b/contest/views.py @@ -24,6 +24,8 @@ from .serializers import (CreateContestSerializer, ContestSerializer, EditContes CreateContestProblemSerializer, ContestProblemSerializer, EditContestProblemSerializer, ContestPasswordVerifySerializer, EditContestProblemSerializer) +from oj.settings import REDIS_CACHE +import redis class ContestAdminAPIView(APIView): @@ -61,7 +63,7 @@ class ContestAdminAPIView(APIView): try: contest = Contest.objects.create(title=data["title"], description=data["description"], mode=data["mode"], contest_type=data["contest_type"], - show_rank=data["show_rank"], password=data["password"], + real_time_rank=data["real_time_rank"], password=data["password"], show_user_submission=data["show_user_submission"], start_time=dateparse.parse_datetime(data["start_time"]), end_time=dateparse.parse_datetime(data["end_time"]), @@ -115,7 +117,7 @@ class ContestAdminAPIView(APIView): contest.description = data["description"] contest.mode = data["mode"] contest.contest_type = data["contest_type"] - contest.show_rank = data["show_rank"] + contest.real_time_rank = data["real_time_rank"] contest.show_user_submission = data["show_user_submission"] contest.start_time = dateparse.parse_datetime(data["start_time"]) contest.end_time = dateparse.parse_datetime(data["end_time"]) @@ -397,19 +399,33 @@ def _cmp(x, y): 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") - result = ContestSubmission.objects.filter(contest=contest).values("user_id").\ - annotate(total_submit=Sum("total_submission_number")) - for i in range(0, len(result)): - # 这个人所有的提交 - submissions = ContestSubmission.objects.filter(user_id=result[i]["user_id"], contest_id=contest_id) - result[i]["submissions"] = {} - for item in submissions: - result[i]["submissions"][item.problem_id] = item - result[i]["total_ac"] = submissions.filter(ac=True).count() - result[i]["user"] = User.objects.get(id=result[i]["user_id"]) - result[i]["total_time"] = submissions.filter(ac=True).aggregate(total_time=Sum("total_time"))["total_time"] + + r = redis.Redis(host=REDIS_CACHE["host"], port=REDIS_CACHE["port"], db=REDIS_CACHE["db"]) + if contest.real_time_rank: + # 更新rank + result = ContestSubmission.objects.filter(contest=contest).values("user_id"). \ + annotate(total_submit=Sum("total_submission_number")) + for i in range(0, len(result)): + # 这个人所有的提交 + submissions = ContestSubmission.objects.filter(user_id=result[i]["user_id"], contest_id=contest_id) + result[i]["submissions"] = {} + for item in submissions: + result[i]["submissions"][item.problem_id] = item + result[i]["total_ac"] = submissions.filter(ac=True).count() + result[i]["user"] = User.objects.get(id=result[i]["user_id"]) + result[i]["total_time"] = submissions.filter(ac=True).aggregate(total_time=Sum("total_time"))["total_time"] + result = sorted(result, cmp=_cmp, reverse=True) + r.set("contest_rank_" + contest_id, json.dumps(list(result))) + else: + # 从缓存读取排名信息 + result = r.get("contest_rank_" + contest_id) + if result: + result = json.loads(result) + else: + result = [] return render(request, "oj/contest/contest_rank.html", {"contest": contest, "contest_problems": contest_problems, - "result": sorted(result, cmp=_cmp, reverse=True), - "auto_refresh": request.GET.get("auto_refresh", None) == "true"}) + "result": result, + "auto_refresh": request.GET.get("auto_refresh", None) == "true", + "real_time_rank": contest.real_time_rank}) diff --git a/template/src/oj/contest/contest_rank.html b/template/src/oj/contest/contest_rank.html index ac2bb153..72ae0670 100644 --- a/template/src/oj/contest/contest_rank.html +++ b/template/src/oj/contest/contest_rank.html @@ -20,6 +20,13 @@
+

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

{% if result %} diff --git a/template/src/oj/contest/submissions_list.html b/template/src/oj/contest/submissions_list.html index 1424bb10..1deba9cb 100644 --- a/template/src/oj/contest/submissions_list.html +++ b/template/src/oj/contest/submissions_list.html @@ -67,7 +67,8 @@ {% for item in submissions %} - {% ifequal item.user_id request.user.id %} + + {% if item.user_id == request.user.id and request.user.admin_type == 2%} {% else %}
{{ forloop.counter |add:start_id }}