Source code for oioioi.publicsolutions.utils

from oioioi.base.permissions import make_condition, make_request_condition
from oioioi.base.utils import request_cached
from oioioi.contests.models import ProblemInstance, Round, Submission
from oioioi.programs.controllers import ProgrammingContestController


@request_cached
[docs]def public_rounds(request): controller = request.contest.controller return [ round for round in Round.objects.filter(contest=request.contest) if controller.can_see_publicsolutions(request, round) ]
[docs]def filter_public_problem_instances(request, qs): return qs.filter(round__in=public_rounds(request))
@request_cached
[docs]def public_problem_instances(request): return filter_public_problem_instances(request, ProblemInstance.objects.all())
@request_cached
[docs]def unfiltered_submissions(request): return Submission.objects.filter( problem_instance__in=public_problem_instances(request) ).select_related( 'publication', 'user', 'problem_instance', 'problem_instance__problem', 'problem_instance__contest', )
@request_cached
[docs]def get_public_solutions(request): return filter_public_solutions(request, unfiltered_submissions(request))
[docs]def filter_public_solutions(request, qs): cc = request.contest.controller return ( cc.solutions_must_be_public(qs) | qs.filter(publication__isnull=False) ).filter(problem_instance__in=public_problem_instances(request))
@request_cached
[docs]def get_may_be_published_solutions(request): controller = request.contest.controller subs = unfiltered_submissions(request) mustbe_subs = controller.solutions_must_be_public(subs) return controller.solutions_may_be_published(subs.exclude(id__in=mustbe_subs))
@request_cached
[docs]def get_may_be_published_solutions_for_user(request): qs = get_may_be_published_solutions(request) if request.user.is_anonymous: return qs.none() return qs.filter(user=request.user)
@request_cached
[docs]def problem_instances_with_any_public_solutions(request): return ( public_problem_instances(request) .filter(submission__in=(get_public_solutions(request))) .distinct() )
@make_request_condition
[docs]def any_round_public(request): return isinstance( request.contest.controller, ProgrammingContestController ) and public_rounds(request)
@make_condition()
[docs]def solution_may_be_published(request, *args, **kwargs): """Checks whether kwargs describe an existing submission for which a user has a publication right. It assumes user is not anonymous. """ sub_id = kwargs['submission_id'] submission = get_may_be_published_solutions(request).filter(pk=sub_id) return submission.exists()