From 980b80351713327915764d8ff513257ad25f9d63 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Mon, 25 May 2026 20:45:15 -0600 Subject: [PATCH] feat: update all query filters to treat AST_CHECK_FAILED as accepted Co-Authored-By: Claude Sonnet 4.6 --- account/views/oj.py | 6 +++--- class_pk/views/oj.py | 4 ++-- comment/views/oj.py | 2 +- contest/views/admin.py | 2 +- problem/views/admin.py | 4 ++-- problem/views/oj.py | 6 +++--- problemset/management/commands/fix_problemset_progress.py | 2 +- problemset/views/oj.py | 4 ++-- submission/views/admin.py | 4 ++-- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/account/views/oj.py b/account/views/oj.py index 40bc41a..15b650e 100644 --- a/account/views/oj.py +++ b/account/views/oj.py @@ -16,7 +16,7 @@ from otpauth import TOTP from options.options import SysOptions 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.captcha import Captcha from utils.constants import CacheKey, ContestRuleType @@ -465,7 +465,7 @@ class UserActivityRankAPI(APIView): submissions = Submission.objects.filter( contest_id__isnull=True, create_time__gte=start, - result=JudgeStatus.ACCEPTED, + result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED], ).exclude(username__in=hidden_names) data = list(submissions.values("username").annotate(count=Count("problem_id", distinct=True)).order_by("-count")[:10]) cache.set(cache_key, data, 600) @@ -480,7 +480,7 @@ class UserProblemRankAPI(APIView): return self.error("User is not authenticated") 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() diff --git a/class_pk/views/oj.py b/class_pk/views/oj.py index bbc49f1..775e87b 100644 --- a/class_pk/views/oj.py +++ b/class_pk/views/oj.py @@ -277,7 +277,7 @@ class ClassPKAPI(APIView): create_time__lte=end_time, ) recent_ac = ( - submissions.filter(result=JudgeStatus.ACCEPTED) + submissions.filter(result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED]) .values("user_id", "problem_id") .distinct() .count() @@ -288,7 +288,7 @@ class ClassPKAPI(APIView): recent_user_ac = {} for user_id in user_ids: 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") .distinct() .count() diff --git a/comment/views/oj.py b/comment/views/oj.py index f361194..0a42afb 100644 --- a/comment/views/oj.py +++ b/comment/views/oj.py @@ -28,7 +28,7 @@ class CommentAPI(APIView): .filter( user_id=request.user.id, problem_id=data["problem_id"], - result=JudgeStatus.ACCEPTED, + result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED], ) .first() ) diff --git a/contest/views/admin.py b/contest/views/admin.py index c4a9236..2402953 100644 --- a/contest/views/admin.py +++ b/contest/views/admin.py @@ -217,7 +217,7 @@ class DownloadContestSubmissions(APIView): problem_ids = contest.problem_set.all().values_list("id", "_id") id2display_id = {k[0]: k[1] 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) users = User.objects.filter(id__in=user_ids) path = f"/tmp/{rand_str()}.zip" diff --git a/problem/views/admin.py b/problem/views/admin.py index 96eb1e2..66832f4 100644 --- a/problem/views/admin.py +++ b/problem/views/admin.py @@ -527,7 +527,7 @@ class StuckProblemsAPI(APIView): Submission.objects.values("problem_id", "problem___id", "problem__title") .annotate( 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_users=Count("user_id", filter=failed_q, distinct=True), ) @@ -593,7 +593,7 @@ class TopACTrendAPI(APIView): .values("problem_id", "problem___id", "problem__title", "year") .annotate( 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") ) diff --git a/problem/views/oj.py b/problem/views/oj.py index c2a6e94..795c8a8 100644 --- a/problem/views/oj.py +++ b/problem/views/oj.py @@ -196,7 +196,7 @@ class ProblemSolvedPeopleCount(APIView): submission_count = Submission.objects.filter( user_id=request.user.id, problem_id=problem_id, - result=JudgeStatus.ACCEPTED, + result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED], ).count() if submission_count == 0: return self.success(rate) @@ -207,7 +207,7 @@ class ProblemSolvedPeopleCount(APIView): ).count() accepted_count = Submission.objects.filter( problem_id=problem_id, - result=JudgeStatus.ACCEPTED, + result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED], create_time__gte=years_ago, ).aggregate(user_count=Count("user_id", distinct=True))["user_count"] if accepted_count < total_count: @@ -310,7 +310,7 @@ class ProblemYearlyACRateAPI(APIView): .values("year") .annotate( 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") ) diff --git a/problemset/management/commands/fix_problemset_progress.py b/problemset/management/commands/fix_problemset_progress.py index a6d412c..d6961ab 100644 --- a/problemset/management/commands/fix_problemset_progress.py +++ b/problemset/management/commands/fix_problemset_progress.py @@ -38,7 +38,7 @@ class Command(BaseCommand): Submission.objects.filter( user_id=progress.user_id, problem_id=psp.problem_id, - result=JudgeStatus.ACCEPTED, + result__in=[JudgeStatus.ACCEPTED, JudgeStatus.AST_CHECK_FAILED], ) .order_by("create_time") .first() diff --git a/problemset/views/oj.py b/problemset/views/oj.py index c75490b..8c16c1f 100644 --- a/problemset/views/oj.py +++ b/problemset/views/oj.py @@ -24,7 +24,7 @@ from problemset.serializers import ( UpdateProgressSerializer, UserBadgeSerializer, ) -from submission.models import JudgeStatus, Submission +from submission.models import JudgeStatus, Submission, is_accepted from utils.api import APIView, validate_serializer @@ -187,7 +187,7 @@ class ProblemSetProgressAPI(APIView): except Submission.DoesNotExist: return self.error("提交记录不存在") - if submission.result != JudgeStatus.ACCEPTED: + if not is_accepted(submission.result): return self.error("只有通过的提交才能更新进度") try: diff --git a/submission/views/admin.py b/submission/views/admin.py index eda7296..d98d4f5 100644 --- a/submission/views/admin.py +++ b/submission/views/admin.py @@ -78,7 +78,7 @@ class SubmissionStatisticsAPI(APIView): # 优化:一次性获取所有统计数据 submission_stats = submissions.aggregate( 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"] accepted_count = submission_stats["accepted_count"] @@ -91,7 +91,7 @@ class SubmissionStatisticsAPI(APIView): submissions.values("username") .annotate( 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") )