Skip to content

Commit

Permalink
Ajout champs allergies et Dys sur formulaire 3
Browse files Browse the repository at this point in the history
  • Loading branch information
davy39 committed Feb 9, 2022
1 parent 5d71e1e commit 5ea307e
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 20 deletions.
3 changes: 2 additions & 1 deletion djangoLxp/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand All @@ -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'),


]
28 changes: 20 additions & 8 deletions inscription/forms.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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):
Expand Down Expand Up @@ -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',
)

Expand Down Expand Up @@ -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:
Expand Down
12 changes: 10 additions & 2 deletions inscription/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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')
Expand All @@ -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)
Expand All @@ -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')
Expand Down
20 changes: 11 additions & 9 deletions inscription/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 :
Expand All @@ -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)

Expand Down
11 changes: 11 additions & 0 deletions static/css/formulaire_inscription.css
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
43 changes: 43 additions & 0 deletions templates/inscription/formulaire_inscription.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,46 @@ <h1 class=text-center >Inscription au Lycée Expérimental</h1>
</div>
</div>
{% endblock content %}
{% block foot-javascript %}
<script>
function ajoutAllergie() {
if(document.getElementById('id_2-ajout_allergie').value) {
var XHR = new XMLHttpRequest();
var urlEncodedData = "";
var urlEncodedDataPairs = [];
// Transformez l'objet data en un tableau de paires clé/valeur codées URL.
urlEncodedDataPairs.push(encodeURIComponent('allergene') + '=' + encodeURIComponent(document.getElementById('id_2-ajout_allergie').value));
urlEncodedDataPairs.push(encodeURIComponent('csrfmiddlewaretoken') + '=' + encodeURIComponent("{{ csrf_token }}"));
// Combinez les paires en une seule chaîne de caractères et remplacez tous
// les espaces codés en % par le caractère'+' ; cela correspond au comportement
// des soumissions de formulaires de navigateur.
urlEncodedData = urlEncodedDataPairs.join('&').replace(/%20/g, '+');
// Définissez ce qui se passe en cas de succès de soumission de données
//XHR.addEventListener('load', function(event) {
// alert('Ouais ! Données envoyées et réponse chargée.');
//});
// Définissez ce qui arrive en cas d'erreur
//XHR.addEventListener('error', function(event) {
// alert('Oups! Quelque chose s\'est mal passé.');
//});

// Configurez la requête
XHR.open('POST', 'allergie');

// Ajoutez l'en-tête HTTP requise pour requêtes POST de données de formulaire
XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

// Finalement, envoyez les données.
XHR.send(urlEncodedData);
setTimeout(function () {
//on ne recharge que le div id allergie (de la step 2)
$('#allergie').load(' #allergie', {"csrfmiddlewaretoken":"{{ csrf_token }}", "wizard_goto_step": '2'}, function(){$(this).children().unwrap()});
//location.load();
document.getElementById('id_2-ajout_allergie').value = '';
}, 500);

}
}

</script>
{% endblock %}

0 comments on commit 5ea307e

Please sign in to comment.