# Copyright (C) 2020 by Animath # SPDX-License-Identifier: GPL-3.0-or-later from django import forms from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User from django.core.exceptions import ValidationError from django.forms import FileInput from django.utils.translation import gettext_lazy as _ from .models import CoachRegistration, ParticipantRegistration, Payment, \ StudentRegistration, VolunteerRegistration class SignupForm(UserCreationForm): """ Signup form to registers participants and coaches They can choose the role at the registration. """ role = forms.ChoiceField( label=lambda: _("role").capitalize(), choices=lambda: [ ("participant", _("participant").capitalize()), ("coach", _("coach").capitalize()), ], ) def clean_email(self): """ Ensure that the email address is unique. """ email = self.data["email"] if User.objects.filter(email=email).exists(): self.add_error("email", _("This email address is already used.")) return email def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["first_name"].required = True self.fields["last_name"].required = True self.fields["email"].required = True class Meta: model = User fields = ('first_name', 'last_name', 'email', 'password1', 'password2', 'role',) class AddOrganizerForm(forms.ModelForm): """ Signup form to registers volunteers """ def clean_email(self): """ Ensure that the email address is unique. """ email = self.data["email"] if User.objects.filter(email=email).exists(): self.add_error("email", _("This email address is already used.")) return email def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["first_name"].required = True self.fields["last_name"].required = True self.fields["email"].required = True class Meta: model = User fields = ('first_name', 'last_name', 'email',) class UserForm(forms.ModelForm): """ Replace the default user form to require the first name, last name and the email. The username is always equal to the email. """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["first_name"].required = True self.fields["last_name"].required = True self.fields["email"].required = True class Meta: model = User fields = ('first_name', 'last_name', 'email',) class StudentRegistrationForm(forms.ModelForm): """ A student can update its class, its school and if it allows Animath to contact him/her later. """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["birth_date"].widget = forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d') class Meta: model = StudentRegistration fields = ('team', 'student_class', 'birth_date', 'gender', 'address', 'zip_code', 'city', 'phone_number', 'health_issues', 'school', 'responsible_name', 'responsible_phone', 'responsible_email', 'give_contact_to_animath', 'email_confirmed',) class PhotoAuthorizationForm(forms.ModelForm): """ Form to send a photo authorization. """ def clean_photo_authorization(self): if "photo_authorization" in self.files: file = self.files["photo_authorization"] 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"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["photo_authorization"].widget = FileInput() class Meta: model = ParticipantRegistration fields = ('photo_authorization',) class HealthSheetForm(forms.ModelForm): """ Form to send a health sheet. """ def clean_health_sheet(self): if "health_sheet" in self.files: file = self.files["health_sheet"] 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["health_sheet"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["health_sheet"].widget = FileInput() class Meta: model = StudentRegistration fields = ('health_sheet',) class ParentalAuthorizationForm(forms.ModelForm): """ Form to send a parental authorization. """ def clean_parental_authorization(self): if "parental_authorization" in self.files: file = self.files["parental_authorization"] 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"].widget = FileInput() class Meta: model = StudentRegistration fields = ('parental_authorization',) class CoachRegistrationForm(forms.ModelForm): """ A coach can tell its professional activity. """ class Meta: model = CoachRegistration fields = ('team', 'gender', 'address', 'zip_code', 'city', 'phone_number', 'health_issues', 'professional_activity', 'give_contact_to_animath', 'email_confirmed',) class VolunteerRegistrationForm(forms.ModelForm): """ A volunteer can also tell its professional activity. """ class Meta: model = VolunteerRegistration fields = ('professional_activity', 'admin', 'give_contact_to_animath', 'email_confirmed',) class PaymentForm(forms.ModelForm): """ Indicate payment information """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["valid"].widget.choices[0] = ('unknown', _("Pending")) def clean_scholarship_file(self): if "scholarship_file" in self.files: file = self.files["scholarship_file"] 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["scholarship_file"] def clean(self): cleaned_data = super().clean() if "type" in cleaned_data and cleaned_data["type"] == "scholarship" \ and "scholarship_file" not in cleaned_data and not self.instance.scholarship_file: self.add_error("scholarship_file", _("You must upload your scholarship attestation.")) return cleaned_data class Meta: model = Payment fields = ('type', 'scholarship_file', 'additional_information', 'valid',)