Source code for oioioi.participants.middleware
from django.contrib.auth.models import User
from django.template.loader import render_to_string
from oioioi.contestexcl.middleware import ExclusiveContestsMiddleware
from oioioi.participants.utils import is_contest_with_participants
[docs]class ExclusiveContestsWithParticipantsMiddlewareMixin(object):
"""This middleware mixin passes an additional selector to the
:class:`~oioioi.contestexcl.middleware.ExclusiveContestsMiddleware`
when the :mod:`~oioioi.participants` application is used.
Now, a contest with
:class:`~oioioi.contestexcl.models.ExclusivenessConfig`
which has participants is exclusive only for its participants.
Note that this feature makes greater sense when combined with automatic
login, see :class:`oioioi.ipdnsauth.middleware.IpDnsAuthMiddleware`.
"""
[docs] def process_view(self, request, view_func, view_args, view_kwargs, selector=None):
if not self._check_requirements(request):
return
def _participants_selector(user, contest):
if is_contest_with_participants(contest):
if user.is_anonymous:
return False
rcontroller = contest.controller.registration_controller()
qs = User.objects.filter(id=user.id)
if qs.filter(
participant__contest=contest, participant__status='BANNED'
).exists():
return True
return rcontroller.filter_participants(qs).exists()
return True
if selector is None:
final_selector = _participants_selector
else:
final_selector = lambda user, contest: _participants_selector(
user, contest
) and selector(user, contest)
return super(
ExclusiveContestsWithParticipantsMiddlewareMixin, self
).process_view(
request, view_func, view_args, view_kwargs, selector=final_selector
)
[docs] def _error_email_message(self, context):
return render_to_string(
'participants/exclusive-contests-error-email.txt', context
)
ExclusiveContestsMiddleware.mix_in(ExclusiveContestsWithParticipantsMiddlewareMixin)