diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index 67a600256..55d96a09b 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 bf78bd5a9..771eb93f3 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 3193527d6..1f4e5f233 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 000000000..f7d5e5b1c --- /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 %} +
+ (*) champs requis +
+ +{{ error }}
+{{ error }}
{% endfor %} {% endif %} {% endfor %} {{ form.responsables }} - - +