封榜后管理员可以通过force_update查看最新rankings

This commit is contained in:
zema1
2017-12-03 15:36:31 +08:00
parent 0281555b39
commit 27a9b1144b
5 changed files with 18 additions and 15 deletions

View File

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

View File

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