diff --git a/inscription/forms.py b/inscription/forms.py index 3e52911..0201521 100644 --- a/inscription/forms.py +++ b/inscription/forms.py @@ -2,7 +2,9 @@ from django.utils.translation import gettext_lazy as _ from crispy_forms.bootstrap import FormActions, InlineField, InlineCheckboxes from crispy_forms.helper import FormHelper -from crispy_forms.layout import Div, Fieldset, Layout, Submit, Column, Field, HTML +from crispy_forms.layout import Div, Fieldset, Layout, Submit, Column, Field, HTML, MultiField + +import inscription.models from .models import BaseEleve from .utils import CaptchaWizardField # Pour l'autocomplétion de la commune en fonction du département choisi @@ -218,6 +220,7 @@ class Media: 'screen': ('css/custom-dark.css',), } + class InscriptionForm3(forms.ModelForm): name = 'Scolarité' @@ -244,7 +247,8 @@ class InscriptionForm4(forms.ModelForm): # Ajout des champs supplémentaires au modèle # captcha captcha = CaptchaWizardField() - + confirm = forms.BooleanField(label="Je comprends et accepte que mes spécialités aient lieu en même temps", + required=False, widget=forms.HiddenInput) def __init__(self, *args, **kwargs): """ Surcharge de l'initialisation du formulaire @@ -267,18 +271,87 @@ def __init__(self, *args, **kwargs): # Liste des champs à afficher dont les champs supplémentaires 'comments', 'niveau', - Div( - HTML(""""""), - Div( - Field('spe1', wrapper_class='col'), - Field('spe2', wrapper_class='col'), - Field('spe3', wrapper_class='col'), - css_class='row'), - css_id='champ-spe'), + Fieldset( + #HTML(""""""), + 'Spécialités', + Field('spe1', wrapper_class='col-4'), + Field('spe2', wrapper_class='col-4'), + Field('spe3', wrapper_class='col-4'), + css_class='row', css_id='champ-spe'), + 'confirm', InlineCheckboxes('dys'), 'captcha', ) + def check_spe(self,spes): + if spes is not None: + if len(spes) < 2: + return False + else: + list_type = [] + for spe in spes: + if inscription.models.Spe.objects.filter(intitule=spe).values_list('type', flat=True).first() is not None: + list_type.append(inscription.models.Spe.objects.filter(intitule=spe).values_list('type', flat=True).first()) + for elem in list_type: + if list_type.count(elem) > 1: + return True + return False + + def clean(self): + niveau = self.cleaned_data.get('niveau') + confirm = self.cleaned_data.get('confirm') + groupe_spe = ['spe1', 'spe2', 'spe3'] + spe1 = self.cleaned_data.get('spe1') + spe2 = self.cleaned_data.get('spe2') + spe3 = self.cleaned_data.get('spe3') + if niveau == 'crepa' or niveau == 'deter' : + self.cleaned_data['spe1'] = None + self.cleaned_data['spe2'] = None + self.cleaned_data['spe3'] = None + elif niveau == 'premiere' : + if len(spe1)+len(spe2)+len(spe3) == 3: + if len(spe1) ==1 and len(spe2) == 1 and len(spe3) == 1: + return self.cleaned_data + else: + for spe in groupe_spe: + if self.check_spe(self.cleaned_data.get(spe)): + msg = forms.ValidationError("Vous ne pouvez-pas prendre 2 spé du même type (arts et langues).") + self.add_error(spe, msg) + return + if not confirm: + msg = forms.ValidationError("Il est fortement déconseillé de choisir 2 spés dans la même colonne. Ces 2 spés auront systématiquement lieux en même temps. Ne faire ce choix qu'après discussion avec un·e membre de l'équipe éducative.") + self.fields['confirm'].widget = forms.CheckboxInput() + self.fields['confirm'].required = True + self.add_error('confirm', msg) + else: + return self.cleaned_data + else: + msg = forms.ValidationError("Vous devez choisir 3 spécialités.") + self.add_error('spe1', msg) + self.add_error('spe2', msg) + self.add_error('spe3', msg) + else: + if len(spe1)+len(spe2)+len(spe3) == 2: + if len(spe1) > 1 or len(spe2) > 1 or len(spe3) > 1: + for spe in groupe_spe: + if self.check_spe(self.cleaned_data.get(spe)): + msg = forms.ValidationError("Vous ne pouvez-pas prendre 2 spé du même type (arts et langues).") + self.add_error(spe, msg) + return + if not confirm: + msg = forms.ValidationError("Il est fortement déconseillé de choisir 2 spés dans la même colonne. Ces 2 spés auront systématiquement lieux en même temps. Ne faire ce choix qu'après discussion avec un·e membre de l'équipe éducative.") + self.fields['confirm'].widget = forms.CheckboxInput() + self.fields['confirm'].required = True + self.add_error('confirm', msg) + else: + return self.cleaned_data + else: + msg = forms.ValidationError("Vous devez choisir 2 spécialités.") + self.add_error('spe1', msg) + self.add_error('spe2', msg) + self.add_error('spe3', msg) + + class Meta: # Définis le modèle utilisé et des données à enregistrer model = BaseEleve @@ -287,4 +360,5 @@ class Meta: ] class Media: + pass js = ('js/form4.js',) \ No newline at end of file