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 }}