diff --git a/djangoLxp/urls.py b/djangoLxp/urls.py index 4f50bb4..fc150c3 100644 --- a/djangoLxp/urls.py +++ b/djangoLxp/urls.py @@ -11,4 +11,5 @@ url('^commune/$', AutocompleteCommune.as_view(model=Commune), name='commune'), url('^pays/$', AutocompletePays.as_view(), name='pays'), url('^departement/$', AutocompleteDepartement.as_view(), name='departement'), + url('^mee/$', AutocompleteMEE.as_view(), name='mee'), ] \ No newline at end of file diff --git a/inscription/admin.py b/inscription/admin.py index 4f01dd0..b8c06f1 100644 --- a/inscription/admin.py +++ b/inscription/admin.py @@ -1,6 +1,10 @@ from django.contrib import admin -from .models import BaseEleve, Departement, Commune +from .models import BaseEleve, MEE, Allergie, Spe, TroubleCognitif + # Register your models here. admin.site.register(BaseEleve) -admin.site.register(Departement) -admin.site.register(Commune) +admin.site.register(MEE) +admin.site.register(Allergie) +admin.site.register(TroubleCognitif) +admin.site.register(Spe) + diff --git a/inscription/forms.py b/inscription/forms.py index a80dfd6..8e4e674 100644 --- a/inscription/forms.py +++ b/inscription/forms.py @@ -258,8 +258,11 @@ def __init__(self, *args, **kwargs): Field('allergie', id='allergie'), FieldWithButtons('ajout_allergie', StrictButton('Enregistrer', id='allergie-btn', css_class='btn-outline-success', onclick="ajoutAllergie()")), - InlineCheckboxes('dys'), - + Field('nouvelle', id='nouvelle', wrapper_class="custom-control custom-switch custom-switch-lg", + template='inscription/custom-field.html'), + 'niveau_an_passe', + 'gb_an_passe', + 'ecco_an_passe', ) class Media: @@ -271,7 +274,29 @@ class Media: class Meta: # Définis le modèle utilisé et des données à enregistrer model = BaseEleve - fields = ['allergie', 'dys'] + fields = ['allergie', 'dys', 'nouvelle', 'niveau_an_passe', 'gb_an_passe', 'ecco_an_passe'] + widgets = { + 'ecco_an_passe': autocomplete.ModelSelect2(url='mee', + forward=('gb_an_passe',)), + } + + def clean(self): + nouvelle = self.cleaned_data.get('nouvelle') + if nouvelle: + self.cleaned_data['ecco_an_passe'] = None + self.cleaned_data['gb_an_passe'] = None + self.cleaned_data['niveau_an_passe'] = None + else: + if not self.cleaned_data.get('ecco_an_passe'): + msg = forms.ValidationError("Indique ton MEE de groupe ECCO de l'an passé.") + self.add_error('ecco_an_passe', msg) + if not self.cleaned_data.get('gb_an_passe'): + msg = forms.ValidationError("Indique ton groupe de base de l'an passé.") + self.add_error('gb_an_passe', msg) + if not self.cleaned_data.get('niveau_an_passe'): + msg = forms.ValidationError("Indique le niveau dans lequel tu étais inscrit l'an passé.") + self.add_error('niveau_an_passe', msg) + return self.cleaned_data class InscriptionForm4(forms.ModelForm): diff --git a/inscription/models.py b/inscription/models.py index c790936..1d5e165 100644 --- a/inscription/models.py +++ b/inscription/models.py @@ -4,6 +4,13 @@ from phonenumber_field.modelfields import PhoneNumberField from .utils import nom_photo, create_hash +GB = ( + (1, 'G1'), + (2, 'G2'), + (3, 'G3'), + (4, 'G4'), + (5, 'G5'), +) class Spe(models.Model): code = models.CharField(max_length=10, verbose_name="Code Spé") @@ -75,6 +82,20 @@ def __str__(self): return '%s' % self.allergene +class MEE(models.Model): + nom = models.CharField(max_length=20, verbose_name="Nom") + prenom = models.CharField(max_length=20, verbose_name="Prénom") + gb_an_passe = models.IntegerField(choices=GB, + verbose_name="GB de l'an passé", blank=True, null=True) + gb_annee_en_cours = models.IntegerField(choices=GB, + verbose_name="GB de cette année", blank=True, null=True) + email = models.EmailField(verbose_name="Email", max_length=30, blank=True, null=True) + telephone = PhoneNumberField(verbose_name="Téléphone", blank=True, null=True) + + def __str__(self): + return '%s' % self.prenom + + class BaseEleve(models.Model): """ Modèle de base de donnée BaseEleve @@ -162,3 +183,14 @@ def __iter__(self): # Scolarité passée dys = models.ManyToManyField(TroubleCognitif, verbose_name="Troubles de l'apprentissage") allergie = models.ManyToManyField(Allergie, verbose_name="Allergies") + + nouvelle = models.BooleanField(verbose_name='Première inscription au LXP', default=True) + niveau_an_passe = models.CharField(max_length=10, choices=NIVEAU, + verbose_name="Niveau d'inscription l'an passé", blank=True, null=True) + gb_an_passe = models.IntegerField(choices=GB, + verbose_name="Groupe de base", blank=True, null=True) + ecco_an_passe = models.ForeignKey(MEE, on_delete=models.CASCADE, + verbose_name="MEE d'ECCO", blank=True, null=True) + + gb_annee_en_cours = models.IntegerField(choices=GB, + verbose_name="Groupe de base", blank=True, null=True) \ No newline at end of file diff --git a/inscription/views.py b/inscription/views.py index 21ed183..8497934 100644 --- a/inscription/views.py +++ b/inscription/views.py @@ -19,8 +19,7 @@ from djangoLxp import settings from .filters import ListeEleveFiltre # Base BaseEleve -from .models import BaseEleve, Pays, Departement, Allergie, TroubleCognitif -# Tableau des inscrits +from .models import BaseEleve, Pays, Departement, Allergie, TroubleCognitif, MEE from .tables import ListeEleveTableau # Une vue pour afficher les inscriptions filtées from .utils import PagedFilteredTableView, MediaStorage, coordonnees @@ -163,4 +162,15 @@ def get_queryset(self): qs = Pays.objects.all().order_by('name') if self.q: qs = qs.filter(name__istartswith=self.q) + return qs + + +class AutocompleteMEE(autocomplete.Select2QuerySetView): + def get_queryset(self): + qs = MEE.objects.all().order_by('prenom') + gb = self.forwarded.get('gb_an_passe', None) + if gb: + qs = qs.filter(gb_an_passe=gb) + if self.q: + qs = qs.filter(prenom__istartswith=self.q) return qs \ No newline at end of file diff --git a/static/css/formulaire_inscription.css b/static/css/formulaire_inscription.css index 7c4e793..0139927 100644 --- a/static/css/formulaire_inscription.css +++ b/static/css/formulaire_inscription.css @@ -80,7 +80,9 @@ .asteriskField { display: none; } - +input#nouvelle.checkboxinput.custom-control-input { + margin-left: 50px; +} /* Customisation des checkboxes (alergie, dys...)*/ .custom-control.custom-checkbox { display: inline-block; @@ -95,4 +97,25 @@ fieldset { margin: 0 0 30px 0; border: 1px solid #515151; border-radius: 10px; +} + +.custom-switch.custom-switch-lg .custom-control-label { + padding-left: 3rem; + padding-bottom: 2rem; +} + +.custom-switch.custom-switch-lg .custom-control-label::before { + height: 2rem; + width: calc(3rem + 0.75rem); + border-radius: 4rem; +} + +.custom-switch.custom-switch-lg .custom-control-label::after { + width: calc(2rem - 4px); + height: calc(2rem - 4px); + border-radius: calc(3rem - (2rem / 2)); +} + +.custom-switch.custom-switch-lg .custom-control-input:checked ~ .custom-control-label::after { + transform: translateX(calc(2rem - 0.25rem)); } \ No newline at end of file diff --git a/static/js/hide_lxp_an_passe.js b/static/js/hide_lxp_an_passe.js new file mode 100644 index 0000000..afe4381 --- /dev/null +++ b/static/js/hide_lxp_an_passe.js @@ -0,0 +1,21 @@ +// Fonction permettant de cacher les champs inutiles du resp2 +function Hide() { + if(document.getElementById('nouvelle').checked) { + document.getElementById('div_id_2-niveau_an_passe').style.display = 'none'; + document.getElementById('div_id_2-gb_an_passe').style.display = 'none'; + document.getElementById('div_id_2-ecco_an_passe').style.display = 'none'; + } else { + document.getElementById('div_id_2-niveau_an_passe').style.display = ''; + document.getElementById('div_id_2-gb_an_passe').style.display = ''; + document.getElementById('div_id_2-ecco_an_passe').style.display = ''; + } +} +// Vérifie id_1-resp2 est à aucun (fonction Hide) après le chargement du document. +// Utile lors du retour en arrière dans le formulaire +document.addEventListener("DOMContentLoaded", function() { + Hide(); +}); +// Appelle la fonction quand on change le statut de resp2 +window.onload = function() { + document.getElementById('nouvelle').onchange = Hide; +}; \ No newline at end of file diff --git a/templates/inscription/custom-field.html b/templates/inscription/custom-field.html new file mode 100644 index 0000000..9886134 --- /dev/null +++ b/templates/inscription/custom-field.html @@ -0,0 +1,34 @@ +{% load crispy_forms_field %} +
+ {% if field.label and form_show_labels %} + {# not field|is_radioselect in row below can be removed once Django 3.2 is no longer supported #} + + {% endif %} +
+ + {% if field|is_checkbox and form_show_labels %} + {%if use_custom_control%} + {% if field.errors %} + {% crispy_field field 'class' 'custom-control-input is-invalid' %} + {% else %} + {% crispy_field field 'class' 'custom-control-input' %} + {% endif %} + {% else %} + {% if field.errors %} + {% crispy_field field 'class' 'form-check-input is-invalid' %} + {% else %} + {% crispy_field field 'class' 'form-check-input' %} + {% endif %} + {% endif %} + + {% include 'bootstrap4/layout/help_text_and_errors.html' %} + {% endif %} + +
+ +
+