Files
OnlineJudge/submission/views/admin.py
2024-06-04 09:15:37 +08:00

78 lines
3.0 KiB
Python

from account.decorators import super_admin_required
from judge.tasks import judge_task
# from judge.dispatcher import JudgeDispatcher
from utils.api import APIView
from ..models import Submission, JudgeStatus
from problem.models import Problem
from django.db.models import Count, Q
class SubmissionRejudgeAPI(APIView):
@super_admin_required
def get(self, request):
id = request.GET.get("id")
if not id:
return self.error("Parameter error, id is required")
try:
submission = Submission.objects.select_related("problem").get(id=id, contest_id__isnull=True)
except Submission.DoesNotExist:
return self.error("Submission does not exists")
submission.statistic_info = {}
submission.save()
judge_task.send(submission.id, submission.problem.id)
return self.success()
class SubmissionStatisticsAPI(APIView):
@super_admin_required
def get(self, request):
start = request.GET.get("start")
end = request.GET.get("end")
if not start or not end:
return self.error("start and end is required")
submissions = Submission.objects.filter(contest_id__isnull=True,
create_time__gte=start,
create_time__lte=end).select_related("problem__created_by")
problem_id = request.GET.get("problem_id")
if problem_id:
try:
problem = Problem.objects.get(_id=problem_id, contest_id__isnull=True, visible=True)
except Problem.DoesNotExist:
return self.error("Problem doesn't exist")
submissions = submissions.filter(problem=problem)
username = request.GET.get("username")
if username:
submissions = submissions.filter(username__icontains=username)
submission_count = submissions.count()
accepted_count = submissions.filter(result=JudgeStatus.ACCEPTED).count()
try:
correct_rate = round(accepted_count/submission_count*100, 2)
except ZeroDivisionError:
correct_rate = 0
counts = submissions.values("username").annotate(submission_count=Count("id", distinct=True),
accepted_count=Count("id", filter=Q(result=JudgeStatus.ACCEPTED), distinct=True),
).order_by("-submission_count")
data = []
for item in counts:
if item["accepted_count"] > 0:
rate = round(item["accepted_count"]/item["submission_count"]*100, 2)
item["correct_rate"] = f"{rate}%"
data.append(item)
return self.success({
"submission_count": submission_count,
"accepted_count": accepted_count,
"correct_rate": f"{correct_rate}%",
"data": data,
})