remove contest type
This commit is contained in:
@@ -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"])
|
||||
|
||||
Reference in New Issue
Block a user