mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2025-11-04 14:49:58 +08:00
封榜后管理员可以通过force_update查看最新rankings
This commit is contained in:
parent
0281555b39
commit
27a9b1144b
@ -68,8 +68,8 @@ def check_contest_permission(check_type="details"):
|
|||||||
self = args[0]
|
self = args[0]
|
||||||
request = args[1]
|
request = args[1]
|
||||||
user = request.user
|
user = request.user
|
||||||
if kwargs.get("contest_id"):
|
if request.data.get("contest_id"):
|
||||||
contest_id = kwargs.pop("contest_id")
|
contest_id = request.data["contest_id"]
|
||||||
else:
|
else:
|
||||||
contest_id = request.GET.get("contest_id")
|
contest_id = request.GET.get("contest_id")
|
||||||
if not contest_id:
|
if not contest_id:
|
||||||
|
|||||||
@ -66,9 +66,9 @@ class AbstractContestRank(models.Model):
|
|||||||
|
|
||||||
class ACMContestRank(AbstractContestRank):
|
class ACMContestRank(AbstractContestRank):
|
||||||
accepted_number = models.IntegerField(default=0)
|
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)
|
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
|
# key is problem id
|
||||||
submission_info = JSONField(default=dict)
|
submission_info = JSONField(default=dict)
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ class ACMContestRank(AbstractContestRank):
|
|||||||
|
|
||||||
class OIContestRank(AbstractContestRank):
|
class OIContestRank(AbstractContestRank):
|
||||||
total_score = models.IntegerField(default=0)
|
total_score = models.IntegerField(default=0)
|
||||||
# {23: 333}}
|
# {"23": 333}
|
||||||
# key is problem id, value is current score
|
# key is problem id, value is current score
|
||||||
submission_info = JSONField(default=dict)
|
submission_info = JSONField(default=dict)
|
||||||
|
|
||||||
|
|||||||
@ -101,18 +101,21 @@ class ContestRankAPI(APIView):
|
|||||||
|
|
||||||
@check_contest_permission(check_type="ranks")
|
@check_contest_permission(check_type="ranks")
|
||||||
def get(self, request):
|
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:
|
if self.contest.rule_type == ContestRuleType.OI:
|
||||||
serializer = OIContestRankSerializer
|
serializer = OIContestRankSerializer
|
||||||
else:
|
else:
|
||||||
serializer = ACMContestRankSerializer
|
serializer = ACMContestRankSerializer
|
||||||
|
|
||||||
cache_key = f"{CacheKey.contest_rank_cache}:{self.contest.id}"
|
if force_refresh == "1" and is_contest_admin:
|
||||||
qs = cache.get(cache_key)
|
|
||||||
if not qs:
|
|
||||||
qs = self.get_rank()
|
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 = self.paginate_data(request, qs)
|
||||||
page_qs["results"] = serializer(page_qs["results"], many=True,
|
page_qs["results"] = serializer(page_qs["results"], many=True, is_contest_admin=is_contest_admin).data
|
||||||
is_admin_role=user.is_authenticated() and user.is_admin_role()).data
|
|
||||||
return self.success(page_qs)
|
return self.success(page_qs)
|
||||||
|
|||||||
@ -197,7 +197,7 @@ CELERY_ACCEPT_CONTENT = ["json"]
|
|||||||
CELERY_TASK_SERIALIZER = "json"
|
CELERY_TASK_SERIALIZER = "json"
|
||||||
|
|
||||||
# 用于限制用户恶意提交大量代码
|
# 用于限制用户恶意提交大量代码
|
||||||
TOKEN_BUCKET_DEFAULT_CAPACITY = 20
|
TOKEN_BUCKET_DEFAULT_CAPACITY = 10
|
||||||
|
|
||||||
# 单位:每分钟
|
# 单位:每分钟
|
||||||
TOKEN_BUCKET_FILL_RATE = 2
|
TOKEN_BUCKET_FILL_RATE = 2
|
||||||
|
|||||||
@ -7,8 +7,8 @@ class UsernameSerializer(serializers.Serializer):
|
|||||||
real_name = serializers.SerializerMethodField()
|
real_name = serializers.SerializerMethodField()
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
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)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
def get_real_name(self, obj):
|
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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user