击败多少用户

This commit is contained in:
2025-04-13 21:20:52 +08:00
parent 4fafdd278e
commit 43dfeb2fa0
3 changed files with 38 additions and 5 deletions

View File

@@ -1,10 +1,17 @@
from django.urls import path from django.urls import path
from ..views.oj import ProblemTagAPI, ProblemAPI, ContestProblemAPI, PickOneAPI from ..views.oj import (
ProblemSolvedPeopleCount,
ProblemTagAPI,
ProblemAPI,
ContestProblemAPI,
PickOneAPI,
)
urlpatterns = [ urlpatterns = [
path("problem/tags", ProblemTagAPI.as_view()), path("problem/tags", ProblemTagAPI.as_view()),
path("problem", ProblemAPI.as_view()), path("problem", ProblemAPI.as_view()),
path("problem/beat_count", ProblemSolvedPeopleCount.as_view()),
path("pickone", PickOneAPI.as_view()), path("pickone", PickOneAPI.as_view()),
path("contest/problem", ContestProblemAPI.as_view()), path("contest/problem", ContestProblemAPI.as_view()),
] ]

View File

@@ -1,5 +1,7 @@
import random import random
from django.db.models import Q, Count from django.db.models import Q, Count
from account.models import User
from submission.models import Submission, JudgeStatus
from utils.api import APIView from utils.api import APIView
from account.decorators import check_contest_permission from account.decorators import check_contest_permission
from ..models import ProblemTag, Problem, ProblemRuleType from ..models import ProblemTag, Problem, ProblemRuleType
@@ -147,3 +149,27 @@ class ContestProblemAPI(APIView):
else: else:
data = ProblemSafeSerializer(contest_problems, many=True).data data = ProblemSafeSerializer(contest_problems, many=True).data
return self.success(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}%")

View File

@@ -50,13 +50,13 @@ class SubmissionStatisticsAPI(APIView):
# 统计人数 # 统计人数
person_count = 0 person_count = 0
all_persions = [] all_persons = []
if username: if username:
submissions = submissions.filter(username__icontains=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, is_disabled=False,
admin_type=AdminType.REGULAR_USER).values_list("username", flat=True) admin_type=AdminType.REGULAR_USER).values_list("username", flat=True)
person_count = all_persions.count() person_count = all_persons.count()
submission_count = submissions.count() submission_count = submissions.count()
accepted_count = submissions.filter(result=JudgeStatus.ACCEPTED).count() accepted_count = submissions.filter(result=JudgeStatus.ACCEPTED).count()
@@ -79,7 +79,7 @@ class SubmissionStatisticsAPI(APIView):
unaccepted = [] unaccepted = []
if len(accepted) > 0: 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 person_rate = 0