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:
2026-05-25 20:45:15 -06:00
parent 4d7eabd607
commit 980b803517
9 changed files with 17 additions and 17 deletions

View File

@@ -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()

View File

@@ -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()

View File

@@ -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()
) )

View File

@@ -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"

View File

@@ -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")
) )

View File

@@ -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")
) )

View File

@@ -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()

View File

@@ -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:

View File

@@ -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")
) )