diff --git a/mq/scripts/info.py b/mq/scripts/info.py index 41a2127..3a5fe18 100644 --- a/mq/scripts/info.py +++ b/mq/scripts/info.py @@ -4,6 +4,8 @@ import logging import redis import json +from django.db import transaction + from judge.judger_controller.settings import redis_config from judge.judger.result import result from submission.models import Submission @@ -37,6 +39,7 @@ class MessageQueue(object): problem.save() except Problem.DoesNotExist: logger.warning("Submission problem does not exist, submission_id: " + submission_id) + continue # 更新该用户的解题状态 try: user = User.objects.get(pk=submission.user_id) @@ -69,50 +72,46 @@ class MessageQueue(object): contest_submission = ContestSubmission.objects.get(user_id=submission.user_id, contest=contest, problem_id=contest_problem.id) # 提交次数加1 - - if submission.result == result["accepted"]: - # 避免这道题已经 ac 了,但是又重新提交了一遍 - if not contest_submission.ac: - # 这种情况是这个题目前处于错误状态,就使用已经存储了的罚时加上这道题的实际用时 - # logger.debug(contest.start_time) - # logger.debug(submission.create_time) - # logger.debug((submission.create_time - contest.start_time).total_seconds()) - # logger.debug(int((submission.create_time - contest.start_time).total_seconds() / 60)) - contest_submission.ac_time = int((submission.create_time - contest.start_time).total_seconds()) - contest_submission.total_time += contest_submission.ac_time + with transaction.atomic(): + if submission.result == result["accepted"]: + # 避免这道题已经 ac 了,但是又重新提交了一遍 + if not contest_submission.ac: + # 这种情况是这个题目前处于错误状态,就使用已经存储了的罚时加上这道题的实际用时 + contest_submission.ac_time = int((submission.create_time - contest.start_time).total_seconds()) + contest_submission.total_time += contest_submission.ac_time + contest_submission.total_submission_number += 1 + # 标记为已经通过 + if contest_problem.total_accepted_number == 0: + contest_submission.first_achieved = True + contest_submission.ac = True + # contest problem ac 计数器加1 + contest_problem.total_accepted_number += 1 + else: + # 如果这个提交是错误的,就罚时20分钟 + contest_submission.total_time += 1200 contest_submission.total_submission_number += 1 - # 标记为已经通过 - if contest_problem.total_accepted_number == 0: - contest_submission.first_achieved = True - contest_submission.ac = True - # contest problem ac 计数器加1 - contest_problem.total_accepted_number += 1 - else: - # 如果这个提交是错误的,就罚时20分钟 - contest_submission.total_time += 1200 - contest_submission.total_submission_number += 1 - contest_submission.save() - contest_problem.save() + contest_submission.save() + contest_problem.save() except ContestSubmission.DoesNotExist: # 第一次提交 - is_ac = submission.result == result["accepted"] - first_achieved = False - ac_time = 0 - if is_ac: - ac_time = int((submission.create_time - contest.start_time).total_seconds()) - total_time = int((submission.create_time - contest.start_time).total_seconds()) - # 增加题目总的ac数计数器 - if contest_problem.total_accepted_number == 0: - first_achieved = True - contest_problem.total_accepted_number += 1 - contest_problem.save() - else: - # 没过罚时20分钟 - total_time = 1200 - ContestSubmission.objects.create(user_id=submission.user_id, contest=contest, problem=contest_problem, - ac=is_ac, total_time=total_time, first_achieved=first_achieved, - ac_time=ac_time) - + with transaction.atomic(): + is_ac = submission.result == result["accepted"] + first_achieved = False + ac_time = 0 + if is_ac: + ac_time = int((submission.create_time - contest.start_time).total_seconds()) + total_time = int((submission.create_time - contest.start_time).total_seconds()) + # 增加题目总的ac数计数器 + if contest_problem.total_accepted_number == 0: + first_achieved = True + contest_problem.total_accepted_number += 1 + contest_problem.save() + else: + # 没过罚时20分钟 + total_time = 1200 + ContestSubmission.objects.create(user_id=submission.user_id, contest=contest, problem=contest_problem, + ac=is_ac, total_time=total_time, first_achieved=first_achieved, + ac_time=ac_time) logger.debug("Start message queue") MessageQueue().listen_task()