From 63f40fc9406ec31b695557eb667bc30608443746 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Wed, 29 Dec 2021 19:40:57 +0100
Subject: [PATCH 1/3] ajout documentation
---
app/entreprises/forms.py | 1 -
app/entreprises/models.py | 17 ++
app/entreprises/routes.py | 224 +++++++++++++++++++++++-
app/models/etudiants.py | 3 +
app/models/formsemestre.py | 2 +-
app/templates/entreprises/_contact.html | 6 +
app/templates/entreprises/contacts.html | 5 +
scodoc.py | 2 +
8 files changed, 256 insertions(+), 4 deletions(-)
diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py
index 0e145f43d..2abc7db33 100644
--- a/app/entreprises/forms.py
+++ b/app/entreprises/forms.py
@@ -1,4 +1,3 @@
-from flask import flash
from flask_wtf import FlaskForm
from markupsafe import Markup
import requests, re
diff --git a/app/entreprises/models.py b/app/entreprises/models.py
index b0cd25de7..10ae990e4 100644
--- a/app/entreprises/models.py
+++ b/app/entreprises/models.py
@@ -57,6 +57,23 @@ class EntrepriseContact(db.Model):
"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,
+ }
+
class EntrepriseOffre(db.Model):
__tablename__ = "entreprise_offre"
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 590dd313c..007af4cfc 100644
--- a/app/entreprises/routes.py
+++ b/app/entreprises/routes.py
@@ -45,6 +45,18 @@ from werkzeug.utils import secure_filename
@bp.route("/", methods=["GET"])
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.all()
logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all()
return render_template(
@@ -57,6 +69,18 @@ def index():
@bp.route("/contacts", methods=["GET"])
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
+ """
contacts = (
db.session.query(EntrepriseContact, Entreprise)
.join(Entreprise, EntrepriseContact.entreprise_id == Entreprise.id)
@@ -70,6 +94,31 @@ def contacts():
@bp.route("/fiche_entreprise/", methods=["GET"])
def fiche_entreprise(id):
+ """
+ Permet d'afficher la fiche entreprise d'une entreprise avec une liste des dernières opérations et
+ 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).first_or_404()
offres = entreprise.offres
offres_with_files = []
@@ -116,19 +165,32 @@ def fiche_entreprise(id):
@bp.route("/offres", methods=["GET"])
def offres():
- offres_recus = (
+ """
+ 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)
.filter(EntrepriseEnvoiOffre.receiver_id == current_user.id)
.join(EntrepriseOffre, EntrepriseOffre.id == EntrepriseEnvoiOffre.offre_id)
.all()
)
return render_template(
- "entreprises/offres.html", title=("Offres"), offres_recus=offres_recus
+ "entreprises/offres.html", title=("Offres"), offres_recues=offres_recues
)
@bp.route("/add_entreprise", methods=["GET", "POST"])
def add_entreprise():
+ """
+ Permet d'ajouter une entreprise dans la base avec un formulaire
+ """
form = EntrepriseCreationForm()
if form.validate_on_submit():
entreprise = Entreprise(
@@ -170,6 +232,13 @@ def add_entreprise():
@bp.route("/edit_entreprise/", methods=["GET", "POST"])
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).first_or_404()
form = EntrepriseModificationForm()
if form.validate_on_submit():
@@ -231,6 +300,13 @@ def edit_entreprise(id):
@bp.route("/delete_entreprise/", methods=["GET", "POST"])
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).first_or_404()
form = SuppressionConfirmationForm()
if form.validate_on_submit():
@@ -253,6 +329,13 @@ def delete_entreprise(id):
@bp.route("/add_offre/", methods=["GET", "POST"])
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).first_or_404()
form = OffreCreationForm()
if form.validate_on_submit():
@@ -279,6 +362,13 @@ def add_offre(id):
@bp.route("/edit_offre/", methods=["GET", "POST"])
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()
if form.validate_on_submit():
@@ -309,6 +399,13 @@ def edit_offre(id):
@bp.route("/delete_offre/", methods=["GET", "POST"])
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
form = SuppressionConfirmationForm()
@@ -330,6 +427,13 @@ def delete_offre(id):
@bp.route("/add_contact/", methods=["GET", "POST"])
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).first_or_404()
form = ContactCreationForm(hidden_entreprise_id=entreprise.id)
if form.validate_on_submit():
@@ -357,6 +461,13 @@ def add_contact(id):
@bp.route("/edit_contact/", methods=["GET", "POST"])
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()
if form.validate_on_submit():
@@ -391,6 +502,13 @@ def edit_contact(id):
@bp.route("/delete_contact/", methods=["GET", "POST"])
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
form = SuppressionConfirmationForm()
@@ -421,6 +539,13 @@ def delete_contact(id):
@bp.route("/add_historique/", methods=["GET", "POST"])
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).first_or_404()
form = HistoriqueCreationForm()
if form.validate_on_submit():
@@ -458,6 +583,13 @@ def add_historique(id):
@bp.route("/envoyer_offre/", methods=["GET", "POST"])
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()
if form.validate_on_submit():
@@ -484,6 +616,16 @@ def envoyer_offre(id):
@bp.route("/etudiants")
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
+ """
term = request.args.get("term").strip()
etudiants = Identite.query.filter(Identite.nom.ilike(f"%{term}%")).all()
list = []
@@ -505,6 +647,16 @@ def json_etudiants():
@bp.route("/responsables")
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
+ """
term = request.args.get("term").strip()
responsables = User.query.filter(
User.nom.ilike(f"%{term}%"), User.nom.is_not(None), User.prenom.is_not(None)
@@ -521,6 +673,9 @@ def json_responsables():
@bp.route("/export_entreprises")
def export_entreprises():
+ """
+ Permet d'exporter la liste des entreprises sous format excel (.xlsx)
+ """
entreprises = Entreprise.query.all()
if entreprises:
keys = ["siret", "nom", "adresse", "ville", "codepostal", "pays"]
@@ -539,6 +694,9 @@ def export_entreprises():
@bp.route("/export_contacts")
def export_contacts():
+ """
+ Permet d'exporter la liste des contacts sous format excel (.xlsx)
+ """
contacts = EntrepriseContact.query.all()
if contacts:
keys = ["nom", "prenom", "telephone", "mail", "poste", "service"]
@@ -552,10 +710,56 @@ def export_contacts():
abort(404)
+@bp.route("/export_contacts_bis")
+def export_contacts_bis():
+ """
+ Permet d'exporter la liste des contacts avec leur entreprise sous format excel (.xlsx)
+ """
+ contacts = EntrepriseContact.query.all()
+ if contacts:
+ keys = [
+ "nom",
+ "prenom",
+ "telephone",
+ "mail",
+ "poste",
+ "service",
+ "nom_entreprise",
+ "siret",
+ "adresse_entreprise",
+ "ville",
+ "codepostal",
+ "pays",
+ ]
+ titles = keys[:]
+ L = [
+ [contact.to_dict_export().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(
"/get_offre_file////"
)
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(
Config.SCODOC_VAR_DIR,
@@ -583,6 +787,13 @@ def get_offre_file(entreprise_id, offre_id, filedir, filename):
@bp.route("/add_offre_file/", methods=["GET", "POST"])
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()
if form.validate_on_submit():
@@ -607,6 +818,15 @@ def add_offre_file(offre_id):
@bp.route("/delete_offre_file//", methods=["GET", "POST"])
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()
if form.validate_on_submit():
diff --git a/app/models/etudiants.py b/app/models/etudiants.py
index 0f81ad6bf..ce4a60b55 100644
--- a/app/models/etudiants.py
+++ b/app/models/etudiants.py
@@ -108,6 +108,9 @@ class Identite(db.Model):
return r[0] if r else None
def inscription_courante_date(self, date_debut, date_fin):
+ """La première inscription à un formsemestre entre date_debut et date_fin.
+ None s'il n'y en a pas (ou plus, ou pas encore).
+ """
r = [
ins
for ins in self.formsemestre_inscriptions
diff --git a/app/models/formsemestre.py b/app/models/formsemestre.py
index dc13c1cc8..85951961d 100644
--- a/app/models/formsemestre.py
+++ b/app/models/formsemestre.py
@@ -147,7 +147,7 @@ class FormSemestre(db.Model):
return (self.date_debut <= today) and (today <= self.date_fin)
def est_courant_date(self, date_debut, date_fin) -> bool:
- """Vrai si la date actuelle (now) est dans le semestre
+ """Vrai si date_debut et date_fin est dans le semestre
(les dates de début et fin sont incluses)
"""
return (self.date_debut <= date_debut) and (date_fin <= self.date_fin)
diff --git a/app/templates/entreprises/_contact.html b/app/templates/entreprises/_contact.html
index eff3a8cb2..5b07c1e2e 100644
--- a/app/templates/entreprises/_contact.html
+++ b/app/templates/entreprises/_contact.html
@@ -4,6 +4,12 @@
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 %}
diff --git a/app/templates/entreprises/contacts.html b/app/templates/entreprises/contacts.html
index 87112710f..f4ae3f718 100644
--- a/app/templates/entreprises/contacts.html
+++ b/app/templates/entreprises/contacts.html
@@ -21,6 +21,8 @@
Prenom |
Telephone |
Mail |
+
Poste |
+
Service |
Entreprise |
{% for contact in contacts %}
@@ -29,6 +31,8 @@
{{ contact[0].prenom }} |
{{ contact[0].telephone }} |
{{ contact[0].mail }} |
+
{{ contact[0].poste}} |
+
{{ contact[0].service}} |
{{ contact[1].nom }} |
{% endfor %}
@@ -40,6 +44,7 @@
diff --git a/scodoc.py b/scodoc.py
index 1be505527..7588c4d16 100755
--- a/scodoc.py
+++ b/scodoc.py
@@ -248,6 +248,7 @@ def edit_role(rolename, addpermissionname=None, removepermissionname=None): # e
db.session.add(role)
db.session.commit()
+
@app.cli.command()
@click.argument("rolename")
def delete_role(rolename):
@@ -259,6 +260,7 @@ def delete_role(rolename):
db.session.delete(role)
db.session.commit()
+
@app.cli.command()
@click.argument("username")
@click.option("-d", "--dept", "dept_acronym")
From 3d4b903acf56ef248a635e42887d353c4981a7a3 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Thu, 30 Dec 2021 19:37:46 +0100
Subject: [PATCH 2/3] =?UTF-8?q?ajout=20error=20+=20offre=20obsol=C3=A8te?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/entreprises/models.py | 18 ++++++++++++
app/entreprises/routes.py | 10 ++++++-
...e_creation_table_relations_entreprrises.py | 28 +++++++++++++++++++
3 files changed, 55 insertions(+), 1 deletion(-)
diff --git a/app/entreprises/models.py b/app/entreprises/models.py
index 10ae990e4..e743df3d6 100644
--- a/app/entreprises/models.py
+++ b/app/entreprises/models.py
@@ -88,6 +88,15 @@ class EntrepriseOffre(db.Model):
missions = db.Column(db.Text)
duree = db.Column(db.Text)
+ def to_dict(self):
+ return {
+ "intitule": self.intitule,
+ "description": self.description,
+ "type_offre": self.type_offre,
+ "missions": self.missions,
+ "duree": self.duree,
+ }
+
class EntrepriseLog(db.Model):
__tablename__ = "entreprise_log"
@@ -117,3 +126,12 @@ class EntrepriseEnvoiOffre(db.Model):
receiver_id = db.Column(db.Integer, db.ForeignKey("user.id"))
offre_id = db.Column(db.Integer, db.ForeignKey("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"
+ 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"))
+ date_envoi = db.Column(db.DateTime(timezone=True), server_default=db.func.now())
diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py
index 007af4cfc..f99fa8eef 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
+from datetime import datetime, timedelta
import glob
import shutil
@@ -123,6 +123,10 @@ 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 ?
+ break
files = []
path = os.path.join(
Config.SCODOC_VAR_DIR,
@@ -626,6 +630,8 @@ def json_etudiants():
Retourne:
le JSON de tous les étudiants (nom, prenom, formation actuelle?) correspondant au terme
"""
+ if request.args.get("term") == None:
+ abort(400)
term = request.args.get("term").strip()
etudiants = Identite.query.filter(Identite.nom.ilike(f"%{term}%")).all()
list = []
@@ -657,6 +663,8 @@ def json_responsables():
Retourne:
le JSON de tous les utilisateurs (nom, prenom, login) correspondant au terme
"""
+ if request.args.get("term") == None:
+ abort(400)
term = request.args.get("term").strip()
responsables = User.query.filter(
User.nom.ilike(f"%{term}%"), User.nom.is_not(None), User.prenom.is_not(None)
diff --git a/migrations/versions/2dfafee725ae_creation_table_relations_entreprrises.py b/migrations/versions/2dfafee725ae_creation_table_relations_entreprrises.py
index 05adc3566..e47a98798 100644
--- a/migrations/versions/2dfafee725ae_creation_table_relations_entreprrises.py
+++ b/migrations/versions/2dfafee725ae_creation_table_relations_entreprrises.py
@@ -97,6 +97,33 @@ def upgrade():
sa.PrimaryKeyConstraint("id"),
)
+ op.create_table(
+ "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"],
+ ["entreprise_offre.id"],
+ ),
+ sa.ForeignKeyConstraint(
+ ["sender_id"],
+ ["user.id"],
+ ),
+ sa.ForeignKeyConstraint(
+ ["receiver_id"],
+ ["identite.id"],
+ ),
+ sa.PrimaryKeyConstraint("id"),
+ )
+
op.drop_constraint(
"entreprise_contact_entreprise_corresp_id_fkey",
"entreprise_contact",
@@ -249,6 +276,7 @@ def downgrade():
op.drop_column("entreprise_contact", "nom")
op.drop_table("entreprise_envoi_offre")
+ op.drop_table("entreprise_envoi_offre_etudiant")
op.drop_table("entreprise_offre")
op.drop_table("entreprise_etudiant")
op.drop_table("entreprise_log")
From 8b98a0bc63fb635f09294c0c62896500f61c4126 Mon Sep 17 00:00:00 2001
From: Arthur ZHU
Date: Sat, 1 Jan 2022 19:45:37 +0100
Subject: [PATCH 3/3] oubli
---
app/entreprises/forms.py | 3 ---
1 file changed, 3 deletions(-)
diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py
index 74aa24ca6..1f76732dc 100644
--- a/app/entreprises/forms.py
+++ b/app/entreprises/forms.py
@@ -1,5 +1,3 @@
-<<<<<<< HEAD
-=======
# -*- mode: python -*-
# -*- coding: utf-8 -*-
@@ -29,7 +27,6 @@
import re
import requests
->>>>>>> e0be0f8feef8cfb7f5da4fe516b33529ec1712c9
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed, FileRequired
from markupsafe import Markup