From 722ec09eb58380d3593f060b3a0316da684497cc Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Tue, 22 Feb 2022 21:52:32 +0100 Subject: [PATCH] preferences, modif export --- app/entreprises/app_relations_entreprises.py | 4 +- app/entreprises/forms.py | 10 ++ app/entreprises/models.py | 12 ++- app/entreprises/routes.py | 91 ++++++++++++++----- app/scodoc/sco_excel.py | 46 ---------- .../entreprises/import_contacts.html | 2 +- .../entreprises/import_entreprises.html | 2 +- app/templates/entreprises/nav.html | 1 + app/templates/entreprises/preferences.html | 15 +++ ...e2915_tables_module_gestion_relations_.py} | 51 +++++++---- 10 files changed, 141 insertions(+), 93 deletions(-) create mode 100644 app/templates/entreprises/preferences.html rename migrations/versions/{593451ab68b3_tables_module_gestion_relations_.py => 717a8dfe2915_tables_module_gestion_relations_.py} (91%) diff --git a/app/entreprises/app_relations_entreprises.py b/app/entreprises/app_relations_entreprises.py index 6f060616d6..a08b0417ff 100644 --- a/app/entreprises/app_relations_entreprises.py +++ b/app/entreprises/app_relations_entreprises.py @@ -117,13 +117,13 @@ def verif_contact_data(contact_data): return False # entreprise_id existant - entreprise = Entreprise.query.filter_by(id=contact_data[6]).first() + entreprise = Entreprise.query.filter_by(siret=contact_data[6]).first() if entreprise is None: return False # contact possède le meme nom et prénom dans la meme entreprise contact = EntrepriseContact.query.filter_by( - nom=contact_data[0], prenom=contact_data[1], entreprise_id=contact_data[6] + nom=contact_data[0], prenom=contact_data[1], entreprise_id=entreprise.id ).first() if contact is not None: return False diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index ca74da2615..4f2cfd8499 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -39,6 +39,7 @@ from wtforms import ( HiddenField, SelectMultipleField, DateField, + BooleanField, ) from wtforms.validators import ValidationError, DataRequired, Email, Optional from wtforms.widgets import ListWidget, CheckboxInput @@ -356,3 +357,12 @@ class ImportForm(FlaskForm): ], ) submit = SubmitField("Importer", render_kw=SUBMIT_MARGE) + + +class PreferencesForm(FlaskForm): + mail_entreprise = StringField( + "Mail notifications", + validators=[Optional(), Email(message="Adresse e-mail invalide")], + ) + check_siret = BooleanField("Vérification SIRET") + submit = SubmitField("Valider", render_kw=SUBMIT_MARGE) diff --git a/app/entreprises/models.py b/app/entreprises/models.py index 9a99f4bc82..ce0acc9844 100644 --- a/app/entreprises/models.py +++ b/app/entreprises/models.py @@ -27,7 +27,7 @@ class Entreprise(db.Model): def to_dict(self): return { "siret": self.siret, - "nom": self.nom, + "nom_entreprise": self.nom, "adresse": self.adresse, "code_postal": self.codepostal, "ville": self.ville, @@ -49,6 +49,7 @@ class EntrepriseContact(db.Model): service = db.Column(db.Text) def to_dict(self): + entreprise = Entreprise.query.filter_by(id=self.entreprise_id).first() return { "nom": self.nom, "prenom": self.prenom, @@ -56,7 +57,7 @@ class EntrepriseContact(db.Model): "mail": self.mail, "poste": self.poste, "service": self.service, - "entreprise_id": self.entreprise_id, + "entreprise_siret": entreprise.siret, } @@ -138,3 +139,10 @@ class EntrepriseOffreDepartement(db.Model): db.Integer, db.ForeignKey("are_entreprise_offre.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) + name = db.Column(db.Text) + value = db.Column(db.Text) diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index eaef9275c6..c3bfcfecd0 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -24,6 +24,7 @@ from app.entreprises.forms import ( AjoutFichierForm, ValidationConfirmationForm, ImportForm, + PreferencesForm, ) from app.entreprises import bp from app.entreprises.models import ( @@ -34,6 +35,7 @@ from app.entreprises.models import ( EntrepriseEtudiant, EntrepriseEnvoiOffre, EntrepriseOffreDepartement, + EntreprisePreferences, ) from app.entreprises import app_relations_entreprises as are from app.models import Identite @@ -124,7 +126,7 @@ def fiche_entreprise(id): les offres de l'entreprise. """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"fiche entreprise {id} inconnu" + description=f"fiche entreprise {id} inconnue" ) offres_with_files = [] depts = are.get_depts() @@ -188,7 +190,7 @@ def fiche_entreprise_validation(id): Permet d'afficher la fiche entreprise d'une entreprise a valider """ entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404( - description=f"fiche entreprise (validation) {id} inconnu" + description=f"fiche entreprise (validation) {id} inconnue" ) contacts = entreprise.contacts return render_template( @@ -242,7 +244,7 @@ def offres_expirees(id): Permet d'afficher la liste des offres expirés d'une entreprise """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"fiche entreprise {id} inconnu" + description=f"fiche entreprise {id} inconnue" ) offres_expirees_with_files = [] depts = are.get_depts() @@ -318,7 +320,7 @@ def edit_entreprise(id): Permet de modifier une entreprise de la base avec un formulaire """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"entreprise {id} inconnu" + description=f"entreprise {id} inconnue" ) form = EntrepriseModificationForm() if form.validate_on_submit(): @@ -387,7 +389,7 @@ def delete_entreprise(id): Permet de supprimer une entreprise de la base avec un formulaire de confirmation """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"entreprise {id} inconnu" + description=f"entreprise {id} inconnue" ) form = SuppressionConfirmationForm() if form.validate_on_submit(): @@ -424,7 +426,7 @@ def validate_entreprise(id): """ form = ValidationConfirmationForm() entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404( - description=f"entreprise (validation) {id} inconnu" + description=f"entreprise (validation) {id} inconnue" ) if form.validate_on_submit(): entreprise.visible = True @@ -451,7 +453,7 @@ def delete_validation_entreprise(id): Permet de supprimer une entreprise en attente de validation avec une formulaire de validation """ entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404( - description=f"entreprise (validation) {id} inconnu" + description=f"entreprise (validation) {id} inconnue" ) form = SuppressionConfirmationForm() if form.validate_on_submit(): @@ -473,7 +475,7 @@ def add_offre(id): Permet d'ajouter une offre a une entreprise """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"entreprise {id} inconnu" + description=f"entreprise {id} inconnue" ) form = OffreCreationForm() if form.validate_on_submit(): @@ -518,7 +520,7 @@ def edit_offre(id): Permet de modifier une offre """ offre = EntrepriseOffre.query.filter_by(id=id).first_or_404( - description=f"offre {id} inconnu" + description=f"offre {id} inconnue" ) offre_depts = EntrepriseOffreDepartement.query.filter_by(offre_id=offre.id).all() form = OffreModificationForm() @@ -575,7 +577,7 @@ def delete_offre(id): Permet de supprimer une offre """ offre = EntrepriseOffre.query.filter_by(id=id).first_or_404( - description=f"offre {id} inconnu" + description=f"offre {id} inconnue" ) entreprise_id = offre.entreprise.id form = SuppressionConfirmationForm() @@ -610,7 +612,7 @@ def delete_offre(id): def delete_offre_recue(id): offre_recue = EntrepriseEnvoiOffre.query.filter_by( id=id, receiver_id=current_user.id - ).first_or_404(description=f"offre recu {id} inconnu") + ).first_or_404(description=f"offre recu {id} inconnue") db.session.delete(offre_recue) db.session.commit() return redirect(url_for("entreprises.offres_recues")) @@ -623,7 +625,7 @@ def add_contact(id): Permet d'ajouter un contact a une entreprise """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"entreprise {id} inconnu" + description=f"entreprise {id} inconnue" ) form = ContactCreationForm(hidden_entreprise_id=entreprise.id) if form.validate_on_submit(): @@ -746,7 +748,7 @@ def add_historique(id): Permet d'ajouter un étudiant ayant réalisé un stage ou une alternance sur la fiche entreprise de l'entreprise """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"entreprise {id} inconnu" + description=f"entreprise {id} inconnue" ) form = HistoriqueCreationForm() if form.validate_on_submit(): @@ -791,7 +793,7 @@ def envoyer_offre(id): Permet d'envoyer une offre à un utilisateur """ offre = EntrepriseOffre.query.filter_by(id=id).first_or_404( - description=f"offre {id} inconnu" + description=f"offre {id} inconnue" ) form = EnvoiOffreForm() if form.validate_on_submit(): @@ -876,7 +878,7 @@ def export_entreprises(): """ entreprises = Entreprise.query.filter_by(visible=True).all() if entreprises: - keys = ["siret", "nom", "adresse", "ville", "code_postal", "pays"] + keys = ["siret", "nom_entreprise", "adresse", "ville", "code_postal", "pays"] titles = keys[:] L = [ [entreprise.to_dict().get(k, "") for k in keys] @@ -901,13 +903,12 @@ def get_import_entreprises_file_sample(): "nom_entreprise", "adresse", "ville", - "codepostal", + "code_postal", "pays", ] titles = keys[:] - # lines = [["" for x in range(6)] for y in range(100)] title = "ImportEntreprises" - xlsx = sco_excel.excel_simple_table_test(titles=titles, sheet_name="Entreprises") + xlsx = sco_excel.excel_simple_table(titles=titles, sheet_name="Entreprises") filename = title return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE) @@ -930,7 +931,7 @@ def import_entreprises(): entreprises_import = [] siret_list = [] ligne = 0 - titles = ["siret", "nom", "adresse", "ville", "code_postal", "pays"] + titles = ["siret", "nom_entreprise", "adresse", "ville", "code_postal", "pays"] if data[1][0] != titles: flash("Veuillez utilisez la feuille excel à remplir") return render_template( @@ -1010,7 +1011,7 @@ def export_contacts(): "mail", "poste", "service", - "entreprise_id", + "entreprise_siret", ] titles = keys[:] L = [[contact.to_dict().get(k, "") for k in keys] for contact in contacts] @@ -1035,7 +1036,7 @@ def get_import_contacts_file_sample(): "mail", "poste", "service", - "entreprise_id", + "entreprise_siret", ] titles = keys[:] title = "ImportContacts" @@ -1069,7 +1070,7 @@ def import_contacts(): "mail", "poste", "service", - "entreprise_id", + "entreprise_siret", ] if data[1][0] != titles: flash("Veuillez utilisez la feuille excel à remplir") @@ -1169,7 +1170,7 @@ def add_offre_file(offre_id): Permet d'ajouter un fichier à une offre """ offre = EntrepriseOffre.query.filter_by(id=offre_id).first_or_404( - description=f"offre {offre_id} inconnu" + description=f"offre {offre_id} inconnue" ) form = AjoutFichierForm() if form.validate_on_submit(): @@ -1201,7 +1202,7 @@ def delete_offre_file(offre_id, filedir): Permet de supprimer un fichier d'une offre """ offre = EntrepriseOffre.query.filter_by(id=offre_id).first_or_404( - description=f"offre {offre_id} inconnu" + description=f"offre {offre_id} inconnue" ) form = SuppressionConfirmationForm() if form.validate_on_submit(): @@ -1223,3 +1224,45 @@ def delete_offre_file(offre_id, filedir): title="Suppression fichier d'une offre", form=form, ) + + +@bp.route("/preferences", methods=["GET", "POST"]) +@permission_required(Permission.RelationsEntreprisesValidate) +def preferences(): + form = PreferencesForm() + if form.validate_on_submit(): + exists = EntreprisePreferences.query.filter_by(name="check_siret").first() + if not exists: + prefs = EntreprisePreferences( + name="check_siret", value=int(form.check_siret.data) + ) + db.session.add(prefs) + else: + exists.value = int(form.check_siret.data) + db.session.commit() + exists = EntreprisePreferences.query.filter_by( + name="mail_notifications_entreprise" + ).first() + if not exists and form.mail_entreprise.data: + prefs = EntreprisePreferences( + name="mail_notifications_entreprise", + value=form.mail_entreprise.data.strip(), + ) + db.session.add(prefs) + else: + exists.value = form.mail_entreprise.data + db.session.commit() + db.session.commit() + return redirect(url_for("entreprises.index")) + elif request.method == "GET": + mail = EntreprisePreferences.query.filter_by( + name="mail_notifications_entreprise" + ).first() + check_siret = EntreprisePreferences.query.filter_by(name="check_siret").first() + form.mail_entreprise.data = mail.value + form.check_siret.data = int(check_siret.value) + return render_template( + "entreprises/preferences.html", + title="Préférences", + form=form, + ) diff --git a/app/scodoc/sco_excel.py b/app/scodoc/sco_excel.py index cdeb408759..9782478009 100644 --- a/app/scodoc/sco_excel.py +++ b/app/scodoc/sco_excel.py @@ -428,52 +428,6 @@ def excel_simple_table( return ws.generate() -def excel_simple_table_test( - titles=None, lines=None, sheet_name=b"feuille", titles_styles=None, comments=None -): - """Export simple type 'CSV': 1ere ligne en gras, le reste tel quel""" - ws = ScoExcelSheet(sheet_name) - - if titles is None: - titles = [] - if lines is None: - lines = [[]] - if titles_styles is None: - style = excel_make_style(bold=True) - titles_styles = [style] * len(titles) - if comments is None: - comments = [None] * len(titles) - # ligne de titres - ws.append_row( - [ - ws.make_cell(it, style, comment) - for (it, style, comment) in zip(titles, titles_styles, comments) - ] - ) - default_style = excel_make_style() - text_style = excel_make_style(number_format=FORMAT_GENERAL) - int_style = excel_make_style() - float_style = excel_make_style(number_format=FORMAT_NUMBER_00) - for line in lines: - cells = [] - for it in line: - cell_style = default_style - if type(it) == float: - cell_style = float_style - elif type(it) == int: - cell_style = int_style - else: - cell_style = text_style - cells.append(ws.make_cell(it, cell_style)) - ws.append_row(cells) - - # sheet = ws.wb.active - # for cell in sheet["A2":"A100"]: - # cell.number_format = FORMAT_GENERAL - - return ws.generate() - - def excel_feuille_saisie(e, titreannee, description, lines): """Genere feuille excel pour saisie des notes. E: evaluation (dict) diff --git a/app/templates/entreprises/import_contacts.html b/app/templates/entreprises/import_contacts.html index a181229302..204a5e970a 100644 --- a/app/templates/entreprises/import_contacts.html +++ b/app/templates/entreprises/import_contacts.html @@ -28,7 +28,7 @@ mailtextmail du contact postetextposte du contact servicetextservice dans lequel travaille le contact - entreprise_idintegerl'id de l'entreprise + entreprise_siretintegerSIRET de l'entreprise {% endif %} diff --git a/app/templates/entreprises/import_entreprises.html b/app/templates/entreprises/import_entreprises.html index 21aeb6a065..2539aeb68f 100644 --- a/app/templates/entreprises/import_entreprises.html +++ b/app/templates/entreprises/import_entreprises.html @@ -23,7 +23,7 @@ - + diff --git a/app/templates/entreprises/nav.html b/app/templates/entreprises/nav.html index f4673bfc35..e242116538 100644 --- a/app/templates/entreprises/nav.html +++ b/app/templates/entreprises/nav.html @@ -6,6 +6,7 @@
  • Offres reçues
  • {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesValidate, None) %}
  • Entreprises à valider
  • +
  • Préférences
  • {% endif %} \ No newline at end of file diff --git a/app/templates/entreprises/preferences.html b/app/templates/entreprises/preferences.html new file mode 100644 index 0000000000..625143728c --- /dev/null +++ b/app/templates/entreprises/preferences.html @@ -0,0 +1,15 @@ +{# -*- mode: jinja-html -*- #} +{% extends 'base.html' %} +{% import 'bootstrap/wtf.html' as wtf %} + +{% block app_content %} + {% include 'entreprises/nav.html' %} + +

    Préférences module gestion entreprises

    +
    +
    +
    + {{ wtf.quick_form(form, novalidate=True) }} +
    +
    +{% endblock %} \ No newline at end of file diff --git a/migrations/versions/593451ab68b3_tables_module_gestion_relations_.py b/migrations/versions/717a8dfe2915_tables_module_gestion_relations_.py similarity index 91% rename from migrations/versions/593451ab68b3_tables_module_gestion_relations_.py rename to migrations/versions/717a8dfe2915_tables_module_gestion_relations_.py index e72dff94b3..eb32d4c1de 100644 --- a/migrations/versions/593451ab68b3_tables_module_gestion_relations_.py +++ b/migrations/versions/717a8dfe2915_tables_module_gestion_relations_.py @@ -1,8 +1,8 @@ """tables module gestion relations entreprises -Revision ID: 593451ab68b3 -Revises: c95d5a3bf0de -Create Date: 2022-02-04 17:06:02.519231 +Revision ID: 717a8dfe2915 +Revises: b9aadc10227f +Create Date: 2022-02-22 20:18:57.171246 """ from alembic import op @@ -10,8 +10,8 @@ import sqlalchemy as sa from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. -revision = "593451ab68b3" -down_revision = "c95d5a3bf0de" +revision = "717a8dfe2915" +down_revision = "b9aadc10227f" branch_labels = None depends_on = None @@ -44,6 +44,13 @@ def upgrade(): sa.Column("visible", sa.Boolean(), nullable=True), sa.PrimaryKeyConstraint("id"), ) + op.create_table( + "are_preferences", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("name", sa.Text(), nullable=True), + sa.Column("value", sa.Text(), nullable=True), + sa.PrimaryKeyConstraint("id"), + ) op.create_table( "are_entreprise_contact", sa.Column("id", sa.Integer(), nullable=False), @@ -148,14 +155,31 @@ def upgrade(): op.drop_table("entreprise_correspondant") op.drop_index("ix_entreprises_dept_id", table_name="entreprises") op.drop_table("entreprises") + op.drop_index("ix_apc_competence_id_orebut", table_name="apc_competence") + op.create_index( + op.f("ix_apc_competence_id_orebut"), + "apc_competence", + ["id_orebut"], + unique=False, + ) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f("ix_apc_competence_id_orebut"), table_name="apc_competence") + op.create_index( + "ix_apc_competence_id_orebut", "apc_competence", ["id_orebut"], unique=False + ) op.create_table( "entreprises", - sa.Column("id", sa.INTEGER(), autoincrement=True, nullable=False), + sa.Column( + "id", + sa.INTEGER(), + server_default=sa.text("nextval('entreprises_id_seq'::regclass)"), + autoincrement=True, + nullable=False, + ), sa.Column("nom", sa.TEXT(), autoincrement=False, nullable=True), sa.Column("adresse", sa.TEXT(), autoincrement=False, nullable=True), sa.Column("ville", sa.TEXT(), autoincrement=False, nullable=True), @@ -180,18 +204,12 @@ def downgrade(): ["dept_id"], ["departement.id"], name="entreprises_dept_id_fkey" ), sa.PrimaryKeyConstraint("id", name="entreprises_pkey"), + postgresql_ignore_search_path=False, ) + op.create_index("ix_entreprises_dept_id", "entreprises", ["dept_id"], unique=False) op.create_table( "entreprise_correspondant", - sa.Column( - "id", - sa.INTEGER(), - server_default=sa.text( - "nextval('entreprise_correspondant_id_seq'::regclass)" - ), - autoincrement=True, - nullable=False, - ), + sa.Column("id", sa.INTEGER(), autoincrement=True, nullable=False), sa.Column("entreprise_id", sa.INTEGER(), autoincrement=False, nullable=True), sa.Column("nom", sa.TEXT(), autoincrement=False, nullable=True), sa.Column("prenom", sa.TEXT(), autoincrement=False, nullable=True), @@ -210,7 +228,6 @@ def downgrade(): name="entreprise_correspondant_entreprise_id_fkey", ), sa.PrimaryKeyConstraint("id", name="entreprise_correspondant_pkey"), - postgresql_ignore_search_path=False, ) op.create_table( "entreprise_contact", @@ -241,13 +258,13 @@ def downgrade(): ), sa.PrimaryKeyConstraint("id", name="entreprise_contact_pkey"), ) - op.create_index("ix_entreprises_dept_id", "entreprises", ["dept_id"], unique=False) op.drop_table("are_entreprise_offre_departement") op.drop_table("are_entreprise_envoi_offre_etudiant") op.drop_table("are_entreprise_envoi_offre") op.drop_table("are_entreprise_offre") op.drop_table("are_entreprise_etudiant") op.drop_table("are_entreprise_contact") + op.drop_table("are_preferences") op.drop_table("are_entreprises") op.drop_table("are_entreprise_log") # ### end Alembic commands ###
    AttributTypeDescription
    sirettextsiret de l'entreprise
    nomtextnom de l'entreprise
    nom_entreprisetextnom de l'entreprise
    adressetextadresse de l'entreprise
    villetextville de l'entreprise
    code_postaltextcode postal de l'entreprise