126 lines
4.6 KiB
Python
126 lines
4.6 KiB
Python
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, DetailView, FormView, RedirectView, UpdateView
|
|
|
|
from .forms import JoinTeamForm, ParticipationForm, TeamForm, UploadVideoForm
|
|
from .models import Participation, Team, Video
|
|
|
|
|
|
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("participation:team_detail", args=(self.object.pk,))
|
|
|
|
|
|
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)
|
|
|
|
self.object = form.instance
|
|
ret = super().form_valid(form)
|
|
registration.team = form.instance
|
|
registration.save()
|
|
return ret
|
|
|
|
def get_success_url(self):
|
|
return reverse_lazy("participation:team_detail", args=(self.object.pk,))
|
|
|
|
|
|
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
|
|
|
|
|
|
class TeamUpdateView(LoginRequiredMixin, UpdateView):
|
|
model = Team
|
|
form_class = TeamForm
|
|
template_name = "participation/update_team.html"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context["participation_form"] = ParticipationForm(data=self.request.POST or None,
|
|
instance=self.object.participation)
|
|
return context
|
|
|
|
@transaction.atomic
|
|
def form_valid(self, form):
|
|
participation_form = ParticipationForm(data=self.request.POST or None, instance=self.object.participation)
|
|
if not participation_form.is_valid():
|
|
return self.form_invalid(form)
|
|
|
|
participation_form.save()
|
|
return super().form_valid(form)
|
|
|
|
def get_success_url(self):
|
|
return reverse_lazy("participation:team_detail", args=(self.object.pk,))
|
|
|
|
|
|
class MyParticipationDetailView(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:participation_detail", args=(registration.team.participation.id,))
|
|
raise PermissionDenied(_("You are not in a team."))
|
|
raise PermissionDenied(_("You don't participate, so you don't have any team."))
|
|
|
|
|
|
class ParticipationDetailView(LoginRequiredMixin, DetailView):
|
|
model = Participation
|
|
|
|
|
|
class UploadVideoView(LoginRequiredMixin, UpdateView):
|
|
model = Video
|
|
form_class = UploadVideoForm
|
|
template_name = "participation/upload_video.html"
|
|
|
|
def get_success_url(self):
|
|
return reverse_lazy("participation:participation_detail", args=(self.object.participation.pk,))
|