From cf0a136071668c9c281466d8efba36763c79b802 Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Wed, 20 Apr 2022 22:37:04 +0200 Subject: [PATCH 1/7] enrichissement correspondant, desactiver une entreprise --- app/entreprises/__init__.py | 8 +++ app/entreprises/forms.py | 50 ++++++++++++------- app/entreprises/models.py | 13 ++--- app/entreprises/routes.py | 25 +++++++++- app/templates/entreprises/_correspondant.html | 7 +++ app/templates/entreprises/_offre.html | 2 +- app/templates/entreprises/entreprises.html | 1 + app/templates/entreprises/offres_recues.html | 18 +++++-- 8 files changed, 89 insertions(+), 35 deletions(-) diff --git a/app/entreprises/__init__.py b/app/entreprises/__init__.py index b211670b2..7f100d51e 100644 --- a/app/entreprises/__init__.py +++ b/app/entreprises/__init__.py @@ -39,4 +39,12 @@ def get_dept_acronym(id): return dept.acronym +@bp.app_template_filter() +def get_civilité(civ): + if civ == "H": + return "Monsieur" + else: + return "Madame" + + from app.entreprises import routes diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index 654b26186..130572372 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -80,6 +80,11 @@ class EntrepriseCreationForm(FlaskForm): ville = _build_string_field("Ville de l'entreprise (*)") pays = _build_string_field("Pays de l'entreprise", required=False) + civilite = SelectField( + "Civilité du correspondant", + choices=[("M", "Monsieur"), ("F", "Madame")], + validators=[DataRequired(message=CHAMP_REQUIS)], + ) nom_correspondant = _build_string_field("Nom du correspondant", required=False) prenom_correspondant = _build_string_field( "Prénom du correspondant", required=False @@ -91,6 +96,8 @@ class EntrepriseCreationForm(FlaskForm): ) poste = _build_string_field("Poste du correspondant", required=False) service = _build_string_field("Service du correspondant", required=False) + origine = _build_string_field("Origine du correspondant", required=False) + notes = _build_string_field("Notes sur le correspondant", required=False) submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE) @@ -106,6 +113,8 @@ class EntrepriseCreationForm(FlaskForm): or self.mail.data.strip() or self.poste.data.strip() or self.service.data.strip() + or self.origine.data.strip() + or self.notes.data.strip() ): if not self.nom_correspondant.data.strip(): self.nom_correspondant.errors.append("Ce champ est requis") @@ -184,11 +193,11 @@ class OffreCreationForm(FlaskForm): "Missions (*)", validators=[DataRequired(message=CHAMP_REQUIS)] ) duree = _build_string_field("Durée (*)") - depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) + depts = MultiCheckboxField("Départements (*)", validators=[Optional()], coerce=int) expiration_date = DateField("Date expiration", validators=[Optional()]) correspondant = SelectField("Correspondant à contacté", validators=[Optional()]) fichier = FileField( - "Fichier (*)", + "Fichier", validators=[ Optional(), FileAllowed(["pdf", "docx"], "Fichier .pdf ou .docx uniquement"), @@ -237,7 +246,7 @@ class OffreModificationForm(FlaskForm): "Missions (*)", validators=[DataRequired(message=CHAMP_REQUIS)] ) duree = _build_string_field("Durée (*)") - depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) + depts = MultiCheckboxField("Départements (*)", validators=[Optional()], coerce=int) expiration_date = DateField("Date expiration", validators=[Optional()]) correspondant = SelectField("Correspondant à contacté", validators=[Optional()]) submit = SubmitField("Modifier", render_kw=SUBMIT_MARGE) @@ -269,6 +278,12 @@ class OffreModificationForm(FlaskForm): class CorrespondantCreationForm(FlaskForm): + civilite = SelectField( + "Civilité (*)", + choices=[("H", "Monsieur"), ("F", "Madame")], + validators=[DataRequired(message=CHAMP_REQUIS)], + render_kw={"class": "form-control"}, + ) 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( @@ -285,14 +300,12 @@ class CorrespondantCreationForm(FlaskForm): service = _build_string_field( "Service", required=False, render_kw={"class": "form-control"} ) - # depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) - - # def __init__(self, *args, **kwargs): - # super().__init__(*args, **kwargs) - - # self.depts.choices = [ - # (dept.id, dept.acronym) for dept in Departement.query.all() - # ] + origine = _build_string_field( + "Origine", required=False, render_kw={"class": "form-control"} + ) + notes = _build_string_field( + "Notes", required=False, render_kw={"class": "form-control"} + ) def validate(self): validate = True @@ -351,6 +364,11 @@ class CorrespondantsCreationForm(FlaskForm): class CorrespondantModificationForm(FlaskForm): hidden_correspondant_id = HiddenField() hidden_entreprise_id = HiddenField() + civilite = SelectField( + "Civilité (*)", + choices=[("H", "Monsieur"), ("F", "Madame")], + validators=[DataRequired(message=CHAMP_REQUIS)], + ) nom = _build_string_field("Nom (*)") prenom = _build_string_field("Prénom (*)") telephone = _build_string_field("Téléphone (*)", required=False) @@ -360,16 +378,10 @@ class CorrespondantModificationForm(FlaskForm): ) poste = _build_string_field("Poste", required=False) service = _build_string_field("Service", required=False) - # depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) + origine = _build_string_field("Origine", required=False) + notes = _build_string_field("Notes", required=False) submit = SubmitField("Modifier", render_kw=SUBMIT_MARGE) - # def __init__(self, *args, **kwargs): - # super().__init__(*args, **kwargs) - - # self.depts.choices = [ - # (dept.id, dept.acronym) for dept in Departement.query.all() - # ] - def validate(self): validate = True if not FlaskForm.validate(self): diff --git a/app/entreprises/models.py b/app/entreprises/models.py index 90fcf3357..5e6de7469 100644 --- a/app/entreprises/models.py +++ b/app/entreprises/models.py @@ -11,6 +11,7 @@ class Entreprise(db.Model): ville = db.Column(db.Text) pays = db.Column(db.Text, default="FRANCE") visible = db.Column(db.Boolean, default=False) + active = db.Column(db.Boolean, default=True) correspondants = db.relationship( "EntrepriseCorrespondant", backref="entreprise", @@ -51,12 +52,15 @@ class EntrepriseCorrespondant(db.Model): db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade") ) # site_id = db.Column(db.Integer, db.ForeignKey("are_sites.id", ondelete="cascade")) + civilite = db.Column(db.String(1)) nom = db.Column(db.Text) prenom = db.Column(db.Text) telephone = db.Column(db.Text) mail = db.Column(db.Text) poste = db.Column(db.Text) service = db.Column(db.Text) + origine = db.Column(db.Text) + notes = db.Column(db.Text) def to_dict(self): entreprise = Entreprise.query.filter_by(id=self.entreprise_id).first() @@ -161,15 +165,6 @@ class EntrepriseOffreDepartement(db.Model): dept_id = db.Column(db.Integer, db.ForeignKey("departement.id", ondelete="cascade")) -# class EntrepriseCorrespondantDepartement(db.Model): -# __tablename__ = "are_correspondant_departement" -# id = db.Column(db.Integer, primary_key=True) -# correspondant_id = db.Column( -# db.Integer, db.ForeignKey("are_correspondants.id", ondelete="cascade") -# ) -# dept_id = db.Column(db.Integer, db.ForeignKey("departement.id", ondelete="cascade")) - - class EntreprisePreferences(db.Model): __tablename__ = "are_preferences" id = db.Column(db.Integer, primary_key=True) diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index 7fe2e7274..cc9de05fe 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -59,7 +59,7 @@ def index(): """ Permet d'afficher une page avec la liste des entreprises (visible) et une liste des dernières opérations """ - entreprises = Entreprise.query.filter_by(visible=True) + entreprises = Entreprise.query.filter_by(visible=True, active=True) logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all() return render_template( "entreprises/entreprises.html", @@ -298,12 +298,15 @@ def add_entreprise(): db.session.refresh(entreprise) correspondant = EntrepriseCorrespondant( entreprise_id=entreprise.id, + civilite=form.civilite.data, nom=form.nom_correspondant.data.strip(), prenom=form.prenom_correspondant.data.strip(), telephone=form.telephone.data.strip(), mail=form.mail.data.strip(), poste=form.poste.data.strip(), service=form.service.data.strip(), + origine=form.origine.data.strip(), + notes=form.notes.data.strip(), ) db.session.add(correspondant) if current_user.has_permission(Permission.RelationsEntreprisesValidate, None): @@ -440,6 +443,17 @@ def delete_entreprise(id): ) +@bp.route("/fiche_entreprise/desactiver/", methods=["GET", "POST"]) +def fiche_entreprise_desactiver(id): + entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( + description=f"entreprise {id} inconnue" + ) + entreprise.active = False + db.session.commit() + flash("L'entreprise a été désactivé.") + return redirect(url_for("entreprises.index")) + + @bp.route( "/fiche_entreprise_validation//validate_entreprise", methods=["GET", "POST"] ) @@ -697,12 +711,15 @@ def add_correspondant(id): for correspondant_entry in form.correspondants.entries: correspondant = EntrepriseCorrespondant( entreprise_id=entreprise.id, + civilite=correspondant_entry.civilite.data, 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(), + origine=correspondant_entry.origine.data.strip(), + notes=correspondant_entry.notes.data.strip(), ) log = EntrepriseLog( authenticated_user=current_user.user_name, @@ -735,12 +752,15 @@ def edit_correspondant(id): hidden_correspondant_id=correspondant.id, ) if form.validate_on_submit(): + correspondant.civilite = form.civilite.data correspondant.nom = form.nom.data.strip() correspondant.prenom = form.prenom.data.strip() correspondant.telephone = form.telephone.data.strip() correspondant.mail = form.mail.data.strip() correspondant.poste = form.poste.data.strip() correspondant.service = form.service.data.strip() + correspondant.origine = form.origine.data.strip() + correspondant.notes = form.notes.data.strip() log = EntrepriseLog( authenticated_user=current_user.user_name, object=correspondant.entreprise_id, @@ -753,12 +773,15 @@ def edit_correspondant(id): url_for("entreprises.fiche_entreprise", id=correspondant.entreprise.id) ) elif request.method == "GET": + form.civilite.data = correspondant.civilite form.nom.data = correspondant.nom form.prenom.data = correspondant.prenom form.telephone.data = correspondant.telephone form.mail.data = correspondant.mail form.poste.data = correspondant.poste form.service.data = correspondant.service + form.origine.data = correspondant.origine + form.notes.data = correspondant.notes return render_template( "entreprises/form.html", title="Modification correspondant", diff --git a/app/templates/entreprises/_correspondant.html b/app/templates/entreprises/_correspondant.html index 0def6b89e..d8c008460 100644 --- a/app/templates/entreprises/_correspondant.html +++ b/app/templates/entreprises/_correspondant.html @@ -1,6 +1,7 @@ {# -*- mode: jinja-html -*- #}
+ Civilité : {{ correspondant.civilite|get_civilité }}
Nom : {{ correspondant.nom }}
Prénom : {{ correspondant.prenom }}
{% if correspondant.telephone %} @@ -15,6 +16,12 @@ {% if correspondant.service %} Service : {{ correspondant.service }}
{% endif %} + {% if correspondant.origine %} + Origine : {{ correspondant.origine }}
+ {% endif %} + {% if correspondant.notes %} + Notes : {{ correspondant.notes }}
+ {% endif %}
{% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} diff --git a/app/templates/entreprises/_offre.html b/app/templates/entreprises/_offre.html index 565411786..c799b6f42 100644 --- a/app/templates/entreprises/_offre.html +++ b/app/templates/entreprises/_offre.html @@ -1,6 +1,6 @@ {# -*- mode: jinja-html -*- #}
-
+
Ajouté le {{ offre[0].date_ajout.strftime('%d/%m/%y') }} à {{ offre[0].date_ajout.strftime('%Hh%M') }}
Intitulé : {{ offre[0].intitule }}
Description : {{ offre[0].description }}
diff --git a/app/templates/entreprises/entreprises.html b/app/templates/entreprises/entreprises.html index d870e5944..c5434c713 100644 --- a/app/templates/entreprises/entreprises.html +++ b/app/templates/entreprises/entreprises.html @@ -67,6 +67,7 @@
diff --git a/app/templates/entreprises/offres_recues.html b/app/templates/entreprises/offres_recues.html index 45ac0e540..97904409f 100644 --- a/app/templates/entreprises/offres_recues.html +++ b/app/templates/entreprises/offres_recues.html @@ -9,7 +9,7 @@ {% if offres_recues %} {% for offre in offres_recues %}
-
+
Envoyé le {{ offre[0].date_envoi.strftime('%d/%m/%Y') }} à {{ offre[0].date_envoi.strftime('%Hh%M') }} par {{ offre[0].sender_id|get_nomcomplet_by_id }}
Intitulé : {{ offre[1].intitule }}
Description : {{ offre[1].description }}
@@ -19,12 +19,20 @@ {% if offre[1].correspondant_id %} Contacté {{ offre[3].nom }} {{ offre[3].prenom }} - {% if offre[3].mail and offre[3].telephone %} - ({{ offre[3].mail }} - {{ offre[3].telephone }})
- {% else %} - ({{ offre[3].mail }}{{offre[3].telephone}})
+ {% if offre[3].mail and offre[3].telephone %} + ({{ offre[3].mail }} - {{ offre[3].telephone }}) + {% else %} + ({{ offre[3].mail }}{{ offre[3].telephone }}) + {% endif %} {% endif %} + + {% if offre[3].poste %} + , poste : {{ offre[3].poste }} {% endif %} + {% if offre[3].service %} + , service : {{ offre[3].service }} + {% endif %} +
lien vers l'entreprise
From 196f80e2105d39f3c61e82118bfa5ee06c069cdd Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Wed, 20 Apr 2022 22:37:45 +0200 Subject: [PATCH 2/7] fix downgrade, ajout colonnes sur les tables relations entreprises --- ...5bae70_ajout_colonnes_tables_relations_.py | 34 +++++++++++++++++++ ...0f86c_tables_module_gestions_relations_.py | 10 ++++-- 2 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 migrations/versions/b1e6885bae70_ajout_colonnes_tables_relations_.py diff --git a/migrations/versions/b1e6885bae70_ajout_colonnes_tables_relations_.py b/migrations/versions/b1e6885bae70_ajout_colonnes_tables_relations_.py new file mode 100644 index 000000000..68d698042 --- /dev/null +++ b/migrations/versions/b1e6885bae70_ajout_colonnes_tables_relations_.py @@ -0,0 +1,34 @@ +"""ajout colonnes tables relations entreprises + +Revision ID: b1e6885bae70 +Revises: e97b2a10f86c +Create Date: 2022-04-20 21:45:42.828853 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'b1e6885bae70' +down_revision = 'e97b2a10f86c' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('are_correspondants', sa.Column('civilite', sa.String(length=1), nullable=True)) + op.add_column('are_correspondants', sa.Column('origine', sa.Text(), nullable=True)) + op.add_column('are_correspondants', sa.Column('notes', sa.Text(), nullable=True)) + op.add_column('are_entreprises', sa.Column('active', sa.Boolean(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('are_entreprises', 'active') + op.drop_column('are_correspondants', 'notes') + op.drop_column('are_correspondants', 'origine') + op.drop_column('are_correspondants', 'civilite') + # ### end Alembic commands ### diff --git a/migrations/versions/e97b2a10f86c_tables_module_gestions_relations_.py b/migrations/versions/e97b2a10f86c_tables_module_gestions_relations_.py index 3580022f9..b4a1995e6 100644 --- a/migrations/versions/e97b2a10f86c_tables_module_gestions_relations_.py +++ b/migrations/versions/e97b2a10f86c_tables_module_gestions_relations_.py @@ -93,7 +93,9 @@ def upgrade(): def downgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.drop_constraint(None, "are_offres", type_="foreignkey") + op.drop_constraint( + "are_offres_correspondant_id_fkey", "are_offres", type_="foreignkey" + ) op.drop_column("are_offres", "correspondant_id") op.add_column( "are_contacts", @@ -121,8 +123,10 @@ def downgrade(): op.add_column( "are_contacts", sa.Column("nom", sa.TEXT(), autoincrement=False, nullable=True) ) - op.drop_constraint(None, "are_contacts", type_="foreignkey") - op.drop_constraint(None, "are_contacts", type_="foreignkey") + op.drop_constraint( + "are_contacts_entreprise_fkey", "are_contacts", type_="foreignkey" + ) + op.drop_constraint("are_contacts_user_fkey", "are_contacts", type_="foreignkey") op.create_foreign_key( "are_contacts_entreprise_id_fkey", "are_contacts", From ff228aef4efdd7ca49d4355e56e08a690b4ae841 Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Thu, 21 Apr 2022 21:18:47 +0200 Subject: [PATCH 3/7] =?UTF-8?q?desactiver=20entreprise,=20visibilit=C3=A9?= =?UTF-8?q?=20correspondants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/entreprises/app_relations_entreprises.py | 4 +- app/entreprises/forms.py | 7 ++- app/entreprises/models.py | 1 + app/entreprises/routes.py | 54 +++++++++++++------ app/scodoc/sco_permissions.py | 1 + app/scodoc/sco_roles_default.py | 7 ++- ...nfirmation.html => confirmation_form.html} | 2 +- .../entreprises/fiche_entreprise.html | 20 +++---- app/templates/entreprises/nav.html | 2 + ...09021e_ajout_colonnes_tables_relations_.py | 40 ++++++++++++++ ...5bae70_ajout_colonnes_tables_relations_.py | 34 ------------ 11 files changed, 107 insertions(+), 65 deletions(-) rename app/templates/entreprises/{delete_confirmation.html => confirmation_form.html} (75%) create mode 100644 migrations/versions/01d13209021e_ajout_colonnes_tables_relations_.py delete mode 100644 migrations/versions/b1e6885bae70_ajout_colonnes_tables_relations_.py diff --git a/app/entreprises/app_relations_entreprises.py b/app/entreprises/app_relations_entreprises.py index e3c0d1da4..d0123bb20 100644 --- a/app/entreprises/app_relations_entreprises.py +++ b/app/entreprises/app_relations_entreprises.py @@ -137,7 +137,7 @@ def verif_correspondant_data(correspondant_data): correspondant_data[3]: mail correspondant_data[4]: poste correspondant_data[5]: service - correspondant_data[6]: entreprise_id + correspondant_data[6]: entreprise_siret """ # champs obligatoires if ( @@ -182,7 +182,7 @@ def verif_entreprise_data(entreprise_data): if data.strip() == "": return False if EntreprisePreferences.get_check_siret(): - siret = entreprise_data[0].replace(" ", "") # vérification sur le siret + siret = entreprise_data[0].strip().replace(" ", "") # vérification sur le siret if re.match("^\d{14}$", siret) is None: return False try: diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index 130572372..ff95217a2 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -135,7 +135,7 @@ class EntrepriseCreationForm(FlaskForm): def validate_siret(self, siret): if EntreprisePreferences.get_check_siret(): - siret_data = siret.data.replace(" ", "") + siret_data = siret.data.strip().replace(" ", "") self.siret.data = siret_data if re.match("^\d{14}$", siret_data) is None: raise ValidationError("Format incorrect") @@ -605,6 +605,11 @@ class SuppressionConfirmationForm(FlaskForm): submit = SubmitField("Supprimer", render_kw=SUBMIT_MARGE) +class DesactivationConfirmationForm(FlaskForm): + notes_active = TextAreaField("Notes sur la désactivation", validators=[Optional()]) + submit = SubmitField("Désactiver", render_kw=SUBMIT_MARGE) + + class ValidationConfirmationForm(FlaskForm): submit = SubmitField("Valider", render_kw=SUBMIT_MARGE) diff --git a/app/entreprises/models.py b/app/entreprises/models.py index 5e6de7469..8ea8ef2ac 100644 --- a/app/entreprises/models.py +++ b/app/entreprises/models.py @@ -12,6 +12,7 @@ class Entreprise(db.Model): pays = db.Column(db.Text, default="FRANCE") visible = db.Column(db.Boolean, default=False) active = db.Column(db.Boolean, default=True) + notes_active = db.Column(db.Text) correspondants = db.relationship( "EntrepriseCorrespondant", backref="entreprise", diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index cc9de05fe..107aa4367 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -13,6 +13,7 @@ from app.decorators import permission_required from app.entreprises import LOGS_LEN from app.entreprises.forms import ( CorrespondantsCreationForm, + DesactivationConfirmationForm, EntrepriseCreationForm, EntrepriseModificationForm, SuppressionConfirmationForm, @@ -101,7 +102,7 @@ def validation(): @bp.route("/correspondants", methods=["GET"]) -@permission_required(Permission.RelationsEntreprisesView) +@permission_required(Permission.RelationsEntreprisesCorrespondants) def correspondants(): """ Permet d'afficher une page avec la liste des correspondants des entreprises visibles et une liste des dernières opérations @@ -109,7 +110,7 @@ def correspondants(): correspondants = ( db.session.query(EntrepriseCorrespondant, Entreprise) .join(Entreprise, EntrepriseCorrespondant.entreprise_id == Entreprise.id) - .filter_by(visible=True) + .filter_by(visible=True, active=True) ) logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all() return render_template( @@ -129,9 +130,9 @@ def fiche_entreprise(id): La fiche entreprise comporte les informations de l'entreprise, les correspondants de l'entreprise et les offres de l'entreprise. """ - entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"fiche entreprise {id} inconnue" - ) + entreprise = Entreprise.query.filter_by( + id=id, visible=True, active=True + ).first_or_404(description=f"fiche entreprise {id} inconnue") offres_with_files = [] depts = are.get_depts() for offre in entreprise.offres: @@ -145,7 +146,9 @@ def fiche_entreprise(id): offre_with_files = are.get_offre_files_and_depts(offre, depts) if offre_with_files is not None: offres_with_files.append(offre_with_files) - correspondants = entreprise.correspondants[:] + correspondants = [] + if current_user.has_permission(Permission.RelationsEntreprisesCorrespondants, None): + correspondants = entreprise.correspondants[:] logs = ( EntrepriseLog.query.order_by(EntrepriseLog.date.desc()) .filter_by(object=id) @@ -437,21 +440,35 @@ def delete_entreprise(id): flash("L'entreprise a été supprimé de la liste.") return redirect(url_for("entreprises.index")) return render_template( - "entreprises/delete_confirmation.html", + "entreprises/confirmation_form.html", title="Supression entreprise", form=form, + info_message="Cliquez sur le bouton Supprimer pour confirmer votre supression", ) @bp.route("/fiche_entreprise/desactiver/", methods=["GET", "POST"]) +@permission_required(Permission.RelationsEntreprisesChange) def fiche_entreprise_desactiver(id): + """ + Permet de désactiver une entreprise + """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( description=f"entreprise {id} inconnue" ) - entreprise.active = False - db.session.commit() - flash("L'entreprise a été désactivé.") - return redirect(url_for("entreprises.index")) + form = DesactivationConfirmationForm() + if form.validate_on_submit(): + entreprise.notes_active = form.notes_active.data.strip() + entreprise.active = False + db.session.commit() + flash("L'entreprise a été désactivé.") + return redirect(url_for("entreprises.index")) + return render_template( + "entreprises/confirmation_form.html", + title="Désactiver entreprise", + form=form, + info_message="Cliquez sur le bouton Désactiver pour confirmer la désactivation", + ) @bp.route( @@ -503,9 +520,10 @@ def delete_validation_entreprise(id): flash("L'entreprise a été supprimé de la liste des entreprise à valider.") return redirect(url_for("entreprises.validation")) return render_template( - "entreprises/delete_confirmation.html", + "entreprises/confirmation_form.html", title="Supression entreprise", form=form, + info_message="Cliquez sur le bouton Supprimer pour confirmer votre supression", ) @@ -659,9 +677,10 @@ def delete_offre(id): flash("L'offre a été supprimé de la fiche entreprise.") return redirect(url_for("entreprises.fiche_entreprise", id=entreprise_id)) return render_template( - "entreprises/delete_confirmation.html", + "entreprises/confirmation_form.html", title="Supression offre", form=form, + info_message="Cliquez sur le bouton Supprimer pour confirmer votre supression", ) @@ -813,9 +832,10 @@ def delete_correspondant(id): url_for("entreprises.fiche_entreprise", id=correspondant.entreprise_id) ) return render_template( - "entreprises/delete_confirmation.html", + "entreprises/confirmation_form.html", title="Supression correspondant", form=form, + info_message="Cliquez sur le bouton Supprimer pour confirmer votre supression", ) @@ -1039,9 +1059,10 @@ def delete_stage_apprentissage(id): ) ) return render_template( - "entreprises/delete_confirmation.html", + "entreprises/confirmation_form.html", title="Supression stage/apprentissage", form=form, + info_message="Cliquez sur le bouton Supprimer pour confirmer votre supression", ) @@ -1503,9 +1524,10 @@ def delete_offre_file(offre_id, filedir): url_for("entreprises.fiche_entreprise", id=offre.entreprise_id) ) return render_template( - "entreprises/delete_confirmation.html", + "entreprises/confirmation_form.html", title="Suppression fichier d'une offre", form=form, + info_message="Cliquez sur le bouton Supprimer pour confirmer votre supression", ) diff --git a/app/scodoc/sco_permissions.py b/app/scodoc/sco_permissions.py index c72b3ff50..b57374fba 100644 --- a/app/scodoc/sco_permissions.py +++ b/app/scodoc/sco_permissions.py @@ -47,6 +47,7 @@ _SCO_PERMISSIONS = ( ), (1 << 25, "RelationsEntreprisesSend", "Envoyer des offres"), (1 << 26, "RelationsEntreprisesValidate", "Valide les entreprises"), + (1 << 27, "RelationsEntreprisesCorrespondants", "Voir les correspondants"), ) diff --git a/app/scodoc/sco_roles_default.py b/app/scodoc/sco_roles_default.py index 9529b031c..df0cd4539 100644 --- a/app/scodoc/sco_roles_default.py +++ b/app/scodoc/sco_roles_default.py @@ -62,7 +62,11 @@ SCO_ROLES_DEFAULTS = { # ObservateurEntreprise est un observateur de l'application entreprise "ObservateurEntreprise": (p.RelationsEntreprisesView,), # UtilisateurEntreprise est un utilisateur de l'application entreprise (droit de modification) - "UtilisateurEntreprise": (p.RelationsEntreprisesView, p.RelationsEntreprisesChange), + "UtilisateurEntreprise": ( + p.RelationsEntreprisesView, + p.RelationsEntreprisesChange, + p.RelationsEntreprisesCorrespondants, + ), # AdminEntreprise est un admin de l'application entreprise (toutes les actions possibles de l'application) "AdminEntreprise": ( p.RelationsEntreprisesView, @@ -70,6 +74,7 @@ SCO_ROLES_DEFAULTS = { p.RelationsEntreprisesExport, p.RelationsEntreprisesSend, p.RelationsEntreprisesValidate, + p.RelationsEntreprisesCorrespondants, ), # Super Admin est un root: création/suppression de départements # _tous_ les droits diff --git a/app/templates/entreprises/delete_confirmation.html b/app/templates/entreprises/confirmation_form.html similarity index 75% rename from app/templates/entreprises/delete_confirmation.html rename to app/templates/entreprises/confirmation_form.html index abd59c47e..fb8737887 100644 --- a/app/templates/entreprises/delete_confirmation.html +++ b/app/templates/entreprises/confirmation_form.html @@ -5,7 +5,7 @@ {% block app_content %}

{{ title }}


-
Cliquez sur le bouton Supprimer pour confirmer votre supression
+
{{ info_message }}

diff --git a/app/templates/entreprises/fiche_entreprise.html b/app/templates/entreprises/fiche_entreprise.html index b8d4b123d..938be46be 100644 --- a/app/templates/entreprises/fiche_entreprise.html +++ b/app/templates/entreprises/fiche_entreprise.html @@ -71,20 +71,20 @@
- {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} - Ajouter stage ou apprentissage - {% endif %}

Liste des stages et apprentissages réalisés au sein de l'entreprise

+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} + Ajouter stage ou apprentissage + {% endif %} - - - - - - - + + + + + + + {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} {% endif %} diff --git a/app/templates/entreprises/nav.html b/app/templates/entreprises/nav.html index 50bca6017..3cd9636dc 100644 --- a/app/templates/entreprises/nav.html +++ b/app/templates/entreprises/nav.html @@ -2,7 +2,9 @@
Date débutDate finDuréeTypeÉtudiantFormationNotesDate débutDate finDuréeTypeÉtudiantFormationNotesAction
+
  • `); }); } diff --git a/app/templates/entreprises/import_correspondants.html b/app/templates/entreprises/import_correspondants.html index cfbaf11a4..796c2135b 100644 --- a/app/templates/entreprises/import_correspondants.html +++ b/app/templates/entreprises/import_correspondants.html @@ -25,13 +25,16 @@ {% if not correspondants_import %} + - + + +
    AttributTypeDescription
    civilitetextcivilite du correspondant (H ou F)
    nomtextnom du correspondant
    prenomtextprenom du correspondant
    telephonetexttelephone du correspondant
    mailtextmail du correspondant
    postetextposte du correspondant
    servicetextservice dans lequel travaille le correspondant
    entreprise_siretintegerSIRET de l'entreprise
    originetextorigine du correspondant
    notestextnotes sur le correspondant
    entreprise_sirettextSIRET de l'entreprise
    {% endif %} @@ -40,6 +43,7 @@ {% for correspondant in correspondants_import %}
    + Civilité : {{ correspondant.civilite|get_civilité }}
    Nom : {{ correspondant.nom }}
    Prénom : {{ correspondant.prenom }}
    {% if correspondant.telephone %} @@ -54,7 +58,13 @@ {% if correspondant.service %} Service : {{ correspondant.service }}
    {% endif %} - lien vers l'entreprise + {% if correspondant.origine %} + Origine : {{ correspondant.origine }}
    + {% endif %} + {% if correspondant.notes %} + Notes : {{ correspondant.notes }}
    + {% endif %} + lien vers l'entreprise
    {% endfor %} From 128fa38d8203b176a8c917ec818925383c9e01ca Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Mon, 25 Apr 2022 20:49:21 +0200 Subject: [PATCH 5/7] ajout site pour les entreprises, corrections de bugs --- app/entreprises/forms.py | 32 +++++---- app/entreprises/models.py | 35 +++++++--- app/entreprises/routes.py | 69 ++++++++++++++++--- app/static/css/entreprises.css | 9 +-- .../entreprises/fiche_entreprise.html | 33 ++++++--- ...09021e_ajout_colonnes_tables_relations_.py | 40 ----------- ...d1d622_ajout_colonnes_tables_relations_.py | 65 +++++++++++++++++ 7 files changed, 195 insertions(+), 88 deletions(-) delete mode 100644 migrations/versions/01d13209021e_ajout_colonnes_tables_relations_.py create mode 100644 migrations/versions/d5b3bdd1d622_ajout_colonnes_tables_relations_.py diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index ff95217a2..33b5c22de 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -123,12 +123,9 @@ class EntrepriseCreationForm(FlaskForm): self.prenom_correspondant.errors.append("Ce champ est requis") validate = False if not self.telephone.data.strip() and not self.mail.data.strip(): - self.telephone.errors.append( - "Saisir un moyen de contact (mail ou téléphone)" - ) - self.mail.errors.append( - "Saisir un moyen de contact (mail ou téléphone)" - ) + msg = "Saisir un moyen de contact (mail ou téléphone)" + self.telephone.errors.append(msg) + self.mail.errors.append(msg) validate = False return validate @@ -173,6 +170,15 @@ class EntrepriseModificationForm(FlaskForm): } +class SiteCreationForm(FlaskForm): + nom = _build_string_field("Nom du site (*)") + adresse = _build_string_field("Adresse (*)") + codepostal = _build_string_field("Code postal (*)") + ville = _build_string_field("Ville (*)") + pays = _build_string_field("Pays", required=False) + submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE) + + class MultiCheckboxField(SelectMultipleField): widget = ListWidget(prefix_label=False) option_widget = CheckboxInput() @@ -313,10 +319,9 @@ class CorrespondantCreationForm(FlaskForm): 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)" - ) - self.mail.errors.append("Saisir un moyen de contact (mail ou téléphone)") + msg = "Saisir un moyen de contact (mail ou téléphone)" + self.telephone.errors.append(msg) + self.mail.errors.append(msg) validate = False return validate @@ -399,10 +404,9 @@ class CorrespondantModificationForm(FlaskForm): 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)" - ) - self.mail.errors.append("Saisir un moyen de contact (mail ou téléphone)") + msg = "Saisir un moyen de contact (mail ou téléphone)" + self.telephone.errors.append(msg) + self.mail.errors.append(msg) validate = False return validate diff --git a/app/entreprises/models.py b/app/entreprises/models.py index f04d1a231..4a318d24a 100644 --- a/app/entreprises/models.py +++ b/app/entreprises/models.py @@ -9,16 +9,18 @@ class Entreprise(db.Model): adresse = db.Column(db.Text) codepostal = db.Column(db.Text) ville = db.Column(db.Text) - pays = db.Column(db.Text, default="FRANCE") + pays = db.Column(db.Text) visible = db.Column(db.Boolean, default=False) active = db.Column(db.Boolean, default=True) notes_active = db.Column(db.Text) - correspondants = db.relationship( - "EntrepriseCorrespondant", + + sites = db.relationship( + "EntrepriseSite", backref="entreprise", lazy="dynamic", cascade="all, delete-orphan", ) + offres = db.relationship( "EntrepriseOffre", backref="entreprise", @@ -37,13 +39,24 @@ class Entreprise(db.Model): } -# class EntrepriseSite(db.Model): -# __tablename__ = "are_sites" -# id = db.Column(db.Integer, primary_key=True) -# entreprise_id = db.Column( -# db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade") -# ) -# nom = db.Column(db.Text) +class EntrepriseSite(db.Model): + __tablename__ = "are_sites" + id = db.Column(db.Integer, primary_key=True) + entreprise_id = db.Column( + db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade") + ) + nom = db.Column(db.Text) + adresse = db.Column(db.Text) + codepostal = db.Column(db.Text) + ville = db.Column(db.Text) + pays = db.Column(db.Text) + + correspondants = db.relationship( + "EntrepriseCorrespondant", + backref="site", + lazy="dynamic", + cascade="all, delete-orphan", + ) class EntrepriseCorrespondant(db.Model): @@ -52,7 +65,7 @@ class EntrepriseCorrespondant(db.Model): entreprise_id = db.Column( db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade") ) - # site_id = db.Column(db.Integer, db.ForeignKey("are_sites.id", ondelete="cascade")) + site_id = db.Column(db.Integer, db.ForeignKey("are_sites.id", ondelete="cascade")) civilite = db.Column(db.String(1)) nom = db.Column(db.Text) prenom = db.Column(db.Text) diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index d7c6ec132..edb536177 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -16,6 +16,7 @@ from app.entreprises.forms import ( DesactivationConfirmationForm, EntrepriseCreationForm, EntrepriseModificationForm, + SiteCreationForm, SuppressionConfirmationForm, OffreCreationForm, OffreModificationForm, @@ -37,6 +38,7 @@ from app.entreprises.models import ( EntrepriseCorrespondant, EntrepriseLog, EntrepriseContact, + EntrepriseSite, EntrepriseStageApprentissage, EntrepriseEnvoiOffre, EntrepriseOffreDepartement, @@ -146,9 +148,7 @@ def fiche_entreprise(id): offre_with_files = are.get_offre_files_and_depts(offre, depts) if offre_with_files is not None: offres_with_files.append(offre_with_files) - correspondants = [] - if current_user.has_permission(Permission.RelationsEntreprisesCorrespondants, None): - correspondants = entreprise.correspondants[:] + sites = entreprise.sites[:] logs = ( EntrepriseLog.query.order_by(EntrepriseLog.date.desc()) .filter_by(object=id) @@ -166,7 +166,7 @@ def fiche_entreprise(id): "entreprises/fiche_entreprise.html", title="Fiche entreprise", entreprise=entreprise, - correspondants=correspondants, + sites=sites, offres=offres_with_files, logs=logs, stages_apprentissages=stages_apprentissages, @@ -297,10 +297,22 @@ def add_entreprise(): ) db.session.add(entreprise) db.session.commit() + db.session.refresh(entreprise) + site = EntrepriseSite( + entreprise_id=entreprise.id, + nom=form.nom_entreprise.data.strip(), + adresse=form.adresse.data.strip(), + codepostal=form.codepostal.data.strip(), + ville=form.ville.data.strip(), + pays=form.pays.data.strip() if form.pays.data.strip() else "FRANCE", + ) + db.session.add(site) + db.session.commit() if form.nom_correspondant.data.strip(): - db.session.refresh(entreprise) + db.session.refresh(site) correspondant = EntrepriseCorrespondant( entreprise_id=entreprise.id, + site_id=site.id, civilite=form.civilite.data, nom=form.nom_correspondant.data.strip(), prenom=form.prenom_correspondant.data.strip(), @@ -716,20 +728,57 @@ def expired(id): return redirect(url_for("entreprises.fiche_entreprise", id=offre.entreprise_id)) -@bp.route("/fiche_entreprise//add_correspondant", methods=["GET", "POST"]) +@bp.route( + "/fiche_entreprise//add_site", + methods=["GET", "POST"], +) @permission_required(Permission.RelationsEntreprisesChange) -def add_correspondant(id): +def add_site(id): + entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( + description=f"entreprise {id} inconnue" + ) + form = SiteCreationForm() + if form.validate_on_submit(): + site = EntrepriseSite( + entreprise_id=entreprise.id, + nom=form.nom.data.strip(), + adresse=form.adresse.data.strip(), + codepostal=form.codepostal.data.strip(), + ville=form.ville.data.strip(), + pays=form.pays.data.strip() if form.pays.data.strip() else "FRANCE", + ) + db.session.add(site) + db.session.commit() + flash("Le site a été créé et ajouté à la fiche entreprise") + return redirect(url_for("entreprises.fiche_entreprise", id=entreprise.id)) + return render_template( + "entreprises/form.html", + title="Ajout site", + form=form, + ) + + +@bp.route( + "/fiche_entreprise//add_correspondant/", + methods=["GET", "POST"], +) +@permission_required(Permission.RelationsEntreprisesChange) +def add_correspondant(id_entreprise, id_site): """ Permet d'ajouter un correspondant a une entreprise """ - entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"entreprise {id} inconnue" + entreprise = Entreprise.query.filter_by( + id=id_entreprise, visible=True + ).first_or_404(description=f"entreprise {id_entreprise} inconnue") + site = EntrepriseSite.query.filter_by(id=id_site).first_or_404( + description=f"site {id_site} inconnue" ) form = CorrespondantsCreationForm(hidden_entreprise_id=entreprise.id) if form.validate_on_submit(): for correspondant_entry in form.correspondants.entries: correspondant = EntrepriseCorrespondant( entreprise_id=entreprise.id, + site_id=site.id, civilite=correspondant_entry.civilite.data, nom=correspondant_entry.nom.data.strip(), prenom=correspondant_entry.prenom.data.strip(), @@ -789,7 +838,7 @@ def edit_correspondant(id): db.session.commit() flash("Le correspondant a été modifié.") return redirect( - url_for("entreprises.fiche_entreprise", id=correspondant.entreprise.id) + url_for("entreprises.fiche_entreprise", id=correspondant.entreprise_id) ) elif request.method == "GET": form.civilite.data = correspondant.civilite diff --git a/app/static/css/entreprises.css b/app/static/css/entreprises.css index 1f4e5f233..436288666 100644 --- a/app/static/css/entreprises.css +++ b/app/static/css/entreprises.css @@ -54,23 +54,24 @@ margin-bottom: -5px; } -.entreprise, .correspondant, .offre { +.entreprise, .correspondant, .offre, .site{ border: solid 2px; border-radius: 10px; padding: 10px; margin-bottom: 10px; + margin-top: 10px; } -.correspondants-et-offres { +.sites-et-offres { display: flex; justify-content: space-between; } -.correspondants-et-offres > div { +.sites-et-offres > div { flex: 1 0 0; } -.correspondants-et-offres > div:nth-child(2) { +.sites-et-offres > div:nth-child(2) { margin-left: 20px; } diff --git a/app/templates/entreprises/fiche_entreprise.html b/app/templates/entreprises/fiche_entreprise.html index 938be46be..c58dfeb71 100644 --- a/app/templates/entreprises/fiche_entreprise.html +++ b/app/templates/entreprises/fiche_entreprise.html @@ -37,24 +37,39 @@
    - {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %}
    + {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} Modifier + Désactiver Supprimer + Ajouter site Ajouter offre - Ajouter correspondant {% endif %} Liste contacts Voir les offres expirées -
    +
    -
    - {% if correspondants %} +
    + {% if sites %}
    -

    Correspondants

    - {% for correspondant in correspondants %} - {% include 'entreprises/_correspondant.html' %} +

    Sites

    + {% for site in sites %} +
    + Nom : {{ site.nom }}
    + Adresse : {{ site.adresse }}
    + Code postal : {{ site.codepostal }}
    + Ville : {{ site.ville }}
    + Pays : {{ site.pays }} + {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} +
    Ajouter correspondant + {% endif %} + {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesCorrespondants, None) %} + {% for correspondant in site.correspondants %} + {% include 'entreprises/_correspondant.html' %} + {% endfor %} + {% endif %} +
    {% endfor %}
    {% endif %} @@ -63,7 +78,7 @@

    Offres - Voir les offres expirées

    {% for offre in offres %} - {% include 'entreprises/_offre.html' %} + {% include 'entreprises/_offre.html' %} {% endfor %}
    {% endif %} diff --git a/migrations/versions/01d13209021e_ajout_colonnes_tables_relations_.py b/migrations/versions/01d13209021e_ajout_colonnes_tables_relations_.py deleted file mode 100644 index 94a586f5d..000000000 --- a/migrations/versions/01d13209021e_ajout_colonnes_tables_relations_.py +++ /dev/null @@ -1,40 +0,0 @@ -"""ajout colonnes tables relations entreprises - -Revision ID: 01d13209021e -Revises: e97b2a10f86c -Create Date: 2022-04-21 21:02:01.319876 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = "01d13209021e" -down_revision = "e97b2a10f86c" -branch_labels = None -depends_on = None - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.add_column( - "are_correspondants", sa.Column("civilite", sa.String(length=1), nullable=True) - ) - op.add_column("are_correspondants", sa.Column("origine", sa.Text(), nullable=True)) - op.add_column("are_correspondants", sa.Column("notes", sa.Text(), nullable=True)) - op.add_column("are_entreprises", sa.Column("active", sa.Boolean(), nullable=True)) - op.add_column( - "are_entreprises", sa.Column("notes_active", sa.Text(), nullable=True) - ) - # ### end Alembic commands ### - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.drop_column("are_entreprises", "notes_active") - op.drop_column("are_entreprises", "active") - op.drop_column("are_correspondants", "notes") - op.drop_column("are_correspondants", "origine") - op.drop_column("are_correspondants", "civilite") - # ### end Alembic commands ### diff --git a/migrations/versions/d5b3bdd1d622_ajout_colonnes_tables_relations_.py b/migrations/versions/d5b3bdd1d622_ajout_colonnes_tables_relations_.py new file mode 100644 index 000000000..dd5a5982b --- /dev/null +++ b/migrations/versions/d5b3bdd1d622_ajout_colonnes_tables_relations_.py @@ -0,0 +1,65 @@ +"""ajout colonnes tables relations entreprises, sites + +Revision ID: d5b3bdd1d622 +Revises: e97b2a10f86c +Create Date: 2022-04-25 18:29:50.841280 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "d5b3bdd1d622" +down_revision = "e97b2a10f86c" +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "are_sites", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("entreprise_id", sa.Integer(), nullable=True), + sa.Column("nom", sa.Text(), nullable=True), + sa.Column("adresse", sa.Text(), nullable=True), + sa.Column("codepostal", sa.Text(), nullable=True), + sa.Column("ville", sa.Text(), nullable=True), + sa.Column("pays", sa.Text(), nullable=True), + sa.ForeignKeyConstraint( + ["entreprise_id"], ["are_entreprises.id"], ondelete="cascade" + ), + sa.PrimaryKeyConstraint("id"), + ) + op.add_column( + "are_correspondants", sa.Column("site_id", sa.Integer(), nullable=True) + ) + op.add_column( + "are_correspondants", sa.Column("civilite", sa.String(length=1), nullable=True) + ) + op.add_column("are_correspondants", sa.Column("origine", sa.Text(), nullable=True)) + op.add_column("are_correspondants", sa.Column("notes", sa.Text(), nullable=True)) + op.create_foreign_key( + None, "are_correspondants", "are_sites", ["site_id"], ["id"], ondelete="cascade" + ) + op.add_column("are_entreprises", sa.Column("active", sa.Boolean(), nullable=True)) + op.add_column( + "are_entreprises", sa.Column("notes_active", sa.Text(), nullable=True) + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column("are_entreprises", "notes_active") + op.drop_column("are_entreprises", "active") + op.drop_constraint( + "are_correspondants_site_id_fkey", "are_correspondants", type_="foreignkey" + ) + op.drop_column("are_correspondants", "notes") + op.drop_column("are_correspondants", "origine") + op.drop_column("are_correspondants", "civilite") + op.drop_column("are_correspondants", "site_id") + op.drop_table("are_sites") + # ### end Alembic commands ### From 94f1e24d3676db4df3eb07b42c88e71c17b8f80c Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Tue, 26 Apr 2022 20:21:56 +0200 Subject: [PATCH 6/7] ajout bouton retirer sur les formulaires --- app/entreprises/forms.py | 2 +- app/static/css/entreprises.css | 5 +++++ .../entreprises/ajout_correspondants.html | 17 ++++++++++++++++- app/templates/entreprises/envoi_offre_form.html | 17 ++++++++++++++++- app/templates/entreprises/form.html | 6 +++--- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index 33b5c22de..a16190070 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -339,7 +339,7 @@ class CorrespondantsCreationForm(FlaskForm): correspondant_list = [] for entry in self.correspondants.entries: - if entry.nom.data.strip() and entry.prenom.data.strip(): + if entry.nom.data and entry.prenom.data: if ( entry.nom.data.strip(), entry.prenom.data.strip(), diff --git a/app/static/css/entreprises.css b/app/static/css/entreprises.css index 436288666..0ede866cb 100644 --- a/app/static/css/entreprises.css +++ b/app/static/css/entreprises.css @@ -40,6 +40,11 @@ *background-color: #151515; } +.btn-remove { + margin-top: 5px; + margin-bottom: 5px; +} + .fiche-entreprise .btn { margin-top: 5px; margin-bottom: 5px; diff --git a/app/templates/entreprises/ajout_correspondants.html b/app/templates/entreprises/ajout_correspondants.html index be8e5cc81..18070b7fc 100644 --- a/app/templates/entreprises/ajout_correspondants.html +++ b/app/templates/entreprises/ajout_correspondants.html @@ -35,6 +35,14 @@
    {% 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 ca5ba131e..6ead6477d 100644 --- a/app/templates/entreprises/envoi_offre_form.html +++ b/app/templates/entreprises/envoi_offre_form.html @@ -36,6 +36,14 @@
    {% endblock %} \ No newline at end of file diff --git a/app/templates/entreprises/form.html b/app/templates/entreprises/form.html index fe51a97b4..067f4a508 100644 --- a/app/templates/entreprises/form.html +++ b/app/templates/entreprises/form.html @@ -23,15 +23,15 @@