submission.user._updating_stats_only = True submission.user.calculate_points() submission.problem._updating_stats_only = True submission.problem.update_stats() if hasattr(submission, 'contest'): contest = submission.contest contest.points = round( points / total * contest.problem.points if total > 0 else 0, 3) if not contest.problem.partial and contest.points != contest.problem.points: contest.points = 0 contest.save() submission.contest.participation.recalculate_score() submission.contest.participation.update_cumtime() finished_submission(submission) event.post( 'sub_%d' % submission.id, { 'type': 'grading-end', 'time': time, 'memory': memory, 'points': float(points), 'total': float(submission.problem.points), 'result': submission.result }) if hasattr(submission, 'contest'): participation = submission.contest.participation event.post('contest_%d' % participation.contest_id, {'type': 'update'}) self._post_update_submission(submission.id, 'grading-end', done=True)
def on_grading_end(self, packet): super(DjangoJudgeHandler, self).on_grading_end(packet) try: submission = Submission.objects.get(id=packet['submission-id']) except Submission.DoesNotExist: logger.warning('Unknown submission: %d', packet['submission-id']) return time = 0 memory = 0 points = 0.0 total = 0 status = 0 status_codes = ['SC', 'AC', 'WA', 'MLE', 'TLE', 'IR', 'RTE', 'OLE'] batches = {} # batch number: (points, total) for case in SubmissionTestCase.objects.filter(submission=submission): time += case.time if not case.batch: points += case.points total += case.total else: if case.batch in batches: batches[case.batch][0] = min(batches[case.batch][0], case.points) batches[case.batch][1] = max(batches[case.batch][1], case.total) else: batches[case.batch] = [case.points, case.total] memory = max(memory, case.memory) i = status_codes.index(case.status) if i > status: status = i for i in batches: points += batches[i][0] total += batches[i][1] points = round(points, 1) total = round(total, 1) submission.case_points = points submission.case_total = total sub_points = round(points / total * submission.problem.points if total > 0 else 0, 1) if not submission.problem.partial and sub_points != submission.problem.points: sub_points = 0 submission.status = 'D' submission.time = time submission.memory = memory submission.points = sub_points submission.result = status_codes[status] submission.save() submission.user.calculate_points() if hasattr(submission, 'contest'): contest = submission.contest contest.points = round(points / total * contest.problem.points if total > 0 else 0, 1) if not contest.problem.partial and contest.points != contest.problem.points: contest.points = 0 contest.save() submission.contest.participation.recalculate_score() submission.contest.participation.update_cumtime() finished_submission(submission) event.post('sub_%d' % submission.id, { 'type': 'grading-end', 'time': time, 'memory': memory, 'points': float(points), 'total': float(submission.problem.points), 'result': submission.result }) if hasattr(submission, 'contest'): participation = submission.contest.participation event.post('contest_%d' % participation.contest_id, {'type': 'update'}) if not submission.problem.is_public: return event.post('submissions', {'type': 'update-submission', 'id': submission.id, 'state': 'grading-end', 'contest': submission.contest_key, 'user': submission.user_id, 'problem': submission.problem_id}) event.post('submissions', {'type': 'done-submission', 'id': submission.id, 'contest': submission.contest_key, 'user': submission.user_id, 'problem': submission.problem_id})