from django.contrib.auth.mixins import LoginRequiredMixin from django.core.exceptions import PermissionDenied from django.db import transaction from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ from django.views.generic import CreateView, FormView, DetailView, RedirectView from participation.forms import TeamForm, JoinTeamForm from participation.models import Team class CreateTeamView(LoginRequiredMixin, CreateView): model = Team form_class = TeamForm extra_context = dict(title=_("Create team")) template_name = "participation/create_team.html" @transaction.atomic def form_valid(self, form): user = self.request.user registration = user.registration if not registration.participates: form.add_error(None, _("You don't participate, so you can't create a team.")) return self.form_invalid(form) elif registration.team: form.add_error(None, _("You are already in a team.")) return self.form_invalid(form) ret = super().form_valid(form) registration.team = form.instance registration.save() return ret def get_success_url(self): return reverse_lazy("index") class JoinTeamView(LoginRequiredMixin, FormView): model = Team form_class = JoinTeamForm extra_context = dict(title=_("Join team")) template_name = "participation/create_team.html" @transaction.atomic def form_valid(self, form): user = self.request.user registration = user.registration if not registration.participates: form.add_error(None, _("You don't participate, so you can't create a team.")) return self.form_invalid(form) elif registration.team: form.add_error(None, _("You are already in a team.")) return self.form_invalid(form) ret = super().form_valid(form) registration.team = form.instance registration.save() return ret def get_success_url(self): return reverse_lazy("index") class MyTeamDetailView(LoginRequiredMixin, RedirectView): def get_redirect_url(self, *args, **kwargs): user = self.request.user registration = user.registration if registration.participates: if registration.team: return reverse_lazy("participation:team_detail", args=(registration.team_id,)) raise PermissionDenied(_("You are not in a team.")) raise PermissionDenied(_("You don't participate, so you don't have any team.")) class TeamDetailView(LoginRequiredMixin, DetailView): model = Team