From d637ffe70cfb427bf06e25a9394b9f6f42f3235e Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Mon, 24 Jan 2022 11:16:46 +0100 Subject: [PATCH 001/159] 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 e743df3d60..865d8ff2c3 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 0000000000..08d5200f7e --- /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 002/159] 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 1f76732dce..9ea927813d 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 865d8ff2c3..0585b4cc4e 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 f99fa8eef7..7618d16449 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 0000000000..54ea8e09f9 --- /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 08d5200f7e..0000000000 --- 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 003/159] =?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 7618d16449..51c693defe 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 9bb20a8a83..8e03942d49 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 0000000000..50c1b7d768 --- /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 004/159] 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 0585b4cc4e..b3389fa4ad 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 51c693defe..c7be9643bb 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 54ea8e09f9..b116c8e0f8 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 005/159] 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 c7be9643bb..8266d67a12 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 a1a06aba8c..55981b0336 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 0000000000..14a5b49dac --- /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 %} +
+ + + + + + + + + + + {% for entreprise in entreprises %} + + + + + + + + + + {% endfor %} +
SIRETNomAdresseCode postalVillePaysAction
{{ entreprise.siret }}{{ entreprise.nom }}{{ entreprise.adresse }}{{ entreprise.codepostal }}{{ entreprise.ville }}{{ entreprise.pays }} + Valider +
+ {% 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 8e03942d49..a7cc09632b 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 0000000000..6daf2ce113 --- /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 %} + +
+ Valider +
+
+{% endblock %} \ No newline at end of file diff --git a/app/templates/entreprises/offres_expirees.html b/app/templates/entreprises/offres_expirees.html index 50c1b7d768..2b7b60f569 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 006/159] oubli --- app/entreprises/routes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index 8266d67a12..91383f3484 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 007/159] =?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 91383f3484..651184920a 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 55981b0336..71cfede19a 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 e7083a26fe..29f7bd46fd 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 ea69110e9d..a893cf5b61 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) %} supprimer
+ {% 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 22fb1be92e..0d0df6797c 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 fe790a8d61..4dd96a0e02 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 %}
- Ajouter une entreprise + {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} + Ajouter une entreprise + {% endif %} {% if entreprises %} - Exporter la liste des entreprises + {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesExport, None) %} + Exporter la liste des entreprises + {% endif %} {% endif %}
diff --git a/app/templates/entreprises/fiche_entreprise.html b/app/templates/entreprises/fiche_entreprise.html index a7cc09632b..94bb21476f 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) %}
Modifier Supprimer @@ -73,5 +74,6 @@ historique Voir les offres expirées
+ {% 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 008/159] 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 44968ffb1b..813fd73b65 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 651184920a..a6f91813bf 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 0000000000..6dded2fa40 --- /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 adf70171b6..176e4b9932 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 %}