diff --git a/problem/urls/oj.py b/problem/urls/oj.py index a4647c7..3f4ab83 100644 --- a/problem/urls/oj.py +++ b/problem/urls/oj.py @@ -1,10 +1,17 @@ from django.urls import path -from ..views.oj import ProblemTagAPI, ProblemAPI, ContestProblemAPI, PickOneAPI +from ..views.oj import ( + ProblemSolvedPeopleCount, + ProblemTagAPI, + ProblemAPI, + ContestProblemAPI, + PickOneAPI, +) urlpatterns = [ path("problem/tags", ProblemTagAPI.as_view()), path("problem", ProblemAPI.as_view()), + path("problem/beat_count", ProblemSolvedPeopleCount.as_view()), path("pickone", PickOneAPI.as_view()), path("contest/problem", ContestProblemAPI.as_view()), ] diff --git a/problem/views/oj.py b/problem/views/oj.py index 72db7e2..ffe18cc 100644 --- a/problem/views/oj.py +++ b/problem/views/oj.py @@ -1,5 +1,7 @@ import random from django.db.models import Q, Count +from account.models import User +from submission.models import Submission, JudgeStatus from utils.api import APIView from account.decorators import check_contest_permission from ..models import ProblemTag, Problem, ProblemRuleType @@ -147,3 +149,27 @@ class ContestProblemAPI(APIView): else: data = ProblemSafeSerializer(contest_problems, many=True).data return self.success(data) + + +class ProblemSolvedPeopleCount(APIView): + def get(self, request): + problem_id = request.GET.get("problem_id") + if not request.user.is_authenticated: + return self.success("0%") + submission_count = Submission.objects.filter( + user_id=request.user.id, + problem_id=problem_id, + result=JudgeStatus.ACCEPTED, + ).count() + if submission_count == 0: + return self.success("0%") + + total_count = User.objects.filter(is_disabled=False).count() + accepted_count = Submission.objects.filter( + problem_id=problem_id, result=JudgeStatus.ACCEPTED + ).aggregate(user_count=Count("user_id", distinct=True))["user_count"] + if accepted_count < total_count: + rate = "%.2f" % ((total_count - accepted_count) / total_count * 100) + else: + rate = "0" + return self.success(f"{rate}%") diff --git a/submission/views/admin.py b/submission/views/admin.py index 92fc202..cee12e6 100644 --- a/submission/views/admin.py +++ b/submission/views/admin.py @@ -50,13 +50,13 @@ class SubmissionStatisticsAPI(APIView): # 统计人数 person_count = 0 - all_persions = [] + all_persons = [] if username: submissions = submissions.filter(username__icontains=username) - all_persions = User.objects.filter(username__icontains=username, + all_persons = User.objects.filter(username__icontains=username, is_disabled=False, admin_type=AdminType.REGULAR_USER).values_list("username", flat=True) - person_count = all_persions.count() + person_count = all_persons.count() submission_count = submissions.count() accepted_count = submissions.filter(result=JudgeStatus.ACCEPTED).count() @@ -79,7 +79,7 @@ class SubmissionStatisticsAPI(APIView): unaccepted = [] if len(accepted) > 0: - unaccepted = list(set(all_persions) - set([item['username'] for item in accepted])) + unaccepted = list(set(all_persons) - set([item['username'] for item in accepted])) # 统计人数完成率 person_rate = 0