from flask import flash from flask_wtf import FlaskForm from markupsafe import Markup import requests, re from wtforms import StringField, SubmitField, TextAreaField, SelectField, HiddenField from wtforms.fields.html5 import EmailField, DateField from flask_wtf.file import FileField, FileAllowed, FileRequired from wtforms.validators import ValidationError, DataRequired, Email from app.entreprises.models import Entreprise, EntrepriseContact from app.models import Identite from app.auth.models import User from app.scodoc import sco_etud from sqlalchemy import text CHAMP_REQUIS = "Ce champ est requis" class EntrepriseCreationForm(FlaskForm): siret = StringField( "SIRET", validators=[DataRequired(message=CHAMP_REQUIS)], render_kw={"placeholder": "Numéro composé de 14 chiffres", "maxlength": "14"}, ) nom_entreprise = StringField( "Nom de l'entreprise", validators=[DataRequired(message=CHAMP_REQUIS)], ) adresse = StringField( "Adresse de l'entreprise", validators=[DataRequired(message=CHAMP_REQUIS)], ) codepostal = StringField( "Code postal de l'entreprise", validators=[DataRequired(message=CHAMP_REQUIS)], ) ville = StringField( "Ville de l'entreprise", validators=[DataRequired(message=CHAMP_REQUIS)], ) pays = StringField( "Pays de l'entreprise", validators=[DataRequired(message=CHAMP_REQUIS)], render_kw={"style": "margin-bottom: 50px;"}, ) nom_contact = StringField( "Nom du contact", validators=[DataRequired(message=CHAMP_REQUIS)] ) prenom_contact = StringField( "Prénom du contact", validators=[DataRequired(message=CHAMP_REQUIS)], ) telephone = StringField( "Téléphone du contact", validators=[DataRequired(message=CHAMP_REQUIS)], ) mail = EmailField( "Mail du contact", validators=[ DataRequired(message=CHAMP_REQUIS), Email(message="Adresse e-mail invalide"), ], ) poste = StringField("Poste du contact", validators=[]) service = StringField("Service du contact", validators=[]) submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"}) def validate_siret(self, siret): siret = siret.data.strip() if re.match("^\d{14}$", siret) == None: raise ValidationError("Format incorrect") req = requests.get( f"https://entreprise.data.gouv.fr/api/sirene/v1/siret/{siret}" ) if req.status_code != 200: raise ValidationError("SIRET inexistant") entreprise = Entreprise.query.filter_by(siret=siret).first() if entreprise is not None: lien = f'ici' raise ValidationError( Markup(f"Entreprise déjà présent, lien vers la fiche : {lien}") ) class EntrepriseModificationForm(FlaskForm): siret = StringField("SIRET", validators=[], render_kw={"disabled": ""}) nom = StringField( "Nom de l'entreprise", validators=[DataRequired(message=CHAMP_REQUIS)], ) adresse = StringField("Adresse", validators=[DataRequired(message=CHAMP_REQUIS)]) codepostal = StringField( "Code postal", validators=[DataRequired(message=CHAMP_REQUIS)] ) ville = StringField("Ville", validators=[DataRequired(message=CHAMP_REQUIS)]) pays = StringField("Pays", validators=[DataRequired(message=CHAMP_REQUIS)]) submit = SubmitField("Modifier", render_kw={"style": "margin-bottom: 10px;"}) class OffreCreationForm(FlaskForm): intitule = StringField("Intitulé", validators=[DataRequired(message=CHAMP_REQUIS)]) description = TextAreaField( "Description", validators=[DataRequired(message=CHAMP_REQUIS)] ) type_offre = SelectField( "Type de l'offre", choices=[("Stage"), ("Alternance")], validators=[DataRequired(message=CHAMP_REQUIS)], ) missions = TextAreaField( "Missions", validators=[DataRequired(message=CHAMP_REQUIS)] ) duree = StringField("Durée", validators=[DataRequired(message=CHAMP_REQUIS)]) submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"}) class OffreModificationForm(FlaskForm): intitule = StringField("Intitulé", validators=[DataRequired(message=CHAMP_REQUIS)]) description = TextAreaField( "Description", validators=[DataRequired(message=CHAMP_REQUIS)] ) type_offre = SelectField( "Type de l'offre", choices=[("Stage"), ("Alternance")], validators=[DataRequired(message=CHAMP_REQUIS)], ) missions = TextAreaField( "Missions", validators=[DataRequired(message=CHAMP_REQUIS)] ) duree = StringField("Durée", validators=[DataRequired(message=CHAMP_REQUIS)]) submit = SubmitField("Modifier", render_kw={"style": "margin-bottom: 10px;"}) class ContactCreationForm(FlaskForm): hidden_entreprise_id = HiddenField() nom = StringField("Nom", validators=[DataRequired(message=CHAMP_REQUIS)]) prenom = StringField("Prénom", validators=[DataRequired(message=CHAMP_REQUIS)]) telephone = StringField( "Téléphone", validators=[DataRequired(message=CHAMP_REQUIS)] ) mail = EmailField( "Mail", validators=[ DataRequired(message=CHAMP_REQUIS), Email(message="Adresse e-mail invalide"), ], ) poste = StringField("Poste", validators=[]) service = StringField("Service", validators=[]) submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"}) def validate(self): rv = FlaskForm.validate(self) if not rv: return False contact = EntrepriseContact.query.filter_by( entreprise_id=self.hidden_entreprise_id.data, nom=self.nom.data, prenom=self.prenom.data, ).first() if contact is not None: self.nom.errors.append("Ce contact existe déjà (même nom et prénom)") self.prenom.errors.append("") return False return True class ContactModificationForm(FlaskForm): nom = StringField("Nom", validators=[DataRequired(message=CHAMP_REQUIS)]) prenom = StringField("Prénom", validators=[DataRequired(message=CHAMP_REQUIS)]) telephone = StringField( "Téléphone", validators=[DataRequired(message=CHAMP_REQUIS)] ) mail = EmailField( "Mail", validators=[ DataRequired(message=CHAMP_REQUIS), Email(message="Adresse e-mail invalide"), ], ) poste = StringField("Poste", validators=[]) service = StringField("Service", validators=[]) submit = SubmitField("Modifier", render_kw={"style": "margin-bottom: 10px;"}) class HistoriqueCreationForm(FlaskForm): etudiant = StringField( "Étudiant", validators=[DataRequired(message=CHAMP_REQUIS)], render_kw={"placeholder": "Tapez le nom de l'étudiant puis selectionnez"}, ) type_offre = SelectField( "Type de l'offre", choices=[("Stage"), ("Alternance")], validators=[DataRequired(message=CHAMP_REQUIS)], ) date_debut = DateField( "Date début", validators=[DataRequired(message=CHAMP_REQUIS)] ) date_fin = DateField("Date fin", validators=[DataRequired(message=CHAMP_REQUIS)]) submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"}) def validate(self): rv = FlaskForm.validate(self) if not rv: return False if self.date_debut.data > self.date_fin.data: self.date_debut.errors.append("Les dates sont incompatibles") self.date_fin.errors.append("Les dates sont incompatibles") return False return True def validate_etudiant(self, etudiant): etudiant_data = etudiant.data.upper().strip() stm = text( "SELECT id, CONCAT(nom, ' ', prenom) as nom_prenom FROM Identite WHERE CONCAT(nom, ' ', prenom)=:nom_prenom" ) etudiant = ( Identite.query.from_statement(stm).params(nom_prenom=etudiant_data).first() ) if etudiant is None: raise ValidationError("Champ incorrect (selectionnez dans la liste)") class EnvoiOffreForm(FlaskForm): responsable = StringField( "Responsable de formation", validators=[DataRequired(message=CHAMP_REQUIS)], ) submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"}) def validate_responsable(self, responsable): responsable_data = responsable.data.upper().strip() stm = text( "SELECT id, UPPER(CONCAT(nom, ' ', prenom, ' ', '(', user_name, ')')) FROM \"user\" WHERE UPPER(CONCAT(nom, ' ', prenom, ' ', '(', user_name, ')'))=:responsable_data" ) responsable = ( User.query.from_statement(stm) .params(responsable_data=responsable_data) .first() ) if responsable is None: raise ValidationError("Champ incorrect (selectionnez dans la liste)") class AjoutFichierForm(FlaskForm): fichier = FileField( "Fichier", validators=[ FileRequired(message=CHAMP_REQUIS), FileAllowed(["pdf", "docx"], "Fichier .pdf ou .docx uniquement"), ], ) submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"}) class SuppressionConfirmationForm(FlaskForm): submit = SubmitField("Supprimer", render_kw={"style": "margin-bottom: 10px;"})