Source code for oioioi.usergroups.controllers

from django.db.models import Q
from django.utils import timezone

from oioioi.rankings.controllers import CONTEST_RANKING_KEY
from oioioi.teachers.controllers import TeacherRegistrationController
from oioioi.usergroups.models import UserGroup, UserGroupRanking
from oioioi.contests.utils import is_contest_basicadmin, is_contest_observer
from oioioi.rankings.controllers import DefaultRankingController

[docs]USER_GROUP_RANKING_PREFIX = 'g'
[docs]class UserGroupsParticipantsControllerMixin(object):
[docs] def filter_participants(self, queryset): base_qs = super( UserGroupsParticipantsControllerMixin, self ).filter_participants(queryset) groups_qs = queryset.filter(usergroups__contests__id=self.contest.id) return base_qs | groups_qs
[docs] def user_contests_query(self, request): base_query = super( UserGroupsParticipantsControllerMixin, self ).user_contests_query(request) if not request.user.is_authenticated: return base_query return base_query | Q(usergroups__members__id=request.user.id)
TeacherRegistrationController.mix_in(UserGroupsParticipantsControllerMixin)
[docs]def user_group_ranking_id(user_group_id): return USER_GROUP_RANKING_PREFIX + str(user_group_id)
[docs]class UserGroupsDefaultRankingControllerMixin(object):
[docs] def _iter_user_groups(self, can_see_all, request): queryset = UserGroupRanking.objects.filter(contest__id=self.contest.id) for user_group_ranking in queryset: user_group = user_group_ranking.user_group if can_see_all or (request and request.user in user_group.members.all()): yield user_group
[docs] def _user_groups_for_ranking(self, request): can_see_all = is_contest_basicadmin(request) or is_contest_observer(request) return self._iter_user_groups(can_see_all, request)
[docs] def _rounds_for_key(self, key): can_see_all = self._key_permission(key) in {'admin', 'observer'} partial_key = self.get_partial_key(key) # Get all visible rounds for user group rankings. if partial_key[0] == USER_GROUP_RANKING_PREFIX: partial_key = CONTEST_RANKING_KEY return self._iter_rounds(can_see_all, timezone.now(), partial_key)
[docs] def available_rankings(self, request): rankings = super( UserGroupsDefaultRankingControllerMixin, self ).available_rankings(request) if len(rankings) == 0: # User cannot see any rounds. return [] for user_group in self._user_groups_for_ranking(request): rankings.append((user_group_ranking_id(user_group.id), user_group.name)) return rankings
[docs] def filter_users_for_ranking(self, key, queryset): queryset = super( UserGroupsDefaultRankingControllerMixin, self ).filter_users_for_ranking(key, queryset) partial_key = self.get_partial_key(key) if partial_key[0] == USER_GROUP_RANKING_PREFIX: user_group = UserGroup.objects.get(id=int(partial_key[1:])) users = user_group.members.all() queryset = queryset & users return queryset
DefaultRankingController.mix_in(UserGroupsDefaultRankingControllerMixin)