From 3550e4290afb49dba90a5dc3c8d875034ea7f7a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9o=20BARAS=20=28IUT1=20Grenoble=29?= Date: Sat, 27 Jan 2024 07:24:52 +0100 Subject: [PATCH] =?UTF-8?q?Corrige=20les=20semestres=20pris=20en=20compte?= =?UTF-8?q?=20pour=20le=20calcul=20des=20moyennes=20d'aggr=C3=A9gat=20(bug?= =?UTF-8?q?=20QLIO=20UPHF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/pe/pe_etudiant.py | 22 ++++++++++++++++++---- app/pe/pe_jury.py | 39 ++++++++++++++++++++------------------- app/pe/pe_trajectoire.py | 25 ++++++++++++------------- 3 files changed, 50 insertions(+), 36 deletions(-) diff --git a/app/pe/pe_etudiant.py b/app/pe/pe_etudiant.py index 605f85cb..f901455c 100644 --- a/app/pe/pe_etudiant.py +++ b/app/pe/pe_etudiant.py @@ -259,10 +259,17 @@ class EtudiantsJuryPE: } # les semestres de n°i de l'étudiant self.cursus[etudid][nom_sem] = semestres_i - def get_trajectoire(self, etudid: int, formsemestre_final: FormSemestre): + def get_trajectoire(self, etudid: int, formsemestre_final: FormSemestre, nom_aggregat: str): """Ensemble des semestres parcourus par un étudiant pour l'amener à un semestre terminal. + Si nom_aggregat est de type "Si", limite les semestres à ceux de numéro i. + Par ex: si formsemestre_terminal est un S3 et nom_agrregat "S3", ne prend en compte que les + semestres 3. + + Si nom_aggregat est de type "iA" ou "iS" (incluant plusieurs numéros de semestres), prend en + compte les dit numéros de semestres. + Par ex: si formsemestre_terminal est un S3, ensemble des S1, S2, S3 suivi pour l'amener au S3 (il peut y avoir plusieurs S1, ou S2, ou S3 s'il a redoublé). @@ -277,12 +284,19 @@ class EtudiantsJuryPE: numero_semestre_terminal = formsemestre_final.semestre_id semestres_significatifs = self.get_semestres_significatifs(etudid) - # Semestres de n° inférieur (pax ex: des S1, S2, S3 pour un S3 terminal) - # et qui lui sont antérieurs + if nom_aggregat.startswith("S"): # les semestres + numero_semestres_possibles =[numero_semestre_terminal] + elif nom_aggregat.endswith("A"): # les années + numero_semestres_possibles = [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) + numero_semestres_possibles = list(range(1, numero_semestre_terminal+1)) + semestres_aggreges = {} for fid, semestre in semestres_significatifs.items(): + # Semestres parmi ceux de n° possibles & qui lui sont antérieurs if ( - semestre.semestre_id <= numero_semestre_terminal + semestre.semestre_id in numero_semestres_possibles and semestre.date_fin <= formsemestre_final.date_fin ): semestres_aggreges[fid] = semestre diff --git a/app/pe/pe_jury.py b/app/pe/pe_jury.py index 3d5f116c..bd46d8c8 100644 --- a/app/pe/pe_jury.py +++ b/app/pe/pe_jury.py @@ -318,29 +318,35 @@ class JuryPE(object): } for aggregat in aggregats: - """La trajectoire de l'étudiant sur l'aggrégat""" + # La trajectoire de l'étudiant sur l'aggrégat trajectoire = self.trajectoires.suivi[etudid][aggregat] - """Les moyennes par tag de cette trajectoire""" + + # Les moyennes par tag de cette trajectoire + donnees[etudid] |= { + f"{aggregat} notes ": "-", + f"{aggregat} class. (groupe)": "-", + f"{aggregat} min/moy/max (groupe)": "-", + } if trajectoire: trajectoire_tagguee = self.trajectoires_tagguees[ trajectoire.trajectoire_id ] - bilan = trajectoire_tagguee.moyennes_tags[tag] + if tag in trajectoire_tagguee.moyennes_tags: + bilan = trajectoire_tagguee.moyennes_tags[tag] + + donnees[etudid] |= { + f"{aggregat} notes ": round(bilan['notes'].loc[etudid], 2), + f"{aggregat} class. (groupe)": f"{bilan['classements'].loc[etudid]}/{bilan['nb_inscrits']}", + f"{aggregat} min/moy/max (groupe)": f"{bilan['min']:.1f}/{bilan['moy']:.1f}/{bilan['max']:.1f}", + } - donnees[etudid] |= { - f"{aggregat} notes ": f"{bilan['notes'].loc[etudid]:.1f}", - f"{aggregat} class. (groupe)": f"{bilan['classements'].loc[etudid]}/{bilan['nb_inscrits']}", - f"{aggregat} min/moy/max (groupe)": f"{bilan['min']:.1f}/{bilan['moy']:.1f}/{bilan['max']:.1f}", - } - else: - donnees[etudid] |= { - f"{aggregat} notes ": "-", - f"{aggregat} class. (groupe)": "-", - f"{aggregat} min/moy/max (groupe)": "-", - } """L'interclassement""" interclass = self.interclassements_taggues[aggregat] + donnees[etudid] |= { + f"{aggregat} class. (promo)": "-", + f"{aggregat} min/moy/max (promo)": "-", + } if tag in interclass.moyennes_tags: bilan = interclass.moyennes_tags[tag] @@ -348,11 +354,6 @@ class JuryPE(object): f"{aggregat} class. (promo)": f"{bilan['classements'].loc[etudid]}/{bilan['nb_inscrits']}", f"{aggregat} min/moy/max (promo)": f"{bilan['min']:.1f}/{bilan['moy']:.1f}/{bilan['max']:.1f}", } - else: - donnees[etudid] |= { - f"{aggregat} class. (promo)": "-", - f"{aggregat} min/moy/max (promo)": "-", - } # Fin de l'aggrégat # Construction du dataFrame diff --git a/app/pe/pe_trajectoire.py b/app/pe/pe_trajectoire.py index d4fa6c9d..01b32090 100644 --- a/app/pe/pe_trajectoire.py +++ b/app/pe/pe_trajectoire.py @@ -36,8 +36,7 @@ class Trajectoire: """Les semestres à aggréger""" self.semestres_aggreges = {} - - def add_semestres_a_aggreger(self, semestres: dict[int: FormSemestre]): + def add_semestres_a_aggreger(self, semestres: dict[int:FormSemestre]): """Ajoute des semestres au semestre à aggréger Args: @@ -45,8 +44,6 @@ class Trajectoire: """ self.semestres_aggreges = self.semestres_aggreges | semestres - - def get_repr(self): """Représentation textuelle d'une trajectoire basée sur ses semestres aggrégés""" @@ -72,11 +69,10 @@ class TrajectoiresJuryPE: self.annee_diplome = annee_diplome """Toutes les trajectoires possibles""" - self.trajectoires: dict[tuple: Trajectoire] = {} + self.trajectoires: dict[tuple:Trajectoire] = {} """Quelle trajectoires pour quel étudiant : dictionnaire {etudid: {nom_aggregat: Trajectoire}}""" - self.suivi: dict[int: str] = {} - + self.suivi: dict[int:str] = {} def cree_trajectoires(self, etudiants: EtudiantsJuryPE): """Créé toutes les trajectoires, au regard du cursus des étudiants @@ -84,15 +80,17 @@ class TrajectoiresJuryPE: """ for nom_aggregat in pe_comp.TOUS_LES_SEMESTRES + pe_comp.TOUS_LES_AGGREGATS: - """L'aggrégat considéré (par ex: 3S=S1+S2+S3), son nom de son semestre terminal (par ex: S3) et son numéro (par ex: 3)""" noms_semestre_de_aggregat = pe_comp.PARCOURS[nom_aggregat]["aggregat"] nom_semestre_terminal = noms_semestre_de_aggregat[-1] for etudid in etudiants.cursus: if etudid not in self.suivi: - self.suivi[etudid] = {aggregat: None - for aggregat in pe_comp.TOUS_LES_SEMESTRES + pe_comp.TOUS_LES_AGGREGATS} + self.suivi[etudid] = { + aggregat: None + for aggregat in pe_comp.TOUS_LES_SEMESTRES + + pe_comp.TOUS_LES_AGGREGATS + } """Le formsemestre terminal (dernier en date) associé au semestre marquant la fin de l'aggrégat @@ -111,7 +109,9 @@ class TrajectoiresJuryPE: """La liste des semestres de l'étudiant à prendre en compte pour cette trajectoire""" - semestres_a_aggreger = etudiants.get_trajectoire(etudid, formsemestre_final) + semestres_a_aggreger = etudiants.get_trajectoire( + etudid, formsemestre_final, nom_aggregat + ) """Ajout des semestres à la trajectoire""" trajectoire.add_semestres_a_aggreger(semestres_a_aggreger) @@ -138,7 +138,7 @@ def get_trajectoires_etudid(trajectoires, etudid): liste.append(trajet.trajectoire_id) return liste - + def get_semestres_a_aggreger(self, aggregat: str, formsemestre_id_terminal: int): """Pour un nom d'aggrégat donné (par ex: 'S3') et un semestre terminal cible identifié par son formsemestre_id (par ex: 'S3 2022-2023'), @@ -162,4 +162,3 @@ def get_semestres_a_aggreger(self, aggregat: str, formsemestre_id_terminal: int) formsemestres_etudiant = cursus_etudiant[formsemestre_id_terminal] formsemestres = formsemestres | formsemestres_etudiant return formsemestres -