From d637ffe70cfb427bf06e25a9394b9f6f42f3235e Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Mon, 24 Jan 2022 11:16:46 +0100
Subject: [PATCH 01/26] renomme tables application relations entreprises
---
app/entreprises/models.py | 24 +--
...ables_application_relations_entreprises.py | 165 ++++++++++++++++++
2 files changed, 177 insertions(+), 12 deletions(-)
create mode 100644 migrations/versions/ee3f2eab6f08_tables_application_relations_entreprises.py
diff --git a/app/entreprises/models.py b/app/entreprises/models.py
index e743df3d6..865d8ff2c 100644
--- a/app/entreprises/models.py
+++ b/app/entreprises/models.py
@@ -2,7 +2,7 @@ from app import db
class Entreprise(db.Model):
- __tablename__ = "entreprises"
+ __tablename__ = "are_entreprises"
id = db.Column(db.Integer, primary_key=True)
siret = db.Column(db.Text)
nom = db.Column(db.Text)
@@ -35,10 +35,10 @@ class Entreprise(db.Model):
class EntrepriseContact(db.Model):
- __tablename__ = "entreprise_contact"
+ __tablename__ = "are_entreprise_contact"
id = db.Column(db.Integer, primary_key=True)
entreprise_id = db.Column(
- db.Integer, db.ForeignKey("entreprises.id", ondelete="cascade")
+ db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade")
)
nom = db.Column(db.Text)
prenom = db.Column(db.Text)
@@ -76,10 +76,10 @@ class EntrepriseContact(db.Model):
class EntrepriseOffre(db.Model):
- __tablename__ = "entreprise_offre"
+ __tablename__ = "are_entreprise_offre"
id = db.Column(db.Integer, primary_key=True)
entreprise_id = db.Column(
- db.Integer, db.ForeignKey("entreprises.id", ondelete="cascade")
+ db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade")
)
date_ajout = db.Column(db.DateTime(timezone=True), server_default=db.func.now())
intitule = db.Column(db.Text)
@@ -99,7 +99,7 @@ class EntrepriseOffre(db.Model):
class EntrepriseLog(db.Model):
- __tablename__ = "entreprise_log"
+ __tablename__ = "are_entreprise_log"
id = db.Column(db.Integer, primary_key=True)
date = db.Column(db.DateTime(timezone=True), server_default=db.func.now())
authenticated_user = db.Column(db.Text)
@@ -108,9 +108,9 @@ class EntrepriseLog(db.Model):
class EntrepriseEtudiant(db.Model):
- __tablename__ = "entreprise_etudiant"
+ __tablename__ = "are_entreprise_etudiant"
id = db.Column(db.Integer, primary_key=True)
- entreprise_id = db.Column(db.Integer, db.ForeignKey("entreprises.id"))
+ entreprise_id = db.Column(db.Integer, db.ForeignKey("are_entreprises.id"))
etudid = db.Column(db.Integer)
type_offre = db.Column(db.Text)
date_debut = db.Column(db.Date)
@@ -120,18 +120,18 @@ class EntrepriseEtudiant(db.Model):
class EntrepriseEnvoiOffre(db.Model):
- __tablename__ = "entreprise_envoi_offre"
+ __tablename__ = "are_entreprise_envoi_offre"
id = db.Column(db.Integer, primary_key=True)
sender_id = db.Column(db.Integer, db.ForeignKey("user.id"))
receiver_id = db.Column(db.Integer, db.ForeignKey("user.id"))
- offre_id = db.Column(db.Integer, db.ForeignKey("entreprise_offre.id"))
+ offre_id = db.Column(db.Integer, db.ForeignKey("are_entreprise_offre.id"))
date_envoi = db.Column(db.DateTime(timezone=True), server_default=db.func.now())
class EntrepriseEnvoiOffreEtudiant(db.Model):
- __tablename__ = "entreprise_envoi_offre_etudiant"
+ __tablename__ = "are_entreprise_envoi_offre_etudiant"
id = db.Column(db.Integer, primary_key=True)
sender_id = db.Column(db.Integer, db.ForeignKey("user.id"))
receiver_id = db.Column(db.Integer, db.ForeignKey("identite.id"))
- offre_id = db.Column(db.Integer, db.ForeignKey("entreprise_offre.id"))
+ offre_id = db.Column(db.Integer, db.ForeignKey("are_entreprise_offre.id"))
date_envoi = db.Column(db.DateTime(timezone=True), server_default=db.func.now())
diff --git a/migrations/versions/ee3f2eab6f08_tables_application_relations_entreprises.py b/migrations/versions/ee3f2eab6f08_tables_application_relations_entreprises.py
new file mode 100644
index 000000000..08d5200f7
--- /dev/null
+++ b/migrations/versions/ee3f2eab6f08_tables_application_relations_entreprises.py
@@ -0,0 +1,165 @@
+"""tables application relations entreprises
+
+Revision ID: ee3f2eab6f08
+Revises: f40fbaf5831c
+Create Date: 2022-01-24 10:44:09.706261
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import postgresql
+
+# revision identifiers, used by Alembic.
+revision = 'ee3f2eab6f08'
+down_revision = 'f40fbaf5831c'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.create_table('are_entreprise_log',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('date', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
+ sa.Column('authenticated_user', sa.Text(), nullable=True),
+ sa.Column('object', sa.Integer(), nullable=True),
+ sa.Column('text', sa.Text(), nullable=True),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.create_table('are_entreprises',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('siret', sa.Text(), 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.PrimaryKeyConstraint('id')
+ )
+ op.create_table('are_entreprise_contact',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('entreprise_id', sa.Integer(), nullable=True),
+ sa.Column('nom', sa.Text(), nullable=True),
+ sa.Column('prenom', sa.Text(), nullable=True),
+ sa.Column('telephone', sa.Text(), nullable=True),
+ sa.Column('mail', sa.Text(), nullable=True),
+ sa.Column('poste', sa.Text(), nullable=True),
+ sa.Column('service', sa.Text(), nullable=True),
+ sa.ForeignKeyConstraint(['entreprise_id'], ['are_entreprises.id'], ondelete='cascade'),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.create_table('are_entreprise_etudiant',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('entreprise_id', sa.Integer(), nullable=True),
+ sa.Column('etudid', sa.Integer(), nullable=True),
+ sa.Column('type_offre', sa.Text(), nullable=True),
+ sa.Column('date_debut', sa.Date(), nullable=True),
+ sa.Column('date_fin', sa.Date(), nullable=True),
+ sa.Column('formation_text', sa.Text(), nullable=True),
+ sa.Column('formation_scodoc', sa.Integer(), nullable=True),
+ sa.ForeignKeyConstraint(['entreprise_id'], ['are_entreprises.id'], ),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.create_table('are_entreprise_offre',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('entreprise_id', sa.Integer(), nullable=True),
+ sa.Column('date_ajout', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
+ sa.Column('intitule', sa.Text(), nullable=True),
+ sa.Column('description', sa.Text(), nullable=True),
+ sa.Column('type_offre', sa.Text(), nullable=True),
+ sa.Column('missions', sa.Text(), nullable=True),
+ sa.Column('duree', sa.Text(), nullable=True),
+ sa.ForeignKeyConstraint(['entreprise_id'], ['are_entreprises.id'], ondelete='cascade'),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.create_table('are_entreprise_envoi_offre',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('sender_id', sa.Integer(), nullable=True),
+ sa.Column('receiver_id', sa.Integer(), nullable=True),
+ sa.Column('offre_id', sa.Integer(), nullable=True),
+ sa.Column('date_envoi', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
+ sa.ForeignKeyConstraint(['offre_id'], ['are_entreprise_offre.id'], ),
+ sa.ForeignKeyConstraint(['receiver_id'], ['user.id'], ),
+ sa.ForeignKeyConstraint(['sender_id'], ['user.id'], ),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.create_table('are_entreprise_envoi_offre_etudiant',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('sender_id', sa.Integer(), nullable=True),
+ sa.Column('receiver_id', sa.Integer(), nullable=True),
+ sa.Column('offre_id', sa.Integer(), nullable=True),
+ sa.Column('date_envoi', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
+ sa.ForeignKeyConstraint(['offre_id'], ['are_entreprise_offre.id'], ),
+ sa.ForeignKeyConstraint(['receiver_id'], ['identite.id'], ),
+ sa.ForeignKeyConstraint(['sender_id'], ['user.id'], ),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.drop_table('entreprise_contact')
+ op.drop_table('entreprise_correspondant')
+ op.drop_index('ix_entreprises_dept_id', table_name='entreprises')
+ op.drop_table('entreprises')
+ # ### end Alembic commands ###
+
+
+def downgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.create_table('entreprises',
+ 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),
+ sa.Column('codepostal', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('pays', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('localisation', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('dept_id', sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.Column('date_creation', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
+ sa.Column('secteur', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('privee', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('plus10salaries', sa.BOOLEAN(), autoincrement=False, nullable=True),
+ sa.Column('contact_origine', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('note', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('qualite_relation', sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.ForeignKeyConstraint(['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('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),
+ sa.Column('civilite', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('fonction', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('phone1', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('phone2', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('mobile', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('mail1', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('mail2', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('fax', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('note', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.ForeignKeyConstraint(['entreprise_id'], ['entreprises.id'], name='entreprise_correspondant_entreprise_id_fkey'),
+ sa.PrimaryKeyConstraint('id', name='entreprise_correspondant_pkey'),
+ postgresql_ignore_search_path=False
+ )
+ op.create_table('entreprise_contact',
+ sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False),
+ sa.Column('entreprise_id', sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.Column('entreprise_corresp_id', sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.Column('etudid', sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.Column('type_contact', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('date', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
+ sa.Column('enseignant', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column('description', sa.TEXT(), autoincrement=False, nullable=True),
+ sa.ForeignKeyConstraint(['entreprise_corresp_id'], ['entreprise_correspondant.id'], name='entreprise_contact_entreprise_corresp_id_fkey'),
+ sa.ForeignKeyConstraint(['entreprise_id'], ['entreprises.id'], name='entreprise_contact_entreprise_id_fkey'),
+ sa.PrimaryKeyConstraint('id', name='entreprise_contact_pkey')
+ )
+ 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_entreprises')
+ op.drop_table('are_entreprise_log')
+ # ### end Alembic commands ###
From 6d1744dacd9a219acec2fc87a44604c224cc8022 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Mon, 24 Jan 2022 18:07:54 +0100
Subject: [PATCH 02/26] offres date expiration
---
app/entreprises/forms.py | 6 +
app/entreprises/models.py | 1 +
app/entreprises/routes.py | 9 +-
...ables_application_relations_entreprises.py | 253 ++++++++++++++++++
...ables_application_relations_entreprises.py | 165 ------------
5 files changed, 265 insertions(+), 169 deletions(-)
create mode 100644 migrations/versions/bd5e795fe77d_tables_application_relations_entreprises.py
delete mode 100644 migrations/versions/ee3f2eab6f08_tables_application_relations_entreprises.py
diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py
index 1f76732dc..9ea927813 100644
--- a/app/entreprises/forms.py
+++ b/app/entreprises/forms.py
@@ -138,6 +138,9 @@ class OffreCreationForm(FlaskForm):
"Missions", validators=[DataRequired(message=CHAMP_REQUIS)]
)
duree = StringField("Durée", validators=[DataRequired(message=CHAMP_REQUIS)])
+ expiration_date = DateField(
+ "Date expiration", validators=[DataRequired(message=CHAMP_REQUIS)]
+ )
submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"})
@@ -155,6 +158,9 @@ class OffreModificationForm(FlaskForm):
"Missions", validators=[DataRequired(message=CHAMP_REQUIS)]
)
duree = StringField("Durée", validators=[DataRequired(message=CHAMP_REQUIS)])
+ expiration_date = DateField(
+ "Date expiration", validators=[DataRequired(message=CHAMP_REQUIS)]
+ )
submit = SubmitField("Modifier", render_kw={"style": "margin-bottom: 10px;"})
diff --git a/app/entreprises/models.py b/app/entreprises/models.py
index 865d8ff2c..0585b4cc4 100644
--- a/app/entreprises/models.py
+++ b/app/entreprises/models.py
@@ -87,6 +87,7 @@ class EntrepriseOffre(db.Model):
type_offre = db.Column(db.Text)
missions = db.Column(db.Text)
duree = db.Column(db.Text)
+ expiration_date = db.Column(db.Date)
def to_dict(self):
return {
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index f99fa8eef..7618d1644 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -1,6 +1,6 @@
import os
from config import Config
-from datetime import datetime, timedelta
+from datetime import datetime, date
import glob
import shutil
@@ -123,9 +123,7 @@ def fiche_entreprise(id):
offres = entreprise.offres
offres_with_files = []
for offre in offres:
- if datetime.now() - offre.date_ajout.replace(tzinfo=None) >= timedelta(
- days=90
- ): # pour une date d'expiration ?
+ if date.today() > offre.expiration_date:
break
files = []
path = os.path.join(
@@ -350,6 +348,7 @@ def add_offre(id):
type_offre=form.type_offre.data.strip(),
missions=form.missions.data.strip(),
duree=form.duree.data.strip(),
+ expiration_date=form.expiration_date.data,
)
log = EntrepriseLog(
authenticated_user=current_user.user_name,
@@ -381,6 +380,7 @@ def edit_offre(id):
offre.type_offre = form.type_offre.data.strip()
offre.missions = form.missions.data.strip()
offre.duree = form.duree.data.strip()
+ offre.expiration_date = form.expiration_date.data
log = EntrepriseLog(
authenticated_user=current_user.user_name,
object=offre.entreprise_id,
@@ -396,6 +396,7 @@ def edit_offre(id):
form.type_offre.data = offre.type_offre
form.missions.data = offre.missions
form.duree.data = offre.duree
+ form.expiration_date.data = offre.expiration_date
return render_template(
"entreprises/form.html", title=("Modification offre"), form=form
)
diff --git a/migrations/versions/bd5e795fe77d_tables_application_relations_entreprises.py b/migrations/versions/bd5e795fe77d_tables_application_relations_entreprises.py
new file mode 100644
index 000000000..54ea8e09f
--- /dev/null
+++ b/migrations/versions/bd5e795fe77d_tables_application_relations_entreprises.py
@@ -0,0 +1,253 @@
+"""tables application relations entreprises
+
+Revision ID: bd5e795fe77d
+Revises: f40fbaf5831c
+Create Date: 2022-01-24 17:43:29.261983
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import postgresql
+
+# revision identifiers, used by Alembic.
+revision = "bd5e795fe77d"
+down_revision = "f40fbaf5831c"
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.create_table(
+ "are_entreprise_log",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column(
+ "date",
+ sa.DateTime(timezone=True),
+ server_default=sa.text("now()"),
+ nullable=True,
+ ),
+ sa.Column("authenticated_user", sa.Text(), nullable=True),
+ sa.Column("object", sa.Integer(), nullable=True),
+ sa.Column("text", sa.Text(), nullable=True),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprises",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("siret", sa.Text(), 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.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprise_contact",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("entreprise_id", sa.Integer(), nullable=True),
+ sa.Column("nom", sa.Text(), nullable=True),
+ sa.Column("prenom", sa.Text(), nullable=True),
+ sa.Column("telephone", sa.Text(), nullable=True),
+ sa.Column("mail", sa.Text(), nullable=True),
+ sa.Column("poste", sa.Text(), nullable=True),
+ sa.Column("service", sa.Text(), nullable=True),
+ sa.ForeignKeyConstraint(
+ ["entreprise_id"], ["are_entreprises.id"], ondelete="cascade"
+ ),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprise_etudiant",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("entreprise_id", sa.Integer(), nullable=True),
+ sa.Column("etudid", sa.Integer(), nullable=True),
+ sa.Column("type_offre", sa.Text(), nullable=True),
+ sa.Column("date_debut", sa.Date(), nullable=True),
+ sa.Column("date_fin", sa.Date(), nullable=True),
+ sa.Column("formation_text", sa.Text(), nullable=True),
+ sa.Column("formation_scodoc", sa.Integer(), nullable=True),
+ sa.ForeignKeyConstraint(
+ ["entreprise_id"],
+ ["are_entreprises.id"],
+ ),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprise_offre",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("entreprise_id", sa.Integer(), nullable=True),
+ sa.Column(
+ "date_ajout",
+ sa.DateTime(timezone=True),
+ server_default=sa.text("now()"),
+ nullable=True,
+ ),
+ sa.Column("intitule", sa.Text(), nullable=True),
+ sa.Column("description", sa.Text(), nullable=True),
+ sa.Column("type_offre", sa.Text(), nullable=True),
+ sa.Column("missions", sa.Text(), nullable=True),
+ sa.Column("duree", sa.Text(), nullable=True),
+ sa.Column("expiration_date", sa.Date(), nullable=True),
+ sa.ForeignKeyConstraint(
+ ["entreprise_id"], ["are_entreprises.id"], ondelete="cascade"
+ ),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprise_envoi_offre",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("sender_id", sa.Integer(), nullable=True),
+ sa.Column("receiver_id", sa.Integer(), nullable=True),
+ sa.Column("offre_id", sa.Integer(), nullable=True),
+ sa.Column(
+ "date_envoi",
+ sa.DateTime(timezone=True),
+ server_default=sa.text("now()"),
+ nullable=True,
+ ),
+ sa.ForeignKeyConstraint(
+ ["offre_id"],
+ ["are_entreprise_offre.id"],
+ ),
+ sa.ForeignKeyConstraint(
+ ["receiver_id"],
+ ["user.id"],
+ ),
+ sa.ForeignKeyConstraint(
+ ["sender_id"],
+ ["user.id"],
+ ),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprise_envoi_offre_etudiant",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("sender_id", sa.Integer(), nullable=True),
+ sa.Column("receiver_id", sa.Integer(), nullable=True),
+ sa.Column("offre_id", sa.Integer(), nullable=True),
+ sa.Column(
+ "date_envoi",
+ sa.DateTime(timezone=True),
+ server_default=sa.text("now()"),
+ nullable=True,
+ ),
+ sa.ForeignKeyConstraint(
+ ["offre_id"],
+ ["are_entreprise_offre.id"],
+ ),
+ sa.ForeignKeyConstraint(
+ ["receiver_id"],
+ ["identite.id"],
+ ),
+ sa.ForeignKeyConstraint(
+ ["sender_id"],
+ ["user.id"],
+ ),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.drop_table("entreprise_contact")
+ op.drop_table("entreprise_correspondant")
+ op.drop_index("ix_entreprises_dept_id", table_name="entreprises")
+ op.drop_table("entreprises")
+ # ### end Alembic commands ###
+
+
+def downgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.create_table(
+ "entreprises",
+ 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),
+ sa.Column("codepostal", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("pays", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("localisation", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("dept_id", sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.Column(
+ "date_creation",
+ postgresql.TIMESTAMP(timezone=True),
+ server_default=sa.text("now()"),
+ autoincrement=False,
+ nullable=True,
+ ),
+ sa.Column("secteur", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("privee", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("plus10salaries", sa.BOOLEAN(), autoincrement=False, nullable=True),
+ sa.Column("contact_origine", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("note", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("qualite_relation", sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.ForeignKeyConstraint(
+ ["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_contact",
+ sa.Column("id", sa.INTEGER(), autoincrement=True, nullable=False),
+ sa.Column("entreprise_id", sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.Column(
+ "entreprise_corresp_id", sa.INTEGER(), autoincrement=False, nullable=True
+ ),
+ sa.Column("etudid", sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.Column("type_contact", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column(
+ "date",
+ postgresql.TIMESTAMP(timezone=True),
+ autoincrement=False,
+ nullable=True,
+ ),
+ sa.Column("enseignant", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("description", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.ForeignKeyConstraint(
+ ["entreprise_corresp_id"],
+ ["entreprise_correspondant.id"],
+ name="entreprise_contact_entreprise_corresp_id_fkey",
+ ),
+ sa.ForeignKeyConstraint(
+ ["entreprise_id"],
+ ["entreprises.id"],
+ name="entreprise_contact_entreprise_id_fkey",
+ ),
+ sa.PrimaryKeyConstraint("id", name="entreprise_contact_pkey"),
+ )
+ op.create_table(
+ "entreprise_correspondant",
+ 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),
+ sa.Column("civilite", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("fonction", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("phone1", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("phone2", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("mobile", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("mail1", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("mail2", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("fax", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("note", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.ForeignKeyConstraint(
+ ["entreprise_id"],
+ ["entreprises.id"],
+ name="entreprise_correspondant_entreprise_id_fkey",
+ ),
+ sa.PrimaryKeyConstraint("id", name="entreprise_correspondant_pkey"),
+ )
+ 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_entreprises")
+ op.drop_table("are_entreprise_log")
+ # ### end Alembic commands ###
diff --git a/migrations/versions/ee3f2eab6f08_tables_application_relations_entreprises.py b/migrations/versions/ee3f2eab6f08_tables_application_relations_entreprises.py
deleted file mode 100644
index 08d5200f7..000000000
--- a/migrations/versions/ee3f2eab6f08_tables_application_relations_entreprises.py
+++ /dev/null
@@ -1,165 +0,0 @@
-"""tables application relations entreprises
-
-Revision ID: ee3f2eab6f08
-Revises: f40fbaf5831c
-Create Date: 2022-01-24 10:44:09.706261
-
-"""
-from alembic import op
-import sqlalchemy as sa
-from sqlalchemy.dialects import postgresql
-
-# revision identifiers, used by Alembic.
-revision = 'ee3f2eab6f08'
-down_revision = 'f40fbaf5831c'
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
- # ### commands auto generated by Alembic - please adjust! ###
- op.create_table('are_entreprise_log',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('date', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
- sa.Column('authenticated_user', sa.Text(), nullable=True),
- sa.Column('object', sa.Integer(), nullable=True),
- sa.Column('text', sa.Text(), nullable=True),
- sa.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprises',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('siret', sa.Text(), 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.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprise_contact',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('entreprise_id', sa.Integer(), nullable=True),
- sa.Column('nom', sa.Text(), nullable=True),
- sa.Column('prenom', sa.Text(), nullable=True),
- sa.Column('telephone', sa.Text(), nullable=True),
- sa.Column('mail', sa.Text(), nullable=True),
- sa.Column('poste', sa.Text(), nullable=True),
- sa.Column('service', sa.Text(), nullable=True),
- sa.ForeignKeyConstraint(['entreprise_id'], ['are_entreprises.id'], ondelete='cascade'),
- sa.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprise_etudiant',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('entreprise_id', sa.Integer(), nullable=True),
- sa.Column('etudid', sa.Integer(), nullable=True),
- sa.Column('type_offre', sa.Text(), nullable=True),
- sa.Column('date_debut', sa.Date(), nullable=True),
- sa.Column('date_fin', sa.Date(), nullable=True),
- sa.Column('formation_text', sa.Text(), nullable=True),
- sa.Column('formation_scodoc', sa.Integer(), nullable=True),
- sa.ForeignKeyConstraint(['entreprise_id'], ['are_entreprises.id'], ),
- sa.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprise_offre',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('entreprise_id', sa.Integer(), nullable=True),
- sa.Column('date_ajout', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
- sa.Column('intitule', sa.Text(), nullable=True),
- sa.Column('description', sa.Text(), nullable=True),
- sa.Column('type_offre', sa.Text(), nullable=True),
- sa.Column('missions', sa.Text(), nullable=True),
- sa.Column('duree', sa.Text(), nullable=True),
- sa.ForeignKeyConstraint(['entreprise_id'], ['are_entreprises.id'], ondelete='cascade'),
- sa.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprise_envoi_offre',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('sender_id', sa.Integer(), nullable=True),
- sa.Column('receiver_id', sa.Integer(), nullable=True),
- sa.Column('offre_id', sa.Integer(), nullable=True),
- sa.Column('date_envoi', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
- sa.ForeignKeyConstraint(['offre_id'], ['are_entreprise_offre.id'], ),
- sa.ForeignKeyConstraint(['receiver_id'], ['user.id'], ),
- sa.ForeignKeyConstraint(['sender_id'], ['user.id'], ),
- sa.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprise_envoi_offre_etudiant',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('sender_id', sa.Integer(), nullable=True),
- sa.Column('receiver_id', sa.Integer(), nullable=True),
- sa.Column('offre_id', sa.Integer(), nullable=True),
- sa.Column('date_envoi', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
- sa.ForeignKeyConstraint(['offre_id'], ['are_entreprise_offre.id'], ),
- sa.ForeignKeyConstraint(['receiver_id'], ['identite.id'], ),
- sa.ForeignKeyConstraint(['sender_id'], ['user.id'], ),
- sa.PrimaryKeyConstraint('id')
- )
- op.drop_table('entreprise_contact')
- op.drop_table('entreprise_correspondant')
- op.drop_index('ix_entreprises_dept_id', table_name='entreprises')
- op.drop_table('entreprises')
- # ### end Alembic commands ###
-
-
-def downgrade():
- # ### commands auto generated by Alembic - please adjust! ###
- op.create_table('entreprises',
- 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),
- sa.Column('codepostal', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('pays', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('localisation', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('dept_id', sa.INTEGER(), autoincrement=False, nullable=True),
- sa.Column('date_creation', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
- sa.Column('secteur', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('privee', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('plus10salaries', sa.BOOLEAN(), autoincrement=False, nullable=True),
- sa.Column('contact_origine', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('note', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('qualite_relation', sa.INTEGER(), autoincrement=False, nullable=True),
- sa.ForeignKeyConstraint(['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('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),
- sa.Column('civilite', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('fonction', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('phone1', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('phone2', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('mobile', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('mail1', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('mail2', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('fax', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('note', sa.TEXT(), autoincrement=False, nullable=True),
- sa.ForeignKeyConstraint(['entreprise_id'], ['entreprises.id'], name='entreprise_correspondant_entreprise_id_fkey'),
- sa.PrimaryKeyConstraint('id', name='entreprise_correspondant_pkey'),
- postgresql_ignore_search_path=False
- )
- op.create_table('entreprise_contact',
- sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False),
- sa.Column('entreprise_id', sa.INTEGER(), autoincrement=False, nullable=True),
- sa.Column('entreprise_corresp_id', sa.INTEGER(), autoincrement=False, nullable=True),
- sa.Column('etudid', sa.INTEGER(), autoincrement=False, nullable=True),
- sa.Column('type_contact', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('date', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
- sa.Column('enseignant', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('description', sa.TEXT(), autoincrement=False, nullable=True),
- sa.ForeignKeyConstraint(['entreprise_corresp_id'], ['entreprise_correspondant.id'], name='entreprise_contact_entreprise_corresp_id_fkey'),
- sa.ForeignKeyConstraint(['entreprise_id'], ['entreprises.id'], name='entreprise_contact_entreprise_id_fkey'),
- sa.PrimaryKeyConstraint('id', name='entreprise_contact_pkey')
- )
- 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_entreprises')
- op.drop_table('are_entreprise_log')
- # ### end Alembic commands ###
From 0220607caa17505c6f60d96a122047bfc2715b28 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Mon, 24 Jan 2022 19:02:16 +0100
Subject: [PATCH 03/26] =?UTF-8?q?ajout=20page=20offres=20expir=C3=A9es?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/entreprises/routes.py | 30 +++++++++++++++++++
.../entreprises/fiche_entreprise.html | 1 +
.../entreprises/offres_expirees.html | 14 +++++++++
3 files changed, 45 insertions(+)
create mode 100644 app/templates/entreprises/offres_expirees.html
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 7618d1644..51c693def 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -188,6 +188,36 @@ def offres():
)
+@bp.route("/fiche_entreprise//offres_expirees")
+def offres_expirees(id):
+ entreprise = Entreprise.query.filter_by(id=id).first_or_404()
+ offres = entreprise.offres
+ offres_expirees_with_files = []
+ for offre in offres:
+ if date.today() > offre.expiration_date:
+ files = []
+ path = os.path.join(
+ Config.SCODOC_VAR_DIR,
+ "entreprises",
+ f"{offre.entreprise_id}",
+ f"{offre.id}",
+ )
+ if os.path.exists(path):
+ for dir in glob.glob(
+ f"{path}/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
+ ):
+ for file in glob.glob(f"{dir}/*"):
+ file = [os.path.basename(dir), os.path.basename(file)]
+ files.append(file)
+ offres_expirees_with_files.append([offre, files])
+ return render_template(
+ "entreprises/offres_expirees.html",
+ title=("Offres expirées"),
+ entreprise=entreprise,
+ offres_expirees=offres_expirees_with_files,
+ )
+
+
@bp.route("/add_entreprise", methods=["GET", "POST"])
def add_entreprise():
"""
diff --git a/app/templates/entreprises/fiche_entreprise.html b/app/templates/entreprises/fiche_entreprise.html
index 9bb20a8a8..8e03942d4 100644
--- a/app/templates/entreprises/fiche_entreprise.html
+++ b/app/templates/entreprises/fiche_entreprise.html
@@ -71,6 +71,7 @@
Ajouter contact
Ajouter
historique
+ Voir les offres expirées
{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/offres_expirees.html b/app/templates/entreprises/offres_expirees.html
new file mode 100644
index 000000000..50c1b7d76
--- /dev/null
+++ b/app/templates/entreprises/offres_expirees.html
@@ -0,0 +1,14 @@
+{# -*- mode: jinja-html -*- #}
+{% extends 'base.html' %}
+
+{% block app_content %}
+
+
Offres expirées de {{ entreprise.nom }}
+{% if offres_expirees %}
+ {% for offre in offres_expirees%}
+ Offre {{loop.index}} (ajouté le {{offre[0].date_ajout.strftime('%d/%m/%Y') }})
+ {% include 'entreprises/_offre.html' %}
+ {% endfor %}
+{% endif %}
+
+{% endblock %}
\ No newline at end of file
From 789d2a8c8803f94a2f5371ea76b3215fb2edf167 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Tue, 25 Jan 2022 19:42:17 +0100
Subject: [PATCH 04/26] validation entreprises
---
app/entreprises/models.py | 1 +
app/entreprises/routes.py | 19 +++++--
.../{offres.html => offres_recues.html} | 0
...bles_application_relations_entreprises.py} | 53 ++++++++++---------
4 files changed, 44 insertions(+), 29 deletions(-)
rename app/templates/entreprises/{offres.html => offres_recues.html} (100%)
rename migrations/versions/{bd5e795fe77d_tables_application_relations_entreprises.py => fa4d3f05e4f0_tables_application_relations_entreprises.py} (98%)
diff --git a/app/entreprises/models.py b/app/entreprises/models.py
index 0585b4cc4..b3389fa4a 100644
--- a/app/entreprises/models.py
+++ b/app/entreprises/models.py
@@ -10,6 +10,7 @@ class Entreprise(db.Model):
codepostal = db.Column(db.Text)
ville = db.Column(db.Text)
pays = db.Column(db.Text)
+ visible = db.Column(db.Boolean, default=False)
contacts = db.relationship(
"EntrepriseContact",
backref="entreprise",
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 51c693def..c7be9643b 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -57,7 +57,7 @@ def index():
logs:
liste des logs
"""
- entreprises = Entreprise.query.all()
+ entreprises = Entreprise.query.filter_by(visible=True).all()
logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all()
return render_template(
"entreprises/entreprises.html",
@@ -67,6 +67,16 @@ def index():
)
+@bp.route("/validation", methods=["GET"])
+def validation_entreprise():
+ entreprises = Entreprise.query.filter_by(visible=False).all()
+ return render_template(
+ "entreprises/entreprises.html",
+ title=("Entreprises"),
+ entreprises=entreprises,
+ )
+
+
@bp.route("/contacts", methods=["GET"])
def contacts():
"""
@@ -84,6 +94,7 @@ def contacts():
contacts = (
db.session.query(EntrepriseContact, Entreprise)
.join(Entreprise, EntrepriseContact.entreprise_id == Entreprise.id)
+ .filter_by(visible=True)
.all()
)
logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all()
@@ -165,7 +176,7 @@ def fiche_entreprise(id):
)
-@bp.route("/offres", methods=["GET"])
+@bp.route("/offres_recues", methods=["GET"])
def offres():
"""
Permet d'afficher la page où l'on recoit les offres
@@ -184,7 +195,9 @@ def offres():
.all()
)
return render_template(
- "entreprises/offres.html", title=("Offres"), offres_recues=offres_recues
+ "entreprises/offres_recues.html",
+ title=("Offres reçues"),
+ offres_recues=offres_recues,
)
diff --git a/app/templates/entreprises/offres.html b/app/templates/entreprises/offres_recues.html
similarity index 100%
rename from app/templates/entreprises/offres.html
rename to app/templates/entreprises/offres_recues.html
diff --git a/migrations/versions/bd5e795fe77d_tables_application_relations_entreprises.py b/migrations/versions/fa4d3f05e4f0_tables_application_relations_entreprises.py
similarity index 98%
rename from migrations/versions/bd5e795fe77d_tables_application_relations_entreprises.py
rename to migrations/versions/fa4d3f05e4f0_tables_application_relations_entreprises.py
index 54ea8e09f..b116c8e0f 100644
--- a/migrations/versions/bd5e795fe77d_tables_application_relations_entreprises.py
+++ b/migrations/versions/fa4d3f05e4f0_tables_application_relations_entreprises.py
@@ -1,8 +1,8 @@
"""tables application relations entreprises
-Revision ID: bd5e795fe77d
+Revision ID: fa4d3f05e4f0
Revises: f40fbaf5831c
-Create Date: 2022-01-24 17:43:29.261983
+Create Date: 2022-01-25 17:33:28.546610
"""
from alembic import op
@@ -10,7 +10,7 @@ import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
-revision = "bd5e795fe77d"
+revision = "fa4d3f05e4f0"
down_revision = "f40fbaf5831c"
branch_labels = None
depends_on = None
@@ -41,6 +41,7 @@ def upgrade():
sa.Column("codepostal", sa.Text(), nullable=True),
sa.Column("ville", sa.Text(), nullable=True),
sa.Column("pays", sa.Text(), nullable=True),
+ sa.Column("visible", sa.Boolean(), nullable=True),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
@@ -148,8 +149,8 @@ def upgrade():
sa.PrimaryKeyConstraint("id"),
)
op.drop_table("entreprise_contact")
- op.drop_table("entreprise_correspondant")
op.drop_index("ix_entreprises_dept_id", table_name="entreprises")
+ op.drop_table("entreprise_correspondant")
op.drop_table("entreprises")
# ### end Alembic commands ###
@@ -192,6 +193,28 @@ def downgrade():
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(), 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),
+ sa.Column("civilite", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("fonction", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("phone1", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("phone2", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("mobile", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("mail1", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("mail2", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("fax", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("note", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.ForeignKeyConstraint(
+ ["entreprise_id"],
+ ["entreprises.id"],
+ name="entreprise_correspondant_entreprise_id_fkey",
+ ),
+ sa.PrimaryKeyConstraint("id", name="entreprise_correspondant_pkey"),
+ )
op.create_table(
"entreprise_contact",
sa.Column("id", sa.INTEGER(), autoincrement=True, nullable=False),
@@ -221,28 +244,6 @@ def downgrade():
),
sa.PrimaryKeyConstraint("id", name="entreprise_contact_pkey"),
)
- op.create_table(
- "entreprise_correspondant",
- 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),
- sa.Column("civilite", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("fonction", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("phone1", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("phone2", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("mobile", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("mail1", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("mail2", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("fax", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("note", sa.TEXT(), autoincrement=False, nullable=True),
- sa.ForeignKeyConstraint(
- ["entreprise_id"],
- ["entreprises.id"],
- name="entreprise_correspondant_entreprise_id_fkey",
- ),
- sa.PrimaryKeyConstraint("id", name="entreprise_correspondant_pkey"),
- )
op.drop_table("are_entreprise_envoi_offre_etudiant")
op.drop_table("are_entreprise_envoi_offre")
op.drop_table("are_entreprise_offre")
From 17d954eea8f990ff8fbd20cc2a79c1ac35d54f32 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Wed, 26 Jan 2022 18:42:48 +0100
Subject: [PATCH 05/26] permissions pour les roles + fin validation entreprises
---
app/entreprises/routes.py | 50 ++++++++++++++++++-
app/scodoc/sco_permissions.py | 9 ++++
.../entreprises/entreprises_validation.html | 49 ++++++++++++++++++
.../entreprises/fiche_entreprise.html | 2 +-
.../fiche_entreprise_validation.html | 45 +++++++++++++++++
.../entreprises/offres_expirees.html | 16 +++---
6 files changed, 161 insertions(+), 10 deletions(-)
create mode 100644 app/templates/entreprises/entreprises_validation.html
create mode 100644 app/templates/entreprises/fiche_entreprise_validation.html
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index c7be9643b..8266d67a1 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -44,6 +44,7 @@ from werkzeug.utils import secure_filename
@bp.route("/", methods=["GET"])
+@permission_required(Permission.RelationsEntreprisesView)
def index():
"""
Permet d'afficher une page avec la liste des entreprises et une liste des dernières opérations
@@ -68,16 +69,18 @@ def index():
@bp.route("/validation", methods=["GET"])
+@permission_required(Permission.RelationsEntreprisesValidate)
def validation_entreprise():
entreprises = Entreprise.query.filter_by(visible=False).all()
return render_template(
- "entreprises/entreprises.html",
+ "entreprises/entreprises_validation.html",
title=("Entreprises"),
entreprises=entreprises,
)
@bp.route("/contacts", methods=["GET"])
+@permission_required(Permission.RelationsEntreprisesView)
def contacts():
"""
Permet d'afficher une page la liste des contacts et une liste des dernières opérations
@@ -104,6 +107,7 @@ def contacts():
@bp.route("/fiche_entreprise/", methods=["GET"])
+@permission_required(Permission.RelationsEntreprisesView)
def fiche_entreprise(id):
"""
Permet d'afficher la fiche entreprise d'une entreprise avec une liste des dernières opérations et
@@ -130,7 +134,7 @@ def fiche_entreprise(id):
historique:
liste des étudiants ayant réaliser un stage ou une alternance dans l'entreprise
"""
- entreprise = Entreprise.query.filter_by(id=id).first_or_404()
+ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
offres = entreprise.offres
offres_with_files = []
for offre in offres:
@@ -176,7 +180,21 @@ def fiche_entreprise(id):
)
+@bp.route("/fiche_entreprise_validation/", methods=["GET"])
+@permission_required(Permission.RelationsEntreprisesValidate)
+def fiche_entreprise_validation(id):
+ entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404()
+ contacts = entreprise.contacts
+ return render_template(
+ "entreprises/fiche_entreprise_validation.html",
+ title=("Fiche entreprise"),
+ entreprise=entreprise,
+ contacts=contacts,
+ )
+
+
@bp.route("/offres_recues", methods=["GET"])
+@permission_required(Permission.RelationsEntreprisesView)
def offres():
"""
Permet d'afficher la page où l'on recoit les offres
@@ -202,6 +220,7 @@ def offres():
@bp.route("/fiche_entreprise//offres_expirees")
+@permission_required(Permission.RelationsEntreprisesView)
def offres_expirees(id):
entreprise = Entreprise.query.filter_by(id=id).first_or_404()
offres = entreprise.offres
@@ -232,6 +251,7 @@ def offres_expirees(id):
@bp.route("/add_entreprise", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesChange)
def add_entreprise():
"""
Permet d'ajouter une entreprise dans la base avec un formulaire
@@ -276,6 +296,7 @@ def add_entreprise():
@bp.route("/edit_entreprise/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesChange)
def edit_entreprise(id):
"""
Permet de modifier une entreprise de la base avec un formulaire
@@ -344,6 +365,7 @@ def edit_entreprise(id):
@bp.route("/delete_entreprise/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesChange)
def delete_entreprise(id):
"""
Permet de supprimer une entreprise de la base avec un formulaire de confirmation
@@ -372,7 +394,17 @@ def delete_entreprise(id):
)
+@bp.route("/validate_entreprise/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesValidate)
+def validate_entreprise(id):
+ entreprise = Entreprise.query.filter_by(id=id).first_or_404()
+ entreprise.visible = True
+ db.session.commit()
+ return redirect(url_for("entreprises.fiche_entreprise", id=entreprise.id))
+
+
@bp.route("/add_offre/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesChange)
def add_offre(id):
"""
Permet d'ajouter une offre a une entreprise
@@ -407,6 +439,7 @@ def add_offre(id):
@bp.route("/edit_offre/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesChange)
def edit_offre(id):
"""
Permet de modifier une offre
@@ -446,6 +479,7 @@ def edit_offre(id):
@bp.route("/delete_offre/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesChange)
def delete_offre(id):
"""
Permet de supprimer une offre
@@ -474,6 +508,7 @@ def delete_offre(id):
@bp.route("/add_contact/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesChange)
def add_contact(id):
"""
Permet d'ajouter un contact a une entreprise
@@ -508,6 +543,7 @@ def add_contact(id):
@bp.route("/edit_contact/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesChange)
def edit_contact(id):
"""
Permet de modifier un contact
@@ -549,6 +585,7 @@ def edit_contact(id):
@bp.route("/delete_contact/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesChange)
def delete_contact(id):
"""
Permet de supprimer un contact
@@ -586,6 +623,7 @@ def delete_contact(id):
@bp.route("/add_historique/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesChange)
def add_historique(id):
"""
Permet d'ajouter un étudiant ayant réalisé un stage ou une alternance sur la fiche entreprise de l'entreprise
@@ -630,6 +668,7 @@ def add_historique(id):
@bp.route("/envoyer_offre/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesSend)
def envoyer_offre(id):
"""
Permet d'envoyer une offre à un utilisateur
@@ -663,6 +702,7 @@ def envoyer_offre(id):
@bp.route("/etudiants")
+@permission_required(Permission.RelationsEntreprisesChange)
def json_etudiants():
"""
Permet de récuperer un JSON avec tous les étudiants
@@ -696,6 +736,7 @@ def json_etudiants():
@bp.route("/responsables")
+@permission_required(Permission.RelationsEntreprisesChange)
def json_responsables():
"""
Permet de récuperer un JSON avec tous les étudiants
@@ -724,6 +765,7 @@ def json_responsables():
@bp.route("/export_entreprises")
+@permission_required(Permission.RelationsEntreprisesExport)
def export_entreprises():
"""
Permet d'exporter la liste des entreprises sous format excel (.xlsx)
@@ -763,6 +805,7 @@ def export_contacts():
@bp.route("/export_contacts_bis")
+@permission_required(Permission.RelationsEntreprisesExport)
def export_contacts_bis():
"""
Permet d'exporter la liste des contacts avec leur entreprise sous format excel (.xlsx)
@@ -798,6 +841,7 @@ def export_contacts_bis():
@bp.route(
"/get_offre_file////"
)
+@permission_required(Permission.RelationsEntreprisesView)
def get_offre_file(entreprise_id, offre_id, filedir, filename):
"""
Permet de télécharger un fichier d'une offre
@@ -838,6 +882,7 @@ def get_offre_file(entreprise_id, offre_id, filedir, filename):
@bp.route("/add_offre_file/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesChange)
def add_offre_file(offre_id):
"""
Permet d'ajouter un fichier à une offre
@@ -869,6 +914,7 @@ def add_offre_file(offre_id):
@bp.route("/delete_offre_file//", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesChange)
def delete_offre_file(offre_id, filedir):
"""
Permet de supprimer un fichier d'une offre
diff --git a/app/scodoc/sco_permissions.py b/app/scodoc/sco_permissions.py
index a1a06aba8..55981b033 100644
--- a/app/scodoc/sco_permissions.py
+++ b/app/scodoc/sco_permissions.py
@@ -37,6 +37,15 @@ _SCO_PERMISSIONS = (
(1 << 21, "ScoEditPVJury", "Éditer les PV de jury"),
# ajouter maquettes Apogee (=> chef dept et secr):
(1 << 22, "ScoEditApo", "Ajouter des maquettes Apogées"),
+ (1 << 23, "RelationsEntreprisesView", "Voir l'application relations entreprises"),
+ (1 << 24, "RelationsEntreprisesChange", "Modifier les entreprises"),
+ (
+ 1 << 25,
+ "RelationsEntreprisesExport",
+ "Exporter les données de l'application relations entreprises",
+ ),
+ (1 << 25, "RelationsEntreprisesSend", "Envoyer des offres"),
+ (1 << 26, "RelationsEntreprisesValidate", "Valide les entreprises"),
)
diff --git a/app/templates/entreprises/entreprises_validation.html b/app/templates/entreprises/entreprises_validation.html
new file mode 100644
index 000000000..14a5b49da
--- /dev/null
+++ b/app/templates/entreprises/entreprises_validation.html
@@ -0,0 +1,49 @@
+{# -*- mode: jinja-html -*- #}
+{% extends 'base.html' %}
+
+{% block app_content %}
+ {% if logs %}
+
+
Dernières opérations
+
+ {% for log in logs %}
+ {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet }}
+ {% endfor %}
+
+
+ {% endif %}
+
+
Liste des entreprises à valider
+ {% if entreprises %}
+
+
+
+ SIRET
+ Nom
+ Adresse
+ Code postal
+ Ville
+ Pays
+ Action
+
+ {% for entreprise in entreprises %}
+
+ {{ entreprise.siret }}
+ {{ entreprise.nom }}
+ {{ entreprise.adresse }}
+ {{ entreprise.codepostal }}
+ {{ entreprise.ville }}
+ {{ entreprise.pays }}
+
+ Valider
+
+
+ {% endfor %}
+
+ {% else %}
+
Aucune entreprise à valider
+
+
+ {% endif %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/fiche_entreprise.html b/app/templates/entreprises/fiche_entreprise.html
index 8e03942d4..a7cc09632 100644
--- a/app/templates/entreprises/fiche_entreprise.html
+++ b/app/templates/entreprises/fiche_entreprise.html
@@ -71,7 +71,7 @@
Ajouter contact
Ajouter
historique
- Voir les offres expirées
+ Voir les offres expirées
{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/fiche_entreprise_validation.html b/app/templates/entreprises/fiche_entreprise_validation.html
new file mode 100644
index 000000000..6daf2ce11
--- /dev/null
+++ b/app/templates/entreprises/fiche_entreprise_validation.html
@@ -0,0 +1,45 @@
+{# -*- mode: jinja-html -*- #}
+{% extends 'base.html' %}
+
+{% block app_content %}
+
+
Fiche entreprise - {{ entreprise.nom }} ({{ entreprise.siret }})
+
+
+
+ SIRET : {{ entreprise.siret }}
+ Nom : {{ entreprise.nom }}
+ Adresse : {{ entreprise.adresse }}
+ Code postal : {{ entreprise.codepostal }}
+ Ville : {{ entreprise.ville }}
+ Pays : {{ entreprise.pays }}
+
+
+
+ {% if contacts %}
+
+ {% for contact in contacts %}
+ Contact {{loop.index}}
+
+
+ Nom : {{ contact.nom }}
+ Prénom : {{ contact.prenom }}
+ Téléphone : {{ contact.telephone }}
+ Mail : {{ contact.mail }}
+ {% if contact.poste %}
+ Poste : {{ contact.poste }}
+ {% endif %}
+ {% if contact.service %}
+ Service : {{ contact.service }}
+ {% endif %}
+
+
+ {% endfor %}
+
+ {% endif %}
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/offres_expirees.html b/app/templates/entreprises/offres_expirees.html
index 50c1b7d76..2b7b60f56 100644
--- a/app/templates/entreprises/offres_expirees.html
+++ b/app/templates/entreprises/offres_expirees.html
@@ -3,12 +3,14 @@
{% block app_content %}
-
Offres expirées de {{ entreprise.nom }}
-{% if offres_expirees %}
- {% for offre in offres_expirees%}
- Offre {{loop.index}} (ajouté le {{offre[0].date_ajout.strftime('%d/%m/%Y') }})
- {% include 'entreprises/_offre.html' %}
- {% endfor %}
-{% endif %}
+
Offres expirées de {{ entreprise.nom }}
+ {% if offres_expirees %}
+ {% for offre in offres_expirees%}
+ Offre {{loop.index}} (ajouté le {{offre[0].date_ajout.strftime('%d/%m/%Y') }})
+ {% include 'entreprises/_offre.html' %}
+ {% endfor %}
+ {% else %}
+
Aucune offre expirées
+ {% endif %}
{% endblock %}
\ No newline at end of file
From 4578973f3f351b6d5a86ed5fe94ee82a0ae19135 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Wed, 26 Jan 2022 18:46:21 +0100
Subject: [PATCH 06/26] oubli
---
app/entreprises/routes.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 8266d67a1..91383f348 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -787,6 +787,7 @@ def export_entreprises():
@bp.route("/export_contacts")
+@permission_required(Permission.RelationsEntreprisesExport)
def export_contacts():
"""
Permet d'exporter la liste des contacts sous format excel (.xlsx)
From a064d1aac8182c9a18e06af4730dcc5baa00ff0c Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Thu, 27 Jan 2022 16:28:28 +0100
Subject: [PATCH 07/26] =?UTF-8?q?page=20=20diff=C3=A9rente=20selon=20les?=
=?UTF-8?q?=20permissions=20de=20l'utilisateur?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/entreprises/routes.py | 26 +++++++++----------
app/scodoc/sco_permissions.py | 1 +
app/templates/entreprises/_contact.html | 2 ++
app/templates/entreprises/_offre.html | 9 +++++++
app/templates/entreprises/contacts.html | 2 ++
app/templates/entreprises/entreprises.html | 12 +++++++--
.../entreprises/fiche_entreprise.html | 2 ++
7 files changed, 39 insertions(+), 15 deletions(-)
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 91383f348..651184920 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -74,7 +74,7 @@ def validation_entreprise():
entreprises = Entreprise.query.filter_by(visible=False).all()
return render_template(
"entreprises/entreprises_validation.html",
- title=("Entreprises"),
+ title=("Validation entreprises"),
entreprises=entreprises,
)
@@ -187,7 +187,7 @@ def fiche_entreprise_validation(id):
contacts = entreprise.contacts
return render_template(
"entreprises/fiche_entreprise_validation.html",
- title=("Fiche entreprise"),
+ title=("Validation fiche entreprise"),
entreprise=entreprise,
contacts=contacts,
)
@@ -195,7 +195,7 @@ def fiche_entreprise_validation(id):
@bp.route("/offres_recues", methods=["GET"])
@permission_required(Permission.RelationsEntreprisesView)
-def offres():
+def offres_recues():
"""
Permet d'afficher la page où l'on recoit les offres
@@ -222,7 +222,7 @@ def offres():
@bp.route("/fiche_entreprise//offres_expirees")
@permission_required(Permission.RelationsEntreprisesView)
def offres_expirees(id):
- entreprise = Entreprise.query.filter_by(id=id).first_or_404()
+ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
offres = entreprise.offres
offres_expirees_with_files = []
for offre in offres:
@@ -305,7 +305,7 @@ def edit_entreprise(id):
id:
l'id de l'entreprise
"""
- entreprise = Entreprise.query.filter_by(id=id).first_or_404()
+ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
form = EntrepriseModificationForm()
if form.validate_on_submit():
nom_entreprise = f"{form.nom.data.strip()} "
@@ -374,7 +374,7 @@ def delete_entreprise(id):
id:
l'id de l'entreprise
"""
- entreprise = Entreprise.query.filter_by(id=id).first_or_404()
+ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
form = SuppressionConfirmationForm()
if form.validate_on_submit():
db.session.delete(entreprise)
@@ -397,7 +397,7 @@ def delete_entreprise(id):
@bp.route("/validate_entreprise/", methods=["GET", "POST"])
@permission_required(Permission.RelationsEntreprisesValidate)
def validate_entreprise(id):
- entreprise = Entreprise.query.filter_by(id=id).first_or_404()
+ entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404()
entreprise.visible = True
db.session.commit()
return redirect(url_for("entreprises.fiche_entreprise", id=entreprise.id))
@@ -413,7 +413,7 @@ def add_offre(id):
id:
l'id de l'entreprise
"""
- entreprise = Entreprise.query.filter_by(id=id).first_or_404()
+ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
form = OffreCreationForm()
if form.validate_on_submit():
offre = EntrepriseOffre(
@@ -517,7 +517,7 @@ def add_contact(id):
id:
l'id de l'entreprise
"""
- entreprise = Entreprise.query.filter_by(id=id).first_or_404()
+ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
form = ContactCreationForm(hidden_entreprise_id=entreprise.id)
if form.validate_on_submit():
contact = EntrepriseContact(
@@ -632,7 +632,7 @@ def add_historique(id):
id:
l'id de l'entreprise
"""
- entreprise = Entreprise.query.filter_by(id=id).first_or_404()
+ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
form = HistoriqueCreationForm()
if form.validate_on_submit():
etudiant_nomcomplet = form.etudiant.data.upper().strip()
@@ -770,7 +770,7 @@ def export_entreprises():
"""
Permet d'exporter la liste des entreprises sous format excel (.xlsx)
"""
- entreprises = Entreprise.query.all()
+ entreprises = Entreprise.query.filter_by(visible=True).all()
if entreprises:
keys = ["siret", "nom", "adresse", "ville", "codepostal", "pays"]
titles = keys[:]
@@ -792,7 +792,7 @@ def export_contacts():
"""
Permet d'exporter la liste des contacts sous format excel (.xlsx)
"""
- contacts = EntrepriseContact.query.all()
+ contacts = EntrepriseContact.query.filter_by(visible=True).all()
if contacts:
keys = ["nom", "prenom", "telephone", "mail", "poste", "service"]
titles = keys[:]
@@ -811,7 +811,7 @@ def export_contacts_bis():
"""
Permet d'exporter la liste des contacts avec leur entreprise sous format excel (.xlsx)
"""
- contacts = EntrepriseContact.query.all()
+ contacts = EntrepriseContact.query.filter_by(visible=True).all()
if contacts:
keys = [
"nom",
diff --git a/app/scodoc/sco_permissions.py b/app/scodoc/sco_permissions.py
index 55981b033..71cfede19 100644
--- a/app/scodoc/sco_permissions.py
+++ b/app/scodoc/sco_permissions.py
@@ -37,6 +37,7 @@ _SCO_PERMISSIONS = (
(1 << 21, "ScoEditPVJury", "Éditer les PV de jury"),
# ajouter maquettes Apogee (=> chef dept et secr):
(1 << 22, "ScoEditApo", "Ajouter des maquettes Apogées"),
+ # application relations entreprises
(1 << 23, "RelationsEntreprisesView", "Voir l'application relations entreprises"),
(1 << 24, "RelationsEntreprisesChange", "Modifier les entreprises"),
(
diff --git a/app/templates/entreprises/_contact.html b/app/templates/entreprises/_contact.html
index e7083a26f..29f7bd46f 100644
--- a/app/templates/entreprises/_contact.html
+++ b/app/templates/entreprises/_contact.html
@@ -13,8 +13,10 @@
{% endif %}
+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %}
+ {% endif %}
\ No newline at end of file
diff --git a/app/templates/entreprises/_offre.html b/app/templates/entreprises/_offre.html
index ea69110e9..a893cf5b6 100644
--- a/app/templates/entreprises/_offre.html
+++ b/app/templates/entreprises/_offre.html
@@ -8,14 +8,23 @@
Durée : {{ offre[0].duree }}
{% for fichier in offre[1] %}
{{ fichier[1] }}
+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %}
+ {% endif %}
{% endfor %}
+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %}
Ajoutez un fichier
+ {% endif %}
+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %}
Modifier l'offre
Supprimer l'offre
+ {% endif %}
+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesSend, None) %}
Envoyer l'offre
+ {% endif %}
+
\ No newline at end of file
diff --git a/app/templates/entreprises/contacts.html b/app/templates/entreprises/contacts.html
index 22fb1be92..0d0df6797 100644
--- a/app/templates/entreprises/contacts.html
+++ b/app/templates/entreprises/contacts.html
@@ -42,11 +42,13 @@
Aucun contact présent dans la base
{% endif %}
+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesExport, None) %}
+ {% endif %}
{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/entreprises.html b/app/templates/entreprises/entreprises.html
index fe790a8d6..4dd96a0e0 100644
--- a/app/templates/entreprises/entreprises.html
+++ b/app/templates/entreprises/entreprises.html
@@ -24,7 +24,9 @@
Code postal
Ville
Pays
+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %}
Action
+ {% endif %}
{% for entreprise in entreprises %}
@@ -34,6 +36,7 @@
{{ entreprise.codepostal }}
{{ entreprise.ville }}
{{ entreprise.pays }}
+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %}
+ {% endif %}
{% endfor %}
@@ -54,9 +58,13 @@
{% endif %}
diff --git a/app/templates/entreprises/fiche_entreprise.html b/app/templates/entreprises/fiche_entreprise.html
index a7cc09632..94bb21476 100644
--- a/app/templates/entreprises/fiche_entreprise.html
+++ b/app/templates/entreprises/fiche_entreprise.html
@@ -64,6 +64,7 @@
{% endif %}
+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %}
+ {% endif %}
{% endblock %}
\ No newline at end of file
From 2d9e428ebfac54d77dee7f3bd13b4abfbfdb47f6 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Mon, 31 Jan 2022 18:22:54 +0100
Subject: [PATCH 08/26] ajout pagination + nettoyage
---
app/entreprises/__init__.py | 2 +-
app/entreprises/routes.py | 159 ++++--------------
app/static/css/entreprises.css | 11 ++
app/templates/base.html | 4 +
.../entreprises/ajout_entreprise.html | 3 +-
.../entreprises/ajout_historique.html | 1 +
app/templates/entreprises/contacts.html | 30 +++-
app/templates/entreprises/entreprises.html | 32 +++-
.../entreprises/entreprises_validation.html | 1 +
.../entreprises/envoi_offre_form.html | 1 +
.../entreprises/fiche_entreprise.html | 136 +++++++--------
app/templates/entreprises/logs.html | 37 ++++
.../entreprises/offres_expirees.html | 22 +--
app/templates/entreprises/offres_recues.html | 8 +-
14 files changed, 235 insertions(+), 212 deletions(-)
create mode 100644 app/static/css/entreprises.css
create mode 100644 app/templates/entreprises/logs.html
diff --git a/app/entreprises/__init__.py b/app/entreprises/__init__.py
index 44968ffb1..813fd73b6 100644
--- a/app/entreprises/__init__.py
+++ b/app/entreprises/__init__.py
@@ -7,7 +7,7 @@ from app.auth.models import User
bp = Blueprint("entreprises", __name__)
-LOGS_LEN = 10
+LOGS_LEN = 5
@bp.app_template_filter()
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 651184920..a6f91813b 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -48,17 +48,11 @@ from werkzeug.utils import secure_filename
def index():
"""
Permet d'afficher une page avec la liste des entreprises et une liste des dernières opérations
-
- Retourne: template de la page (entreprises.html)
- Arguments du template:
- title:
- titre de la page
- entreprises:
- liste des entreprises
- logs:
- liste des logs
"""
- entreprises = Entreprise.query.filter_by(visible=True).all()
+ page = request.args.get("page", 1, type=int)
+ entreprises = Entreprise.query.filter_by(visible=True).paginate(
+ page=page, per_page=10
+ )
logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all()
return render_template(
"entreprises/entreprises.html",
@@ -68,9 +62,27 @@ def index():
)
+@bp.route("/logs", methods=["GET"])
+@permission_required(Permission.RelationsEntreprisesView)
+def logs():
+ """
+ Permet d'afficher les logs (toutes les entreprises)
+ """
+ page = request.args.get("page", 1, type=int)
+ logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).paginate(
+ page=page, per_page=20
+ )
+ if logs is None:
+ abort(404)
+ return render_template("entreprises/logs.html", title=("Logs"), logs=logs)
+
+
@bp.route("/validation", methods=["GET"])
@permission_required(Permission.RelationsEntreprisesValidate)
def validation_entreprise():
+ """
+ Permet d'afficher une page avec la liste des entreprises a valider
+ """
entreprises = Entreprise.query.filter_by(visible=False).all()
return render_template(
"entreprises/entreprises_validation.html",
@@ -84,21 +96,13 @@ def validation_entreprise():
def contacts():
"""
Permet d'afficher une page la liste des contacts et une liste des dernières opérations
-
- Retourne: template de la page (contacts.html)
- Arguments du template:
- title:
- titre de la page
- contacts:
- liste des contacts
- logs:
- liste des logs
"""
+ page = request.args.get("page", 1, type=int)
contacts = (
db.session.query(EntrepriseContact, Entreprise)
.join(Entreprise, EntrepriseContact.entreprise_id == Entreprise.id)
.filter_by(visible=True)
- .all()
+ .paginate(page=page, per_page=10)
)
logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all()
return render_template(
@@ -114,25 +118,6 @@ def fiche_entreprise(id):
l'historique des étudiants ayant réaliser un stage ou une alternance dans cette entreprise.
La fiche entreprise comporte les informations de l'entreprise, les contacts de l'entreprise et
les offres de l'entreprise.
-
- Arguments:
- id:
- l'id de l'entreprise
-
- Retourne: template de la page (fiche_entreprise.html)
- Arguments du template:
- title:
- titre de la page
- entreprise:
- un objet entreprise
- contacts:
- liste des contacts de l'entreprise
- offres:
- liste des offres de l'entreprise avec leurs fichiers
- logs:
- liste des logs
- historique:
- liste des étudiants ayant réaliser un stage ou une alternance dans l'entreprise
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
offres = entreprise.offres
@@ -183,6 +168,9 @@ def fiche_entreprise(id):
@bp.route("/fiche_entreprise_validation/", methods=["GET"])
@permission_required(Permission.RelationsEntreprisesValidate)
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()
contacts = entreprise.contacts
return render_template(
@@ -198,13 +186,6 @@ def fiche_entreprise_validation(id):
def offres_recues():
"""
Permet d'afficher la page où l'on recoit les offres
-
- Retourne: template de la page (offres.html)
- Arguments du template:
- title:
- titre de la page
- offres_recus:
- liste des offres reçues
"""
offres_recues = (
db.session.query(EntrepriseEnvoiOffre, EntrepriseOffre)
@@ -222,6 +203,9 @@ def offres_recues():
@bp.route("/fiche_entreprise//offres_expirees")
@permission_required(Permission.RelationsEntreprisesView)
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()
offres = entreprise.offres
offres_expirees_with_files = []
@@ -290,7 +274,7 @@ def add_entreprise():
return redirect(url_for("entreprises.index"))
return render_template(
"entreprises/ajout_entreprise.html",
- title=("Ajout entreprise + contact"),
+ title=("Ajout entreprise avec contact"),
form=form,
)
@@ -300,10 +284,6 @@ def add_entreprise():
def edit_entreprise(id):
"""
Permet de modifier une entreprise de la base avec un formulaire
-
- Arguments:
- id:
- l'id de l'entreprise
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
form = EntrepriseModificationForm()
@@ -369,10 +349,6 @@ def edit_entreprise(id):
def delete_entreprise(id):
"""
Permet de supprimer une entreprise de la base avec un formulaire de confirmation
-
- Arguments:
- id:
- l'id de l'entreprise
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
form = SuppressionConfirmationForm()
@@ -397,6 +373,9 @@ def delete_entreprise(id):
@bp.route("/validate_entreprise/", methods=["GET", "POST"])
@permission_required(Permission.RelationsEntreprisesValidate)
def validate_entreprise(id):
+ """
+ Permet de valider une entreprise
+ """
entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404()
entreprise.visible = True
db.session.commit()
@@ -408,10 +387,6 @@ def validate_entreprise(id):
def add_offre(id):
"""
Permet d'ajouter une offre a une entreprise
-
- Arguments:
- id:
- l'id de l'entreprise
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
form = OffreCreationForm()
@@ -443,10 +418,6 @@ def add_offre(id):
def edit_offre(id):
"""
Permet de modifier une offre
-
- Arguments:
- id:
- l'id de l'offre
"""
offre = EntrepriseOffre.query.filter_by(id=id).first_or_404()
form = OffreModificationForm()
@@ -483,10 +454,6 @@ def edit_offre(id):
def delete_offre(id):
"""
Permet de supprimer une offre
-
- Arguments:
- id:
- l'id de l'offre
"""
offre = EntrepriseOffre.query.filter_by(id=id).first_or_404()
entreprise_id = offre.entreprise.id
@@ -512,10 +479,6 @@ def delete_offre(id):
def add_contact(id):
"""
Permet d'ajouter un contact a une entreprise
-
- Arguments:
- id:
- l'id de l'entreprise
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
form = ContactCreationForm(hidden_entreprise_id=entreprise.id)
@@ -547,10 +510,6 @@ def add_contact(id):
def edit_contact(id):
"""
Permet de modifier un contact
-
- Arguments:
- id:
- l'id du contact
"""
contact = EntrepriseContact.query.filter_by(id=id).first_or_404()
form = ContactModificationForm()
@@ -589,10 +548,6 @@ def edit_contact(id):
def delete_contact(id):
"""
Permet de supprimer un contact
-
- Arguments:
- id:
- l'id du contact
"""
contact = EntrepriseContact.query.filter_by(id=id).first_or_404()
entreprise_id = contact.entreprise.id
@@ -627,10 +582,6 @@ def delete_contact(id):
def add_historique(id):
"""
Permet d'ajouter un étudiant ayant réalisé un stage ou une alternance sur la fiche entreprise de l'entreprise
-
- Arguments:
- id:
- l'id de l'entreprise
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
form = HistoriqueCreationForm()
@@ -672,10 +623,6 @@ def add_historique(id):
def envoyer_offre(id):
"""
Permet d'envoyer une offre à un utilisateur
-
- Arguments:
- id:
- l'id de l'offre
"""
offre = EntrepriseOffre.query.filter_by(id=id).first_or_404()
form = EnvoiOffreForm()
@@ -706,13 +653,6 @@ def envoyer_offre(id):
def json_etudiants():
"""
Permet de récuperer un JSON avec tous les étudiants
-
- Arguments:
- term:
- le terme utilisé pour le filtre de l'autosuggest
-
- Retourne:
- le JSON de tous les étudiants (nom, prenom, formation actuelle?) correspondant au terme
"""
if request.args.get("term") == None:
abort(400)
@@ -740,13 +680,6 @@ def json_etudiants():
def json_responsables():
"""
Permet de récuperer un JSON avec tous les étudiants
-
- Arguments:
- term:
- le terme utilisé pour le filtre de l'autosuggest
-
- Retourne:
- le JSON de tous les utilisateurs (nom, prenom, login) correspondant au terme
"""
if request.args.get("term") == None:
abort(400)
@@ -792,7 +725,7 @@ def export_contacts():
"""
Permet d'exporter la liste des contacts sous format excel (.xlsx)
"""
- contacts = EntrepriseContact.query.filter_by(visible=True).all()
+ contacts = EntrepriseContact.query.all()
if contacts:
keys = ["nom", "prenom", "telephone", "mail", "poste", "service"]
titles = keys[:]
@@ -811,7 +744,7 @@ def export_contacts_bis():
"""
Permet d'exporter la liste des contacts avec leur entreprise sous format excel (.xlsx)
"""
- contacts = EntrepriseContact.query.filter_by(visible=True).all()
+ contacts = EntrepriseContact.query.all()
if contacts:
keys = [
"nom",
@@ -846,16 +779,6 @@ def export_contacts_bis():
def get_offre_file(entreprise_id, offre_id, filedir, filename):
"""
Permet de télécharger un fichier d'une offre
-
- Arguments:
- entreprise_id:
- l'id de l'entreprise
- offre_id:
- l'id de l'offre
- filedir:
- le répertoire du fichier
- filename:
- le nom du fichier
"""
if os.path.isfile(
os.path.join(
@@ -887,10 +810,6 @@ def get_offre_file(entreprise_id, offre_id, filedir, filename):
def add_offre_file(offre_id):
"""
Permet d'ajouter un fichier à une offre
-
- Arguments:
- offre_id:
- l'id de l'offre
"""
offre = EntrepriseOffre.query.filter_by(id=offre_id).first_or_404()
form = AjoutFichierForm()
@@ -919,12 +838,6 @@ def add_offre_file(offre_id):
def delete_offre_file(offre_id, filedir):
"""
Permet de supprimer un fichier d'une offre
-
- Arguments:
- offre_id:
- l'id de l'offre
- filedir:
- le répertoire du fichier
"""
offre = EntrepriseOffre.query.filter_by(id=offre_id).first_or_404()
form = SuppressionConfirmationForm()
diff --git a/app/static/css/entreprises.css b/app/static/css/entreprises.css
new file mode 100644
index 000000000..6dded2fa4
--- /dev/null
+++ b/app/static/css/entreprises.css
@@ -0,0 +1,11 @@
+.btn-inverse {
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgb(0 0 0 / 25%);
+ background-color: #363636;
+}
+
+.btn-inverse:hover {
+ color: #ffffff;
+ background-color: #222222;
+ *background-color: #151515;
+}
\ No newline at end of file
diff --git a/app/templates/base.html b/app/templates/base.html
index adf70171b..176e4b993 100644
--- a/app/templates/base.html
+++ b/app/templates/base.html
@@ -4,6 +4,7 @@
{% block styles %}
{{super()}}
+
{% endblock %}
{% block title %}
@@ -35,6 +36,9 @@
url_for('scolar.index_html', scodoc_dept=g.scodoc_dept)
}}">Dept. {{ g.scodoc_dept }}
{% endif %}
+ {% if not current_user.is_anonymous and current_user.has_permission(current_user.Permission.RelationsEntreprisesView, None) %}
+ Entreprises
+ {% endif %}
{% if current_user.is_anonymous %}
diff --git a/app/templates/entreprises/ajout_entreprise.html b/app/templates/entreprises/ajout_entreprise.html
index 15cf174fb..348c60882 100644
--- a/app/templates/entreprises/ajout_entreprise.html
+++ b/app/templates/entreprises/ajout_entreprise.html
@@ -8,11 +8,12 @@
- Les champs s'autocomplète selon le SIRET
+ Les champs s'auto complète selon le SIRET
{{ 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/593451ab68b3_tables_module_gestion_relations_.py
new file mode 100644
index 000000000..e72dff94b
--- /dev/null
+++ b/migrations/versions/593451ab68b3_tables_module_gestion_relations_.py
@@ -0,0 +1,253 @@
+"""tables module gestion relations entreprises
+
+Revision ID: 593451ab68b3
+Revises: c95d5a3bf0de
+Create Date: 2022-02-04 17:06:02.519231
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import postgresql
+
+# revision identifiers, used by Alembic.
+revision = "593451ab68b3"
+down_revision = "c95d5a3bf0de"
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.create_table(
+ "are_entreprise_log",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column(
+ "date",
+ sa.DateTime(timezone=True),
+ server_default=sa.text("now()"),
+ nullable=True,
+ ),
+ sa.Column("authenticated_user", sa.Text(), nullable=True),
+ sa.Column("object", sa.Integer(), nullable=True),
+ sa.Column("text", sa.Text(), nullable=True),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprises",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("siret", sa.Text(), 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.Column("visible", sa.Boolean(), nullable=True),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprise_contact",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("entreprise_id", sa.Integer(), nullable=True),
+ sa.Column("nom", sa.Text(), nullable=True),
+ sa.Column("prenom", sa.Text(), nullable=True),
+ sa.Column("telephone", sa.Text(), nullable=True),
+ sa.Column("mail", sa.Text(), nullable=True),
+ sa.Column("poste", sa.Text(), nullable=True),
+ sa.Column("service", sa.Text(), nullable=True),
+ sa.ForeignKeyConstraint(
+ ["entreprise_id"], ["are_entreprises.id"], ondelete="cascade"
+ ),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprise_etudiant",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("entreprise_id", sa.Integer(), nullable=True),
+ sa.Column("etudid", sa.Integer(), nullable=True),
+ sa.Column("type_offre", sa.Text(), nullable=True),
+ sa.Column("date_debut", sa.Date(), nullable=True),
+ sa.Column("date_fin", sa.Date(), nullable=True),
+ sa.Column("formation_text", sa.Text(), nullable=True),
+ sa.Column("formation_scodoc", sa.Integer(), nullable=True),
+ sa.ForeignKeyConstraint(
+ ["entreprise_id"], ["are_entreprises.id"], ondelete="cascade"
+ ),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprise_offre",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("entreprise_id", sa.Integer(), nullable=True),
+ sa.Column(
+ "date_ajout",
+ sa.DateTime(timezone=True),
+ server_default=sa.text("now()"),
+ nullable=True,
+ ),
+ sa.Column("intitule", sa.Text(), nullable=True),
+ sa.Column("description", sa.Text(), nullable=True),
+ sa.Column("type_offre", sa.Text(), nullable=True),
+ sa.Column("missions", sa.Text(), nullable=True),
+ sa.Column("duree", sa.Text(), nullable=True),
+ sa.Column("expiration_date", sa.Date(), nullable=True),
+ sa.ForeignKeyConstraint(
+ ["entreprise_id"], ["are_entreprises.id"], ondelete="cascade"
+ ),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprise_envoi_offre",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("sender_id", sa.Integer(), nullable=True),
+ sa.Column("receiver_id", sa.Integer(), nullable=True),
+ sa.Column("offre_id", sa.Integer(), nullable=True),
+ sa.Column(
+ "date_envoi",
+ sa.DateTime(timezone=True),
+ server_default=sa.text("now()"),
+ nullable=True,
+ ),
+ sa.ForeignKeyConstraint(
+ ["offre_id"], ["are_entreprise_offre.id"], ondelete="cascade"
+ ),
+ sa.ForeignKeyConstraint(["receiver_id"], ["user.id"], ondelete="cascade"),
+ sa.ForeignKeyConstraint(["sender_id"], ["user.id"], ondelete="cascade"),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprise_envoi_offre_etudiant",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("sender_id", sa.Integer(), nullable=True),
+ sa.Column("receiver_id", sa.Integer(), nullable=True),
+ sa.Column("offre_id", sa.Integer(), nullable=True),
+ sa.Column(
+ "date_envoi",
+ sa.DateTime(timezone=True),
+ server_default=sa.text("now()"),
+ nullable=True,
+ ),
+ sa.ForeignKeyConstraint(
+ ["offre_id"], ["are_entreprise_offre.id"], ondelete="cascade"
+ ),
+ sa.ForeignKeyConstraint(["receiver_id"], ["identite.id"], ondelete="cascade"),
+ sa.ForeignKeyConstraint(["sender_id"], ["user.id"], ondelete="cascade"),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.create_table(
+ "are_entreprise_offre_departement",
+ sa.Column("id", sa.Integer(), nullable=False),
+ sa.Column("offre_id", sa.Integer(), nullable=True),
+ sa.Column("dept_id", sa.Integer(), nullable=True),
+ sa.ForeignKeyConstraint(["dept_id"], ["departement.id"], ondelete="cascade"),
+ sa.ForeignKeyConstraint(
+ ["offre_id"], ["are_entreprise_offre.id"], ondelete="cascade"
+ ),
+ sa.PrimaryKeyConstraint("id"),
+ )
+ op.drop_table("entreprise_contact")
+ op.drop_table("entreprise_correspondant")
+ op.drop_index("ix_entreprises_dept_id", table_name="entreprises")
+ op.drop_table("entreprises")
+ # ### end Alembic commands ###
+
+
+def downgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.create_table(
+ "entreprises",
+ sa.Column("id", sa.INTEGER(), 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),
+ sa.Column("codepostal", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("pays", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("localisation", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("dept_id", sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.Column(
+ "date_creation",
+ postgresql.TIMESTAMP(timezone=True),
+ server_default=sa.text("now()"),
+ autoincrement=False,
+ nullable=True,
+ ),
+ sa.Column("secteur", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("privee", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("plus10salaries", sa.BOOLEAN(), autoincrement=False, nullable=True),
+ sa.Column("contact_origine", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("note", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("qualite_relation", sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.ForeignKeyConstraint(
+ ["dept_id"], ["departement.id"], name="entreprises_dept_id_fkey"
+ ),
+ sa.PrimaryKeyConstraint("id", name="entreprises_pkey"),
+ )
+ 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("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),
+ sa.Column("civilite", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("fonction", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("phone1", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("phone2", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("mobile", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("mail1", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("mail2", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("fax", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("note", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.ForeignKeyConstraint(
+ ["entreprise_id"],
+ ["entreprises.id"],
+ name="entreprise_correspondant_entreprise_id_fkey",
+ ),
+ sa.PrimaryKeyConstraint("id", name="entreprise_correspondant_pkey"),
+ postgresql_ignore_search_path=False,
+ )
+ op.create_table(
+ "entreprise_contact",
+ sa.Column("id", sa.INTEGER(), autoincrement=True, nullable=False),
+ sa.Column("entreprise_id", sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.Column(
+ "entreprise_corresp_id", sa.INTEGER(), autoincrement=False, nullable=True
+ ),
+ sa.Column("etudid", sa.INTEGER(), autoincrement=False, nullable=True),
+ sa.Column("type_contact", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column(
+ "date",
+ postgresql.TIMESTAMP(timezone=True),
+ autoincrement=False,
+ nullable=True,
+ ),
+ sa.Column("enseignant", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.Column("description", sa.TEXT(), autoincrement=False, nullable=True),
+ sa.ForeignKeyConstraint(
+ ["entreprise_corresp_id"],
+ ["entreprise_correspondant.id"],
+ name="entreprise_contact_entreprise_corresp_id_fkey",
+ ),
+ sa.ForeignKeyConstraint(
+ ["entreprise_id"],
+ ["entreprises.id"],
+ name="entreprise_contact_entreprise_id_fkey",
+ ),
+ 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_entreprises")
+ op.drop_table("are_entreprise_log")
+ # ### end Alembic commands ###
diff --git a/migrations/versions/e63f6a9dcc75_tables_application_relations_entreprises.py b/migrations/versions/e63f6a9dcc75_tables_application_relations_entreprises.py
deleted file mode 100644
index 73b7b0d14..000000000
--- a/migrations/versions/e63f6a9dcc75_tables_application_relations_entreprises.py
+++ /dev/null
@@ -1,176 +0,0 @@
-"""tables application relations entreprises
-
-Revision ID: e63f6a9dcc75
-Revises: c95d5a3bf0de
-Create Date: 2022-02-03 15:47:02.445248
-
-"""
-from alembic import op
-import sqlalchemy as sa
-from sqlalchemy.dialects import postgresql
-
-# revision identifiers, used by Alembic.
-revision = 'e63f6a9dcc75'
-down_revision = 'c95d5a3bf0de'
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
- # ### commands auto generated by Alembic - please adjust! ###
- op.create_table('are_entreprise_log',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('date', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
- sa.Column('authenticated_user', sa.Text(), nullable=True),
- sa.Column('object', sa.Integer(), nullable=True),
- sa.Column('text', sa.Text(), nullable=True),
- sa.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprises',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('siret', sa.Text(), 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.Column('visible', sa.Boolean(), nullable=True),
- sa.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprise_contact',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('entreprise_id', sa.Integer(), nullable=True),
- sa.Column('nom', sa.Text(), nullable=True),
- sa.Column('prenom', sa.Text(), nullable=True),
- sa.Column('telephone', sa.Text(), nullable=True),
- sa.Column('mail', sa.Text(), nullable=True),
- sa.Column('poste', sa.Text(), nullable=True),
- sa.Column('service', sa.Text(), nullable=True),
- sa.ForeignKeyConstraint(['entreprise_id'], ['are_entreprises.id'], ondelete='cascade'),
- sa.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprise_etudiant',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('entreprise_id', sa.Integer(), nullable=True),
- sa.Column('etudid', sa.Integer(), nullable=True),
- sa.Column('type_offre', sa.Text(), nullable=True),
- sa.Column('date_debut', sa.Date(), nullable=True),
- sa.Column('date_fin', sa.Date(), nullable=True),
- sa.Column('formation_text', sa.Text(), nullable=True),
- sa.Column('formation_scodoc', sa.Integer(), nullable=True),
- sa.ForeignKeyConstraint(['entreprise_id'], ['are_entreprises.id'], ),
- sa.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprise_offre',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('entreprise_id', sa.Integer(), nullable=True),
- sa.Column('date_ajout', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
- sa.Column('intitule', sa.Text(), nullable=True),
- sa.Column('description', sa.Text(), nullable=True),
- sa.Column('type_offre', sa.Text(), nullable=True),
- sa.Column('missions', sa.Text(), nullable=True),
- sa.Column('duree', sa.Text(), nullable=True),
- sa.Column('expiration_date', sa.Date(), nullable=True),
- sa.ForeignKeyConstraint(['entreprise_id'], ['are_entreprises.id'], ondelete='cascade'),
- sa.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprise_envoi_offre',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('sender_id', sa.Integer(), nullable=True),
- sa.Column('receiver_id', sa.Integer(), nullable=True),
- sa.Column('offre_id', sa.Integer(), nullable=True),
- sa.Column('date_envoi', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
- sa.ForeignKeyConstraint(['offre_id'], ['are_entreprise_offre.id'], ),
- sa.ForeignKeyConstraint(['receiver_id'], ['user.id'], ),
- sa.ForeignKeyConstraint(['sender_id'], ['user.id'], ),
- sa.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprise_envoi_offre_etudiant',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('sender_id', sa.Integer(), nullable=True),
- sa.Column('receiver_id', sa.Integer(), nullable=True),
- sa.Column('offre_id', sa.Integer(), nullable=True),
- sa.Column('date_envoi', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
- sa.ForeignKeyConstraint(['offre_id'], ['are_entreprise_offre.id'], ),
- sa.ForeignKeyConstraint(['receiver_id'], ['identite.id'], ),
- sa.ForeignKeyConstraint(['sender_id'], ['user.id'], ),
- sa.PrimaryKeyConstraint('id')
- )
- op.create_table('are_entreprise_offre_departement',
- sa.Column('id', sa.Integer(), nullable=False),
- sa.Column('offre_id', sa.Integer(), nullable=True),
- sa.Column('dept_id', sa.Integer(), nullable=True),
- sa.ForeignKeyConstraint(['dept_id'], ['departement.id'], ),
- sa.ForeignKeyConstraint(['offre_id'], ['are_entreprise_offre.id'], ),
- sa.PrimaryKeyConstraint('id')
- )
- op.drop_table('entreprise_contact')
- op.drop_table('entreprise_correspondant')
- op.drop_index('ix_entreprises_dept_id', table_name='entreprises')
- op.drop_table('entreprises')
- # ### end Alembic commands ###
-
-
-def downgrade():
- # ### commands auto generated by Alembic - please adjust! ###
- op.create_table('entreprises',
- 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),
- sa.Column('codepostal', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('pays', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('localisation', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('dept_id', sa.INTEGER(), autoincrement=False, nullable=True),
- sa.Column('date_creation', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),
- sa.Column('secteur', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('privee', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('plus10salaries', sa.BOOLEAN(), autoincrement=False, nullable=True),
- sa.Column('contact_origine', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('note', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('qualite_relation', sa.INTEGER(), autoincrement=False, nullable=True),
- sa.ForeignKeyConstraint(['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('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),
- sa.Column('civilite', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('fonction', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('phone1', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('phone2', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('mobile', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('mail1', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('mail2', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('fax', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('note', sa.TEXT(), autoincrement=False, nullable=True),
- sa.ForeignKeyConstraint(['entreprise_id'], ['entreprises.id'], name='entreprise_correspondant_entreprise_id_fkey'),
- sa.PrimaryKeyConstraint('id', name='entreprise_correspondant_pkey'),
- postgresql_ignore_search_path=False
- )
- op.create_table('entreprise_contact',
- sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False),
- sa.Column('entreprise_id', sa.INTEGER(), autoincrement=False, nullable=True),
- sa.Column('entreprise_corresp_id', sa.INTEGER(), autoincrement=False, nullable=True),
- sa.Column('etudid', sa.INTEGER(), autoincrement=False, nullable=True),
- sa.Column('type_contact', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('date', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
- sa.Column('enseignant', sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column('description', sa.TEXT(), autoincrement=False, nullable=True),
- sa.ForeignKeyConstraint(['entreprise_corresp_id'], ['entreprise_correspondant.id'], name='entreprise_contact_entreprise_corresp_id_fkey'),
- sa.ForeignKeyConstraint(['entreprise_id'], ['entreprises.id'], name='entreprise_contact_entreprise_id_fkey'),
- sa.PrimaryKeyConstraint('id', name='entreprise_contact_pkey')
- )
- 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_entreprises')
- op.drop_table('are_entreprise_log')
- # ### end Alembic commands ###
From f9cad4fd01c0ea9b6a92c6008cb1922e5e18b61d Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Mon, 7 Feb 2022 17:06:00 +0100
Subject: [PATCH 16/26] correctif formulaire
---
app/entreprises/forms.py | 78 ++++++++++++++++---------
app/templates/entreprises/_contact.html | 4 ++
2 files changed, 53 insertions(+), 29 deletions(-)
diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py
index 59cd85929..b644e2bc2 100644
--- a/app/entreprises/forms.py
+++ b/app/entreprises/forms.py
@@ -85,21 +85,29 @@ class EntrepriseCreationForm(FlaskForm):
"Prénom du contact",
validators=[DataRequired(message=CHAMP_REQUIS)],
)
- telephone = StringField(
- "Téléphone du contact",
- validators=[DataRequired(message=CHAMP_REQUIS)],
- )
+ telephone = StringField("Téléphone du contact", validators=[Optional()])
mail = EmailField(
"Mail du contact",
- validators=[
- DataRequired(message=CHAMP_REQUIS),
- Email(message="Adresse e-mail invalide"),
- ],
+ validators=[Optional(), Email(message="Adresse e-mail invalide")],
)
- poste = StringField("Poste du contact", validators=[])
- service = StringField("Service du contact", validators=[])
+ poste = StringField("Poste du contact", validators=[Optional()])
+ service = StringField("Service du contact", validators=[Optional()])
submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"})
+ def validate(self):
+ rv = FlaskForm.validate(self)
+ if not rv:
+ return 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)")
+ return False
+
+ return True
+
def validate_siret(self, siret):
siret = siret.data.strip()
if re.match("^\d{14}$", siret) == None:
@@ -198,18 +206,13 @@ 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)]
- )
+ telephone = StringField("Téléphone", validators=[Optional()])
mail = EmailField(
"Mail",
- validators=[
- DataRequired(message=CHAMP_REQUIS),
- Email(message="Adresse e-mail invalide"),
- ],
+ validators=[Optional(), Email(message="Adresse e-mail invalide")],
)
- poste = StringField("Poste", validators=[])
- service = StringField("Service", validators=[])
+ poste = StringField("Poste", validators=[Optional()])
+ service = StringField("Service", validators=[Optional()])
submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"})
def validate(self):
@@ -226,7 +229,15 @@ class ContactCreationForm(FlaskForm):
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
+
+ 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)"
+ )
+ return False
return True
@@ -234,20 +245,29 @@ class ContactCreationForm(FlaskForm):
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)]
- )
+ telephone = StringField("Téléphone", validators=[Optional()])
mail = EmailField(
"Mail",
- validators=[
- DataRequired(message=CHAMP_REQUIS),
- Email(message="Adresse e-mail invalide"),
- ],
+ validators=[Optional(), Email(message="Adresse e-mail invalide")],
)
- poste = StringField("Poste", validators=[])
- service = StringField("Service", validators=[])
+ poste = StringField("Poste", validators=[Optional()])
+ service = StringField("Service", validators=[Optional()])
submit = SubmitField("Modifier", render_kw={"style": "margin-bottom: 10px;"})
+ def validate(self):
+ rv = FlaskForm.validate(self)
+ if not rv:
+ return 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)")
+ return False
+
+ return True
+
class HistoriqueCreationForm(FlaskForm):
etudiant = StringField(
diff --git a/app/templates/entreprises/_contact.html b/app/templates/entreprises/_contact.html
index 50fe4185c..e2f61aa9c 100644
--- a/app/templates/entreprises/_contact.html
+++ b/app/templates/entreprises/_contact.html
@@ -3,8 +3,12 @@
Nom : {{ contact.nom }}
Prénom : {{ contact.prenom }}
+ {% if contact.telephone %}
Téléphone : {{ contact.telephone }}
+ {% endif %}
+ {% if contact.mail %}
Mail : {{ contact.mail }}
+ {% endif %}
{% if contact.poste %}
Poste : {{ contact.poste }}
{% endif %}
From ab7a68c74bb805e10b21e2d0810c8c7e98c3806a Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Mon, 7 Feb 2022 18:39:32 +0100
Subject: [PATCH 17/26] debut import excel entreprises
---
app/entreprises/forms.py | 13 +++++-
app/entreprises/routes.py | 42 +++++++++++++++++++
app/templates/entreprises/entreprises.html | 3 ++
app/templates/entreprises/form.html | 2 -
.../entreprises/import_entreprises.html | 21 ++++++++++
5 files changed, 78 insertions(+), 3 deletions(-)
create mode 100644 app/templates/entreprises/import_entreprises.html
diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py
index b644e2bc2..e6235eaef 100644
--- a/app/entreprises/forms.py
+++ b/app/entreprises/forms.py
@@ -338,7 +338,7 @@ class AjoutFichierForm(FlaskForm):
FileAllowed(["pdf", "docx"], "Fichier .pdf ou .docx uniquement"),
],
)
- submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"})
+ submit = SubmitField("Ajouter", render_kw={"style": "margin-bottom: 10px;"})
class SuppressionConfirmationForm(FlaskForm):
@@ -347,3 +347,14 @@ class SuppressionConfirmationForm(FlaskForm):
class ValidationConfirmationForm(FlaskForm):
submit = SubmitField("Valider", render_kw={"style": "margin-bottom: 10px;"})
+
+
+class ImportEntreprisesForm(FlaskForm):
+ fichier = FileField(
+ "Fichier",
+ validators=[
+ FileRequired(message=CHAMP_REQUIS),
+ FileAllowed(["xlsx"], "Fichier .xlsx uniquement"),
+ ],
+ )
+ submit = SubmitField("Importer", render_kw={"style": "margin-bottom: 10px;"})
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 7c7415187..d7a3fac0b 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -23,6 +23,7 @@ from app.entreprises.forms import (
EnvoiOffreForm,
AjoutFichierForm,
ValidationConfirmationForm,
+ ImportEntreprisesForm,
)
from app.entreprises import bp
from app.entreprises.models import (
@@ -809,6 +810,47 @@ def export_entreprises():
abort(404)
+@bp.route("/get_import_entreprises_file_sample")
+@permission_required(Permission.RelationsEntreprisesExport)
+def get_import_entreprises_file_sample():
+ keys = [
+ "siret",
+ "nom_entreprise",
+ "adresse",
+ "ville",
+ "codepostal",
+ "pays",
+ "nom_contact",
+ "prenom_contact",
+ "telephone",
+ "mail",
+ "poste",
+ "service",
+ ]
+ titles = keys[:]
+ title = "ImportEntreprises"
+ 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)
+
+
+@bp.route("/import_entreprises", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesExport)
+def import_entreprises():
+ form = ImportEntreprisesForm()
+ if form.validate_on_submit():
+ path = os.path.join(Config.SCODOC_VAR_DIR, "tmp")
+ file = form.fichier.data
+ filename = secure_filename(file.filename)
+ file.save(os.path.join(path, filename))
+ # print(sco_excel.excel_file_to_list(filename))
+ return render_template(
+ "entreprises/import_entreprises.html",
+ title=("Importation entreprises"),
+ form=form,
+ )
+
+
@bp.route("/export_contacts")
@permission_required(Permission.RelationsEntreprisesExport)
def export_contacts():
diff --git a/app/templates/entreprises/entreprises.html b/app/templates/entreprises/entreprises.html
index 301e31051..f5615a435 100644
--- a/app/templates/entreprises/entreprises.html
+++ b/app/templates/entreprises/entreprises.html
@@ -19,6 +19,9 @@
{% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %}
Ajouter une entreprise
{% endif %}
+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesExport, None) %}
+ Importer des entreprises
+ {% endif %}
{% if entreprises %}
{% if current_user.has_permission(current_user.Permission.RelationsEntreprisesExport, None) %}
Exporter la liste des entreprises
diff --git a/app/templates/entreprises/form.html b/app/templates/entreprises/form.html
index 7659250ba..7e7792065 100644
--- a/app/templates/entreprises/form.html
+++ b/app/templates/entreprises/form.html
@@ -4,8 +4,6 @@
{% block styles %}
{{super()}}
-
-
{% endblock %}
{% block app_content %}
diff --git a/app/templates/entreprises/import_entreprises.html b/app/templates/entreprises/import_entreprises.html
new file mode 100644
index 000000000..7bb32a44a
--- /dev/null
+++ b/app/templates/entreprises/import_entreprises.html
@@ -0,0 +1,21 @@
+{# -*- mode: jinja-html -*- #}
+{% extends 'base.html' %}
+{% import 'bootstrap/wtf.html' as wtf %}
+
+{% block styles %}
+{{super()}}
+{% endblock %}
+
+{% block app_content %}
+ {{ title }}
+
+
+
+
+
+ {{ wtf.quick_form(form, novalidate=True) }}
+
+
+{% endblock %}
\ No newline at end of file
From 63292d4cd35eddce1196ddd89d863e098c505ba3 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Mon, 7 Feb 2022 20:43:59 +0100
Subject: [PATCH 18/26] correctif formulaire
---
app/entreprises/forms.py | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py
index e6235eaef..4612dfa4f 100644
--- a/app/entreprises/forms.py
+++ b/app/entreprises/forms.py
@@ -226,20 +226,21 @@ class ContactCreationForm(FlaskForm):
prenom=self.prenom.data,
).first()
+ validate = True
+
if contact is not None:
self.nom.errors.append("Ce contact 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)"
- )
- self.mail.errors.append(
- "Saisir un moyen de contact (mail ou téléphone)"
- )
- return 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)")
+ validate = False
- return True
+ return validate
class ContactModificationForm(FlaskForm):
From 442e1a35c9cd1f92b21b97d0f2f3c0f85bed1881 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Mon, 7 Feb 2022 21:40:58 +0100
Subject: [PATCH 19/26] correctif formulaire modif contact
---
app/entreprises/forms.py | 20 ++++++++++++++++++--
app/entreprises/routes.py | 5 ++++-
2 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py
index 4612dfa4f..006902be0 100644
--- a/app/entreprises/forms.py
+++ b/app/entreprises/forms.py
@@ -244,6 +244,8 @@ class ContactCreationForm(FlaskForm):
class ContactModificationForm(FlaskForm):
+ hidden_contact_id = HiddenField()
+ 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=[Optional()])
@@ -260,14 +262,28 @@ class ContactModificationForm(FlaskForm):
if not rv:
return False
+ contact = EntrepriseContact.query.filter(
+ EntrepriseContact.id != self.hidden_contact_id.data,
+ EntrepriseContact.entreprise_id == self.hidden_entreprise_id.data,
+ EntrepriseContact.nom == self.nom.data,
+ EntrepriseContact.prenom == self.prenom.data,
+ ).first()
+
+ validate = True
+
+ if contact is not None:
+ self.nom.errors.append("Ce contact 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)"
)
self.mail.errors.append("Saisir un moyen de contact (mail ou téléphone)")
- return False
+ validate = False
- return True
+ return validate
class HistoriqueCreationForm(FlaskForm):
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index d7a3fac0b..640c49cb5 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -603,7 +603,10 @@ def edit_contact(id):
Permet de modifier un contact
"""
contact = EntrepriseContact.query.filter_by(id=id).first_or_404()
- form = ContactModificationForm()
+ form = ContactModificationForm(
+ hidden_entreprise_id=contact.entreprise_id,
+ hidden_contact_id=contact.id,
+ )
if form.validate_on_submit():
contact.nom = form.nom.data.strip()
contact.prenom = form.prenom.data.strip()
From 6d7a7a7c4b2c8abbb7152431b85b369c1dba4601 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Tue, 8 Feb 2022 16:40:32 +0100
Subject: [PATCH 20/26] supprime fichiers lors des suppressions, correctifs
---
app/entreprises/routes.py | 75 ++++++++++++++++---
.../entreprises/ajout_entreprise.html | 2 +-
.../entreprises/ajout_historique.html | 2 +-
app/templates/entreprises/contacts.html | 2 +-
app/templates/entreprises/entreprises.html | 2 +-
.../entreprises/entreprises_validation.html | 5 +-
.../entreprises/envoi_offre_form.html | 2 +-
.../fiche_entreprise_validation.html | 4 +
.../entreprises/import_entreprises.html | 2 +-
app/templates/entreprises/logs.html | 62 ++++++++-------
.../entreprises/logs_entreprise.html | 51 +++++++------
app/templates/entreprises/offres_recues.html | 33 ++++----
.../entreprises/validate_confirmation.html | 2 +-
13 files changed, 152 insertions(+), 92 deletions(-)
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 640c49cb5..1b01f9634 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -1,4 +1,5 @@
import os
+from queue import Empty
from config import Config
from datetime import datetime, date
import glob
@@ -75,7 +76,11 @@ def logs():
logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).paginate(
page=page, per_page=20
)
- return render_template("entreprises/logs.html", title=("Logs"), logs=logs)
+ return render_template(
+ "entreprises/logs.html",
+ title=("Logs"),
+ logs=logs,
+ )
@bp.route("/validation", methods=["GET"])
@@ -107,7 +112,10 @@ def contacts():
)
logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all()
return render_template(
- "entreprises/contacts.html", title=("Contacts"), contacts=contacts, logs=logs
+ "entreprises/contacts.html",
+ title=("Contacts"),
+ contacts=contacts,
+ logs=logs,
)
@@ -392,7 +400,9 @@ def edit_entreprise(id):
form.ville.data = entreprise.ville
form.pays.data = entreprise.pays
return render_template(
- "entreprises/form.html", title=("Modification entreprise"), form=form
+ "entreprises/form.html",
+ title=("Modification entreprise"),
+ form=form,
)
@@ -406,6 +416,14 @@ def delete_entreprise(id):
form = SuppressionConfirmationForm()
if form.validate_on_submit():
db.session.delete(entreprise)
+ # supprime les fichiers attachés aux offres
+ path = os.path.join(
+ Config.SCODOC_VAR_DIR,
+ "entreprises",
+ f"{entreprise.id}",
+ )
+ if os.path.isdir(path):
+ shutil.rmtree(path)
log = EntrepriseLog(
authenticated_user=current_user.user_name,
object=entreprise.id,
@@ -484,7 +502,11 @@ def add_offre(id):
db.session.commit()
flash("L'offre a été ajouté à la fiche entreprise.")
return redirect(url_for("entreprises.fiche_entreprise", id=entreprise.id))
- return render_template("entreprises/form.html", title=("Ajout offre"), form=form)
+ return render_template(
+ "entreprises/form.html",
+ title=("Ajout offre"),
+ form=form,
+ )
@bp.route("/edit_offre/", methods=["GET", "POST"])
@@ -536,7 +558,9 @@ def edit_offre(id):
form.expiration_date.data = offre.expiration_date
form.depts.data = offre_depts_list
return render_template(
- "entreprises/form.html", title=("Modification offre"), form=form
+ "entreprises/form.html",
+ title=("Modification offre"),
+ form=form,
)
@@ -551,6 +575,14 @@ def delete_offre(id):
form = SuppressionConfirmationForm()
if form.validate_on_submit():
db.session.delete(offre)
+ path = os.path.join(
+ Config.SCODOC_VAR_DIR,
+ "entreprises",
+ f"{entreprise_id}",
+ f"{offre.id}",
+ )
+ if os.path.isdir(path):
+ shutil.rmtree(path)
log = EntrepriseLog(
authenticated_user=current_user.user_name,
object=offre.entreprise_id,
@@ -561,7 +593,9 @@ 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", title=("Supression offre"), form=form
+ "entreprises/delete_confirmation.html",
+ title=("Supression offre"),
+ form=form,
)
@@ -593,7 +627,11 @@ def add_contact(id):
db.session.commit()
flash("Le contact a été ajouté à la fiche entreprise.")
return redirect(url_for("entreprises.fiche_entreprise", id=entreprise.id))
- return render_template("entreprises/form.html", title=("Ajout contact"), form=form)
+ return render_template(
+ "entreprises/form.html",
+ title=("Ajout contact"),
+ form=form,
+ )
@bp.route("/edit_contact/", methods=["GET", "POST"])
@@ -633,7 +671,9 @@ def edit_contact(id):
form.poste.data = contact.poste
form.service.data = contact.service
return render_template(
- "entreprises/form.html", title=("Modification contact"), form=form
+ "entreprises/form.html",
+ title=("Modification contact"),
+ form=form,
)
@@ -667,7 +707,9 @@ def delete_contact(id):
flash("Le contact a été supprimé de la fiche entreprise.")
return redirect(url_for("entreprises.fiche_entreprise", id=entreprise_id))
return render_template(
- "entreprises/delete_confirmation.html", title=("Supression contact"), form=form
+ "entreprises/delete_confirmation.html",
+ title=("Supression contact"),
+ form=form,
)
@@ -708,7 +750,9 @@ def add_historique(id):
flash("L'étudiant a été ajouté sur la fiche entreprise.")
return redirect(url_for("entreprises.fiche_entreprise", id=entreprise.id))
return render_template(
- "entreprises/ajout_historique.html", title=("Ajout historique"), form=form
+ "entreprises/ajout_historique.html",
+ title=("Ajout historique"),
+ form=form,
)
@@ -738,7 +782,9 @@ def envoyer_offre(id):
flash(f"L'offre a été envoyé à {responsable.get_nomplogin()}.")
return redirect(url_for("entreprises.fiche_entreprise", id=offre.entreprise_id))
return render_template(
- "entreprises/envoi_offre_form.html", title=("Envoyer une offre"), form=form
+ "entreprises/envoi_offre_form.html",
+ title=("Envoyer une offre"),
+ form=form,
)
@@ -840,6 +886,9 @@ def get_import_entreprises_file_sample():
@bp.route("/import_entreprises", methods=["GET", "POST"])
@permission_required(Permission.RelationsEntreprisesExport)
def import_entreprises():
+ """
+ Permet d'importer des entreprises a l'aide d'un fichier excel (.xlsx)
+ """
form = ImportEntreprisesForm()
if form.validate_on_submit():
path = os.path.join(Config.SCODOC_VAR_DIR, "tmp")
@@ -974,7 +1023,9 @@ def add_offre_file(offre_id):
flash("Le fichier a été ajouté a l'offre.")
return redirect(url_for("entreprises.fiche_entreprise", id=offre.entreprise_id))
return render_template(
- "entreprises/form.html", title=("Ajout fichier à une offre"), form=form
+ "entreprises/form.html",
+ title=("Ajout fichier à une offre"),
+ form=form,
)
diff --git a/app/templates/entreprises/ajout_entreprise.html b/app/templates/entreprises/ajout_entreprise.html
index 348c60882..f07d1632c 100644
--- a/app/templates/entreprises/ajout_entreprise.html
+++ b/app/templates/entreprises/ajout_entreprise.html
@@ -3,7 +3,7 @@
{% import 'bootstrap/wtf.html' as wtf %}
{% block app_content %}
- {{ title }}
+ Ajout entreprise avec contact
diff --git a/app/templates/entreprises/ajout_historique.html b/app/templates/entreprises/ajout_historique.html
index 9b492112f..db659229f 100644
--- a/app/templates/entreprises/ajout_historique.html
+++ b/app/templates/entreprises/ajout_historique.html
@@ -9,7 +9,7 @@
{% endblock %}
{% block app_content %}
-
{{ title }}
+
Ajout historique
diff --git a/app/templates/entreprises/contacts.html b/app/templates/entreprises/contacts.html
index 3c1fe2950..264205e52 100644
--- a/app/templates/entreprises/contacts.html
+++ b/app/templates/entreprises/contacts.html
@@ -75,7 +75,7 @@
Page {{ contacts.page }} sur {{ contacts.pages }}
{% else %}
-
Aucun contact présent dans la base
+
Aucun contact présent dans la base
{% endif %}
{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/entreprises.html b/app/templates/entreprises/entreprises.html
index f5615a435..ab6582433 100644
--- a/app/templates/entreprises/entreprises.html
+++ b/app/templates/entreprises/entreprises.html
@@ -95,7 +95,7 @@
Page {{ entreprises.page }} sur {{ entreprises.pages }}
{% else %}
-
Aucune entreprise présent dans la base
+
Aucune entreprise présent dans la base
{% endif %}
{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/entreprises_validation.html b/app/templates/entreprises/entreprises_validation.html
index 39463fe92..60c6a1942 100644
--- a/app/templates/entreprises/entreprises_validation.html
+++ b/app/templates/entreprises/entreprises_validation.html
@@ -43,10 +43,9 @@
{% endfor %}
- {% else %}
-
Aucune entreprise à valider
-
+ {% else %}
+
Aucune entreprise à valider
{% endif %}
{% 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 cf210893e..bfab89e4d 100644
--- a/app/templates/entreprises/envoi_offre_form.html
+++ b/app/templates/entreprises/envoi_offre_form.html
@@ -9,7 +9,7 @@
{% endblock %}
{% block app_content %}
- {{ title }}
+ Envoyer une offre
diff --git a/app/templates/entreprises/fiche_entreprise_validation.html b/app/templates/entreprises/fiche_entreprise_validation.html
index ee36ca742..9d67ac83b 100644
--- a/app/templates/entreprises/fiche_entreprise_validation.html
+++ b/app/templates/entreprises/fiche_entreprise_validation.html
@@ -24,8 +24,12 @@
Nom : {{ contact.nom }}
Prénom : {{ contact.prenom }}
+ {% if contact.telephone %}
Téléphone : {{ contact.telephone }}
+ {% endif %}
+ {% if contact.mail %}
Mail : {{ contact.mail }}
+ {% endif %}
{% if contact.poste %}
Poste : {{ contact.poste }}
{% endif %}
diff --git a/app/templates/entreprises/import_entreprises.html b/app/templates/entreprises/import_entreprises.html
index 7bb32a44a..5e1a50d77 100644
--- a/app/templates/entreprises/import_entreprises.html
+++ b/app/templates/entreprises/import_entreprises.html
@@ -7,7 +7,7 @@
{% endblock %}
{% block app_content %}
-
{{ title }}
+
Importation entreprises
Obtenir la feuille excel à remplir
diff --git a/app/templates/entreprises/logs.html b/app/templates/entreprises/logs.html
index ffdb67c42..8bdc9c9d7 100644
--- a/app/templates/entreprises/logs.html
+++ b/app/templates/entreprises/logs.html
@@ -4,34 +4,40 @@
{% block app_content %}
Dernières opérations
-
- {% for log in logs.items %}
- {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet }}
- {% endfor %}
-
+ {% if logs.items %}
+
+ {% for log in logs.items %}
+ {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet }}
+ {% endfor %}
+
+
+
+
+ «
+
+ {% for page_num in logs.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %}
+ {% if page_num %}
+ {% if logs.page == page_num %}
+
{{ page_num }}
+ {% else %}
+
{{ page_num }}
+ {% endif %}
+ {% else %}
+ ...
+ {% endif %}
+ {% endfor %}
+
+ »
+
+
+
+
+ Page {{ logs.page }} sur {{ logs.pages }}
+
+ {% else %}
+
Aucune opération
+ {% endif %}
-
-
- «
-
- {% for page_num in logs.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %}
- {% if page_num %}
- {% if logs.page == page_num %}
-
{{ page_num }}
- {% else %}
-
{{ page_num }}
- {% endif %}
- {% else %}
- ...
- {% endif %}
- {% endfor %}
-
- »
-
-
-
-
- Page {{ logs.page }} sur {{ logs.pages }}
-
+
{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/logs_entreprise.html b/app/templates/entreprises/logs_entreprise.html
index a9b806ee2..7d213187f 100644
--- a/app/templates/entreprises/logs_entreprise.html
+++ b/app/templates/entreprises/logs_entreprise.html
@@ -4,34 +4,39 @@
{% block app_content %}
Dernières opérations - {{ entreprise.nom }}
+ {% if logs.items %}
{% for log in logs.items %}
{{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet }}
{% endfor %}
+
+
+
+ «
+
+ {% for page_num in logs.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %}
+ {% if page_num %}
+ {% if logs.page == page_num %}
+
{{ page_num }}
+ {% else %}
+
{{ page_num }}
+ {% endif %}
+ {% else %}
+ ...
+ {% endif %}
+ {% endfor %}
+
+ »
+
+
+
+
+ Page {{ logs.page }} sur {{ logs.pages }}
+
+ {% else %}
+
Aucune opération
+ {% endif %}
-
-
- «
-
- {% for page_num in logs.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %}
- {% if page_num %}
- {% if logs.page == page_num %}
-
{{ page_num }}
- {% else %}
-
{{ page_num }}
- {% endif %}
- {% else %}
- ...
- {% endif %}
- {% endfor %}
-
- »
-
-
-
-
- Page {{ logs.page }} sur {{ logs.pages }}
-
{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/offres_recues.html b/app/templates/entreprises/offres_recues.html
index 5f31fb74b..63bbdb65d 100644
--- a/app/templates/entreprises/offres_recues.html
+++ b/app/templates/entreprises/offres_recues.html
@@ -5,31 +5,26 @@
{% include 'entreprises/nav.html' %}
-
{{ title }}
+
Offres reçues
{% if offres_recues %}
-
-
{% for offre in offres_recues %}
-
-
- Envoyé le {{ offre[0].date_envoi.strftime('%d %B %Y à %H:%M') }} par {{ offre[0].sender_id|get_nomcomplet_by_id }}
- Intitulé : {{ offre[1].intitule }}
- Description : {{ offre[1].description }}
- Type de l'offre : {{ offre[1].type_offre }}
- Missions : {{ offre[1].missions }}
- Durée : {{ offre[1].duree }}
+
+
+ Envoyé le {{ offre[0].date_envoi.strftime('%d %B %Y à %H:%M') }} par {{ offre[0].sender_id|get_nomcomplet_by_id }}
+ Intitulé : {{ offre[1].intitule }}
+ Description : {{ offre[1].description }}
+ Type de l'offre : {{ offre[1].type_offre }}
+ Missions : {{ offre[1].missions }}
+ Durée : {{ offre[1].duree }}
- {% for fichier in offre[2] %}
-
{{ fichier[1] }}
- {% endfor %}
-
+ {% for fichier in offre[2] %}
+
{{ fichier[1] }}
+ {% endfor %}
- {% endfor %}
-
- {% else %}
+ {% endfor %}
+ {% else %}
Aucune offre reçue
-
{% endif %}
{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/validate_confirmation.html b/app/templates/entreprises/validate_confirmation.html
index 04ab1eac1..277bf237c 100644
--- a/app/templates/entreprises/validate_confirmation.html
+++ b/app/templates/entreprises/validate_confirmation.html
@@ -3,7 +3,7 @@
{% import 'bootstrap/wtf.html' as wtf %}
{% block app_content %}
-
{{ title }}
+
Validation entreprise
Cliquez sur le bouton Valider pour confirmer votre validation
From 42e74174bad057917bae908da589e95957e5a481 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Tue, 8 Feb 2022 19:13:45 +0100
Subject: [PATCH 21/26] suite import entreprises par excel
---
app/entreprises/forms.py | 2 +-
app/entreprises/routes.py | 50 +++++++++++++++----
.../entreprises/import_entreprises.html | 18 +++++++
3 files changed, 60 insertions(+), 10 deletions(-)
diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py
index 006902be0..19c562ab3 100644
--- a/app/entreprises/forms.py
+++ b/app/entreprises/forms.py
@@ -110,7 +110,7 @@ class EntrepriseCreationForm(FlaskForm):
def validate_siret(self, siret):
siret = siret.data.strip()
- if re.match("^\d{14}$", siret) == None:
+ if re.match("^\d{14}$", siret) is None:
raise ValidationError("Format incorrect")
req = requests.get(
f"https://entreprise.data.gouv.fr/api/sirene/v1/siret/{siret}"
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 1b01f9634..4611336d5 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -1,9 +1,10 @@
import os
-from queue import Empty
from config import Config
from datetime import datetime, date
import glob
import shutil
+import re
+import requests
from flask import render_template, redirect, url_for, request, flash, send_file, abort
from flask.json import jsonify
@@ -869,12 +870,6 @@ def get_import_entreprises_file_sample():
"ville",
"codepostal",
"pays",
- "nom_contact",
- "prenom_contact",
- "telephone",
- "mail",
- "poste",
- "service",
]
titles = keys[:]
title = "ImportEntreprises"
@@ -883,6 +878,23 @@ def get_import_entreprises_file_sample():
return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE)
+def verif_entreprise_data(entreprise_data):
+ print(entreprise_data)
+ for data in entreprise_data:
+ if data is "":
+ return False
+ siret = entreprise_data[0].strip()
+ if re.match("^\d{14}$", siret) is None:
+ return False
+ req = requests.get(f"https://entreprise.data.gouv.fr/api/sirene/v1/siret/{siret}")
+ if req.status_code != 200:
+ return False
+ entreprise = Entreprise.query.filter_by(siret=siret).first()
+ if entreprise is not None:
+ return False
+ return True
+
+
@bp.route("/import_entreprises", methods=["GET", "POST"])
@permission_required(Permission.RelationsEntreprisesExport)
def import_entreprises():
@@ -894,8 +906,28 @@ def import_entreprises():
path = os.path.join(Config.SCODOC_VAR_DIR, "tmp")
file = form.fichier.data
filename = secure_filename(file.filename)
- file.save(os.path.join(path, filename))
- # print(sco_excel.excel_file_to_list(filename))
+ file_path = os.path.join(path, filename)
+ file.save(file_path)
+ data = sco_excel.excel_file_to_list(file_path)
+ os.remove(file_path)
+ entreprises_import = []
+ for entreprise_data in data[1][1:]:
+ if verif_entreprise_data(entreprise_data):
+ entreprise = Entreprise(
+ siret=entreprise_data[0],
+ nom=entreprise_data[1],
+ adresse=entreprise_data[2],
+ ville=entreprise_data[3],
+ codepostal=entreprise_data[4],
+ pays=entreprise_data[5],
+ )
+ entreprises_import.append(entreprise)
+ return render_template(
+ "entreprises/import_entreprises.html",
+ title=("Importation entreprises"),
+ form=form,
+ entreprises_import=entreprises_import,
+ )
return render_template(
"entreprises/import_entreprises.html",
title=("Importation entreprises"),
diff --git a/app/templates/entreprises/import_entreprises.html b/app/templates/entreprises/import_entreprises.html
index 5e1a50d77..dfa844874 100644
--- a/app/templates/entreprises/import_entreprises.html
+++ b/app/templates/entreprises/import_entreprises.html
@@ -18,4 +18,22 @@
{{ wtf.quick_form(form, novalidate=True) }}
+
+ {% if entreprises_import %}
+ {% for entreprise in entreprises_import %}
+
+
+ SIRET : {{ entreprise.siret }}
+ Nom : {{ entreprise.nom }}
+ Adresse : {{ entreprise.adresse }}
+ Code postal : {{ entreprise.codepostal }}
+ Ville : {{ entreprise.ville }}
+ Pays : {{ entreprise.pays }}
+
+
+ {% endfor %}
+
Ajouter
+ {% else %}
+
Aucune entreprise importée (vérifier le fichier .xlsx)
+ {% endif %}
{% endblock %}
\ No newline at end of file
From f1bb718f083230d21ee658d6756b2bb535518ac0 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Wed, 9 Feb 2022 20:09:14 +0100
Subject: [PATCH 22/26] import entreprises par fichier excel, divers
corrections
---
app/entreprises/routes.py | 43 +++++++++++++++----
app/templates/entreprises/contacts.html | 2 +-
app/templates/entreprises/entreprises.html | 2 +-
.../entreprises/import_entreprises.html | 4 +-
4 files changed, 37 insertions(+), 14 deletions(-)
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 4611336d5..d5c34597f 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -879,9 +879,8 @@ def get_import_entreprises_file_sample():
def verif_entreprise_data(entreprise_data):
- print(entreprise_data)
for data in entreprise_data:
- if data is "":
+ if data == "":
return False
siret = entreprise_data[0].strip()
if re.match("^\d{14}$", siret) is None:
@@ -911,8 +910,16 @@ def import_entreprises():
data = sco_excel.excel_file_to_list(file_path)
os.remove(file_path)
entreprises_import = []
+ siret_list = []
+ ligne = 0
+
for entreprise_data in data[1][1:]:
- if verif_entreprise_data(entreprise_data):
+ ligne += 1
+ if (
+ verif_entreprise_data(entreprise_data)
+ and entreprise_data[0] not in siret_list
+ ):
+ siret_list.append(entreprise_data[0])
entreprise = Entreprise(
siret=entreprise_data[0],
nom=entreprise_data[1],
@@ -920,14 +927,32 @@ def import_entreprises():
ville=entreprise_data[3],
codepostal=entreprise_data[4],
pays=entreprise_data[5],
+ visible=True,
)
entreprises_import.append(entreprise)
- return render_template(
- "entreprises/import_entreprises.html",
- title=("Importation entreprises"),
- form=form,
- entreprises_import=entreprises_import,
- )
+
+ else:
+ flash(f"Erreur lors de l'importation (ligne {ligne})")
+ return render_template(
+ "entreprises/import_entreprises.html",
+ title=("Importation entreprises"),
+ form=form,
+ )
+
+ if len(entreprises_import) > 0:
+ for entreprise in entreprises_import:
+ db.session.add(entreprise)
+ db.session.commit()
+ flash(f"Importation réussie de {len(entreprises_import)} entreprise(s)")
+ return render_template(
+ "entreprises/import_entreprises.html",
+ title=("Importation entreprises"),
+ form=form,
+ entreprises_import=entreprises_import,
+ )
+ else:
+ flash('Feuille "Entreprises" vide')
+
return render_template(
"entreprises/import_entreprises.html",
title=("Importation entreprises"),
diff --git a/app/templates/entreprises/contacts.html b/app/templates/entreprises/contacts.html
index 264205e52..ee92442c6 100644
--- a/app/templates/entreprises/contacts.html
+++ b/app/templates/entreprises/contacts.html
@@ -15,7 +15,7 @@
{% endif %}
- {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesExport, None) %}
+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesExport, None) and contacts.items %}
{% if contacts %}
Exporter la liste des contacts
diff --git a/app/templates/entreprises/entreprises.html b/app/templates/entreprises/entreprises.html
index ab6582433..a820a38da 100644
--- a/app/templates/entreprises/entreprises.html
+++ b/app/templates/entreprises/entreprises.html
@@ -23,7 +23,7 @@
Importer des entreprises
{% endif %}
{% if entreprises %}
- {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesExport, None) %}
+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesExport, None) and entreprises.items%}
Exporter la liste des entreprises
{% endif %}
{% endif %}
diff --git a/app/templates/entreprises/import_entreprises.html b/app/templates/entreprises/import_entreprises.html
index dfa844874..7d64196b8 100644
--- a/app/templates/entreprises/import_entreprises.html
+++ b/app/templates/entreprises/import_entreprises.html
@@ -20,6 +20,7 @@
{% if entreprises_import %}
+
Importation de {{ entreprises_import|length }} entreprise(s)
{% for entreprise in entreprises_import %}
{% endfor %}
-
Ajouter
- {% else %}
-
Aucune entreprise importée (vérifier le fichier .xlsx)
{% endif %}
{% endblock %}
\ No newline at end of file
From 7858baa841bb42f70d5e32b95a4e8f799ae06625 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Thu, 10 Feb 2022 21:17:22 +0100
Subject: [PATCH 23/26] import contacts, nettoyage
---
app/entreprises/__init__.py | 2 +-
app/entreprises/forms.py | 2 +-
app/entreprises/models.py | 20 +-
app/entreprises/routes.py | 234 +++++++++++++-----
app/templates/entreprises/contacts.html | 10 +-
app/templates/entreprises/entreprises.html | 4 +-
.../entreprises/entreprises_validation.html | 2 +-
.../entreprises/fiche_entreprise.html | 2 +-
.../entreprises/import_contacts.html | 59 +++++
.../entreprises/import_entreprises.html | 12 +
app/templates/entreprises/logs.html | 2 +-
.../entreprises/logs_entreprise.html | 2 +-
12 files changed, 254 insertions(+), 97 deletions(-)
create mode 100644 app/templates/entreprises/import_contacts.html
diff --git a/app/entreprises/__init__.py b/app/entreprises/__init__.py
index 34dcaed82..b211670b2 100644
--- a/app/entreprises/__init__.py
+++ b/app/entreprises/__init__.py
@@ -22,7 +22,7 @@ def format_nom(s):
@bp.app_template_filter()
-def get_nomcomplet(s):
+def get_nomcomplet_by_username(s):
user = User.query.filter_by(user_name=s).first()
return user.get_nomcomplet()
diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py
index 19c562ab3..4b0db01c1 100644
--- a/app/entreprises/forms.py
+++ b/app/entreprises/forms.py
@@ -366,7 +366,7 @@ class ValidationConfirmationForm(FlaskForm):
submit = SubmitField("Valider", render_kw={"style": "margin-bottom: 10px;"})
-class ImportEntreprisesForm(FlaskForm):
+class ImportForm(FlaskForm):
fichier = FileField(
"Fichier",
validators=[
diff --git a/app/entreprises/models.py b/app/entreprises/models.py
index a91dc09b9..9a99f4bc8 100644
--- a/app/entreprises/models.py
+++ b/app/entreprises/models.py
@@ -29,7 +29,7 @@ class Entreprise(db.Model):
"siret": self.siret,
"nom": self.nom,
"adresse": self.adresse,
- "codepostal": self.codepostal,
+ "code_postal": self.codepostal,
"ville": self.ville,
"pays": self.pays,
}
@@ -56,23 +56,7 @@ class EntrepriseContact(db.Model):
"mail": self.mail,
"poste": self.poste,
"service": self.service,
- }
-
- def to_dict_export(self):
- entreprise = Entreprise.query.get(self.entreprise_id)
- return {
- "nom": self.nom,
- "prenom": self.prenom,
- "telephone": self.telephone,
- "mail": self.mail,
- "poste": self.poste,
- "service": self.service,
- "siret": entreprise.siret,
- "nom_entreprise": entreprise.nom,
- "adresse_entreprise": entreprise.adresse,
- "codepostal": entreprise.codepostal,
- "ville": entreprise.ville,
- "pays": entreprise.pays,
+ "entreprise_id": self.entreprise_id,
}
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index d5c34597f..a78460f58 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -25,7 +25,7 @@ from app.entreprises.forms import (
EnvoiOffreForm,
AjoutFichierForm,
ValidationConfirmationForm,
- ImportEntreprisesForm,
+ ImportForm,
)
from app.entreprises import bp
from app.entreprises.models import (
@@ -130,30 +130,30 @@ def fiche_entreprise(id):
les offres de l'entreprise.
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
- offres = entreprise.offres
offres_with_files = []
- for offre in offres:
- if date.today() > offre.expiration_date:
- break
- files = []
- path = os.path.join(
- Config.SCODOC_VAR_DIR,
- "entreprises",
- f"{offre.entreprise_id}",
- f"{offre.id}",
- )
- if os.path.exists(path):
- for dir in glob.glob(
- f"{path}/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
- ):
- for file in glob.glob(f"{dir}/*"):
- file = [os.path.basename(dir), os.path.basename(file)]
- files.append(file)
- offre_depts = EntrepriseOffreDepartement.query.filter_by(
- offre_id=offre.id
- ).all()
- offres_with_files.append([offre, files, offre_depts])
- contacts = entreprise.contacts
+ for offre in entreprise.offres:
+ if date.today() < offre.expiration_date:
+ files = []
+ path = os.path.join(
+ Config.SCODOC_VAR_DIR,
+ "entreprises",
+ f"{offre.entreprise_id}",
+ f"{offre.id}",
+ )
+ if os.path.exists(path):
+ for dir in glob.glob(
+ f"{path}/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
+ ):
+ for file in glob.glob(f"{dir}/*"):
+ file = [os.path.basename(dir), os.path.basename(file)]
+ files.append(file)
+ offre_depts = EntrepriseOffreDepartement.query.filter_by(
+ offre_id=offre.id
+ ).all()
+ offres_with_files.append([offre, files, offre_depts])
+ contacts = []
+ for contact in entreprise.contacts:
+ contacts.append(contact)
logs = (
EntrepriseLog.query.order_by(EntrepriseLog.date.desc())
.filter_by(object=id)
@@ -800,8 +800,8 @@ def json_etudiants():
term = request.args.get("term").strip()
etudiants = Identite.query.filter(Identite.nom.ilike(f"%{term}%")).all()
list = []
- content = {}
for etudiant in etudiants:
+ content = {}
value = f"{sco_etud.format_nom(etudiant.nom)} {sco_etud.format_prenom(etudiant.prenom)}"
if etudiant.inscription_courante() is not None:
content = {
@@ -812,7 +812,6 @@ def json_etudiants():
else:
content = {"id": f"{etudiant.id}", "value": value}
list.append(content)
- content = {}
return jsonify(results=list)
@@ -829,12 +828,12 @@ def json_responsables():
User.nom.ilike(f"%{term}%"), User.nom.is_not(None), User.prenom.is_not(None)
).all()
list = []
- content = {}
+
for responsable in responsables:
+ content = {}
value = f"{responsable.get_nomplogin()}"
content = {"id": f"{responsable.id}", "value": value, "info": ""}
list.append(content)
- content = {}
return jsonify(results=list)
@@ -846,13 +845,13 @@ def export_entreprises():
"""
entreprises = Entreprise.query.filter_by(visible=True).all()
if entreprises:
- keys = ["siret", "nom", "adresse", "ville", "codepostal", "pays"]
+ keys = ["siret", "nom", "adresse", "ville", "code_postal", "pays"]
titles = keys[:]
L = [
[entreprise.to_dict().get(k, "") for k in keys]
for entreprise in entreprises
]
- title = "entreprises"
+ title = "Entreprises"
xlsx = sco_excel.excel_simple_table(titles=titles, lines=L, sheet_name=title)
filename = title
return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE)
@@ -863,6 +862,9 @@ def export_entreprises():
@bp.route("/get_import_entreprises_file_sample")
@permission_required(Permission.RelationsEntreprisesExport)
def get_import_entreprises_file_sample():
+ """
+ Permet de récupérer un fichier pour pouvoir importer des entreprises
+ """
keys = [
"siret",
"nom_entreprise",
@@ -900,7 +902,7 @@ def import_entreprises():
"""
Permet d'importer des entreprises a l'aide d'un fichier excel (.xlsx)
"""
- form = ImportEntreprisesForm()
+ form = ImportForm()
if form.validate_on_submit():
path = os.path.join(Config.SCODOC_VAR_DIR, "tmp")
file = form.fichier.data
@@ -912,7 +914,14 @@ def import_entreprises():
entreprises_import = []
siret_list = []
ligne = 0
-
+ titles = ["siret", "nom_entreprise", "adresse", "ville", "codepostal", "pays"]
+ if data[1][0] != titles:
+ flash("Veuillez utilisez la feuille excel à remplir")
+ return render_template(
+ "entreprises/import_entreprises.html",
+ title=("Importation entreprises"),
+ form=form,
+ )
for entreprise_data in data[1][1:]:
ligne += 1
if (
@@ -972,30 +981,6 @@ def export_contacts():
.filter_by(visible=True)
.all()
)
- if contacts:
- keys = ["nom", "prenom", "telephone", "mail", "poste", "service"]
- titles = keys[:]
- L = [[contact.to_dict().get(k, "") for k in keys] for contact in contacts]
- title = "contacts"
- xlsx = sco_excel.excel_simple_table(titles=titles, lines=L, sheet_name=title)
- filename = title
- return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE)
- else:
- abort(404)
-
-
-@bp.route("/export_contacts_bis")
-@permission_required(Permission.RelationsEntreprisesExport)
-def export_contacts_bis():
- """
- Permet d'exporter la liste des contacts avec leur entreprise sous format excel (.xlsx)
- """
- contacts = (
- db.session.query(EntrepriseContact)
- .join(Entreprise, EntrepriseContact.entreprise_id == Entreprise.id)
- .filter_by(visible=True)
- .all()
- )
if contacts:
keys = [
"nom",
@@ -1004,18 +989,11 @@ def export_contacts_bis():
"mail",
"poste",
"service",
- "nom_entreprise",
- "siret",
- "adresse_entreprise",
- "ville",
- "codepostal",
- "pays",
+ "entreprise_id",
]
titles = keys[:]
- L = [
- [contact.to_dict_export().get(k, "") for k in keys] for contact in contacts
- ]
- title = "contacts"
+ L = [[contact.to_dict().get(k, "") for k in keys] for contact in contacts]
+ title = "Contacts"
xlsx = sco_excel.excel_simple_table(titles=titles, lines=L, sheet_name=title)
filename = title
return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE)
@@ -1023,6 +1001,130 @@ def export_contacts_bis():
abort(404)
+@bp.route("/get_import_contacts_file_sample")
+@permission_required(Permission.RelationsEntreprisesExport)
+def get_import_contacts_file_sample():
+ """
+ Permet de récupérer un fichier pour pouvoir importer des contacts
+ """
+ keys = [
+ "nom",
+ "prenom",
+ "telephone",
+ "mail",
+ "poste",
+ "service",
+ "entreprise_id",
+ ]
+ titles = keys[:]
+ title = "ImportContacts"
+ xlsx = sco_excel.excel_simple_table(titles=titles, sheet_name="Contacts")
+ filename = title
+ return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE)
+
+
+def verif_contact_data(contact_data):
+ # champ nom, prenom et entreprise_id obligatoire
+ if contact_data[0] == "" or contact_data[1] == "" or contact_data[6] == "":
+ return False
+
+ entreprise = Entreprise.query.filter_by(id=contact_data[6]).first()
+ if entreprise is None:
+ return False
+
+ contact = EntrepriseContact.query.filter_by(
+ nom=contact_data[0], prenom=contact_data[1], entreprise_id=contact_data[6]
+ ).first()
+ if contact is not None:
+ return False
+
+ # 1 moyen de contact
+ if contact_data[2] == "" and contact_data[3] == "":
+ return False
+
+ return True
+
+
+@bp.route("/import_contacts", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesExport)
+def import_contacts():
+ """
+ Permet d'importer des contacts a l'aide d'un fichier excel (.xlsx)
+ """
+ form = ImportForm()
+ if form.validate_on_submit():
+ path = os.path.join(Config.SCODOC_VAR_DIR, "tmp")
+ file = form.fichier.data
+ filename = secure_filename(file.filename)
+ file_path = os.path.join(path, filename)
+ file.save(file_path)
+ data = sco_excel.excel_file_to_list(file_path)
+ os.remove(file_path)
+ contacts_import = []
+ contact_list = []
+ ligne = 0
+ titles = [
+ "nom",
+ "prenom",
+ "telephone",
+ "mail",
+ "poste",
+ "service",
+ "entreprise_id",
+ ]
+ if data[1][0] != titles:
+ flash("Veuillez utilisez la feuille excel à remplir")
+ return render_template(
+ "entreprises/import_contacts.html",
+ title=("Importation contacts"),
+ form=form,
+ )
+ for contact_data in data[1][1:]:
+ ligne += 1
+ if (
+ verif_contact_data(contact_data)
+ and (contact_data[0], contact_data[1], contact_data[6])
+ not in contact_list
+ ):
+ contact_list.append((contact_data[0], contact_data[1], contact_data[6]))
+ contact = EntrepriseContact(
+ nom=contact_data[0],
+ prenom=contact_data[1],
+ telephone=contact_data[2],
+ mail=contact_data[3],
+ poste=contact_data[4],
+ service=contact_data[5],
+ entreprise_id=contact_data[6],
+ )
+ contacts_import.append(contact)
+ else:
+ flash(f"Erreur lors de l'importation (ligne {ligne})")
+ return render_template(
+ "entreprises/import_contacts.html",
+ title=("Importation contacts"),
+ form=form,
+ )
+
+ if len(contacts_import) > 0:
+ for contact in contacts_import:
+ db.session.add(contact)
+ db.session.commit()
+ flash(f"Importation réussie de {len(contacts_import)} contact(s)")
+ return render_template(
+ "entreprises/import_contacts.html",
+ title=("Importation Contacts"),
+ form=form,
+ contacts_import=contacts_import,
+ )
+ else:
+ flash('Feuille "Contacts" vide')
+ return render_template(
+ "entreprises/import_contacts.html",
+ title=("Importation contacts"),
+ form=form,
+ )
+
+
@bp.route(
"/get_offre_file////"
)
diff --git a/app/templates/entreprises/contacts.html b/app/templates/entreprises/contacts.html
index ee92442c6..7ee982f76 100644
--- a/app/templates/entreprises/contacts.html
+++ b/app/templates/entreprises/contacts.html
@@ -9,20 +9,20 @@
Dernières opérations Voir tout
{% for log in logs %}
- {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet }}
+ {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet_by_username }}
{% endfor %}
{% endif %}
- {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesExport, None) and contacts.items %}
- {% endif %}
Liste des contacts
diff --git a/app/templates/entreprises/entreprises.html b/app/templates/entreprises/entreprises.html
index a820a38da..3219c78dd 100644
--- a/app/templates/entreprises/entreprises.html
+++ b/app/templates/entreprises/entreprises.html
@@ -9,7 +9,7 @@
Dernières opérations Voir tout
{% for log in logs %}
- {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet }}
+ {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet_by_username }}
{% endfor %}
@@ -33,7 +33,7 @@
Liste des entreprises
{% if entreprises.items %}
-
+
SIRET
Nom
diff --git a/app/templates/entreprises/entreprises_validation.html b/app/templates/entreprises/entreprises_validation.html
index 60c6a1942..90c787a54 100644
--- a/app/templates/entreprises/entreprises_validation.html
+++ b/app/templates/entreprises/entreprises_validation.html
@@ -9,7 +9,7 @@
Dernières opérations
{% for log in logs %}
- {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet }}
+ {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet_by_username }}
{% endfor %}
diff --git a/app/templates/entreprises/fiche_entreprise.html b/app/templates/entreprises/fiche_entreprise.html
index 443afea42..2d530e705 100644
--- a/app/templates/entreprises/fiche_entreprise.html
+++ b/app/templates/entreprises/fiche_entreprise.html
@@ -9,7 +9,7 @@
{% for log in logs %}
{{ log.date.strftime('%d %b %Hh%M') }}
- {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet }}
+ {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet_by_username }}
{% endfor %}
diff --git a/app/templates/entreprises/import_contacts.html b/app/templates/entreprises/import_contacts.html
new file mode 100644
index 000000000..a18122930
--- /dev/null
+++ b/app/templates/entreprises/import_contacts.html
@@ -0,0 +1,59 @@
+{# -*- mode: jinja-html -*- #}
+{% extends 'base.html' %}
+{% import 'bootstrap/wtf.html' as wtf %}
+
+{% block styles %}
+{{super()}}
+{% endblock %}
+
+{% block app_content %}
+ Importation contacts
+
+
+
+
+
+ {{ wtf.quick_form(form, novalidate=True) }}
+
+
+
+ {% if not contacts_import %}
+
+ Attribut Type Description
+ nom text nom du contact
+ prenom text prenom du contact
+ telephone text telephone du contact
+ mail text mail du contact
+ poste text poste du contact
+ service text service dans lequel travaille le contact
+ entreprise_id integer l'id de l'entreprise
+
+ {% endif %}
+
+ {% if contacts_import %}
+ Importation de {{ contacts_import|length }} contact(s)
+ {% for contact in contacts_import %}
+
+ {% endfor %}
+ {% endif %}
+{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/import_entreprises.html b/app/templates/entreprises/import_entreprises.html
index 7d64196b8..21aeb6a06 100644
--- a/app/templates/entreprises/import_entreprises.html
+++ b/app/templates/entreprises/import_entreprises.html
@@ -19,6 +19,18 @@
+ {% if not entreprises_import %}
+
+ Attribut Type Description
+ siret text siret de l'entreprise
+ nom text nom de l'entreprise
+ adresse text adresse de l'entreprise
+ ville text ville de l'entreprise
+ code_postal text code postal de l'entreprise
+ pays text pays de l'entreprise
+
+ {% endif %}
+
{% if entreprises_import %}
Importation de {{ entreprises_import|length }} entreprise(s)
{% for entreprise in entreprises_import %}
diff --git a/app/templates/entreprises/logs.html b/app/templates/entreprises/logs.html
index 8bdc9c9d7..c6cba95f4 100644
--- a/app/templates/entreprises/logs.html
+++ b/app/templates/entreprises/logs.html
@@ -7,7 +7,7 @@
{% if logs.items %}
{% for log in logs.items %}
- {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet }}
+ {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet_by_username }}
{% endfor %}
diff --git a/app/templates/entreprises/logs_entreprise.html b/app/templates/entreprises/logs_entreprise.html
index 7d213187f..cebea0405 100644
--- a/app/templates/entreprises/logs_entreprise.html
+++ b/app/templates/entreprises/logs_entreprise.html
@@ -7,7 +7,7 @@
{% if logs.items %}
{% for log in logs.items %}
- {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet }}
+ {{ log.date.strftime('%d %b %Hh%M') }} {{ log.text|safe }} par {{ log.authenticated_user|get_nomcomplet_by_username }}
{% endfor %}
From 0cef1089b32b94e0de828ca8aceefacf35304a25 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Fri, 11 Feb 2022 19:18:01 +0100
Subject: [PATCH 24/26] refactoring
---
app/entreprises/forms.py | 196 ++++++++----------
app/entreprises/routes.py | 95 +++++----
.../entreprises/ajout_entreprise.html | 7 +
app/templates/entreprises/form.html | 10 +-
4 files changed, 150 insertions(+), 158 deletions(-)
diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py
index 4b0db01c1..7bc1a1021 100644
--- a/app/entreprises/forms.py
+++ b/app/entreprises/forms.py
@@ -38,8 +38,8 @@ from wtforms import (
SelectField,
HiddenField,
SelectMultipleField,
+ DateField,
)
-from wtforms.fields import EmailField, DateField
from wtforms.validators import ValidationError, DataRequired, Email, Optional
from wtforms.widgets import ListWidget, CheckboxInput
@@ -48,65 +48,55 @@ from app.models import Identite, Departement
from app.auth.models import User
CHAMP_REQUIS = "Ce champ est requis"
+SUBMIT_MARGE = {"style": "margin-bottom: 10px;"}
+
+
+def _build_string_field(label, required=True, render_kw=None):
+ if required:
+ return StringField(
+ label,
+ validators=[DataRequired(message=CHAMP_REQUIS)],
+ render_kw=render_kw,
+ )
+ else:
+ return StringField(label, validators=[Optional()], render_kw=render_kw)
class EntrepriseCreationForm(FlaskForm):
- siret = StringField(
+ siret = _build_string_field(
"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_entreprise = _build_string_field("Nom de l'entreprise")
+ adresse = _build_string_field("Adresse de l'entreprise")
+ codepostal = _build_string_field("Code postal de l'entreprise")
+ ville = _build_string_field("Ville de l'entreprise")
+ pays = _build_string_field("Pays de l'entreprise")
- 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=[Optional()])
- mail = EmailField(
+ nom_contact = _build_string_field("Nom du contact")
+ prenom_contact = _build_string_field("Prénom du contact")
+ telephone = _build_string_field("Téléphone du contact", required=False)
+ mail = StringField(
"Mail du contact",
validators=[Optional(), Email(message="Adresse e-mail invalide")],
)
- poste = StringField("Poste du contact", validators=[Optional()])
- service = StringField("Service du contact", validators=[Optional()])
- submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"})
+ poste = _build_string_field("Poste du contact", required=False)
+ service = _build_string_field("Service du contact", required=False)
+ submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE)
def validate(self):
- rv = FlaskForm.validate(self)
- if not rv:
- return False
+ validate = True
+ if not FlaskForm.validate(self):
+ 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)")
- return False
+ validate = False
- return True
+ return validate
def validate_siret(self, siret):
siret = siret.data.strip()
@@ -126,18 +116,13 @@ class EntrepriseCreationForm(FlaskForm):
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;"})
+ siret = StringField("SIRET", render_kw={"disabled": ""})
+ nom = _build_string_field("Nom de l'entreprise")
+ adresse = _build_string_field("Adresse")
+ codepostal = _build_string_field("Code postal")
+ ville = _build_string_field("Ville")
+ pays = _build_string_field("Pays")
+ submit = SubmitField("Modifier", render_kw=SUBMIT_MARGE)
class MultiCheckboxField(SelectMultipleField):
@@ -146,8 +131,7 @@ class MultiCheckboxField(SelectMultipleField):
class OffreCreationForm(FlaskForm):
-
- intitule = StringField("Intitulé", validators=[DataRequired(message=CHAMP_REQUIS)])
+ intitule = _build_string_field("Intitulé")
description = TextAreaField(
"Description", validators=[DataRequired(message=CHAMP_REQUIS)]
)
@@ -156,15 +140,13 @@ class OffreCreationForm(FlaskForm):
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)])
+ missions = _build_string_field("Missions")
+ duree = _build_string_field("Durée")
depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int)
expiration_date = DateField(
"Date expiration", validators=[DataRequired(message=CHAMP_REQUIS)]
)
- submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"})
+ submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -175,7 +157,7 @@ class OffreCreationForm(FlaskForm):
class OffreModificationForm(FlaskForm):
- intitule = StringField("Intitulé", validators=[DataRequired(message=CHAMP_REQUIS)])
+ intitule = _build_string_field("Intitulé")
description = TextAreaField(
"Description", validators=[DataRequired(message=CHAMP_REQUIS)]
)
@@ -184,15 +166,13 @@ class OffreModificationForm(FlaskForm):
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)])
+ missions = _build_string_field("Missions")
+ duree = _build_string_field("Durée")
depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int)
expiration_date = DateField(
"Date expiration", validators=[DataRequired(message=CHAMP_REQUIS)]
)
- submit = SubmitField("Modifier", render_kw={"style": "margin-bottom: 10px;"})
+ submit = SubmitField("Modifier", render_kw=SUBMIT_MARGE)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -204,30 +184,27 @@ class OffreModificationForm(FlaskForm):
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=[Optional()])
- mail = EmailField(
+ nom = _build_string_field("Nom")
+ prenom = _build_string_field("Prénom")
+ telephone = _build_string_field("Téléphone", required=False)
+ mail = StringField(
"Mail",
validators=[Optional(), Email(message="Adresse e-mail invalide")],
)
- poste = StringField("Poste", validators=[Optional()])
- service = StringField("Service", validators=[Optional()])
- submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"})
+ poste = _build_string_field("Poste", required=False)
+ service = _build_string_field("Service", required=False)
+ submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE)
def validate(self):
- rv = FlaskForm.validate(self)
- if not rv:
- return False
+ validate = True
+ if not FlaskForm.validate(self):
+ validate = False
contact = EntrepriseContact.query.filter_by(
entreprise_id=self.hidden_entreprise_id.data,
nom=self.nom.data,
prenom=self.prenom.data,
).first()
-
- validate = True
-
if contact is not None:
self.nom.errors.append("Ce contact existe déjà (même nom et prénom)")
self.prenom.errors.append("")
@@ -246,21 +223,21 @@ class ContactCreationForm(FlaskForm):
class ContactModificationForm(FlaskForm):
hidden_contact_id = HiddenField()
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=[Optional()])
- mail = EmailField(
+ nom = _build_string_field("Nom")
+ prenom = _build_string_field("Prénom")
+ telephone = _build_string_field("Téléphone", required=False)
+ mail = StringField(
"Mail",
validators=[Optional(), Email(message="Adresse e-mail invalide")],
)
- poste = StringField("Poste", validators=[Optional()])
- service = StringField("Service", validators=[Optional()])
- submit = SubmitField("Modifier", render_kw={"style": "margin-bottom: 10px;"})
+ poste = _build_string_field("Poste", required=False)
+ service = _build_string_field("Service", required=False)
+ submit = SubmitField("Modifier", render_kw=SUBMIT_MARGE)
def validate(self):
- rv = FlaskForm.validate(self)
- if not rv:
- return False
+ validate = True
+ if not FlaskForm.validate(self):
+ validate = False
contact = EntrepriseContact.query.filter(
EntrepriseContact.id != self.hidden_contact_id.data,
@@ -268,9 +245,6 @@ class ContactModificationForm(FlaskForm):
EntrepriseContact.nom == self.nom.data,
EntrepriseContact.prenom == self.prenom.data,
).first()
-
- validate = True
-
if contact is not None:
self.nom.errors.append("Ce contact existe déjà (même nom et prénom)")
self.prenom.errors.append("")
@@ -287,10 +261,9 @@ class ContactModificationForm(FlaskForm):
class HistoriqueCreationForm(FlaskForm):
- etudiant = StringField(
+ etudiant = _build_string_field(
"Étudiant",
- validators=[DataRequired(message=CHAMP_REQUIS)],
- render_kw={"placeholder": "Tapez le nom de l'étudiant puis selectionnez"},
+ render_kw={"placeholder": "Tapez le nom de l'étudiant"},
)
type_offre = SelectField(
"Type de l'offre",
@@ -301,18 +274,23 @@ class HistoriqueCreationForm(FlaskForm):
"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;"})
+ submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE)
def validate(self):
- rv = FlaskForm.validate(self)
- if not rv:
- return False
+ validate = True
+ if not FlaskForm.validate(self):
+ validate = False
- if self.date_debut.data > self.date_fin.data:
+ if (
+ self.date_debut.data
+ and self.date_fin.data
+ and 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
+ validate = False
+
+ return validate
def validate_etudiant(self, etudiant):
etudiant_data = etudiant.data.upper().strip()
@@ -327,11 +305,11 @@ class HistoriqueCreationForm(FlaskForm):
class EnvoiOffreForm(FlaskForm):
- responsable = StringField(
+ responsable = _build_string_field(
"Responsable de formation",
- validators=[DataRequired(message=CHAMP_REQUIS)],
+ render_kw={"placeholder": "Tapez le nom du responsable de formation"},
)
- submit = SubmitField("Envoyer", render_kw={"style": "margin-bottom: 10px;"})
+ submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE)
def validate_responsable(self, responsable):
responsable_data = responsable.data.upper().strip()
@@ -355,15 +333,15 @@ class AjoutFichierForm(FlaskForm):
FileAllowed(["pdf", "docx"], "Fichier .pdf ou .docx uniquement"),
],
)
- submit = SubmitField("Ajouter", render_kw={"style": "margin-bottom: 10px;"})
+ submit = SubmitField("Ajouter", render_kw=SUBMIT_MARGE)
class SuppressionConfirmationForm(FlaskForm):
- submit = SubmitField("Supprimer", render_kw={"style": "margin-bottom: 10px;"})
+ submit = SubmitField("Supprimer", render_kw=SUBMIT_MARGE)
class ValidationConfirmationForm(FlaskForm):
- submit = SubmitField("Valider", render_kw={"style": "margin-bottom: 10px;"})
+ submit = SubmitField("Valider", render_kw=SUBMIT_MARGE)
class ImportForm(FlaskForm):
@@ -374,4 +352,4 @@ class ImportForm(FlaskForm):
FileAllowed(["xlsx"], "Fichier .xlsx uniquement"),
],
)
- submit = SubmitField("Importer", render_kw={"style": "margin-bottom: 10px;"})
+ submit = SubmitField("Importer", render_kw=SUBMIT_MARGE)
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index a78460f58..8ec543949 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -61,7 +61,7 @@ def index():
logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all()
return render_template(
"entreprises/entreprises.html",
- title=("Entreprises"),
+ title="Entreprises",
entreprises=entreprises,
logs=logs,
)
@@ -79,7 +79,7 @@ def logs():
)
return render_template(
"entreprises/logs.html",
- title=("Logs"),
+ title="Logs",
logs=logs,
)
@@ -93,7 +93,7 @@ def validation():
entreprises = Entreprise.query.filter_by(visible=False).all()
return render_template(
"entreprises/entreprises_validation.html",
- title=("Validation entreprises"),
+ title="Validation entreprises",
entreprises=entreprises,
)
@@ -114,7 +114,7 @@ def contacts():
logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all()
return render_template(
"entreprises/contacts.html",
- title=("Contacts"),
+ title="Contacts",
contacts=contacts,
logs=logs,
)
@@ -151,9 +151,7 @@ def fiche_entreprise(id):
offre_id=offre.id
).all()
offres_with_files.append([offre, files, offre_depts])
- contacts = []
- for contact in entreprise.contacts:
- contacts.append(contact)
+ contacts = entreprise.contacts[:]
logs = (
EntrepriseLog.query.order_by(EntrepriseLog.date.desc())
.filter_by(object=id)
@@ -169,7 +167,7 @@ def fiche_entreprise(id):
)
return render_template(
"entreprises/fiche_entreprise.html",
- title=("Fiche entreprise"),
+ title="Fiche entreprise",
entreprise=entreprise,
contacts=contacts,
offres=offres_with_files,
@@ -193,7 +191,7 @@ def logs_entreprise(id):
)
return render_template(
"entreprises/logs_entreprise.html",
- title=("Logs"),
+ title="Logs",
logs=logs,
entreprise=entreprise,
)
@@ -209,7 +207,7 @@ def fiche_entreprise_validation(id):
contacts = entreprise.contacts
return render_template(
"entreprises/fiche_entreprise_validation.html",
- title=("Validation fiche entreprise"),
+ title="Validation fiche entreprise",
entreprise=entreprise,
contacts=contacts,
)
@@ -246,7 +244,7 @@ def offres_recues():
offres_recues_with_files.append([offre[0], offre[1], files])
return render_template(
"entreprises/offres_recues.html",
- title=("Offres reçues"),
+ title="Offres reçues",
offres_recues=offres_recues_with_files,
)
@@ -282,7 +280,7 @@ def offres_expirees(id):
offres_expirees_with_files.append([offre, files, offre_depts])
return render_template(
"entreprises/offres_expirees.html",
- title=("Offres expirées"),
+ title="Offres expirées",
entreprise=entreprise,
offres_expirees=offres_expirees_with_files,
)
@@ -335,7 +333,7 @@ def add_entreprise():
return redirect(url_for("entreprises.index"))
return render_template(
"entreprises/ajout_entreprise.html",
- title=("Ajout entreprise avec contact"),
+ title="Ajout entreprise avec contact",
form=form,
)
@@ -402,7 +400,7 @@ def edit_entreprise(id):
form.pays.data = entreprise.pays
return render_template(
"entreprises/form.html",
- title=("Modification entreprise"),
+ title="Modification entreprise",
form=form,
)
@@ -436,7 +434,7 @@ def delete_entreprise(id):
return redirect(url_for("entreprises.index"))
return render_template(
"entreprises/delete_confirmation.html",
- title=("Supression entreprise"),
+ title="Supression entreprise",
form=form,
)
@@ -462,7 +460,7 @@ def validate_entreprise(id):
return redirect(url_for("entreprises.index"))
return render_template(
"entreprises/validate_confirmation.html",
- title=("Validation entreprise"),
+ title="Validation entreprise",
form=form,
)
@@ -505,7 +503,7 @@ def add_offre(id):
return redirect(url_for("entreprises.fiche_entreprise", id=entreprise.id))
return render_template(
"entreprises/form.html",
- title=("Ajout offre"),
+ title="Ajout offre",
form=form,
)
@@ -560,7 +558,7 @@ def edit_offre(id):
form.depts.data = offre_depts_list
return render_template(
"entreprises/form.html",
- title=("Modification offre"),
+ title="Modification offre",
form=form,
)
@@ -595,7 +593,7 @@ def delete_offre(id):
return redirect(url_for("entreprises.fiche_entreprise", id=entreprise_id))
return render_template(
"entreprises/delete_confirmation.html",
- title=("Supression offre"),
+ title="Supression offre",
form=form,
)
@@ -630,7 +628,7 @@ def add_contact(id):
return redirect(url_for("entreprises.fiche_entreprise", id=entreprise.id))
return render_template(
"entreprises/form.html",
- title=("Ajout contact"),
+ title="Ajout contact",
form=form,
)
@@ -673,7 +671,7 @@ def edit_contact(id):
form.service.data = contact.service
return render_template(
"entreprises/form.html",
- title=("Modification contact"),
+ title="Modification contact",
form=form,
)
@@ -685,17 +683,18 @@ def delete_contact(id):
Permet de supprimer un contact
"""
contact = EntrepriseContact.query.filter_by(id=id).first_or_404()
- entreprise_id = contact.entreprise.id
form = SuppressionConfirmationForm()
if form.validate_on_submit():
contact_count = EntrepriseContact.query.filter_by(
- entreprise_id=contact.entreprise.id
+ entreprise_id=contact.entreprise_id
).count()
if contact_count == 1:
flash(
"Le contact n'a pas été supprimé de la fiche entreprise. (1 contact minimum)"
)
- return redirect(url_for("entreprises.fiche_entreprise", id=entreprise_id))
+ return redirect(
+ url_for("entreprises.fiche_entreprise", id=contact.entreprise_id)
+ )
else:
db.session.delete(contact)
log = EntrepriseLog(
@@ -706,10 +705,12 @@ def delete_contact(id):
db.session.add(log)
db.session.commit()
flash("Le contact a été supprimé de la fiche entreprise.")
- return redirect(url_for("entreprises.fiche_entreprise", id=entreprise_id))
+ return redirect(
+ url_for("entreprises.fiche_entreprise", id=contact.entreprise_id)
+ )
return render_template(
"entreprises/delete_confirmation.html",
- title=("Supression contact"),
+ title="Supression contact",
form=form,
)
@@ -752,7 +753,7 @@ def add_historique(id):
return redirect(url_for("entreprises.fiche_entreprise", id=entreprise.id))
return render_template(
"entreprises/ajout_historique.html",
- title=("Ajout historique"),
+ title="Ajout historique",
form=form,
)
@@ -776,7 +777,9 @@ def envoyer_offre(id):
.first()
)
envoi_offre = EntrepriseEnvoiOffre(
- sender_id=current_user.id, receiver_id=responsable.id, offre_id=offre.id
+ sender_id=current_user.id,
+ receiver_id=responsable.id,
+ offre_id=offre.id,
)
db.session.add(envoi_offre)
db.session.commit()
@@ -784,7 +787,7 @@ def envoyer_offre(id):
return redirect(url_for("entreprises.fiche_entreprise", id=offre.entreprise_id))
return render_template(
"entreprises/envoi_offre_form.html",
- title=("Envoyer une offre"),
+ title="Envoyer une offre",
form=form,
)
@@ -904,10 +907,10 @@ def import_entreprises():
"""
form = ImportForm()
if form.validate_on_submit():
- path = os.path.join(Config.SCODOC_VAR_DIR, "tmp")
file = form.fichier.data
- filename = secure_filename(file.filename)
- file_path = os.path.join(path, filename)
+ file_path = os.path.join(
+ Config.SCODOC_VAR_DIR, "tmp", secure_filename(file.filename)
+ )
file.save(file_path)
data = sco_excel.excel_file_to_list(file_path)
os.remove(file_path)
@@ -919,7 +922,7 @@ def import_entreprises():
flash("Veuillez utilisez la feuille excel à remplir")
return render_template(
"entreprises/import_entreprises.html",
- title=("Importation entreprises"),
+ title="Importation entreprises",
form=form,
)
for entreprise_data in data[1][1:]:
@@ -944,7 +947,7 @@ def import_entreprises():
flash(f"Erreur lors de l'importation (ligne {ligne})")
return render_template(
"entreprises/import_entreprises.html",
- title=("Importation entreprises"),
+ title="Importation entreprises",
form=form,
)
@@ -955,7 +958,7 @@ def import_entreprises():
flash(f"Importation réussie de {len(entreprises_import)} entreprise(s)")
return render_template(
"entreprises/import_entreprises.html",
- title=("Importation entreprises"),
+ title="Importation entreprises",
form=form,
entreprises_import=entreprises_import,
)
@@ -964,7 +967,7 @@ def import_entreprises():
return render_template(
"entreprises/import_entreprises.html",
- title=("Importation entreprises"),
+ title="Importation entreprises",
form=form,
)
@@ -1028,10 +1031,12 @@ def verif_contact_data(contact_data):
if contact_data[0] == "" or contact_data[1] == "" or contact_data[6] == "":
return False
+ # entreprise_id existant
entreprise = Entreprise.query.filter_by(id=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]
).first()
@@ -1053,10 +1058,10 @@ def import_contacts():
"""
form = ImportForm()
if form.validate_on_submit():
- path = os.path.join(Config.SCODOC_VAR_DIR, "tmp")
file = form.fichier.data
- filename = secure_filename(file.filename)
- file_path = os.path.join(path, filename)
+ file_path = os.path.join(
+ Config.SCODOC_VAR_DIR, "tmp", secure_filename(file.filename)
+ )
file.save(file_path)
data = sco_excel.excel_file_to_list(file_path)
os.remove(file_path)
@@ -1076,7 +1081,7 @@ def import_contacts():
flash("Veuillez utilisez la feuille excel à remplir")
return render_template(
"entreprises/import_contacts.html",
- title=("Importation contacts"),
+ title="Importation contacts",
form=form,
)
for contact_data in data[1][1:]:
@@ -1101,7 +1106,7 @@ def import_contacts():
flash(f"Erreur lors de l'importation (ligne {ligne})")
return render_template(
"entreprises/import_contacts.html",
- title=("Importation contacts"),
+ title="Importation contacts",
form=form,
)
@@ -1112,7 +1117,7 @@ def import_contacts():
flash(f"Importation réussie de {len(contacts_import)} contact(s)")
return render_template(
"entreprises/import_contacts.html",
- title=("Importation Contacts"),
+ title="Importation Contacts",
form=form,
contacts_import=contacts_import,
)
@@ -1120,7 +1125,7 @@ def import_contacts():
flash('Feuille "Contacts" vide')
return render_template(
"entreprises/import_contacts.html",
- title=("Importation contacts"),
+ title="Importation contacts",
form=form,
)
@@ -1183,7 +1188,7 @@ def add_offre_file(offre_id):
return redirect(url_for("entreprises.fiche_entreprise", id=offre.entreprise_id))
return render_template(
"entreprises/form.html",
- title=("Ajout fichier à une offre"),
+ title="Ajout fichier à une offre",
form=form,
)
@@ -1212,6 +1217,6 @@ def delete_offre_file(offre_id, filedir):
)
return render_template(
"entreprises/delete_confirmation.html",
- title=("Suppression fichier d'une offre"),
+ title="Suppression fichier d'une offre",
form=form,
)
diff --git a/app/templates/entreprises/ajout_entreprise.html b/app/templates/entreprises/ajout_entreprise.html
index f07d1632c..c593335b8 100644
--- a/app/templates/entreprises/ajout_entreprise.html
+++ b/app/templates/entreprises/ajout_entreprise.html
@@ -51,5 +51,12 @@
document.getElementById("pays").value = ''
}
}
+
+ {# ajout margin-bottom sur le champ pays #}
+ var champ_pays = document.getElementById("pays")
+ if (champ_pays !== null) {
+ var closest_form_group = champ_pays.closest(".form-group")
+ closest_form_group.style.marginBottom = "50px"
+ }
{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/form.html b/app/templates/entreprises/form.html
index 7e7792065..d987f1ebe 100644
--- a/app/templates/entreprises/form.html
+++ b/app/templates/entreprises/form.html
@@ -16,9 +16,11 @@
{% endblock %}
\ No newline at end of file
From 82b77913097ae317ed8082ebba11d21d886bb98e Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Mon, 14 Feb 2022 19:42:17 +0100
Subject: [PATCH 25/26] =?UTF-8?q?offres=20affich=C3=A9es=20selon=20departe?=
=?UTF-8?q?ment,=20divers?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/entreprises/routes.py | 93 ++++++++++++++++---
app/static/css/entreprises.css | 7 +-
app/templates/entreprises/_offre.html | 2 +-
.../fiche_entreprise_validation.html | 1 +
app/templates/entreprises/offres_recues.html | 7 +-
5 files changed, 91 insertions(+), 19 deletions(-)
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 8ec543949..5135470e4 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -45,6 +45,7 @@ import app.scodoc.sco_utils as scu
from app import db
from sqlalchemy import text
+from app.models.departements import Departement
from werkzeug.utils import secure_filename
@@ -120,6 +121,21 @@ def contacts():
)
+# temp
+def get_dept_id(acronym):
+ dept = Departement.query.filter_by(acronym=acronym).first()
+ if dept is not None:
+ return dept.id
+ return None
+
+
+def check_offre_dept(depts, offre_depts):
+ for offre_dept in offre_depts:
+ if offre_dept.dept_id in depts:
+ return True
+ return False
+
+
@bp.route("/fiche_entreprise/", methods=["GET"])
@permission_required(Permission.RelationsEntreprisesView)
def fiche_entreprise(id):
@@ -131,26 +147,32 @@ def fiche_entreprise(id):
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
offres_with_files = []
+ depts = []
+ for role in current_user.user_roles:
+ dept_id = get_dept_id(role.dept)
+ if dept_id is not None:
+ depts.append(dept_id)
for offre in entreprise.offres:
if date.today() < offre.expiration_date:
- files = []
- path = os.path.join(
- Config.SCODOC_VAR_DIR,
- "entreprises",
- f"{offre.entreprise_id}",
- f"{offre.id}",
- )
- if os.path.exists(path):
- for dir in glob.glob(
- f"{path}/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
- ):
- for file in glob.glob(f"{dir}/*"):
- file = [os.path.basename(dir), os.path.basename(file)]
- files.append(file)
offre_depts = EntrepriseOffreDepartement.query.filter_by(
offre_id=offre.id
).all()
- offres_with_files.append([offre, files, offre_depts])
+ if not offre_depts or check_offre_dept(depts, offre_depts):
+ files = []
+ path = os.path.join(
+ Config.SCODOC_VAR_DIR,
+ "entreprises",
+ f"{offre.entreprise_id}",
+ f"{offre.id}",
+ )
+ if os.path.exists(path):
+ for dir in glob.glob(
+ f"{path}/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
+ ):
+ for file in glob.glob(f"{dir}/*"):
+ file = [os.path.basename(dir), os.path.basename(file)]
+ files.append(file)
+ offres_with_files.append([offre, files, offre_depts])
contacts = entreprise.contacts[:]
logs = (
EntrepriseLog.query.order_by(EntrepriseLog.date.desc())
@@ -465,6 +487,26 @@ def validate_entreprise(id):
)
+@bp.route("/delete_validation_entreprise/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesValidate)
+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()
+ form = SuppressionConfirmationForm()
+ if form.validate_on_submit():
+ db.session.delete(entreprise)
+ db.session.commit()
+ 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",
+ title="Supression entreprise",
+ form=form,
+ )
+
+
@bp.route("/add_offre/", methods=["GET", "POST"])
@permission_required(Permission.RelationsEntreprisesChange)
def add_offre(id):
@@ -598,6 +640,17 @@ def delete_offre(id):
)
+@bp.route("/delete_offre_recue/", methods=["GET", "POST"])
+@permission_required(Permission.RelationsEntreprisesView)
+def delete_offre_recue(id):
+ offre_recue = EntrepriseEnvoiOffre.query.filter_by(
+ id=id, receiver_id=current_user.id
+ ).first_or_404()
+ db.session.delete(offre_recue)
+ db.session.commit()
+ return redirect(url_for("entreprises.offres_recues"))
+
+
@bp.route("/add_contact/", methods=["GET", "POST"])
@permission_required(Permission.RelationsEntreprisesChange)
def add_contact(id):
@@ -954,6 +1007,11 @@ def import_entreprises():
if len(entreprises_import) > 0:
for entreprise in entreprises_import:
db.session.add(entreprise)
+ log = EntrepriseLog(
+ authenticated_user=current_user.user_name,
+ text=f"Importation de {len(entreprises_import)} entreprise(s)",
+ )
+ db.session.add(log)
db.session.commit()
flash(f"Importation réussie de {len(entreprises_import)} entreprise(s)")
return render_template(
@@ -1113,6 +1171,11 @@ def import_contacts():
if len(contacts_import) > 0:
for contact in contacts_import:
db.session.add(contact)
+ log = EntrepriseLog(
+ authenticated_user=current_user.user_name,
+ text=f"Importation de {len(contacts_import)} contact(s)",
+ )
+ db.session.add(log)
db.session.commit()
flash(f"Importation réussie de {len(contacts_import)} contact(s)")
return render_template(
diff --git a/app/static/css/entreprises.css b/app/static/css/entreprises.css
index 8883fb9ec..d2dc5cf5d 100644
--- a/app/static/css/entreprises.css
+++ b/app/static/css/entreprises.css
@@ -75,9 +75,14 @@
padding-left: 10px;
}
-.offre_depts {
+.offre-depts {
display: inline-block;
border: black solid 2px;
border-radius: 5px;
padding: 1px;
+}
+
+.offre-recue {
+ display: flex;
+ justify-content: space-between;
}
\ No newline at end of file
diff --git a/app/templates/entreprises/_offre.html b/app/templates/entreprises/_offre.html
index 8e1f56ccb..0176ddd2d 100644
--- a/app/templates/entreprises/_offre.html
+++ b/app/templates/entreprises/_offre.html
@@ -7,7 +7,7 @@
Missions : {{ offre[0].missions }}
Durée : {{ offre[0].duree }}
{% if offre[2] %}
- Département(s) : {% for offre_dept in offre[2] %} {{ offre_dept.dept_id|get_dept_acronym }}
{% endfor %}
+ Département(s) : {% for offre_dept in offre[2] %} {{ offre_dept.dept_id|get_dept_acronym }}
{% endfor %}
{% endif %}
{% for fichier in offre[1] %}
{{ fichier[1] }}
diff --git a/app/templates/entreprises/fiche_entreprise_validation.html b/app/templates/entreprises/fiche_entreprise_validation.html
index 9d67ac83b..072461b44 100644
--- a/app/templates/entreprises/fiche_entreprise_validation.html
+++ b/app/templates/entreprises/fiche_entreprise_validation.html
@@ -44,6 +44,7 @@
{% endblock %}
\ No newline at end of file
diff --git a/app/templates/entreprises/offres_recues.html b/app/templates/entreprises/offres_recues.html
index 63bbdb65d..e4de166eb 100644
--- a/app/templates/entreprises/offres_recues.html
+++ b/app/templates/entreprises/offres_recues.html
@@ -8,7 +8,7 @@
Offres reçues
{% if offres_recues %}
{% for offre in offres_recues %}
-
+
Envoyé le {{ offre[0].date_envoi.strftime('%d %B %Y à %H:%M') }} par {{ offre[0].sender_id|get_nomcomplet_by_id }}
Intitulé : {{ offre[1].intitule }}
@@ -18,9 +18,12 @@
Durée : {{ offre[1].duree }}
{% for fichier in offre[2] %}
-
{{ fichier[1] }}
+
{{ fichier[1] }}
{% endfor %}
+
+
+
{% endfor %}
{% else %}
From a57953c210ab355d2d51c9b7c7a63710f27911dc Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Tue, 15 Feb 2022 18:24:10 +0100
Subject: [PATCH 26/26] =?UTF-8?q?visibilit=C3=A9=20offres=20li=C3=A9s=20d?=
=?UTF-8?q?=C3=A9partement(s),=20divers?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/entreprises/app_relations_entreprises.py | 153 +++++++++++++++++++
app/entreprises/routes.py | 116 ++------------
app/templates/entreprises/offres_recues.html | 1 +
3 files changed, 166 insertions(+), 104 deletions(-)
create mode 100644 app/entreprises/app_relations_entreprises.py
diff --git a/app/entreprises/app_relations_entreprises.py b/app/entreprises/app_relations_entreprises.py
new file mode 100644
index 000000000..c47000ce3
--- /dev/null
+++ b/app/entreprises/app_relations_entreprises.py
@@ -0,0 +1,153 @@
+# -*- mode: python -*-
+# -*- coding: utf-8 -*-
+
+##############################################################################
+#
+# Gestion scolarite IUT
+#
+# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+##############################################################################
+
+import os
+from config import Config
+import re
+import requests
+import glob
+
+from flask_login import current_user
+
+from app.entreprises.models import (
+ Entreprise,
+ EntrepriseContact,
+ EntrepriseOffre,
+ EntrepriseOffreDepartement,
+)
+
+from app.models import Departement
+from app.scodoc.sco_permissions import Permission
+
+
+def get_depts():
+ """
+ Retourne une liste contenant les l'id des départements des roles de l'utilisateur courant
+ """
+ depts = []
+ for role in current_user.user_roles:
+ dept_id = get_dept_id_by_acronym(role.dept)
+ if dept_id is not None:
+ depts.append(dept_id)
+ return depts
+
+
+def get_dept_id_by_acronym(acronym):
+ """
+ Retourne l'id d'un departement a l'aide de son acronym
+ """
+ dept = Departement.query.filter_by(acronym=acronym).first()
+ if dept is not None:
+ return dept.id
+ return None
+
+
+def check_offre_depts(depts, offre_depts):
+ """
+ Retourne vrai si l'utilisateur a le droit de visibilité sur l'offre
+ """
+ if current_user.has_permission(Permission.RelationsEntreprisesChange, None):
+ return True
+ for offre_dept in offre_depts:
+ if offre_dept.dept_id in depts:
+ return True
+ return False
+
+
+def get_offre_files_and_depts(offre: EntrepriseOffre, depts: list):
+ """
+ Retourne l'offre, les fichiers attachés a l'offre et les département liés
+ """
+ offre_depts = EntrepriseOffreDepartement.query.filter_by(offre_id=offre.id).all()
+ if not offre_depts or check_offre_depts(depts, offre_depts):
+ files = []
+ path = os.path.join(
+ Config.SCODOC_VAR_DIR,
+ "entreprises",
+ f"{offre.entreprise_id}",
+ f"{offre.id}",
+ )
+ if os.path.exists(path):
+ for dir in glob.glob(
+ f"{path}/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
+ ):
+ for _file in glob.glob(f"{dir}/*"):
+ file = [os.path.basename(dir), os.path.basename(_file)]
+ files.append(file)
+ return [offre, files, offre_depts]
+ return None
+
+
+def verif_contact_data(contact_data):
+ """
+ Verifie les données d'une ligne Excel (contact)
+ contact_data[0]: nom
+ contact_data[1]: prenom
+ contact_data[2]: telephone
+ contact_data[3]: mail
+ contact_data[4]: poste
+ contact_data[5]: service
+ contact_data[6]: entreprise_id
+ """
+ # champs obligatoires
+ if contact_data[0] == "" or contact_data[1] == "" or contact_data[6] == "":
+ return False
+
+ # entreprise_id existant
+ entreprise = Entreprise.query.filter_by(id=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]
+ ).first()
+ if contact is not None:
+ return False
+
+ if contact_data[2] == "" and contact_data[3] == "": # 1 moyen de contact
+ return False
+
+ return True
+
+
+def verif_entreprise_data(entreprise_data):
+ """
+ Verifie les données d'une ligne Excel (entreprise)
+ """
+ for data in entreprise_data: # champs obligatoires
+ if data == "":
+ return False
+ siret = entreprise_data[0].strip() # vérification sur le siret
+ if re.match("^\d{14}$", siret) is None:
+ return False
+ req = requests.get(f"https://entreprise.data.gouv.fr/api/sirene/v1/siret/{siret}")
+ if req.status_code != 200:
+ return False
+ entreprise = Entreprise.query.filter_by(siret=siret).first()
+ if entreprise is not None:
+ return False
+ return True
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 5135470e4..e3226c712 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -3,8 +3,6 @@ from config import Config
from datetime import datetime, date
import glob
import shutil
-import re
-import requests
from flask import render_template, redirect, url_for, request, flash, send_file, abort
from flask.json import jsonify
@@ -37,6 +35,7 @@ from app.entreprises.models import (
EntrepriseEnvoiOffre,
EntrepriseOffreDepartement,
)
+from app.entreprises import app_relations_entreprises as are
from app.models import Identite
from app.auth.models import User
from app.scodoc.sco_permissions import Permission
@@ -45,7 +44,6 @@ import app.scodoc.sco_utils as scu
from app import db
from sqlalchemy import text
-from app.models.departements import Departement
from werkzeug.utils import secure_filename
@@ -121,21 +119,6 @@ def contacts():
)
-# temp
-def get_dept_id(acronym):
- dept = Departement.query.filter_by(acronym=acronym).first()
- if dept is not None:
- return dept.id
- return None
-
-
-def check_offre_dept(depts, offre_depts):
- for offre_dept in offre_depts:
- if offre_dept.dept_id in depts:
- return True
- return False
-
-
@bp.route("/fiche_entreprise/", methods=["GET"])
@permission_required(Permission.RelationsEntreprisesView)
def fiche_entreprise(id):
@@ -147,32 +130,12 @@ def fiche_entreprise(id):
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404()
offres_with_files = []
- depts = []
- for role in current_user.user_roles:
- dept_id = get_dept_id(role.dept)
- if dept_id is not None:
- depts.append(dept_id)
+ depts = are.get_depts()
for offre in entreprise.offres:
if date.today() < offre.expiration_date:
- offre_depts = EntrepriseOffreDepartement.query.filter_by(
- offre_id=offre.id
- ).all()
- if not offre_depts or check_offre_dept(depts, offre_depts):
- files = []
- path = os.path.join(
- Config.SCODOC_VAR_DIR,
- "entreprises",
- f"{offre.entreprise_id}",
- f"{offre.id}",
- )
- if os.path.exists(path):
- for dir in glob.glob(
- f"{path}/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
- ):
- for file in glob.glob(f"{dir}/*"):
- file = [os.path.basename(dir), os.path.basename(file)]
- files.append(file)
- offres_with_files.append([offre, files, offre_depts])
+ 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)
contacts = entreprise.contacts[:]
logs = (
EntrepriseLog.query.order_by(EntrepriseLog.date.desc())
@@ -278,28 +241,13 @@ 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()
- offres = entreprise.offres
offres_expirees_with_files = []
- for offre in offres:
+ depts = are.get_depts()
+ for offre in entreprise.offres:
if date.today() > offre.expiration_date:
- files = []
- path = os.path.join(
- Config.SCODOC_VAR_DIR,
- "entreprises",
- f"{offre.entreprise_id}",
- f"{offre.id}",
- )
- if os.path.exists(path):
- for dir in glob.glob(
- f"{path}/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"
- ):
- for file in glob.glob(f"{dir}/*"):
- file = [os.path.basename(dir), os.path.basename(file)]
- files.append(file)
- offre_depts = EntrepriseOffreDepartement.query.filter_by(
- offre_id=offre.id
- ).all()
- offres_expirees_with_files.append([offre, files, offre_depts])
+ offre_expiree_with_files = are.get_offre_files_and_depts(offre, depts)
+ if offre_expiree_with_files is not None:
+ offres_expirees_with_files.append(offre_expiree_with_files)
return render_template(
"entreprises/offres_expirees.html",
title="Offres expirées",
@@ -936,22 +884,6 @@ def get_import_entreprises_file_sample():
return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE)
-def verif_entreprise_data(entreprise_data):
- for data in entreprise_data:
- if data == "":
- return False
- siret = entreprise_data[0].strip()
- if re.match("^\d{14}$", siret) is None:
- return False
- req = requests.get(f"https://entreprise.data.gouv.fr/api/sirene/v1/siret/{siret}")
- if req.status_code != 200:
- return False
- entreprise = Entreprise.query.filter_by(siret=siret).first()
- if entreprise is not None:
- return False
- return True
-
-
@bp.route("/import_entreprises", methods=["GET", "POST"])
@permission_required(Permission.RelationsEntreprisesExport)
def import_entreprises():
@@ -981,7 +913,7 @@ def import_entreprises():
for entreprise_data in data[1][1:]:
ligne += 1
if (
- verif_entreprise_data(entreprise_data)
+ are.verif_entreprise_data(entreprise_data)
and entreprise_data[0] not in siret_list
):
siret_list.append(entreprise_data[0])
@@ -1084,30 +1016,6 @@ def get_import_contacts_file_sample():
return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE)
-def verif_contact_data(contact_data):
- # champ nom, prenom et entreprise_id obligatoire
- if contact_data[0] == "" or contact_data[1] == "" or contact_data[6] == "":
- return False
-
- # entreprise_id existant
- entreprise = Entreprise.query.filter_by(id=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]
- ).first()
- if contact is not None:
- return False
-
- # 1 moyen de contact
- if contact_data[2] == "" and contact_data[3] == "":
- return False
-
- return True
-
-
@bp.route("/import_contacts", methods=["GET", "POST"])
@permission_required(Permission.RelationsEntreprisesExport)
def import_contacts():
@@ -1145,7 +1053,7 @@ def import_contacts():
for contact_data in data[1][1:]:
ligne += 1
if (
- verif_contact_data(contact_data)
+ are.verif_contact_data(contact_data)
and (contact_data[0], contact_data[1], contact_data[6])
not in contact_list
):
diff --git a/app/templates/entreprises/offres_recues.html b/app/templates/entreprises/offres_recues.html
index e4de166eb..2d3c9698e 100644
--- a/app/templates/entreprises/offres_recues.html
+++ b/app/templates/entreprises/offres_recues.html
@@ -16,6 +16,7 @@
Type de l'offre : {{ offre[1].type_offre }}
Missions : {{ offre[1].missions }}
Durée : {{ offre[1].duree }}
+ lien vers l'entreprise
{% for fichier in offre[2] %}
{{ fichier[1] }}