feat: update all query filters to treat AST_CHECK_FAILED as accepted
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -16,7 +16,7 @@ from otpauth import TOTP
|
|||||||
|
|
||||||
from options.options import SysOptions
|
from options.options import SysOptions
|
||||||
from problem.models import Problem
|
from problem.models import Problem
|
||||||
from submission.models import JudgeStatus, Submission
|
from submission.models import JudgeStatus, Submission, is_accepted
|
||||||
from utils.api import APIView, CSRFExemptAPIView, validate_serializer
|
from utils.api import APIView, CSRFExemptAPIView, validate_serializer
|
||||||
from utils.captcha import Captcha
|
from utils.captcha import Captcha
|
||||||
from utils.constants import CacheKey, ContestRuleType
|
from utils.constants import CacheKey, ContestRuleType
|
||||||
@@ -465,7 +465,7 @@ class UserActivityRankAPI(APIView):
|
|||||||
submissions = Submission.objects.filter(
|
submissions = Submission.objects.filter(
|
||||||
contest_id__isnull=True,
|
contest_id__isnull=True,
|
||||||
create_time__gte=start,
|
create_time__gte=start,
|
||||||
result=JudgeStatus.ACCEPTED,
|
result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED],
|
||||||
).exclude(username__in=hidden_names)
|
).exclude(username__in=hidden_names)
|
||||||
data = list(submissions.values("username").annotate(count=Count("problem_id", distinct=True)).order_by("-count")[:10])
|
data = list(submissions.values("username").annotate(count=Count("problem_id", distinct=True)).order_by("-count")[:10])
|
||||||
cache.set(cache_key, data, 600)
|
cache.set(cache_key, data, 600)
|
||||||
@@ -480,7 +480,7 @@ class UserProblemRankAPI(APIView):
|
|||||||
return self.error("User is not authenticated")
|
return self.error("User is not authenticated")
|
||||||
|
|
||||||
problem = Problem.objects.get(_id__iexact=problem_id, contest_id__isnull=True, visible=True)
|
problem = Problem.objects.get(_id__iexact=problem_id, contest_id__isnull=True, visible=True)
|
||||||
submissions = Submission.objects.filter(problem=problem, result=JudgeStatus.ACCEPTED)
|
submissions = Submission.objects.filter(problem=problem, result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED])
|
||||||
|
|
||||||
all_ac_count = submissions.values("user_id").distinct().count()
|
all_ac_count = submissions.values("user_id").distinct().count()
|
||||||
|
|
||||||
|
|||||||
@@ -277,7 +277,7 @@ class ClassPKAPI(APIView):
|
|||||||
create_time__lte=end_time,
|
create_time__lte=end_time,
|
||||||
)
|
)
|
||||||
recent_ac = (
|
recent_ac = (
|
||||||
submissions.filter(result=JudgeStatus.ACCEPTED)
|
submissions.filter(result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED])
|
||||||
.values("user_id", "problem_id")
|
.values("user_id", "problem_id")
|
||||||
.distinct()
|
.distinct()
|
||||||
.count()
|
.count()
|
||||||
@@ -288,7 +288,7 @@ class ClassPKAPI(APIView):
|
|||||||
recent_user_ac = {}
|
recent_user_ac = {}
|
||||||
for user_id in user_ids:
|
for user_id in user_ids:
|
||||||
user_recent_ac = (
|
user_recent_ac = (
|
||||||
submissions.filter(user_id=user_id, result=JudgeStatus.ACCEPTED)
|
submissions.filter(user_id=user_id, result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED])
|
||||||
.values("problem_id")
|
.values("problem_id")
|
||||||
.distinct()
|
.distinct()
|
||||||
.count()
|
.count()
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class CommentAPI(APIView):
|
|||||||
.filter(
|
.filter(
|
||||||
user_id=request.user.id,
|
user_id=request.user.id,
|
||||||
problem_id=data["problem_id"],
|
problem_id=data["problem_id"],
|
||||||
result=JudgeStatus.ACCEPTED,
|
result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED],
|
||||||
)
|
)
|
||||||
.first()
|
.first()
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ class DownloadContestSubmissions(APIView):
|
|||||||
problem_ids = contest.problem_set.all().values_list("id", "_id")
|
problem_ids = contest.problem_set.all().values_list("id", "_id")
|
||||||
id2display_id = {k[0]: k[1] for k in problem_ids}
|
id2display_id = {k[0]: k[1] for k in problem_ids}
|
||||||
ac_map = {k[0]: False for k in problem_ids}
|
ac_map = {k[0]: False for k in problem_ids}
|
||||||
submissions = Submission.objects.filter(contest=contest, result=JudgeStatus.ACCEPTED).order_by("-create_time")
|
submissions = Submission.objects.filter(contest=contest, result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED]).order_by("-create_time")
|
||||||
user_ids = submissions.values_list("user_id", flat=True)
|
user_ids = submissions.values_list("user_id", flat=True)
|
||||||
users = User.objects.filter(id__in=user_ids)
|
users = User.objects.filter(id__in=user_ids)
|
||||||
path = f"/tmp/{rand_str()}.zip"
|
path = f"/tmp/{rand_str()}.zip"
|
||||||
|
|||||||
@@ -527,7 +527,7 @@ class StuckProblemsAPI(APIView):
|
|||||||
Submission.objects.values("problem_id", "problem___id", "problem__title")
|
Submission.objects.values("problem_id", "problem___id", "problem__title")
|
||||||
.annotate(
|
.annotate(
|
||||||
total=Count("id"),
|
total=Count("id"),
|
||||||
accepted=Count("id", filter=Q(result=JudgeStatus.ACCEPTED)),
|
accepted=Count("id", filter=Q(result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED])),
|
||||||
failed=Count("id", filter=failed_q),
|
failed=Count("id", filter=failed_q),
|
||||||
failed_users=Count("user_id", filter=failed_q, distinct=True),
|
failed_users=Count("user_id", filter=failed_q, distinct=True),
|
||||||
)
|
)
|
||||||
@@ -593,7 +593,7 @@ class TopACTrendAPI(APIView):
|
|||||||
.values("problem_id", "problem___id", "problem__title", "year")
|
.values("problem_id", "problem___id", "problem__title", "year")
|
||||||
.annotate(
|
.annotate(
|
||||||
total=Count("id"),
|
total=Count("id"),
|
||||||
accepted=Count("id", filter=Q(result=JudgeStatus.ACCEPTED)),
|
accepted=Count("id", filter=Q(result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED])),
|
||||||
)
|
)
|
||||||
.order_by("problem_id", "year")
|
.order_by("problem_id", "year")
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ class ProblemSolvedPeopleCount(APIView):
|
|||||||
submission_count = Submission.objects.filter(
|
submission_count = Submission.objects.filter(
|
||||||
user_id=request.user.id,
|
user_id=request.user.id,
|
||||||
problem_id=problem_id,
|
problem_id=problem_id,
|
||||||
result=JudgeStatus.ACCEPTED,
|
result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED],
|
||||||
).count()
|
).count()
|
||||||
if submission_count == 0:
|
if submission_count == 0:
|
||||||
return self.success(rate)
|
return self.success(rate)
|
||||||
@@ -207,7 +207,7 @@ class ProblemSolvedPeopleCount(APIView):
|
|||||||
).count()
|
).count()
|
||||||
accepted_count = Submission.objects.filter(
|
accepted_count = Submission.objects.filter(
|
||||||
problem_id=problem_id,
|
problem_id=problem_id,
|
||||||
result=JudgeStatus.ACCEPTED,
|
result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED],
|
||||||
create_time__gte=years_ago,
|
create_time__gte=years_ago,
|
||||||
).aggregate(user_count=Count("user_id", distinct=True))["user_count"]
|
).aggregate(user_count=Count("user_id", distinct=True))["user_count"]
|
||||||
if accepted_count < total_count:
|
if accepted_count < total_count:
|
||||||
@@ -310,7 +310,7 @@ class ProblemYearlyACRateAPI(APIView):
|
|||||||
.values("year")
|
.values("year")
|
||||||
.annotate(
|
.annotate(
|
||||||
total=Count("id"),
|
total=Count("id"),
|
||||||
accepted=Count("id", filter=Q(result=JudgeStatus.ACCEPTED)),
|
accepted=Count("id", filter=Q(result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED])),
|
||||||
)
|
)
|
||||||
.order_by("year")
|
.order_by("year")
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class Command(BaseCommand):
|
|||||||
Submission.objects.filter(
|
Submission.objects.filter(
|
||||||
user_id=progress.user_id,
|
user_id=progress.user_id,
|
||||||
problem_id=psp.problem_id,
|
problem_id=psp.problem_id,
|
||||||
result=JudgeStatus.ACCEPTED,
|
result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED],
|
||||||
)
|
)
|
||||||
.order_by("create_time")
|
.order_by("create_time")
|
||||||
.first()
|
.first()
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ from problemset.serializers import (
|
|||||||
UpdateProgressSerializer,
|
UpdateProgressSerializer,
|
||||||
UserBadgeSerializer,
|
UserBadgeSerializer,
|
||||||
)
|
)
|
||||||
from submission.models import JudgeStatus, Submission
|
from submission.models import JudgeStatus, Submission, is_accepted
|
||||||
from utils.api import APIView, validate_serializer
|
from utils.api import APIView, validate_serializer
|
||||||
|
|
||||||
|
|
||||||
@@ -187,7 +187,7 @@ class ProblemSetProgressAPI(APIView):
|
|||||||
except Submission.DoesNotExist:
|
except Submission.DoesNotExist:
|
||||||
return self.error("提交记录不存在")
|
return self.error("提交记录不存在")
|
||||||
|
|
||||||
if submission.result != JudgeStatus.ACCEPTED:
|
if not is_accepted(submission.result):
|
||||||
return self.error("只有通过的提交才能更新进度")
|
return self.error("只有通过的提交才能更新进度")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ class SubmissionStatisticsAPI(APIView):
|
|||||||
# 优化:一次性获取所有统计数据
|
# 优化:一次性获取所有统计数据
|
||||||
submission_stats = submissions.aggregate(
|
submission_stats = submissions.aggregate(
|
||||||
total_count=Count("id"),
|
total_count=Count("id"),
|
||||||
accepted_count=Count("id", filter=Q(result=JudgeStatus.ACCEPTED)),
|
accepted_count=Count("id", filter=Q(result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED])),
|
||||||
)
|
)
|
||||||
submission_count = submission_stats["total_count"]
|
submission_count = submission_stats["total_count"]
|
||||||
accepted_count = submission_stats["accepted_count"]
|
accepted_count = submission_stats["accepted_count"]
|
||||||
@@ -91,7 +91,7 @@ class SubmissionStatisticsAPI(APIView):
|
|||||||
submissions.values("username")
|
submissions.values("username")
|
||||||
.annotate(
|
.annotate(
|
||||||
submission_count=Count("id"),
|
submission_count=Count("id"),
|
||||||
accepted_count=Count("id", filter=Q(result=JudgeStatus.ACCEPTED)),
|
accepted_count=Count("id", filter=Q(result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED])),
|
||||||
)
|
)
|
||||||
.order_by("-submission_count")
|
.order_by("-submission_count")
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user