Update opolka/ScoDoc from ScoDoc/ScoDoc #2

Merged
opolka merged 1272 commits from ScoDoc/ScoDoc:master into master 2024-05-27 09:11:04 +02:00
Showing only changes of commit 5446ac0ed2 - Show all commits

View File

@ -38,27 +38,24 @@ Created on 17/01/2024
import pandas as pd
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
class EtudiantsJuryPE:
"""Classe centralisant la gestion des étudiants à prendre en compte dans un jury de PE"""
def __init__(self, annee_diplome: int):
"""
Classe centralisant la gestion des étudiants à prendre en compte dans un jury de PE
Args:
annee_diplome: L'année de diplomation
"""
self.annee_diplome = annee_diplome
"""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"
self.cursus = {}
self.cursus: dict[int, dict] = {}
"Les cursus (semestres suivis, abandons) des étudiants"
self.trajectoires = {}
@ -67,15 +64,17 @@ class EtudiantsJuryPE:
(par ex: 3S=S1+S2+S3 à prendre en compte avec d'éventuels redoublements)"""
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 = {}
"""Les etudids des étudiants diplômés"""
self.etudiants_ids = {}
"""Les etudids des étudiants dont il faut calculer les moyennes/classements (même si d'éventuels abandons).
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)"""
"""Les etudids des étudiants dont il faut calculer les moyennes/classements
(même si d'éventuels abandons).
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
"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")
self.etudiants_ids = get_etudiants_dans_semestres(cosemestres)
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
# avec prise en compte des redoublements, des abandons, ....
pe_affichage.pe_print("3) Analyse des parcours individuels des étudiants")
no_etud = 0
for no_etud, etudid in enumerate(self.etudiants_ids):
identite = Identite.get_etud(etudid)
self.identites[etudid] = identite
"""identités des étudiants"""
for etudid in self.etudiants_ids:
self.identites[etudid] = Identite.get_etud(etudid)
# Analyse son cursus
self.analyse_etat_etudiant(etudid, cosemestres)
@ -131,7 +127,6 @@ class EtudiantsJuryPE:
self.diplomes_ids = set(self.etudiants_diplomes.keys())
self.etudiants_ids = set(self.identites.keys())
"""Les étudiants dont il faut calculer les moyennes"""
self.formsemestres_jury_ids = self.get_formsemestres()
"""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)])
# )
def get_etudiants_diplomes(self) -> dict[int, Identite]:
"""Identités des étudiants (sous forme d'un dictionnaire `{etudid: Identite(etudid)}`
qui vont être à traiter au jury PE pour
@ -175,9 +168,9 @@ class EtudiantsJuryPE:
"""
etudids = [
etudid
for etudid in self.cursus
if self.cursus[etudid]["diplome"] == self.annee_diplome
and self.cursus[etudid]["abandon"] is False
for etudid, cursus_etud in self.cursus.items()
if cursus_etud["diplome"] == self.annee_diplome
and cursus_etud["abandon"] is False
]
etudiants = {etudid: self.identites[etudid] for etudid in etudids}
return etudiants
@ -192,9 +185,9 @@ class EtudiantsJuryPE:
"""
etudids = [
etudid
for etudid in self.cursus
if self.cursus[etudid]["diplome"] != self.annee_diplome
or self.cursus[etudid]["abandon"] is True
for etudid, cursus_etud in self.cursus.items()
if cursus_etud["diplome"] != self.annee_diplome
or cursus_etud["abandon"] is True
]
etudiants = {etudid: self.identites[etudid] for etudid in etudids}
return etudiants
@ -224,9 +217,9 @@ class EtudiantsJuryPE:
formsemestres = identite.get_formsemestres()
semestres_etudiant = {
frmsem.formsemestre_id: frmsem
for frmsem in formsemestres
if frmsem.formation.is_apc()
formsemestre.formsemestre_id: formsemestre
for formsemestre in formsemestres
if formsemestre.formation.is_apc()
}
self.cursus[etudid] = {
@ -282,11 +275,12 @@ class EtudiantsJuryPE:
# Tri des semestres par numéro de semestre
for nom_sem in pe_comp.TOUS_LES_SEMESTRES:
i = int(nom_sem[1]) # le n° du semestre
# les semestres de n°i de l'étudiant:
semestres_i = {
fid: semestres_significatifs[fid]
for fid in semestres_significatifs
if semestres_significatifs[fid].semestre_id == i
} # les semestres de n°i de l'étudiant
fid: sem_sig
for fid, sem_sig in semestres_significatifs.items()
if sem_sig.semestre_id == i
}
self.cursus[etudid][nom_sem] = semestres_i
def get_trajectoire(
@ -323,7 +317,7 @@ class EtudiantsJuryPE:
int(sem[-1]) for sem in pe_comp.PARCOURS[nom_aggregat]["aggregat"]
]
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))
semestres_aggreges = {}
@ -380,23 +374,23 @@ class EtudiantsJuryPE:
* '3S', '4S' : pour obtenir les combinaisons de semestres définies par les aggrégats
Returns:
Un dictionnaire de la forme ``{fid: FormSemestre(fid)}``
Un dictionnaire de la forme `{fid: FormSemestre(fid)}`
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:
# Appel récursif pour obtenir tous les semestres (validants)
semestres = self.get_formsemestres(pe_comp.AGGREGAT_DIPLOMANT)
return semestres
elif isinstance(semestres_recherches, list):
if isinstance(semestres_recherches, list):
# Appel récursif sur tous les éléments de la liste
semestres = {}
for elmt in semestres_recherches:
semestres_elmt = self.get_formsemestres(elmt)
semestres = semestres | semestres_elmt
return semestres
elif (
if (
isinstance(semestres_recherches, str)
and semestres_recherches in pe_comp.TOUS_LES_AGGREGATS
):
@ -405,7 +399,7 @@ class EtudiantsJuryPE:
pe_comp.PARCOURS[semestres_recherches]["aggregat"]
)
return semestres
elif (
if (
isinstance(semestres_recherches, str)
and semestres_recherches in pe_comp.TOUS_LES_SEMESTRES
):
@ -418,8 +412,8 @@ class EtudiantsJuryPE:
if self.cursus[etudid][nom_sem]:
semestres = semestres | self.cursus[etudid][nom_sem]
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:
"""Partant d'un ensemble d'étudiants,
@ -433,8 +427,7 @@ class EtudiantsJuryPE:
nbres_semestres.append(self.cursus[etudid]["nb_semestres"])
if not nbres_semestres:
return 0
else:
return max(nbres_semestres)
return max(nbres_semestres)
def df_administratif(self, etudids: list[int]) -> pd.DataFrame:
"""Synthétise toutes les données administratives d'un groupe
@ -461,13 +454,16 @@ class EtudiantsJuryPE:
diplome = "indéterminé"
administratif[etudid] = {
"etudid": etudiant.id,
"INE": etudiant.code_ine or "",
"NIP": etudiant.code_nip or "",
"Nom": etudiant.nom,
"Prenom": etudiant.prenom,
"Civilite": etudiant.civilite_str,
"Age": pe_comp.calcul_age(etudiant.date_naissance),
"Date d'entree": cursus["entree"],
"Date de diplome": diplome,
"Nbre de semestres": len(formsemestres),
"Date entree": cursus["entree"],
"Date diplome": diplome,
"Nb semestres": len(formsemestres),
}
# Ajout des noms de semestres parcourus