From 73b46b11dc4b0549e1ded0708fe23a035b70c9d5 Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Thu, 7 Apr 2022 02:54:11 +0200 Subject: [PATCH] ajout formulaire dynamique correspondant --- app/entreprises/forms.py | 75 ++++++++++++++----- app/entreprises/routes.py | 44 +++++------ app/static/css/entreprises.css | 4 + .../entreprises/ajout_correspondants.html | 56 ++++++++++++++ .../entreprises/envoi_offre_form.html | 14 ++-- 5 files changed, 145 insertions(+), 48 deletions(-) create mode 100644 app/templates/entreprises/ajout_correspondants.html diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index 67a6002563..55d96a09bc 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -41,6 +41,7 @@ from wtforms import ( DateField, BooleanField, FieldList, + FormField, ) from wtforms.validators import ValidationError, DataRequired, Email, Optional from wtforms.widgets import ListWidget, CheckboxInput @@ -219,18 +220,23 @@ class OffreModificationForm(FlaskForm): class CorrespondantCreationForm(FlaskForm): - hidden_entreprise_id = HiddenField() - nom = _build_string_field("Nom (*)") - prenom = _build_string_field("Prénom (*)") - telephone = _build_string_field("Téléphone (*)", required=False) + nom = _build_string_field("Nom (*)", render_kw={"class": "form-control"}) + prenom = _build_string_field("Prénom (*)", render_kw={"class": "form-control"}) + telephone = _build_string_field( + "Téléphone (*)", required=False, render_kw={"class": "form-control"} + ) mail = StringField( "Mail (*)", validators=[Optional(), Email(message="Adresse e-mail invalide")], + render_kw={"class": "form-control"}, + ) + poste = _build_string_field( + "Poste", required=False, render_kw={"class": "form-control"} + ) + service = _build_string_field( + "Service", required=False, render_kw={"class": "form-control"} ) - poste = _build_string_field("Poste", required=False) - service = _build_string_field("Service", required=False) # depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) - submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE) # def __init__(self, *args, **kwargs): # super().__init__(*args, **kwargs) @@ -244,16 +250,6 @@ class CorrespondantCreationForm(FlaskForm): if not FlaskForm.validate(self): validate = False - correspondant = EntrepriseCorrespondant.query.filter_by( - entreprise_id=self.hidden_entreprise_id.data, - nom=self.nom.data, - prenom=self.prenom.data, - ).first() - if correspondant is not None: - self.nom.errors.append("Ce correspondant existe déjà (même nom et prénom)") - self.prenom.errors.append("") - validate = False - if not self.telephone.data and not self.mail.data: self.telephone.errors.append( "Saisir un moyen de contact (mail ou téléphone)" @@ -264,6 +260,45 @@ class CorrespondantCreationForm(FlaskForm): return validate +class CorrespondantsCreationForm(FlaskForm): + hidden_entreprise_id = HiddenField() + correspondants = FieldList(FormField(CorrespondantCreationForm), min_entries=1) + submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE) + + def validate(self): + validate = True + if not FlaskForm.validate(self): + validate = False + + correspondant_list = [] + for entry in self.correspondants.entries: + if entry.nom.data.strip() and entry.prenom.data.strip(): + if ( + entry.nom.data.strip(), + entry.prenom.data.strip(), + ) in correspondant_list: + entry.nom.errors.append( + "Vous avez saisi 2 fois le même nom et prenom" + ) + entry.prenom.errors.append("") + validate = False + correspondant_list.append( + (entry.nom.data.strip(), entry.prenom.data.strip()) + ) + correspondant = EntrepriseCorrespondant.query.filter_by( + entreprise_id=self.hidden_entreprise_id.data, + nom=entry.nom.data, + prenom=entry.prenom.data, + ).first() + if correspondant is not None: + entry.nom.errors.append( + "Ce correspondant existe déjà (même nom et prénom)" + ) + entry.prenom.errors.append("") + validate = False + return validate + + class CorrespondantModificationForm(FlaskForm): hidden_correspondant_id = HiddenField() hidden_entreprise_id = HiddenField() @@ -428,10 +463,12 @@ class EnvoiOffreForm(FlaskForm): responsables = FieldList( _build_string_field( "Responsable (*)", - render_kw={"placeholder": "Tapez le nom du responsable de formation"}, + render_kw={ + "placeholder": "Tapez le nom du responsable de formation", + "class": "form-control", + }, ), min_entries=1, - max_entries=5, ) submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE) diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index bf78bd5a9e..771eb93f31 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -12,6 +12,7 @@ from app.decorators import permission_required from app.entreprises import LOGS_LEN from app.entreprises.forms import ( + CorrespondantsCreationForm, EntrepriseCreationForm, EntrepriseModificationForm, SuppressionConfirmationForm, @@ -673,29 +674,30 @@ def add_correspondant(id): entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( description=f"entreprise {id} inconnue" ) - form = CorrespondantCreationForm(hidden_entreprise_id=entreprise.id) + form = CorrespondantsCreationForm(hidden_entreprise_id=entreprise.id) if form.validate_on_submit(): - correspondant = EntrepriseCorrespondant( - entreprise_id=entreprise.id, - nom=form.nom.data.strip(), - prenom=form.prenom.data.strip(), - telephone=form.telephone.data.strip(), - mail=form.mail.data.strip(), - poste=form.poste.data.strip(), - service=form.service.data.strip(), - ) - log = EntrepriseLog( - authenticated_user=current_user.user_name, - object=entreprise.id, - text="Création d'un correspondant", - ) - db.session.add(log) - db.session.add(correspondant) - db.session.commit() - flash("Le correspondant a été ajouté à la fiche entreprise.") + for correspondant_entry in form.correspondants.entries: + correspondant = EntrepriseCorrespondant( + entreprise_id=entreprise.id, + nom=correspondant_entry.nom.data.strip(), + prenom=correspondant_entry.prenom.data.strip(), + telephone=correspondant_entry.telephone.data.strip(), + mail=correspondant_entry.mail.data.strip(), + poste=correspondant_entry.poste.data.strip(), + service=correspondant_entry.service.data.strip(), + ) + log = EntrepriseLog( + authenticated_user=current_user.user_name, + object=entreprise.id, + text="Création d'un correspondant", + ) + db.session.add(log) + db.session.add(correspondant) + db.session.commit() + flash("Le correspondant a été ajouté à la fiche entreprise.") return redirect(url_for("entreprises.fiche_entreprise", id=entreprise.id)) return render_template( - "entreprises/form.html", + "entreprises/ajout_correspondants.html", title="Ajout correspondant", form=form, ) @@ -1004,8 +1006,8 @@ def envoyer_offre(id): offre_id=offre.id, ) db.session.add(envoi_offre) + db.session.commit() flash(f"L'offre a été envoyé à {responsable.get_nomplogin()}.") - db.session.commit() return redirect(url_for("entreprises.fiche_entreprise", id=offre.entreprise_id)) return render_template( "entreprises/envoi_offre_form.html", diff --git a/app/static/css/entreprises.css b/app/static/css/entreprises.css index 3193527d67..1f4e5f233a 100644 --- a/app/static/css/entreprises.css +++ b/app/static/css/entreprises.css @@ -15,6 +15,10 @@ } +.form-error { + color: #a94442; +} + .nav-entreprise>ul>li>a:hover { color: red; } diff --git a/app/templates/entreprises/ajout_correspondants.html b/app/templates/entreprises/ajout_correspondants.html new file mode 100644 index 0000000000..f7d5e5b1c6 --- /dev/null +++ b/app/templates/entreprises/ajout_correspondants.html @@ -0,0 +1,56 @@ +{# -*- mode: jinja-html -*- #} +{% extends 'base.html' %} +{% import 'bootstrap/wtf.html' as wtf %} + +{% block styles %} +{{super()}} +{% endblock %} + +{% block app_content %} +

{{ title }}

+
+
+
+

+ (*) champs requis +

+
+ {{ form.hidden_tag() }} + {% for subfield in form.correspondants %} + {% for subsubfield in subfield %} + {% if subsubfield.errors %} + {% for error in subsubfield.errors %} +

{{ error }}

+ {% endfor %} + {% endif %} + {% endfor %} + {% endfor %} + {{ form.correspondants }} +
+ + +
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/app/templates/entreprises/envoi_offre_form.html b/app/templates/entreprises/envoi_offre_form.html index c964bfc472..ca5ba131e4 100644 --- a/app/templates/entreprises/envoi_offre_form.html +++ b/app/templates/entreprises/envoi_offre_form.html @@ -22,13 +22,15 @@ {% for subfield in form.responsables %} {% if subfield.errors %} {% for error in subfield.errors %} -

{{ error }}

+

{{ error }}

{% endfor %} {% endif %} {% endfor %} {{ form.responsables }} - - +
+ + +
@@ -48,7 +50,6 @@ let allResponsablesField = allResponsablesFieldWrapper.getElementsByTagName('input'); for(let i = 0; i < allResponsablesField.length; i++) { new bsn.AutoSuggest(allResponsablesField[i].id, responsables_options); - document.getElementById(allResponsablesField[i].id).classList.add("form-control"); } let addResponsableFieldBtn = document.getElementById('add-responsable-field'); @@ -56,16 +57,13 @@ e.preventDefault(); let allResponsablesFieldWrapper = document.getElementById('responsables'); let allResponsablesField = allResponsablesFieldWrapper.getElementsByTagName('input'); - if(allResponsablesField.length > 4) { - return; - } let responsableInputIds = [] for(let i = 0; i < allResponsablesField.length; i++) { responsableInputIds.push(parseInt(allResponsablesField[i].name.split('-')[1])); } let newFieldName = `responsables-${Math.max(...responsableInputIds) + 1}`; allResponsablesFieldWrapper.insertAdjacentHTML('beforeend',` -
  • +
  • `); var as_r = new bsn.AutoSuggest(newFieldName, responsables_options); });