Source code for oioioi.balloons.controllers
from django.contrib.auth.models import User
from django.db import transaction
from django.db.models import Q
from oioioi.acm.controllers import ACMContestController
from oioioi.balloons.models import BalloonDelivery
from oioioi.contests.models import Submission
[docs]class BalloonsDeliveryACMControllerMixin(object):
"""Creates a :class:`~oioioi.balloons.models.BalloonDelivery` object for
every submission that has been successfully judged, but only if it's
the first judged submission for that problem instance or
a `BalloonDelivery` object was already created for that problem
instance.
"""
[docs] def submission_judged(self, submission, rejudged=False):
super(BalloonsDeliveryACMControllerMixin, self).submission_judged(
submission, rejudged
)
self._create_balloon_delivery(submission)
@transaction.atomic
[docs] def _create_balloon_delivery(self, submission):
this_problem_instance = Q(problem_instance=submission.problem_instance)
if submission.user is None:
return
if BalloonDelivery.objects.filter(this_problem_instance).exists():
# First solver has been determined, just create a request if OK.
user_qs = User.objects.filter(id=submission.user.id)
registration_controller = (
submission.problem_instance.contest.controller.registration_controller()
)
participant_qs = registration_controller.filter_participants(user_qs)
if (
submission.status == 'OK'
and submission.kind == 'NORMAL'
and participant_qs.exists()
):
BalloonDelivery.objects.get_or_create(
user=submission.user, problem_instance=submission.problem_instance
)
else:
# First solver has not been determined yet.
# It may be necessary to wait for some submissions to be judged.
accepted_or_unjudged = Q(status='OK') | Q(status='?') | Q(status='SE')
not_ignored = Q(kind='NORMAL')
user_is_participant = Q(
user__participant__contest=submission.problem_instance.contest_id
)
submissions = Submission.objects.filter(
accepted_or_unjudged
& this_problem_instance
& not_ignored
& user_is_participant
).order_by('date')
first_not_found = True
for submission in submissions:
if submission.status in ('?', 'SE'):
if first_not_found:
# We are waiting for this submission to be judged.
break
else:
BalloonDelivery.objects.get_or_create(
user=submission.user,
problem_instance=submission.problem_instance,
first_accepted_solution=first_not_found,
)
first_not_found = False
ACMContestController.mix_in(BalloonsDeliveryACMControllerMixin)