remove contest type

This commit is contained in:
2026-05-26 23:10:27 -06:00
parent 6b81856bfd
commit 6ab2886f77
12 changed files with 69 additions and 213 deletions

View File

@@ -11,7 +11,7 @@ from django.utils import timezone
from account.models import User
from conf.models import JudgeServer
from contest.models import ACMContestRank, ContestRuleType, ContestStatus, OIContestRank
from contest.models import ACMContestRank, ContestStatus
from options.options import SysOptions
from problem.models import Problem, ProblemRuleType
from problem.utils import parse_problem_template
@@ -350,30 +350,16 @@ class JudgeDispatcher(DispatcherBase):
user_profile = user.userprofile
problem_id = str(self.problem.id)
profile_status = JudgeStatus.ACCEPTED if is_accepted(self.submission.result) else self.submission.result
if self.contest.rule_type == ContestRuleType.ACM:
contest_problems_status = user_profile.acm_problems_status.get("contest_problems", {})
if problem_id not in contest_problems_status:
contest_problems_status[problem_id] = {"status": profile_status, "_id": self.problem._id}
elif not is_accepted(contest_problems_status[problem_id]["status"]):
contest_problems_status[problem_id]["status"] = profile_status
else:
# 如果已AC 直接跳过 不计入任何计数器
return
user_profile.acm_problems_status["contest_problems"] = contest_problems_status
user_profile.save(update_fields=["acm_problems_status"])
elif self.contest.rule_type == ContestRuleType.OI:
contest_problems_status = user_profile.oi_problems_status.get("contest_problems", {})
score = self.submission.statistic_info["score"]
if problem_id not in contest_problems_status:
contest_problems_status[problem_id] = {"status": profile_status,
"_id": self.problem._id,
"score": score}
else:
contest_problems_status[problem_id]["score"] = score
contest_problems_status[problem_id]["status"] = profile_status
user_profile.oi_problems_status["contest_problems"] = contest_problems_status
user_profile.save(update_fields=["oi_problems_status"])
contest_problems_status = user_profile.acm_problems_status.get("contest_problems", {})
if problem_id not in contest_problems_status:
contest_problems_status[problem_id] = {"status": profile_status, "_id": self.problem._id}
elif not is_accepted(contest_problems_status[problem_id]["status"]):
contest_problems_status[problem_id]["status"] = profile_status
else:
# 如果已AC 直接跳过 不计入任何计数器
return
user_profile.acm_problems_status["contest_problems"] = contest_problems_status
user_profile.save(update_fields=["acm_problems_status"])
problem = Problem.objects.select_for_update().get(contest_id=self.contest_id, id=self.problem.id)
result = str(self.submission.result)
@@ -385,28 +371,18 @@ class JudgeDispatcher(DispatcherBase):
problem.save(update_fields=["submission_number", "accepted_number", "statistic_info"])
def update_contest_rank(self):
if self.contest.rule_type == ContestRuleType.OI or self.contest.real_time_rank:
cache.delete(f"{CacheKey.contest_rank_cache}:{self.contest.id}")
def get_rank(model):
return model.objects.select_for_update().get(user_id=self.submission.user_id, contest=self.contest)
if self.contest.rule_type == ContestRuleType.ACM:
model = ACMContestRank
func = self._update_acm_contest_rank
else:
model = OIContestRank
func = self._update_oi_contest_rank
def get_rank():
return ACMContestRank.objects.select_for_update().get(user_id=self.submission.user_id, contest=self.contest)
try:
rank = get_rank(model)
except model.DoesNotExist:
rank = get_rank()
except ACMContestRank.DoesNotExist:
try:
model.objects.create(user_id=self.submission.user_id, contest=self.contest)
rank = get_rank(model)
ACMContestRank.objects.create(user_id=self.submission.user_id, contest=self.contest)
rank = get_rank()
except IntegrityError:
rank = get_rank(model)
func(rank)
rank = get_rank()
self._update_acm_contest_rank(rank)
def _update_acm_contest_rank(self, rank):
info = rank.submission_info.get(str(self.submission.problem_id))
@@ -447,13 +423,3 @@ class JudgeDispatcher(DispatcherBase):
rank.submission_info[str(self.submission.problem_id)] = info
rank.save(update_fields=["submission_info", "total_time", "accepted_number", "submission_number"])
def _update_oi_contest_rank(self, rank):
problem_id = str(self.submission.problem_id)
current_score = self.submission.statistic_info["score"]
last_score = rank.submission_info.get(problem_id)
if last_score:
rank.total_score = rank.total_score - last_score + current_score
else:
rank.total_score = rank.total_score + current_score
rank.submission_info[problem_id] = current_score
rank.save(update_fields=["submission_info", "total_score", "submission_number"])