PE: ajout coloness etudid, INE, NIP + some code cleaning

This commit is contained in:
Emmanuel Viennet 2024-01-30 11:02:28 +01:00
parent 1f6f3620a2
commit 5446ac0ed2

View File

@ -38,27 +38,24 @@ Created on 17/01/2024
import pandas as pd import pandas as pd
from app.models import FormSemestre, Identite from app.models import FormSemestre, Identite
import app.pe.pe_affichage as pe_affichage
import app.pe.pe_comp as pe_comp
from app.pe import pe_comp, pe_affichage from app.pe import pe_comp, pe_affichage
class EtudiantsJuryPE: class EtudiantsJuryPE:
"""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):
""" """
Classe centralisant la gestion des étudiants à prendre en compte dans un jury de PE
Args: Args:
annee_diplome: L'année de diplomation annee_diplome: L'année de diplomation
""" """
self.annee_diplome = annee_diplome self.annee_diplome = annee_diplome
"""L'année du diplôme""" """L'année du diplôme"""
self.identites = {} # ex. ETUDINFO_DICT self.identites: dict[int, Identite] = {} # ex. ETUDINFO_DICT
"Les identités des étudiants traités pour le jury" "Les identités des étudiants traités pour le jury"
self.cursus = {} self.cursus: dict[int, dict] = {}
"Les cursus (semestres suivis, abandons) des étudiants" "Les cursus (semestres suivis, abandons) des étudiants"
self.trajectoires = {} self.trajectoires = {}
@ -67,15 +64,17 @@ class EtudiantsJuryPE:
(par ex: 3S=S1+S2+S3 à prendre en compte avec d'éventuels redoublements)""" (par ex: 3S=S1+S2+S3 à prendre en compte avec d'éventuels redoublements)"""
self.etudiants_diplomes = {} self.etudiants_diplomes = {}
"""Les identités des étudiants à considérer au jury (ceux qui seront effectivement diplômés)""" """Les identités des étudiants à considérer au jury (ceux qui seront effectivement
diplômés)"""
self.diplomes_ids = {} self.diplomes_ids = {}
"""Les etudids des étudiants diplômés""" """Les etudids des étudiants diplômés"""
self.etudiants_ids = {} self.etudiants_ids = {}
"""Les etudids des étudiants dont il faut calculer les moyennes/classements (même si d'éventuels abandons). """Les etudids des étudiants dont il faut calculer les moyennes/classements
Il s'agit des étudiants inscrits dans les co-semestres (ceux du jury mais aussi d'autres ayant (même si d'éventuels abandons).
été réorientés ou ayant abandonnés)""" Il s'agit des étudiants inscrits dans les co-semestres (ceux du jury mais aussi
d'autres ayant été réorientés ou ayant abandonnés)"""
self.cosemestres: dict[int, FormSemestre] = None self.cosemestres: dict[int, FormSemestre] = None
"Les cosemestres donnant lieu à même année de diplome" "Les cosemestres donnant lieu à même année de diplome"
@ -107,18 +106,15 @@ class EtudiantsJuryPE:
pe_affichage.pe_print("2) Liste des étudiants dans les différents co-semestres") pe_affichage.pe_print("2) Liste des étudiants dans les différents co-semestres")
self.etudiants_ids = get_etudiants_dans_semestres(cosemestres) self.etudiants_ids = get_etudiants_dans_semestres(cosemestres)
pe_affichage.pe_print( pe_affichage.pe_print(
" => %d étudiants trouvés dans les cosemestres" % len(self.etudiants_ids) f" => {len(self.etudiants_ids)} étudiants trouvés dans les cosemestres"
) )
# Analyse des parcours étudiants pour déterminer leur année effective de diplome # Analyse des parcours étudiants pour déterminer leur année effective de diplome
# avec prise en compte des redoublements, des abandons, .... # avec prise en compte des redoublements, des abandons, ....
pe_affichage.pe_print("3) Analyse des parcours individuels des étudiants") pe_affichage.pe_print("3) Analyse des parcours individuels des étudiants")
no_etud = 0 for etudid in self.etudiants_ids:
for no_etud, etudid in enumerate(self.etudiants_ids): self.identites[etudid] = Identite.get_etud(etudid)
identite = Identite.get_etud(etudid)
self.identites[etudid] = identite
"""identités des étudiants"""
# Analyse son cursus # Analyse son cursus
self.analyse_etat_etudiant(etudid, cosemestres) self.analyse_etat_etudiant(etudid, cosemestres)
@ -131,7 +127,6 @@ class EtudiantsJuryPE:
self.diplomes_ids = set(self.etudiants_diplomes.keys()) self.diplomes_ids = set(self.etudiants_diplomes.keys())
self.etudiants_ids = set(self.identites.keys()) self.etudiants_ids = set(self.identites.keys())
"""Les étudiants dont il faut calculer les moyennes"""
self.formsemestres_jury_ids = self.get_formsemestres() self.formsemestres_jury_ids = self.get_formsemestres()
"""Les formsemestres (des étudiants) dont il faut calculer les moyennes""" """Les formsemestres (des étudiants) dont il faut calculer les moyennes"""
@ -162,8 +157,6 @@ class EtudiantsJuryPE:
# + ", ".join([str(fid) for fid in list(self.formsemestres_jury_ids)]) # + ", ".join([str(fid) for fid in list(self.formsemestres_jury_ids)])
# ) # )
def get_etudiants_diplomes(self) -> dict[int, Identite]: def get_etudiants_diplomes(self) -> dict[int, Identite]:
"""Identités des étudiants (sous forme d'un dictionnaire `{etudid: Identite(etudid)}` """Identités des étudiants (sous forme d'un dictionnaire `{etudid: Identite(etudid)}`
qui vont être à traiter au jury PE pour qui vont être à traiter au jury PE pour
@ -175,9 +168,9 @@ class EtudiantsJuryPE:
""" """
etudids = [ etudids = [
etudid etudid
for etudid in self.cursus for etudid, cursus_etud in self.cursus.items()
if self.cursus[etudid]["diplome"] == self.annee_diplome if cursus_etud["diplome"] == self.annee_diplome
and self.cursus[etudid]["abandon"] is False and cursus_etud["abandon"] is False
] ]
etudiants = {etudid: self.identites[etudid] for etudid in etudids} etudiants = {etudid: self.identites[etudid] for etudid in etudids}
return etudiants return etudiants
@ -192,9 +185,9 @@ class EtudiantsJuryPE:
""" """
etudids = [ etudids = [
etudid etudid
for etudid in self.cursus for etudid, cursus_etud in self.cursus.items()
if self.cursus[etudid]["diplome"] != self.annee_diplome if cursus_etud["diplome"] != self.annee_diplome
or self.cursus[etudid]["abandon"] is True or cursus_etud["abandon"] is True
] ]
etudiants = {etudid: self.identites[etudid] for etudid in etudids} etudiants = {etudid: self.identites[etudid] for etudid in etudids}
return etudiants return etudiants
@ -224,9 +217,9 @@ class EtudiantsJuryPE:
formsemestres = identite.get_formsemestres() formsemestres = identite.get_formsemestres()
semestres_etudiant = { semestres_etudiant = {
frmsem.formsemestre_id: frmsem formsemestre.formsemestre_id: formsemestre
for frmsem in formsemestres for formsemestre in formsemestres
if frmsem.formation.is_apc() if formsemestre.formation.is_apc()
} }
self.cursus[etudid] = { self.cursus[etudid] = {
@ -282,11 +275,12 @@ class EtudiantsJuryPE:
# Tri des semestres par numéro de semestre # Tri des semestres par numéro de semestre
for nom_sem in pe_comp.TOUS_LES_SEMESTRES: for nom_sem in pe_comp.TOUS_LES_SEMESTRES:
i = int(nom_sem[1]) # le n° du semestre i = int(nom_sem[1]) # le n° du semestre
# les semestres de n°i de l'étudiant:
semestres_i = { semestres_i = {
fid: semestres_significatifs[fid] fid: sem_sig
for fid in semestres_significatifs for fid, sem_sig in semestres_significatifs.items()
if semestres_significatifs[fid].semestre_id == i if sem_sig.semestre_id == i
} # les semestres de n°i de l'étudiant }
self.cursus[etudid][nom_sem] = semestres_i self.cursus[etudid][nom_sem] = semestres_i
def get_trajectoire( def get_trajectoire(
@ -323,7 +317,7 @@ class EtudiantsJuryPE:
int(sem[-1]) for sem in pe_comp.PARCOURS[nom_aggregat]["aggregat"] int(sem[-1]) for sem in pe_comp.PARCOURS[nom_aggregat]["aggregat"]
] ]
assert numero_semestre_terminal in numero_semestres_possibles assert numero_semestre_terminal in numero_semestres_possibles
else: # les xS = tous les semestres jusqu'à Sx (pax ex: des S1, S2, S3 pour un S3 terminal) else: # les xS = tous les semestres jusqu'à Sx (eg S1, S2, S3 pour un S3 terminal)
numero_semestres_possibles = list(range(1, numero_semestre_terminal + 1)) numero_semestres_possibles = list(range(1, numero_semestre_terminal + 1))
semestres_aggreges = {} semestres_aggreges = {}
@ -380,23 +374,23 @@ class EtudiantsJuryPE:
* '3S', '4S' : pour obtenir les combinaisons de semestres définies par les aggrégats * '3S', '4S' : pour obtenir les combinaisons de semestres définies par les aggrégats
Returns: Returns:
Un dictionnaire de la forme ``{fid: FormSemestre(fid)}`` Un dictionnaire de la forme `{fid: FormSemestre(fid)}`
Remarque: Remarque:
Une liste de la forme ``[ 'Si', 'iA' , ... ]`` (combinant les formats précédents) est possible. Une liste de la forme `[ 'Si', 'iA' , ... ]` (combinant les formats précédents) est possible.
""" """
if semestres_recherches is None: if semestres_recherches is None:
# Appel récursif pour obtenir tous les semestres (validants) # Appel récursif pour obtenir tous les semestres (validants)
semestres = self.get_formsemestres(pe_comp.AGGREGAT_DIPLOMANT) semestres = self.get_formsemestres(pe_comp.AGGREGAT_DIPLOMANT)
return semestres return semestres
elif isinstance(semestres_recherches, list): if isinstance(semestres_recherches, list):
# Appel récursif sur tous les éléments de la liste # Appel récursif sur tous les éléments de la liste
semestres = {} semestres = {}
for elmt in semestres_recherches: for elmt in semestres_recherches:
semestres_elmt = self.get_formsemestres(elmt) semestres_elmt = self.get_formsemestres(elmt)
semestres = semestres | semestres_elmt semestres = semestres | semestres_elmt
return semestres return semestres
elif ( if (
isinstance(semestres_recherches, str) isinstance(semestres_recherches, str)
and semestres_recherches in pe_comp.TOUS_LES_AGGREGATS and semestres_recherches in pe_comp.TOUS_LES_AGGREGATS
): ):
@ -405,7 +399,7 @@ class EtudiantsJuryPE:
pe_comp.PARCOURS[semestres_recherches]["aggregat"] pe_comp.PARCOURS[semestres_recherches]["aggregat"]
) )
return semestres return semestres
elif ( if (
isinstance(semestres_recherches, str) isinstance(semestres_recherches, str)
and semestres_recherches in pe_comp.TOUS_LES_SEMESTRES and semestres_recherches in pe_comp.TOUS_LES_SEMESTRES
): ):
@ -418,8 +412,8 @@ class EtudiantsJuryPE:
if self.cursus[etudid][nom_sem]: if self.cursus[etudid][nom_sem]:
semestres = semestres | self.cursus[etudid][nom_sem] semestres = semestres | self.cursus[etudid][nom_sem]
return semestres return semestres
else:
raise ValueError("Probleme de paramètres d'appel dans get_formsemestreids") raise ValueError("Probleme de paramètres d'appel dans get_formsemestreids")
def nbre_etapes_max_diplomes(self, etudids: list[int]) -> int: def nbre_etapes_max_diplomes(self, etudids: list[int]) -> int:
"""Partant d'un ensemble d'étudiants, """Partant d'un ensemble d'étudiants,
@ -433,8 +427,7 @@ class EtudiantsJuryPE:
nbres_semestres.append(self.cursus[etudid]["nb_semestres"]) nbres_semestres.append(self.cursus[etudid]["nb_semestres"])
if not nbres_semestres: if not nbres_semestres:
return 0 return 0
else: return max(nbres_semestres)
return max(nbres_semestres)
def df_administratif(self, etudids: list[int]) -> pd.DataFrame: def df_administratif(self, etudids: list[int]) -> pd.DataFrame:
"""Synthétise toutes les données administratives d'un groupe """Synthétise toutes les données administratives d'un groupe
@ -461,13 +454,16 @@ class EtudiantsJuryPE:
diplome = "indéterminé" diplome = "indéterminé"
administratif[etudid] = { administratif[etudid] = {
"etudid": etudiant.id,
"INE": etudiant.code_ine or "",
"NIP": etudiant.code_nip or "",
"Nom": etudiant.nom, "Nom": etudiant.nom,
"Prenom": etudiant.prenom, "Prenom": etudiant.prenom,
"Civilite": etudiant.civilite_str, "Civilite": etudiant.civilite_str,
"Age": pe_comp.calcul_age(etudiant.date_naissance), "Age": pe_comp.calcul_age(etudiant.date_naissance),
"Date d'entree": cursus["entree"], "Date entree": cursus["entree"],
"Date de diplome": diplome, "Date diplome": diplome,
"Nbre de semestres": len(formsemestres), "Nb semestres": len(formsemestres),
} }
# Ajout des noms de semestres parcourus # Ajout des noms de semestres parcourus