From 18e661ad68e23537a8fb1d2e603be39f92a4b198 Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Tue, 15 Sep 2015 20:28:58 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=B8=BAUser=20=20=20problems=5Fstatus=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=BB=98=E8=AE=A4=E5=80=BC=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E7=B2=BE=E7=AE=80=E4=BA=86=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/migrations/0003_auto_20150915_2025.py | 19 +++++++++++++++++++ account/models.py | 3 +-- mq/scripts/info.py | 5 +---- problem/views.py | 2 +- submission/views.py | 5 +---- 5 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 account/migrations/0003_auto_20150915_2025.py diff --git a/account/migrations/0003_auto_20150915_2025.py b/account/migrations/0003_auto_20150915_2025.py new file mode 100644 index 00000000..ff6b0ea1 --- /dev/null +++ b/account/migrations/0003_auto_20150915_2025.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0002_user_problems_status'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='problems_status', + field=models.TextField(default=b'{}'), + ), + ] diff --git a/account/models.py b/account/models.py index 754e178d..32453336 100644 --- a/account/models.py +++ b/account/models.py @@ -31,8 +31,7 @@ class User(AbstractBaseUser): # 0代表不是管理员 1是普通管理员 2是超级管理员 admin_type = models.IntegerField(default=0) # JSON字典用来表示该用户的问题的解决状态 1为ac,2为正在进行 - problems_status = models.TextField(blank=True) - + problems_status = models.TextField(default="{}") USERNAME_FIELD = 'username' REQUIRED_FIELDS = [] diff --git a/mq/scripts/info.py b/mq/scripts/info.py index 41a21273..9df03344 100644 --- a/mq/scripts/info.py +++ b/mq/scripts/info.py @@ -43,10 +43,7 @@ class MessageQueue(object): except User.DoesNotExist: logger.warning("Submission user does not exist, submission_id: " + submission_id) continue - if user.problems_status: - problems_status = json.loads(user.problems_status) - else: - problems_status = {} + problems_status = json.loads(user.problems_status) problems_status[str(problem.id)] = 1 user.problems_status = json.dumps(problems_status) user.save() diff --git a/problem/views.py b/problem/views.py index 84ca58d8..3b736c9f 100644 --- a/problem/views.py +++ b/problem/views.py @@ -282,7 +282,7 @@ def problem_list_page(request, page=1): except Exception: pass - if request.user.is_authenticated() and request.user.problems_status: + if request.user.is_authenticated(): problems_status = json.loads(request.user.problems_status) else: problems_status = {} diff --git a/submission/views.py b/submission/views.py index baa81d4d..aad15606 100644 --- a/submission/views.py +++ b/submission/views.py @@ -47,10 +47,7 @@ class SubmissionAPIView(APIView): except Exception: return error_response(u"提交判题任务失败") # 修改用户解题状态 - if request.user.problems_status: - problems_status = json.loads(request.user.problems_status) - else: - problems_status = {} + problems_status = json.loads(request.user.problems_status) problems_status[str(data["problem_id"])] = 2 request.user.problems_status = json.dumps(problems_status) request.user.save() From 83c356f0dbd4b5f6933cecd3bf29b1a546664d1f Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Wed, 16 Sep 2015 09:18:41 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contest/views.py b/contest/views.py index 31a6c36c..97cca2cf 100644 --- a/contest/views.py +++ b/contest/views.py @@ -391,7 +391,7 @@ def _cmp(x, y): return -1 -def get_the_time_format(seconds): +def get_the_formatted_time(seconds): if not seconds: return "" result = str(seconds % 60) @@ -427,14 +427,14 @@ def contest_rank_page(request, contest_id): "first_achieved": status.first_achieved, "ac": status.ac, "failed_number": status.total_submission_number, - "ac_time": get_the_time_format(status.ac_time)}) + "ac_time": get_the_formatted_time(status.ac_time)}) if status.ac: result[i]["problems"][-1]["failed_number"] -= 1 except ContestSubmission.DoesNotExist: result[i]["problems"].append({}) result[i]["total_ac"] = submissions.filter(ac=True).count() result[i]["username"] = User.objects.get(id=result[i]["user_id"]).username - result[i]["total_time"] = get_the_time_format(submissions.filter(ac=True).aggregate(total_time=Sum("total_time"))["total_time"]) + result[i]["total_time"] = get_the_formatted_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: From 7f42ad70094fd17dd9ea167d89e714e20325928e Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Wed, 16 Sep 2015 09:19:13 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=AF=94=E8=B5=9B?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=A1=B5=E9=9D=A2=E5=B0=81=E6=A6=9C=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest_submission/views.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/contest_submission/views.py b/contest_submission/views.py index 2358b076..40b3c207 100644 --- a/contest_submission/views.py +++ b/contest_submission/views.py @@ -20,6 +20,8 @@ from utils.shortcuts import serializer_invalid_response, error_response, success from submission.models import Submission from .serializers import CreateContestSubmissionSerializer from submission.serializers import SubmissionSerializer +from oj.settings import REDIS_CACHE +import redis class ContestSubmissionAPIView(APIView): @@ -85,8 +87,25 @@ def contest_problem_submissions_list_page(request, contest_id, page=1): except Contest.DoesNotExist: return error_page(request, u"比赛不存在") # 以下是本场比赛中所有的提交 - submissions = Submission.objects.filter(contest_id=contest_id). \ - values("id", "contest_id", "problem_id", "result", "create_time", "accepted_answer_time", "language", "user_id").order_by("-create_time") + r = redis.Redis(host=REDIS_CACHE["host"], port=REDIS_CACHE["port"], db=REDIS_CACHE["db"]) + if contest.real_time_rank: + # 更新submissions缓存 + submissions = Submission.objects.filter(contest_id=contest_id). \ + values("id", "contest_id", "problem_id", "result", "create_time", "accepted_answer_time", "language", + "user_id").order_by("-create_time") + r.set("contest_submissions_" + contest_id, json.dumps(list(submissions))) + else: + # 已封榜 + submissions = r.get("contest_submissions_" + contest_id) + if submissions: + submissions = json.loads(submissions) + else: + submissions = [] + # 除了缓存里的还要加上封榜以后自己的提交 + submissions += Submission.objects.filter(contest_id=contest_id, user_id=request.user, cerate_time__gte=time). \ + values("id", "contest_id", "problem_id", "result", "create_time", "accepted_answer_time", "language", + "user_id").order_by("-create_time") + language = request.GET.get("language", None) filter = None if language: @@ -131,7 +150,7 @@ def contest_problem_submissions_list_page(request, contest_id, page=1): return render(request, "oj/contest/submissions_list.html", {"submissions": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, "start_id": int(page) * 20 - 20, - "contest": contest, "filter":filter}) + "contest": contest, "filter": filter}) class ContestSubmissionAdminAPIView(APIView): From 03ef1e49f3faafbf6706caaec18b0f5d36821883 Mon Sep 17 00:00:00 2001 From: "sxw@401" Date: Wed, 16 Sep 2015 11:30:45 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E6=AF=94?= =?UTF-8?q?=E8=B5=9B=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E9=87=8C=E5=B0=81?= =?UTF-8?q?=E6=A6=9C=E7=9A=84=E8=A1=8C=E4=B8=BA=EF=BC=8C=E5=B0=81=E6=A6=9C?= =?UTF-8?q?=E4=BB=A5=E5=90=8E=E5=8F=AA=E6=98=BE=E7=A4=BA=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E9=87=8C=E7=9A=84=E6=8F=90=E4=BA=A4=E6=95=B0=E6=8D=AE=E5=92=8C?= =?UTF-8?q?=E5=B0=81=E6=A6=9C=E5=90=8E=E8=87=AA=E5=B7=B1=E7=9A=84=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=EF=BC=8C=E5=B0=81=E6=A6=9C=E4=BB=A5=E5=90=8Erank?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E5=88=B7=E6=96=B0=EF=BC=88rank=E9=87=8C?= =?UTF-8?q?=E8=BF=98=E4=B8=8D=E4=BC=9A=E6=98=BE=E7=A4=BA=E8=87=AA=E5=B7=B1?= =?UTF-8?q?=E5=B0=81=E6=A6=9C=E4=BB=A5=E5=90=8E=E7=9A=84=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E3=80=82=E3=80=82=E3=80=82=E8=BF=99=E5=A5=BD=E5=83=8F=E4=B8=8D?= =?UTF-8?q?=E5=AF=B9=E5=91=80=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contest_submission/views.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/contest_submission/views.py b/contest_submission/views.py index 40b3c207..aaa6c6e6 100644 --- a/contest_submission/views.py +++ b/contest_submission/views.py @@ -1,9 +1,11 @@ # coding=utf-8 import json +from datetime import datetime import redis +import pytz from django.shortcuts import render from django.core.paginator import Paginator - +from django.utils import timezone from rest_framework.views import APIView from judge.judger_controller.tasks import judge @@ -21,7 +23,6 @@ from submission.models import Submission from .serializers import CreateContestSubmissionSerializer from submission.serializers import SubmissionSerializer from oj.settings import REDIS_CACHE -import redis class ContestSubmissionAPIView(APIView): @@ -77,6 +78,20 @@ def contest_problem_my_submissions_list_page(request, contest_id, contest_proble {"submissions": submissions, "problem": contest_problem}) +def get_formatted_datetime(date_time): + date_time = timezone.localtime(date_time) + result = str(date_time.minute) + if date_time.minute < 10: + result = "0" + result + result = str(date_time.hour) + ":" + result + if date_time.hour < 10: + result = "0" + result + result = str(date_time.day) + u"日 " + result + result = str(date_time.month) + u"月" + result + result = str(date_time.year) + u"年" + result + return result + + @login_required def contest_problem_submissions_list_page(request, contest_id, page=1): """ @@ -93,18 +108,26 @@ def contest_problem_submissions_list_page(request, contest_id, page=1): submissions = Submission.objects.filter(contest_id=contest_id). \ values("id", "contest_id", "problem_id", "result", "create_time", "accepted_answer_time", "language", "user_id").order_by("-create_time") + # 把datetime类型转换为string + for submission in submissions: + submission["create_time"] = get_formatted_datetime(submission["create_time"]) r.set("contest_submissions_" + contest_id, json.dumps(list(submissions))) else: # 已封榜 submissions = r.get("contest_submissions_" + contest_id) if submissions: submissions = json.loads(submissions) + time = datetime.strptime(submissions[0]["create_time"].encode("utf8"), + '%Y\xe5\xb9\xb4%m\xe6\x9c\x88%d\xe6\x97\xa5 %H:%M') + time = time.replace(tzinfo=pytz.timezone('Asia/Shanghai')) else: submissions = [] + time = contest.start_time # 除了缓存里的还要加上封榜以后自己的提交 - submissions += Submission.objects.filter(contest_id=contest_id, user_id=request.user, cerate_time__gte=time). \ + self_submissions = Submission.objects.filter(contest_id=int(contest_id), user_id=request.user.id, create_time__gte=time). \ values("id", "contest_id", "problem_id", "result", "create_time", "accepted_answer_time", "language", "user_id").order_by("-create_time") + submissions = list(self_submissions) + submissions language = request.GET.get("language", None) filter = None