mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2025-11-04 14:49:58 +08:00
add ACM contest admin helper api
This commit is contained in:
parent
27a9b1144b
commit
4c2db34b9d
@ -79,11 +79,11 @@ class ACMContestRankSerializer(serializers.ModelSerializer):
|
|||||||
fields = "__all__"
|
fields = "__all__"
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.is_admin_role = kwargs.pop("is_admin_role", False)
|
self.is_contest_admin = kwargs.pop("is_contest_admin", False)
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
def get_user(self, obj):
|
def get_user(self, obj):
|
||||||
return UsernameSerializer(obj.user, is_admin_role=self.is_admin_role).data
|
return UsernameSerializer(obj.user, need_real_name=self.is_contest_admin).data
|
||||||
|
|
||||||
|
|
||||||
class OIContestRankSerializer(serializers.ModelSerializer):
|
class OIContestRankSerializer(serializers.ModelSerializer):
|
||||||
@ -94,8 +94,15 @@ class OIContestRankSerializer(serializers.ModelSerializer):
|
|||||||
fields = "__all__"
|
fields = "__all__"
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.is_admin_role = kwargs.pop("is_admin_role", False)
|
self.is_contest_admin = kwargs.pop("is_contest_admin", False)
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
def get_user(self, obj):
|
def get_user(self, obj):
|
||||||
return UsernameSerializer(obj.user, is_admin_role=self.is_admin_role).data
|
return UsernameSerializer(obj.user, need_real_name=self.is_contest_admin).data
|
||||||
|
|
||||||
|
|
||||||
|
class ACMContesHelperSerializer(serializers.Serializer):
|
||||||
|
contest_id = serializers.IntegerField()
|
||||||
|
problem_id = serializers.CharField()
|
||||||
|
rank_id = serializers.IntegerField()
|
||||||
|
checked = serializers.BooleanField()
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
from django.conf.urls import url
|
from django.conf.urls import url
|
||||||
|
|
||||||
from ..views.admin import ContestAnnouncementAPI, ContestAPI
|
from ..views.admin import ContestAnnouncementAPI, ContestAPI, ACMContestHelper
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r"^contest/?$", ContestAPI.as_view(), name="contest_admin_api"),
|
url(r"^contest/?$", ContestAPI.as_view(), name="contest_admin_api"),
|
||||||
url(r"^contest/announcement/?$", ContestAnnouncementAPI.as_view(), name="contest_announcement_admin_api")
|
url(r"^contest/announcement/?$", ContestAnnouncementAPI.as_view(), name="contest_announcement_admin_api"),
|
||||||
|
url(r"^contest/acm_helper/?$", ACMContestHelper.as_view(), name="acm_contest_helper"),
|
||||||
]
|
]
|
||||||
|
|||||||
@ -2,13 +2,15 @@ from ipaddress import ip_network
|
|||||||
import dateutil.parser
|
import dateutil.parser
|
||||||
|
|
||||||
from utils.api import APIView, validate_serializer
|
from utils.api import APIView, validate_serializer
|
||||||
|
from utils.cache import cache
|
||||||
|
from utils.constants import CacheKey
|
||||||
|
|
||||||
from ..models import Contest, ContestAnnouncement
|
from account.decorators import check_contest_permission
|
||||||
|
from ..models import Contest, ContestAnnouncement, ACMContestRank
|
||||||
from ..serializers import (ContestAnnouncementSerializer, ContestAdminSerializer,
|
from ..serializers import (ContestAnnouncementSerializer, ContestAdminSerializer,
|
||||||
CreateConetestSeriaizer,
|
CreateConetestSeriaizer, CreateContestAnnouncementSerializer,
|
||||||
CreateContestAnnouncementSerializer,
|
EditConetestSeriaizer, EditContestAnnouncementSerializer,
|
||||||
EditConetestSeriaizer,
|
ACMContesHelperSerializer)
|
||||||
EditContestAnnouncementSerializer)
|
|
||||||
|
|
||||||
|
|
||||||
class ContestAPI(APIView):
|
class ContestAPI(APIView):
|
||||||
@ -50,6 +52,9 @@ class ContestAPI(APIView):
|
|||||||
ip_network(ip_range, strict=False)
|
ip_network(ip_range, strict=False)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
return self.error(f"{ip_range} is not a valid cidr network")
|
return self.error(f"{ip_range} is not a valid cidr network")
|
||||||
|
if not contest.real_time_rank and data.get("real_time_rank"):
|
||||||
|
cache_key = f"{CacheKey.contest_rank_cache}:{contest.id}"
|
||||||
|
cache.delete(cache_key)
|
||||||
|
|
||||||
for k, v in data.items():
|
for k, v in data.items():
|
||||||
setattr(contest, k, v)
|
setattr(contest, k, v)
|
||||||
@ -150,3 +155,41 @@ class ContestAnnouncementAPI(APIView):
|
|||||||
if keyword:
|
if keyword:
|
||||||
contest_announcements = contest_announcements.filter(title__contains=keyword)
|
contest_announcements = contest_announcements.filter(title__contains=keyword)
|
||||||
return self.success(ContestAnnouncementSerializer(contest_announcements, many=True).data)
|
return self.success(ContestAnnouncementSerializer(contest_announcements, many=True).data)
|
||||||
|
|
||||||
|
|
||||||
|
class ACMContestHelper(APIView):
|
||||||
|
@check_contest_permission(check_type="ranks")
|
||||||
|
def get(self, request):
|
||||||
|
ranks = ACMContestRank.objects.filter(contest=self.contest, accepted_number__gt=0) \
|
||||||
|
.values("id", "user__username", "user__userprofile__real_name", "submission_info")
|
||||||
|
results = []
|
||||||
|
for rank in ranks:
|
||||||
|
for problem_id, info in rank["submission_info"].items():
|
||||||
|
if info["is_ac"]:
|
||||||
|
results.append({
|
||||||
|
"id": rank["id"],
|
||||||
|
"username": rank["user__username"],
|
||||||
|
"real_name": rank["user__userprofile__real_name"],
|
||||||
|
"problem_id": problem_id,
|
||||||
|
"ac_info": info,
|
||||||
|
"checked": info.get("checked", False)
|
||||||
|
})
|
||||||
|
results.sort(key=lambda x: -x["ac_info"]["ac_time"])
|
||||||
|
return self.success(results)
|
||||||
|
|
||||||
|
@validate_serializer(ACMContesHelperSerializer)
|
||||||
|
@check_contest_permission(check_type="ranks")
|
||||||
|
def put(self, request):
|
||||||
|
data = request.data
|
||||||
|
if not request.user.is_contest_admin(self.contest):
|
||||||
|
return self.error("You are not contest admin")
|
||||||
|
try:
|
||||||
|
rank = ACMContestRank.objects.get(pk=data["rank_id"])
|
||||||
|
except ACMContestRank.DoesNotExist:
|
||||||
|
return self.error("Rank id does not exist")
|
||||||
|
problem_rank_status = rank.submission_info.get(data["problem_id"])
|
||||||
|
if not problem_rank_status:
|
||||||
|
return self.error("Problem id does not exist")
|
||||||
|
problem_rank_status["checked"] = data["checked"]
|
||||||
|
rank.save(update_fields=("submission_info",))
|
||||||
|
return self.success()
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import xmlrpclib
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
try:
|
try:
|
||||||
server = xmlrpclib.Server('http://localhost:9005/RPC2')
|
server = xmlrpclib.Server("http://localhost:9005/RPC2")
|
||||||
info = server.supervisor.getAllProcessInfo()
|
info = server.supervisor.getAllProcessInfo()
|
||||||
error_states = list(filter(lambda x: x["state"] != 20, info))
|
error_states = list(filter(lambda x: x["state"] != 20, info))
|
||||||
exit(len(error_states))
|
exit(len(error_states))
|
||||||
|
|||||||
@ -7,7 +7,7 @@ DATABASES = {
|
|||||||
'default': {
|
'default': {
|
||||||
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||||
'HOST': '127.0.0.1',
|
'HOST': '127.0.0.1',
|
||||||
'PORT': 5433,
|
'PORT': 5432,
|
||||||
'NAME': "onlinejudge",
|
'NAME': "onlinejudge",
|
||||||
'USER': "onlinejudge",
|
'USER': "onlinejudge",
|
||||||
'PASSWORD': 'onlinejudge'
|
'PASSWORD': 'onlinejudge'
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user