Source code for oioioi.teams.views

from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.template.response import TemplateResponse
from django.urls import reverse
from django.utils.translation import gettext_lazy as _

from oioioi.base.menu import menu_registry
from oioioi.base.permissions import enforce_condition, not_anonymous
from oioioi.contests.utils import can_enter_contest, contest_exists
from oioioi.teams.forms import CreateTeamForm
from oioioi.teams.models import Team, TeamMembership
from oioioi.teams.utils import (
    can_create_team,
    can_delete_team,
    can_join_team,
    can_quit_team,
    can_see_teams_list,
    has_team,
    teams_enabled,
)


[docs]def create_team(login, name, contest): new_team = Team(name=name, contest=contest, login=login) new_team.save() return new_team
[docs]def team_members_names(request, team): return [ team.contest.controller.get_user_public_name(request, membership.user) for membership in team.members.all() ]
@menu_registry.register_decorator( _("Teams"), lambda request: reverse('teams_list', kwargs={'contest_id': request.contest.id}), order=50, ) @enforce_condition(can_see_teams_list & contest_exists & can_enter_contest)
[docs]def teams_list(request): teams = [ {'name': team.name, 'members': team_members_names(request, team)} for team in Team.objects.filter(contest=request.contest) ] return TemplateResponse(request, 'teams/teams.html', {'teams': teams})
@menu_registry.register_decorator( _("My Team"), lambda request: reverse('team_view', kwargs={'contest_id': request.contest.id}), order=50, ) @enforce_condition( not_anonymous & contest_exists & can_enter_contest & teams_enabled & (has_team | can_create_team) )
[docs]def team_view(request): controller = request.contest.controller try: tm = TeamMembership.objects.get( user=request.user, team__contest=request.contest ) members = team_members_names(request, tm.team) can_invite = ( len(members) < controller.max_size_of_team() ) and controller.can_modify_team(request) join_link = request.build_absolute_uri( reverse( 'join_team', kwargs={'contest_id': request.contest.id, 'join_key': tm.team.join_key}, ) ) return TemplateResponse( request, 'teams/team.html', { 'members': members, 'name': tm.team.name, 'join_link': join_link, 'show_delete': can_delete_team(request), 'show_quit': can_quit_team(request), 'show_invite': can_invite, }, ) except TeamMembership.DoesNotExist: return HttpResponseRedirect( reverse('create_team', kwargs={'contest_id': request.contest.id}) )
@enforce_condition(not_anonymous & contest_exists & can_enter_contest & can_create_team)
[docs]def create_team_view(request): if request.method == 'POST': team_create_form = CreateTeamForm(request.POST, request=request) if team_create_form.is_valid(): new_team = create_team( team_create_form.cleaned_data['login'], team_create_form.cleaned_data['name'], request.contest, ) membership = TeamMembership(team=new_team, user=request.user) membership.save() return HttpResponseRedirect( reverse('team_view', kwargs={'contest_id': request.contest.id}) ) else: team_create_form = CreateTeamForm() return TemplateResponse( request, 'teams/create-team.html', {'form': team_create_form} )
@enforce_condition(not_anonymous & contest_exists & can_enter_contest & can_join_team)
[docs]def join_team_view(request, join_key): team = get_object_or_404(Team, contest=request.contest, join_key=join_key) if request.method == 'POST': members = [ membership.user for membership in TeamMembership.objects.filter(team=team) ] tm = TeamMembership(team=team, user=request.user) tm.save() return HttpResponseRedirect( reverse('team_view', kwargs={'contest_id': request.contest.id}) ) else: members = team_members_names(request=request, team=team) return TemplateResponse( request, 'teams/confirm-join-team.html', {'join_key': join_key, 'members': members, 'name': team.name}, )
@enforce_condition(not_anonymous & contest_exists & can_enter_contest & can_delete_team)
[docs]def delete_team_view(request): tm = get_object_or_404( TeamMembership, user=request.user, team__contest=request.contest ) team = tm.team user = team.user tm.delete() team.delete() user.delete() return HttpResponseRedirect( reverse('team_view', kwargs={'contest_id': request.contest.id}) )
@enforce_condition(not_anonymous & contest_exists & can_enter_contest & can_quit_team)
[docs]def quit_team_view(request): tm = get_object_or_404( TeamMembership, user=request.user, team__contest=request.contest ) tm.delete() return HttpResponseRedirect( reverse('team_view', kwargs={'contest_id': request.contest.id}) )