diff --git a/djangoLxp/urls.py b/djangoLxp/urls.py index 569ea43..2dd1d3a 100644 --- a/djangoLxp/urls.py +++ b/djangoLxp/urls.py @@ -2,7 +2,7 @@ from django.contrib import admin from django.urls import re_path as url from inscription.models import Commune -from inscription.views import AutocompleteCommune, AutocompletePays, AutocompleteDepartement +from inscription.views import AutocompleteCommune, AutocompletePays, AutocompleteDepartement, ajout_allergie urlpatterns = [ path('admin/', admin.site.urls), @@ -11,6 +11,7 @@ url('^linked_data/$', AutocompleteCommune.as_view(model=Commune), name='linked_data'), url('^pays/$', AutocompletePays.as_view(), name='pays'), url('^departement/$', AutocompleteDepartement.as_view(), name='departement'), + path('allergie', ajout_allergie, name='allergie'), ] \ No newline at end of file diff --git a/inscription/forms.py b/inscription/forms.py index f62652a..615520c 100644 --- a/inscription/forms.py +++ b/inscription/forms.py @@ -1,11 +1,11 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from crispy_forms.bootstrap import FormActions, InlineField, InlineCheckboxes +from crispy_forms.bootstrap import FormActions, InlineField, InlineCheckboxes, FieldWithButtons, StrictButton from crispy_forms.helper import FormHelper -from crispy_forms.layout import Div, Fieldset, Layout, Submit, Column, Field, HTML, MultiField +from crispy_forms.layout import Div, Fieldset, Layout, Submit, Field import inscription.models -from .models import BaseEleve +from .models import BaseEleve, Allergie from .utils import CaptchaWizardField # Pour l'autocomplétion de la commune en fonction du département choisi from dal import autocomplete @@ -53,6 +53,7 @@ class InscriptionForm1(forms.ModelForm): name = 'Identité' # mail de confirmation confirmation_email = forms.EmailField(label="Confirmation de l'email", required=False) + def __init__(self, *args, **kwargs): """ Surcharge de l'initialisation du formulaire @@ -224,6 +225,12 @@ class Media: class InscriptionForm3(forms.ModelForm): name = 'Scolarité' + ajout_allergie = forms.CharField(label="Ajouter une allergie", required=False) + allergie = forms.ModelMultipleChoiceField( + queryset=Allergie.objects.all(), + widget=forms.CheckboxSelectMultiple, + required=False + ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -234,13 +241,19 @@ def __init__(self, *args, **kwargs): self.helper.form_id = 'BaseEleve-form' # Largeur des labels et des champs sur la grille self.helper.label_class = 'col-md-4' - self.helper.field_class = 'col-md-6' - self.helper.layout = Layout() + self.helper.field_class = 'col-md-8 d-flex flex-wrap justify-content-between' + self.helper.layout = Layout( + Field('allergie', id='allergie'), + FieldWithButtons('ajout_allergie', StrictButton('Enregistrer', id='allergie-btn', css_class='btn-outline-success', + onclick="ajoutAllergie()")), + InlineCheckboxes('dys'), + + ) class Meta: # Définis le modèle utilisé et des données à enregistrer model = BaseEleve - fields = [] + fields = ['allergie', 'dys'] class InscriptionForm4(forms.ModelForm): @@ -280,7 +293,6 @@ def __init__(self, *args, **kwargs): Field('spe3', wrapper_class='col-4'), css_class='row', css_id='champ-spe'), 'confirm', - InlineCheckboxes('dys'), 'captcha', ) @@ -357,7 +369,7 @@ class Meta: # Définis le modèle utilisé et des données à enregistrer model = BaseEleve fields = [ - 'comments', 'dys','spe1', 'spe2', 'spe3','niveau', + 'comments','spe1', 'spe2', 'spe3','niveau', ] class Media: diff --git a/inscription/models.py b/inscription/models.py index 822cea5..63a8476 100644 --- a/inscription/models.py +++ b/inscription/models.py @@ -61,6 +61,13 @@ def __str__(self): return u'%s' % (self.name) +class Allergie(models.Model): + allergene = models.CharField(max_length=100) + + def __str__(self): + return '%s' % self.allergene + + class BaseEleve(models.Model): """ Modèle de base de donnée BaseEleve @@ -116,7 +123,7 @@ def __iter__(self): ('aucun', 'Aucun') ) resp1 = models.CharField(max_length=5, choices=RESP1, - default='mere', verbose_name="Responsable 1") + default='mere', verbose_name="Lien de parenté") nom_resp1 = models.CharField(max_length=255, verbose_name="Nom de famille") prenom_resp1 = models.CharField(max_length=255, verbose_name="Prénom") adresse_resp1 = AddressField(verbose_name="Adresse", related_name='resp1') @@ -125,7 +132,7 @@ def __iter__(self): sociopro_resp1 = models.ForeignKey(Sociopro, related_name='resp1', on_delete=models.CASCADE, verbose_name="Profession") resp2 = models.CharField(max_length=5, choices=RESP2, - default='pere', verbose_name="Responsable 2") + default='pere', verbose_name="Lien de parenté") nom_resp2 = models.CharField(max_length=255, verbose_name="Nom de famille", blank=True, null=True) prenom_resp2 = models.CharField(max_length=255, verbose_name="Prénom", blank=True, null=True) adresse_resp2 = AddressField(verbose_name="Adresse", related_name='resp2', blank=True, null=True) @@ -141,6 +148,7 @@ def __iter__(self): ('DO', 'Dysorthographie') ) dys = MultiSelectField(choices=DYS, verbose_name='Troubles cognitifs', blank=True, null=True) + allergie = models.ManyToManyField(Allergie, blank=True, null=True) spe1 = models.ManyToManyField(Spe, limit_choices_to={'groupe': '1'}, blank=True, related_name='spe1') spe2 = models.ManyToManyField(Spe, limit_choices_to={'groupe': '2'}, blank=True, related_name='spe2') spe3 = models.ManyToManyField(Spe, limit_choices_to={'groupe': '3'}, blank=True, related_name='spe3') diff --git a/inscription/views.py b/inscription/views.py index 0ed679c..2c62bf8 100644 --- a/inscription/views.py +++ b/inscription/views.py @@ -19,7 +19,7 @@ from djangoLxp import settings from .filters import ListeEleveFiltre # Base BaseEleve -from .models import BaseEleve, Pays, Departement +from .models import BaseEleve, Pays, Departement, Allergie # Tableau des inscrits from .tables import ListeEleveTableau # Une vue pour afficher les inscriptions filtées @@ -64,24 +64,28 @@ def fiche_pdf(request, **kwargs): return response -# -# Vue du formulaire wizard, cad en plusieurs étapes -# - -# Liste des formulaires à inclure dans le wizard -form_list = [InscriptionForm1, InscriptionForm2, InscriptionForm3, InscriptionForm4] +def ajout_allergie(request): + """Une vue pour ajouter une allergie en jquery depuis le formulaire Wizard""" + if request.POST: + p, created = Allergie.objects.get_or_create( + allergene=request.POST.get('allergene').capitalize(), + ) + return HttpResponse('success') class FormulaireInscription(SessionWizardView): """ Vue du formulaire wizard (en plusieurs étapes) """ + # Liste des formulaires à inclure dans le wizard + form_list = [InscriptionForm1, InscriptionForm2, InscriptionForm3, InscriptionForm4] template_name = 'inscription/formulaire_inscription.html' instance = None if settings.USE_S3: file_storage = MediaStorage(location='tmp') else: file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, 'tmp')) + def get_form_instance(self, step): """Connection du wizard à une instance de la base de donnée Soit nouvelle, soit existante à partir de l' id envoyé en kwargs, par l'entrée url.py : @@ -102,8 +106,6 @@ def done(self, form_list, **kwargs): # On sauvegarde les données self.instance.save() # On redirige vers le PDF - #url = reverse('inscription:pdf', kwargs={'id': self.instance.id, 'hash': self.instance.hash}) - # On redirige vers la fiche html url = reverse('inscription:pdf', kwargs={'id': self.instance.id, 'hash': self.instance.hash}) return HttpResponseRedirect(url) diff --git a/static/css/formulaire_inscription.css b/static/css/formulaire_inscription.css index 9e47a57..ed4aca3 100644 --- a/static/css/formulaire_inscription.css +++ b/static/css/formulaire_inscription.css @@ -1,7 +1,18 @@ +/* Retrait de asterisk des champs requis */ + .asteriskField { display: none; } +/* Customisation des checkboxes (alergie, dys...)*/ +.custom-control.custom-checkbox { + display: inline-block; +} +.custom-control.custom-checkbox label.custom-control-label { + margin-left: 10px; + margin-right: 10px; +} +/* Pour encadrer des zones de formulaire (ex Responsables) */ fieldset { padding: 20px; margin: 0 0 30px 0; diff --git a/templates/inscription/formulaire_inscription.html b/templates/inscription/formulaire_inscription.html index bcf6674..54b6584 100644 --- a/templates/inscription/formulaire_inscription.html +++ b/templates/inscription/formulaire_inscription.html @@ -48,3 +48,46 @@