1
0
mirror of https://gitlab.com/animath/si/plateforme.git synced 2025-06-21 20:38:24 +02:00

Implement final selection

Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
Emmy D'Anello
2024-04-07 11:40:58 +02:00
parent 7732a737bb
commit 1493df0078
15 changed files with 657 additions and 310 deletions

View File

@ -133,6 +133,28 @@ class PhotoAuthorizationForm(forms.ModelForm):
fields = ('photo_authorization',)
class PhotoAuthorizationFinalForm(forms.ModelForm):
"""
Form to send a photo authorization.
"""
def clean_photo_authorization_final(self):
if "photo_authorization_final" in self.files:
file = self.files["photo_authorization_final"]
if file.size > 2e6:
raise ValidationError(_("The uploaded file size must be under 2 Mo."))
if file.content_type not in ["application/pdf", "image/png", "image/jpeg"]:
raise ValidationError(_("The uploaded file must be a PDF, PNG of JPEG file."))
return self.cleaned_data["photo_authorization_final"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["photo_authorization_final"].widget = FileInput()
class Meta:
model = ParticipantRegistration
fields = ('photo_authorization_final',)
class HealthSheetForm(forms.ModelForm):
"""
Form to send a health sheet.
@ -199,6 +221,28 @@ class ParentalAuthorizationForm(forms.ModelForm):
fields = ('parental_authorization',)
class ParentalAuthorizationFinalForm(forms.ModelForm):
"""
Form to send a parental authorization.
"""
def clean_parental_authorization(self):
if "parental_authorization_final" in self.files:
file = self.files["parental_authorization_final"]
if file.size > 2e6:
raise ValidationError(_("The uploaded file size must be under 2 Mo."))
if file.content_type not in ["application/pdf", "image/png", "image/jpeg"]:
raise ValidationError(_("The uploaded file must be a PDF, PNG of JPEG file."))
return self.cleaned_data["parental_authorization"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["parental_authorization_final"].widget = FileInput()
class Meta:
model = StudentRegistration
fields = ('parental_authorization_final',)
class CoachRegistrationForm(forms.ModelForm):
"""
A coach can tell its professional activity.

View File

@ -0,0 +1,34 @@
# Generated by Django 5.0.3 on 2024-04-07 08:34
import registration.models
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("registration", "0012_payment_token_alter_payment_type"),
]
operations = [
migrations.AddField(
model_name="participantregistration",
name="photo_authorization_final",
field=models.FileField(
blank=True,
default="",
upload_to=registration.models.get_random_photo_filename,
verbose_name="photo authorization (final)",
),
),
migrations.AddField(
model_name="studentregistration",
name="parental_authorization_final",
field=models.FileField(
blank=True,
default="",
upload_to=registration.models.get_random_parental_filename,
verbose_name="parental authorization (final)",
),
),
]

View File

@ -210,17 +210,31 @@ class ParticipantRegistration(Registration):
default="",
)
photo_authorization_final = models.FileField(
verbose_name=_("photo authorization (final)"),
upload_to=get_random_photo_filename,
blank=True,
default="",
)
@property
def under_18(self):
if isinstance(self, CoachRegistration):
return False # In normal case
important_date = timezone.now().date()
important_date = localtime(timezone.now()).date()
if self.team and self.team.participation.tournament:
important_date = self.team.participation.tournament.date_start
if self.team.participation.final:
from participation.models import Tournament
important_date = Tournament.final_tournament().date_start
return (important_date - self.birth_date).days < 18 * 365.24
over_18_on = self.birth_date.replace(year=self.birth_date.year + 18)
return important_date < over_18_on
@property
def under_18_final(self):
if isinstance(self, CoachRegistration):
return False # In normal case
from participation.models import Tournament
important_date = Tournament.final_tournament().date_start
over_18_on = self.birth_date.replace(year=self.birth_date.year + 18)
return important_date < over_18_on
@property
def type(self): # pragma: no cover
@ -314,6 +328,13 @@ class StudentRegistration(ParticipantRegistration):
default="",
)
parental_authorization_final = models.FileField(
verbose_name=_("parental authorization (final)"),
upload_to=get_random_parental_filename,
blank=True,
default="",
)
health_sheet = models.FileField(
verbose_name=_("health sheet"),
upload_to=get_random_health_filename,

View File

@ -9,7 +9,7 @@
<div id="form-content">
<div class="alert alert-info">
{% trans "Authorization template:" %}
<a class="alert-link" href="{% url "registration:parental_authorization_template" %}?registration_id={{ object.pk }}&tournament_id={{ object.team.participation.tournament.pk }}">{% trans "Download" %}</a>
<a class="alert-link" href="{% url "registration:parental_authorization_template" %}?registration_id={{ object.pk }}&tournament_id={{ tournament.pk }}">{% trans "Download" %}</a>
</div>
{% csrf_token %}
{{ form|crispy }}

View File

@ -9,8 +9,8 @@
<div id="form-content">
<div class="alert alert-info">
{% trans "Authorization templates:" %}
<a class="alert-link" href="{% url "registration:photo_authorization_adult_template" %}?registration_id={{ object.pk }}&tournament_id={{ object.team.participation.tournament.pk }}">{% trans "Adult" %}</a>
<a class="alert-link" href="{% url "registration:photo_authorization_child_template" %}?registration_id={{ object.pk }}&tournament_id={{ object.team.participation.tournament.pk }}">{% trans "Child" %}</a>
<a class="alert-link" href="{% url "registration:photo_authorization_adult_template" %}?registration_id={{ object.pk }}&tournament_id={{ tournament.pk }}">{% trans "Adult" %}</a>
<a class="alert-link" href="{% url "registration:photo_authorization_child_template" %}?registration_id={{ object.pk }}&tournament_id={{ tournament.pk }}">{% trans "Child" %}</a>
</div>
{% csrf_token %}
{{ form|crispy }}

View File

@ -72,6 +72,16 @@
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#uploadPhotoAuthorizationModal">{% trans "Replace" %}</button>
{% endif %}
</dd>
{% if user_object.registration.team.participation.final %}
<dt class="col-sm-6 text-end">{% trans "Photo authorization (final):" %}</dt>
<dd class="col-sm-6">
{% if user_object.registration.photo_authorization_final %}
<a href="{{ user_object.registration.photo_authorization_final.url }}">{% trans "Download" %}</a>
{% endif %}
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#uploadPhotoAuthorizationFinalModal">{% trans "Replace" %}</button>
</dd>
{% endif %}
{% endif %}
{% if user_object.registration.studentregistration %}
@ -105,6 +115,16 @@
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#uploadParentalAuthorizationModal">{% trans "Replace" %}</button>
{% endif %}
</dd>
{% if user_object.registration.team.participation.final %}
<dt class="col-sm-6 text-end">{% trans "Parental authorization (final):" %}</dt>
<dd class="col-sm-6">
{% if user_object.registration.parental_authorization_final %}
<a href="{{ user_object.registration.parental_authorization_final.url }}">{% trans "Download" %}</a>
{% endif %}
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#uploadParentalAuthorizationFinalModal">{% trans "Replace" %}</button>
</dd>
{% endif %}
{% endif %}
<dt class="col-sm-6 text-end">{% trans "Student class:" %}</dt>
@ -143,11 +163,16 @@
</dl>
{% if user_object.registration.participates and user_object.registration.team.participation.valid %}
<hr>
{% for payment in user_object.registration.payments.all %}
<hr>
<dl class="row">
<dt class="col-sm-6 text-end">{% trans "Payment information:" %}</dt>
<dt class="col-sm-6 text-end">
{% if payment.final %}
{% trans "Payment information (final):" %}
{% else %}
{% trans "Payment information:" %}
{% endif %}
</dt>
<dd class="col-sm-6">
{% trans "yes,no,pending" as yesnodefault %}
{% with info=payment.additional_information %}
@ -197,25 +222,36 @@
{% url "registration:upload_user_photo_authorization" pk=user_object.registration.pk as modal_action %}
{% include "base_modal.html" with modal_id="uploadPhotoAuthorization" modal_enctype="multipart/form-data" %}
{% trans "Upload health sheet" as modal_title %}
{% trans "Upload" as modal_button %}
{% url "registration:upload_user_health_sheet" pk=user_object.registration.pk as modal_action %}
{% include "base_modal.html" with modal_id="uploadHealthSheet" modal_enctype="multipart/form-data" %}
{% if user_object.registration.under_18 %}
{% trans "Upload health sheet" as modal_title %}
{% trans "Upload" as modal_button %}
{% url "registration:upload_user_health_sheet" pk=user_object.registration.pk as modal_action %}
{% include "base_modal.html" with modal_id="uploadHealthSheet" modal_enctype="multipart/form-data" %}
{% trans "Upload vaccine sheet" as modal_title %}
{% trans "Upload" as modal_button %}
{% url "registration:upload_user_vaccine_sheet" pk=user_object.registration.pk as modal_action %}
{% include "base_modal.html" with modal_id="uploadVaccineSheet" modal_enctype="multipart/form-data" %}
{% trans "Upload vaccine sheet" as modal_title %}
{% trans "Upload" as modal_button %}
{% url "registration:upload_user_vaccine_sheet" pk=user_object.registration.pk as modal_action %}
{% include "base_modal.html" with modal_id="uploadVaccineSheet" modal_enctype="multipart/form-data" %}
{% trans "Upload parental authorization" as modal_title %}
{% trans "Upload" as modal_button %}
{% url "registration:upload_user_parental_authorization" pk=user_object.registration.pk as modal_action %}
{% include "base_modal.html" with modal_id="uploadParentalAuthorization" modal_enctype="multipart/form-data" %}
{% trans "Upload parental authorization" as modal_title %}
{% trans "Upload" as modal_button %}
{% url "registration:upload_user_parental_authorization" pk=user_object.registration.pk as modal_action %}
{% include "base_modal.html" with modal_id="uploadParentalAuthorization" modal_enctype="multipart/form-data" %}
{% endif %}
{% endif %}
{% trans "Upload parental authorization" as modal_title %}
{% if user_object.registration.team.participation.final %}
{% trans "Upload photo authorization (final)" as modal_title %}
{% trans "Upload" as modal_button %}
{% url "registration:upload_user_parental_authorization" pk=user_object.registration.pk as modal_action %}
{% include "base_modal.html" with modal_id="uploadParentalAuthorization" modal_enctype="multipart/form-data" %}
{% url "registration:upload_user_photo_authorization_final" pk=user_object.registration.pk as modal_action %}
{% include "base_modal.html" with modal_id="uploadPhotoAuthorizationFinal" modal_enctype="multipart/form-data" %}
{% if user_object.registration.under_18_final %}
{% trans "Upload parental authorization (final)" as modal_title %}
{% trans "Upload" as modal_button %}
{% url "registration:upload_user_parental_authorization_final" pk=user_object.registration.pk as modal_action %}
{% include "base_modal.html" with modal_id="uploadParentalAuthorizationFinal" modal_enctype="multipart/form-data" %}
{% endif %}
{% endif %}
{% endblock %}
@ -224,9 +260,18 @@
document.addEventListener('DOMContentLoaded', () => {
{% if user_object.registration.team and not user_object.registration.team.participation.valid %}
initModal("uploadPhotoAuthorization", "{% url "registration:upload_user_photo_authorization" pk=user_object.registration.pk %}")
initModal("uploadHealthSheet", "{% url "registration:upload_user_health_sheet" pk=user_object.registration.pk %}")
initModal("uploadVaccineSheet", "{% url "registration:upload_user_vaccine_sheet" pk=user_object.registration.pk %}")
initModal("uploadParentalAuthorization", "{% url "registration:upload_user_parental_authorization" pk=user_object.registration.pk %}")
{% if user_object.registration.under_18 %}
initModal("uploadHealthSheet", "{% url "registration:upload_user_health_sheet" pk=user_object.registration.pk %}")
initModal("uploadVaccineSheet", "{% url "registration:upload_user_vaccine_sheet" pk=user_object.registration.pk %}")
initModal("uploadParentalAuthorization", "{% url "registration:upload_user_parental_authorization" pk=user_object.registration.pk %}")
{% endif %}
{% endif %}
{% if user_object.registration.team.participation.final %}
initModal("uploadPhotoAuthorizationFinal", "{% url "registration:upload_user_photo_authorization_final" pk=user_object.registration.pk %}")
{% if user_object.registration.under_18_final %}
initModal("uploadParentalAuthorizationFinal", "{% url "registration:upload_user_parental_authorization_final" pk=user_object.registration.pk %}")
{% endif %}
{% endif %}
});
</script>

View File

@ -24,6 +24,8 @@ urlpatterns = [
path("user/<int:pk>/update/", UserUpdateView.as_view(), name="update_user"),
path("user/<int:pk>/upload-photo-authorization/", UserUploadPhotoAuthorizationView.as_view(),
name="upload_user_photo_authorization"),
path("user/<int:pk>/upload-photo-authorization/final/", UserUploadPhotoAuthorizationView.as_view(),
name="upload_user_photo_authorization_final"),
path("parental-authorization-template/", ParentalAuthorizationTemplateView.as_view(),
name="parental_authorization_template"),
path("photo-authorization-template/adult/", AdultPhotoAuthorizationTemplateView.as_view(),
@ -37,6 +39,8 @@ urlpatterns = [
name="upload_user_vaccine_sheet"),
path("user/<int:pk>/upload-parental-authorization/", UserUploadParentalAuthorizationView.as_view(),
name="upload_user_parental_authorization"),
path("user/<int:pk>/upload-parental-authorization/final/", UserUploadParentalAuthorizationView.as_view(),
name="upload_user_parental_authorization_final"),
path("update-payment/<int:pk>/", PaymentUpdateView.as_view(), name="update_payment"),
path("update-payment/<int:pk>/toggle-group-mode/", PaymentUpdateGroupView.as_view(),
name="update_payment_group_mode"),

View File

@ -1,5 +1,6 @@
# Copyright (C) 2020 by Animath
# SPDX-License-Identifier: GPL-3.0-or-later
import json
import os
import subprocess
@ -29,8 +30,9 @@ from participation.models import Passage, Solution, Synthesis, Tournament
from tfjm.tokens import email_validation_token
from tfjm.views import UserMixin, UserRegistrationMixin, VolunteerMixin
from .forms import AddOrganizerForm, CoachRegistrationForm, HealthSheetForm, ParentalAuthorizationForm, \
PaymentAdminForm, PaymentForm, PhotoAuthorizationForm, SignupForm, StudentRegistrationForm, UserForm, \
from .forms import AddOrganizerForm, CoachRegistrationForm, HealthSheetForm, \
PhotoAuthorizationFinalForm, ParentalAuthorizationForm, PaymentAdminForm, PaymentForm, \
ParentalAuthorizationFinalForm, PhotoAuthorizationForm, SignupForm, StudentRegistrationForm, UserForm, \
VaccineSheetForm, VolunteerRegistrationForm
from .models import ParticipantRegistration, Payment, Registration, StudentRegistration
from .tables import RegistrationTable
@ -311,15 +313,27 @@ class UserUploadPhotoAuthorizationView(UserRegistrationMixin, UpdateView):
A participant can send its photo authorization.
"""
model = ParticipantRegistration
form_class = PhotoAuthorizationForm
template_name = "registration/upload_photo_authorization.html"
extra_context = dict(title=_("Upload photo authorization"))
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if self.object.team:
tournament = self.object.team.participation.tournament \
if 'final' not in self.request.path else Tournament.final_tournament()
context["tournament"] = tournament
return context
def get_form_class(self):
return PhotoAuthorizationForm if 'final' not in self.request.path else PhotoAuthorizationFinalForm
@transaction.atomic
def form_valid(self, form):
old_instance = ParticipantRegistration.objects.get(pk=self.object.pk)
if old_instance.photo_authorization:
old_instance.photo_authorization.delete()
old_instance: ParticipantRegistration = ParticipantRegistration.objects.get(pk=self.object.pk)
old_field = old_instance.photo_authorization \
if 'final' not in self.request.path else old_instance.photo_authorization_final
if old_field:
old_field.delete()
old_instance.save()
return super().form_valid(form)
@ -374,15 +388,27 @@ class UserUploadParentalAuthorizationView(UserRegistrationMixin, UpdateView):
A participant can send its parental authorization.
"""
model = StudentRegistration
form_class = ParentalAuthorizationForm
template_name = "registration/upload_parental_authorization.html"
extra_context = dict(title=_("Upload parental authorization"))
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if self.object.team:
tournament = self.object.team.participation.tournament \
if 'final' not in self.request.path else Tournament.final_tournament()
context["tournament"] = tournament
return context
def get_form_class(self):
return ParentalAuthorizationForm if 'final' not in self.request.path else ParentalAuthorizationFinalForm
@transaction.atomic
def form_valid(self, form):
old_instance = StudentRegistration.objects.get(pk=self.object.pk)
if old_instance.parental_authorization:
old_instance.parental_authorization.delete()
old_instance: StudentRegistration = StudentRegistration.objects.get(pk=self.object.pk)
old_field = old_instance.parental_authorization \
if 'final' not in self.request.path else old_instance.parental_authorization_final
if old_field:
old_field.delete()
old_instance.save()
return super().form_valid(form)
@ -666,7 +692,8 @@ class PhotoAuthorizationView(LoginRequiredMixin, View):
path = f"media/authorization/photo/{filename}"
if not os.path.exists(path):
raise Http404
student = ParticipantRegistration.objects.get(photo_authorization__endswith=filename)
student = ParticipantRegistration.objects.get(Q(photo_authorization__endswith=filename)
| Q(photo_authorization_final__endswith=filename))
user = request.user
if not (student.user == user or user.registration.is_admin or user.registration.is_volunteer and student.team
and student.team.participation.tournament in user.registration.organized_tournaments.all()):
@ -738,7 +765,8 @@ class ParentalAuthorizationView(LoginRequiredMixin, View):
path = f"media/authorization/parental/{filename}"
if not os.path.exists(path):
raise Http404
student = StudentRegistration.objects.get(parental_authorization__endswith=filename)
student = StudentRegistration.objects.get(Q(parental_authorization__endswith=filename)
| Q(parental_authorization_final__endswith=filename))
user = request.user
if not (student.user == user or user.registration.is_admin or user.registration.is_volunteer and student.team
and student.team.participation.tournament in user.registration.organized_tournaments.all()):