From 27a9b1144b3d9fdd857c5db7513d67a39f78e545 Mon Sep 17 00:00:00 2001 From: zema1 Date: Sun, 3 Dec 2017 15:36:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=81=E6=A6=9C=E5=90=8E=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E5=8F=AF=E4=BB=A5=E9=80=9A=E8=BF=87force=5Fupdate?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E6=9C=80=E6=96=B0rankings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/decorators.py | 4 ++-- contest/models.py | 6 +++--- contest/views/oj.py | 17 ++++++++++------- oj/settings.py | 2 +- utils/api/_serializers.py | 4 ++-- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/account/decorators.py b/account/decorators.py index 4cbb15a1..d9c7cc95 100644 --- a/account/decorators.py +++ b/account/decorators.py @@ -68,8 +68,8 @@ def check_contest_permission(check_type="details"): self = args[0] request = args[1] user = request.user - if kwargs.get("contest_id"): - contest_id = kwargs.pop("contest_id") + if request.data.get("contest_id"): + contest_id = request.data["contest_id"] else: contest_id = request.GET.get("contest_id") if not contest_id: diff --git a/contest/models.py b/contest/models.py index 2f07b37e..24aace4c 100644 --- a/contest/models.py +++ b/contest/models.py @@ -66,9 +66,9 @@ class AbstractContestRank(models.Model): class ACMContestRank(AbstractContestRank): accepted_number = models.IntegerField(default=0) - # total_time is only for ACM contest total_time = ac time + none-ac times * 20 * 60 + # total_time is only for ACM contest, total_time = ac time + none-ac times * 20 * 60 total_time = models.IntegerField(default=0) - # {23: {"is_ac": True, "ac_time": 8999, "error_number": 2, "is_first_ac": True}} + # {"23": {"is_ac": True, "ac_time": 8999, "error_number": 2, "is_first_ac": True}} # key is problem id submission_info = JSONField(default=dict) @@ -78,7 +78,7 @@ class ACMContestRank(AbstractContestRank): class OIContestRank(AbstractContestRank): total_score = models.IntegerField(default=0) - # {23: 333}} + # {"23": 333} # key is problem id, value is current score submission_info = JSONField(default=dict) diff --git a/contest/views/oj.py b/contest/views/oj.py index 560f5679..4f78f826 100644 --- a/contest/views/oj.py +++ b/contest/views/oj.py @@ -101,18 +101,21 @@ class ContestRankAPI(APIView): @check_contest_permission(check_type="ranks") def get(self, request): - user = request.user + force_refresh = request.GET.get("force_refresh") + is_contest_admin = request.user.is_contest_admin(self.contest) if self.contest.rule_type == ContestRuleType.OI: serializer = OIContestRankSerializer else: serializer = ACMContestRankSerializer - cache_key = f"{CacheKey.contest_rank_cache}:{self.contest.id}" - qs = cache.get(cache_key) - if not qs: + if force_refresh == "1" and is_contest_admin: qs = self.get_rank() - cache.set(cache_key, qs) + else: + cache_key = f"{CacheKey.contest_rank_cache}:{self.contest.id}" + qs = cache.get(cache_key) + if not qs: + qs = self.get_rank() + cache.set(cache_key, qs) page_qs = self.paginate_data(request, qs) - page_qs["results"] = serializer(page_qs["results"], many=True, - is_admin_role=user.is_authenticated() and user.is_admin_role()).data + page_qs["results"] = serializer(page_qs["results"], many=True, is_contest_admin=is_contest_admin).data return self.success(page_qs) diff --git a/oj/settings.py b/oj/settings.py index 40335a1e..91683a65 100644 --- a/oj/settings.py +++ b/oj/settings.py @@ -197,7 +197,7 @@ CELERY_ACCEPT_CONTENT = ["json"] CELERY_TASK_SERIALIZER = "json" # 用于限制用户恶意提交大量代码 -TOKEN_BUCKET_DEFAULT_CAPACITY = 20 +TOKEN_BUCKET_DEFAULT_CAPACITY = 10 # 单位:每分钟 TOKEN_BUCKET_FILL_RATE = 2 diff --git a/utils/api/_serializers.py b/utils/api/_serializers.py index b45b987c..745c6960 100644 --- a/utils/api/_serializers.py +++ b/utils/api/_serializers.py @@ -7,8 +7,8 @@ class UsernameSerializer(serializers.Serializer): real_name = serializers.SerializerMethodField() def __init__(self, *args, **kwargs): - self.is_admin_role = kwargs.pop("is_admin_role", False) + self.need_real_name = kwargs.pop("need_real_name", False) super().__init__(*args, **kwargs) def get_real_name(self, obj): - return obj.userprofile.real_name if self.is_admin_role else None + return obj.userprofile.real_name if self.need_real_name else None