击败多少用户
This commit is contained in:
@@ -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()),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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}%")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user