1
0
mirror of https://gitlab.crans.org/bde/nk20 synced 2025-06-12 12:57:28 +02:00
This commit is contained in:
Ehouarn 2025-05-28 16:31:03 +02:00
parent 4479e8f97a
commit 02453e07ba
2 changed files with 28 additions and 27 deletions

View File

@ -39,9 +39,11 @@ class WEIRegistrationForm(forms.ModelForm):
class Meta: class Meta:
model = WEIRegistration model = WEIRegistration
fields = ['user', 'soge_credit', 'birth_date', 'gender', 'clothing_size', fields = [
'health_issues', 'emergency_contact_name', 'emergency_contact_phone', 'first_year', 'user', 'soge_credit', 'birth_date', 'gender', 'clothing_size',
'information_json'] 'health_issues', 'emergency_contact_name', 'emergency_contact_phone',
'first_year', 'information_json', 'caution_check'
]
widgets = { widgets = {
"user": Autocomplete( "user": Autocomplete(
User, User,
@ -51,8 +53,14 @@ class WEIRegistrationForm(forms.ModelForm):
'placeholder': 'Nom ...', 'placeholder': 'Nom ...',
}, },
), ),
"birth_date": DatePickerInput(options={'minDate': '1900-01-01', "birth_date": DatePickerInput(options={
'maxDate': '2100-01-01'}), 'minDate': '1900-01-01',
'maxDate': '2100-01-01'
}),
"caution_check": forms.BooleanField(
label=_("I confirm that I have read the caution and that I am aware of the risks involved."),
required=False,
),
} }

View File

@ -4,7 +4,7 @@
import os import os
import shutil import shutil
import subprocess import subprocess
from datetime import date, timedelta from datetime import date
from tempfile import mkdtemp from tempfile import mkdtemp
from django.conf import settings from django.conf import settings
@ -21,7 +21,7 @@ from django.shortcuts import redirect
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.views import View from django.views import View
from django.views.generic import DetailView, UpdateView, RedirectView, TemplateView, CreateView from django.views.generic import DetailView, UpdateView, RedirectView, TemplateView
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views.generic.edit import BaseFormView, DeleteView from django.views.generic.edit import BaseFormView, DeleteView
from django_tables2 import SingleTableView, MultiTableMixin from django_tables2 import SingleTableView, MultiTableMixin
@ -39,7 +39,6 @@ from .forms import WEIForm, WEIRegistrationForm, BusForm, BusTeamForm, WEIMember
WEIMembershipForm, CurrentSurvey WEIMembershipForm, CurrentSurvey
from .tables import BusRepartitionTable, BusTable, BusTeamTable, WEITable, WEIRegistrationTable, \ from .tables import BusRepartitionTable, BusTable, BusTeamTable, WEITable, WEIRegistrationTable, \
WEIRegistration1ATable, WEIMembershipTable WEIRegistration1ATable, WEIMembershipTable
from .forms.surveys import CurrentSurvey
class CurrentWEIDetailView(LoginRequiredMixin, RedirectView): class CurrentWEIDetailView(LoginRequiredMixin, RedirectView):
@ -443,13 +442,10 @@ class BusTeamCreateView(ProtectQuerysetMixin, ProtectedCreateView):
def get_success_url(self): def get_success_url(self):
self.object.refresh_from_db() self.object.refresh_from_db()
return reverse_lazy("wei:manage_bus_team", kwargs={"pk": self.object.pk}) return reverse_lazy("wei:manage_bus_team", kwargs={"pk": self.object.pk})
def get_template_names(self): def get_template_names(self):
names = super().get_template_names() names = super().get_template_names()
return names return names
class BusTeamUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView): class BusTeamUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
@ -482,13 +478,10 @@ class BusTeamUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
def get_success_url(self): def get_success_url(self):
self.object.refresh_from_db() self.object.refresh_from_db()
return reverse_lazy("wei:manage_bus_team", kwargs={"pk": self.object.pk}) return reverse_lazy("wei:manage_bus_team", kwargs={"pk": self.object.pk})
def get_template_names(self): def get_template_names(self):
names = super().get_template_names() names = super().get_template_names()
return names return names
class BusTeamManageView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): class BusTeamManageView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
@ -563,7 +556,7 @@ class WEIRegister1AView(ProtectQuerysetMixin, ProtectedCreateView):
def get_form(self, form_class=None): def get_form(self, form_class=None):
form = super().get_form(form_class) form = super().get_form(form_class)
form.fields["user"].initial = self.request.user form.fields["user"].initial = self.request.user
# Cacher les champs pendant l'inscription initiale # Cacher les champs pendant l'inscription initiale
if "first_year" in form.fields: if "first_year" in form.fields:
del form.fields["first_year"] del form.fields["first_year"]
@ -571,7 +564,7 @@ class WEIRegister1AView(ProtectQuerysetMixin, ProtectedCreateView):
del form.fields["caution_check"] del form.fields["caution_check"]
if "information_json" in form.fields: if "information_json" in form.fields:
del form.fields["information_json"] del form.fields["information_json"]
return form return form
@transaction.atomic @transaction.atomic
@ -797,22 +790,22 @@ class WEIUpdateRegistrationView(ProtectQuerysetMixin, LoginRequiredMixin, Update
membership = form.instance.membership membership = form.instance.membership
if membership is None: if membership is None:
raise ValueError(_("No membership found for this registration")) raise ValueError(_("No membership found for this registration"))
membership_form = self.get_membership_form(self.request.POST, instance=membership) membership_form = self.get_membership_form(self.request.POST, instance=membership)
if not membership_form.is_valid(): if not membership_form.is_valid():
return self.form_invalid(form) return self.form_invalid(form)
# Vérifier que l'utilisateur a la permission de modifier le membership # Vérifier que l'utilisateur a la permission de modifier le membership
# On vérifie d'abord si l'utilisateur a la permission générale de modification # On vérifie d'abord si l'utilisateur a la permission générale de modification
if not self.request.user.has_perm("wei.change_weimembership"): if not self.request.user.has_perm("wei.change_weimembership"):
raise PermissionDenied(_("You don't have the permission to update memberships")) raise PermissionDenied(_("You don't have the permission to update memberships"))
# On vérifie ensuite les permissions spécifiques pour chaque champ modifié # On vérifie ensuite les permissions spécifiques pour chaque champ modifié
for field_name in membership_form.changed_data: for field_name in membership_form.changed_data:
perm = f"wei.change_weimembership_{field_name}" perm = f"wei.change_weimembership_{field_name}"
if not self.request.user.has_perm(perm): if not self.request.user.has_perm(perm):
raise PermissionDenied(_("You don't have the permission to update the field %(field)s") % {'field': field_name}) raise PermissionDenied(_("You don't have the permission to update the field %(field)s") % {'field': field_name})
membership_form.save() membership_form.save()
except (WEIMembership.DoesNotExist, ValueError, PermissionDenied) as e: except (WEIMembership.DoesNotExist, ValueError, PermissionDenied) as e:
form.add_error(None, str(e)) form.add_error(None, str(e))
@ -898,7 +891,7 @@ class WEIValidateRegistrationView(ProtectQuerysetMixin, ProtectedCreateView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
registration = WEIRegistration.objects.get(pk=self.kwargs["pk"]) registration = WEIRegistration.objects.get(pk=self.kwargs["pk"])
wei = registration.wei wei = registration.wei
today = date.today() today = date.today()
# We can't validate anyone once the WEI is started and before the membership start date # We can't validate anyone once the WEI is started and before the membership start date
@ -1347,7 +1340,7 @@ class WEIAttributeBus1ANextView(LoginRequiredMixin, RedirectView):
if not wei.exists(): if not wei.exists():
raise Http404 raise Http404
wei = wei.get() wei = wei.get()
# On cherche d'abord les 1A qui ont une inscription validée (membership) mais pas de bus # On cherche d'abord les 1A qui ont une inscription validée (membership) mais pas de bus
qs = WEIRegistration.objects.filter( qs = WEIRegistration.objects.filter(
wei=wei, wei=wei,
@ -1355,14 +1348,14 @@ class WEIAttributeBus1ANextView(LoginRequiredMixin, RedirectView):
membership__isnull=False, membership__isnull=False,
membership__bus__isnull=True membership__bus__isnull=True
) )
# Parmi eux, on prend ceux qui ont répondu au questionnaire (ont un bus préféré) # Parmi eux, on prend ceux qui ont répondu au questionnaire (ont un bus préféré)
qs = qs.filter(information_json__contains='selected_bus_pk') qs = qs.filter(information_json__contains='selected_bus_pk')
if not qs.exists(): if not qs.exists():
# Si on ne trouve personne, on affiche un message et on retourne à la liste # Si on ne trouve personne, on affiche un message et on retourne à la liste
messages.info(self.request, _("No first year student without a bus found. Either all of them have a bus, or none has filled the survey yet.")) messages.info(self.request, _("No first year student without a bus found. Either all of them have a bus, or none has filled the survey yet."))
return reverse_lazy('wei:wei_1A_list', args=(wei.pk,)) return reverse_lazy('wei:wei_1A_list', args=(wei.pk,))
# On redirige vers la page d'attribution pour le premier étudiant trouvé # On redirige vers la page d'attribution pour le premier étudiant trouvé
return reverse_lazy('wei:wei_bus_1A', args=(qs.first().pk,)) return reverse_lazy('wei:wei_bus_1A', args=(qs.first().pk,))