Skip to content
Snippets Groups Projects
Commit dd8edc37 authored by Emmanuel Viennet's avatar Emmanuel Viennet
Browse files

PE: ajout option pour générer comptes d'absences

parent b4f1c1a4
No related branches found
No related tags found
No related merge requests found
...@@ -27,7 +27,7 @@ Formulaire options génération table poursuite études (PE) ...@@ -27,7 +27,7 @@ Formulaire options génération table poursuite études (PE)
""" """
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from wtforms import BooleanField, HiddenField, SubmitField from wtforms import BooleanField, SubmitField
class ParametrageClasseurPE(FlaskForm): class ParametrageClasseurPE(FlaskForm):
...@@ -61,5 +61,6 @@ class ParametrageClasseurPE(FlaskForm): ...@@ -61,5 +61,6 @@ class ParametrageClasseurPE(FlaskForm):
# default=False, # default=False,
# render_kw={"checked": ""}, # render_kw={"checked": ""},
) )
assiduite = BooleanField("Inclure les comptes d'absences non justifiées")
submit = SubmitField("Générer les classeurs poursuites d'études") submit = SubmitField("Générer les classeurs poursuites d'études")
cancel = SubmitField("Annuler", render_kw={"formnovalidate": True}) cancel = SubmitField("Annuler", render_kw={"formnovalidate": True})
...@@ -49,11 +49,13 @@ from app.comp.res_sem import load_formsemestre_results ...@@ -49,11 +49,13 @@ from app.comp.res_sem import load_formsemestre_results
class EtudiantsJuryPE: class EtudiantsJuryPE:
"""Classe centralisant la gestion des étudiants à prendre en compte dans un jury de PE""" """Classe centralisant la gestion des étudiants à prendre en compte dans un jury de PE"""
def __init__(self, annee_diplome: int): def __init__(self, annee_diplome: int, options: dict | None = None):
""" """
Args: Args:
annee_diplome: L'année de diplomation annee_diplome: L'année de diplomation
""" """
self.options = options or {}
"Options de configuration (cf. pe_sem_recap)"
self.annee_diplome = annee_diplome self.annee_diplome = annee_diplome
"""L'année du diplôme""" """L'année du diplôme"""
...@@ -388,6 +390,10 @@ class EtudiantsJuryPE: ...@@ -388,6 +390,10 @@ class EtudiantsJuryPE:
# Ajout des noms de semestres parcourus # Ajout des noms de semestres parcourus
etapes = etapes_du_cursus(formsemestres, nbre_semestres_max) etapes = etapes_du_cursus(formsemestres, nbre_semestres_max)
administratif[etudid] |= etapes administratif[etudid] |= etapes
if self.options["assiduite"]:
# Colonnes avec absences non jutifiées
abs_dict = absences_du_cursus(etudiant, formsemestres)
administratif[etudid] |= abs_dict
# Construction du dataframe # Construction du dataframe
df = pd.DataFrame.from_dict(administratif, orient="index") df = pd.DataFrame.from_dict(administratif, orient="index")
...@@ -586,9 +592,22 @@ def arret_de_formation(etud: Identite, cosemestres: dict[int, FormSemestre]) -> ...@@ -586,9 +592,22 @@ def arret_de_formation(etud: Identite, cosemestres: dict[int, FormSemestre]) ->
return est_demissionnaire return est_demissionnaire
def absences_du_cursus(
etud: Identite, semestres: dict[int, FormSemestre]
) -> dict[str, int]:
"""Ajoute les absences non just. de chaque formsemestre du cursus
de cet étudiant.
"""
abs_dict = {}
for i, formsemestre in enumerate(reversed(semestres.values()), start=1):
nbabsnj, nbabsjust, nbabs = formsemestre.get_abs_count(etud.id)
abs_dict[f"Etape {i+1}_ABS"] = nbabsnj
return abs_dict
def etapes_du_cursus( def etapes_du_cursus(
semestres: dict[int, FormSemestre], nbre_etapes_max: int semestres: dict[int, FormSemestre], nbre_etapes_max: int
) -> list[str]: ) -> dict[str, str]:
"""Partant d'un dictionnaire de semestres (qui retrace """Partant d'un dictionnaire de semestres (qui retrace
la scolarité d'un étudiant), liste les noms des la scolarité d'un étudiant), liste les noms des
semestres (en version abbrégée) semestres (en version abbrégée)
...@@ -598,15 +617,15 @@ def etapes_du_cursus( ...@@ -598,15 +617,15 @@ def etapes_du_cursus(
avec i variant jusqu'à nbre_semestres_max. (S'il n'y a pas de semestre à l'étape i, avec i variant jusqu'à nbre_semestres_max. (S'il n'y a pas de semestre à l'étape i,
le nom affiché est vide. le nom affiché est vide.
La fonction suppose la liste des semestres triées par ordre La fonction suppose la items du dict des semestres sont triés par ordre
décroissant de date. décroissant de date.
Args: Args:
semestres: une liste de ``FormSemestre`` semestres: un dict formsemestre_id : ``FormSemestre``
nbre_etapes_max: le nombre d'étapes max prise en compte nbre_etapes_max: le nombre d'étapes max prise en compte
Returns: Returns:
Une liste de nom de semestre (dans le même ordre que les ``semestres``) Une liste de noms de semestre (dans le même ordre que les ``semestres``)
See also: See also:
app.pe.pe_affichage.nom_semestre_etape app.pe.pe_affichage.nom_semestre_etape
...@@ -626,11 +645,12 @@ def nom_semestre_etape(semestre: FormSemestre, avec_fid=False) -> str: ...@@ -626,11 +645,12 @@ def nom_semestre_etape(semestre: FormSemestre, avec_fid=False) -> str:
"""Nom d'un semestre à afficher dans le descriptif des étapes de la scolarité """Nom d'un semestre à afficher dans le descriptif des étapes de la scolarité
d'un étudiant. d'un étudiant.
Par ex: Pour un S2, affiche ``"Semestre 2 FI S014-2015 (129)"`` avec : Par ex: Pour un S2, affiche ``"Semestre 2 FI S014-2015"`` avec :
* 2 le numéro du semestre, * 2 le numéro du semestre,
* FI la modalité, * FI la modalité,
* 2014-2015 les dates * 2014-2015 les dates
Si avec_fid, ajoute le fid du semestre (debug).
Args: Args:
semestre: Un ``FormSemestre`` semestre: Un ``FormSemestre``
......
...@@ -90,18 +90,20 @@ class JuryPE(object): ...@@ -90,18 +90,20 @@ class JuryPE(object):
diplome : l'année d'obtention du diplome BUT et du jury de PE (généralement février XXXX) diplome : l'année d'obtention du diplome BUT et du jury de PE (généralement février XXXX)
""" """
def __init__( _default_options = {
self,
diplome: int,
formsemestre_id_base,
options={
"moyennes_tags": True, "moyennes_tags": True,
"moyennes_ue_res_sae": True, "moyennes_ue_res_sae": True,
"moyennes_ues_rcues": True, "moyennes_ues_rcues": True,
"min_max_moy": False, "min_max_moy": False,
"publipostage": False, "publipostage": False,
}, "assiduite": False,
): }
def __init__(self, diplome: int, formsemestre_id_base, options: dict | None = None):
options = options or {}
for k, y in self._default_options.items():
if k not in options:
options[k] = v
pe_affichage.pe_start_log() pe_affichage.pe_start_log()
self.diplome = diplome self.diplome = diplome
"L'année du diplome" "L'année du diplome"
...@@ -123,21 +125,22 @@ class JuryPE(object): ...@@ -123,21 +125,22 @@ class JuryPE(object):
pe_affichage.pe_print("Options", info=True) pe_affichage.pe_print("Options", info=True)
for cle, val in self.options.items(): for cle, val in self.options.items():
if cle != "csrf_token":
pe_affichage.pe_print(f" > {cle} -> {val}", info=True) pe_affichage.pe_print(f" > {cle} -> {val}", info=True)
# Chargement des étudiants à prendre en compte dans le jury # Chargement des étudiants à prendre en compte dans le jury
pe_affichage.pe_print( pe_affichage.pe_print(
f"""***********************************************************""" """***********************************************************"""
) )
pe_affichage.pe_print( pe_affichage.pe_print(
f"""*** Recherche des étudiants diplômés 🎓 en {self.diplome}""", info=True f"""*** Recherche des étudiants diplômés 🎓 en {self.diplome}""", info=True
) )
pe_affichage.pe_print( pe_affichage.pe_print(
f"""***********************************************************""" """***********************************************************"""
) )
# Les infos sur les étudiants # Les infos sur les étudiants
self.etudiants = pe_etudiant.EtudiantsJuryPE(self.diplome) self.etudiants = pe_etudiant.EtudiantsJuryPE(self.diplome, self.options)
"""Les informations sur les étudiants du jury PE""" """Les informations sur les étudiants du jury PE"""
self.etudiants.find_etudiants() self.etudiants.find_etudiants()
self.diplomes_ids = self.etudiants.diplomes_ids self.diplomes_ids = self.etudiants.diplomes_ids
......
...@@ -90,6 +90,7 @@ def pe_view_sem_recap(formsemestre_id: int): ...@@ -90,6 +90,7 @@ def pe_view_sem_recap(formsemestre_id: int):
sco=ScoData(formsemestre=formsemestre), sco=ScoData(formsemestre=formsemestre),
cosemestres=affichage_cosemestres_tries, cosemestres=affichage_cosemestres_tries,
rangs_tries=sorted(affichage_cosemestres_tries.keys()), rangs_tries=sorted(affichage_cosemestres_tries.keys()),
title="Avis de poursuite d'étude",
) )
# request.method == "POST" # request.method == "POST"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment