From 66fbb0afbcd4a494ce4ec70f13068293acf985a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9o=20BARAS=20=28IUT1=20Grenoble=29?= Date: Fri, 2 Feb 2024 06:11:21 +0100 Subject: [PATCH] =?UTF-8?q?Export=20Excel=20:=20Am=C3=A9liore=20les=20ent?= =?UTF-8?q?=C3=AAtes=20des=20colonnes=20+=20supprime=20l'affichage=20des?= =?UTF-8?q?=20classements=20des=20=C3=A9tudiants=20sans=20note?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/pe/pe_affichage.py | 2 ++ app/pe/pe_comp.py | 52 ++++++++--------------------- app/pe/pe_jury.py | 75 +++++++++++++++++++----------------------- app/pe/pe_tabletags.py | 35 ++++++++++++++++++-- 4 files changed, 82 insertions(+), 82 deletions(-) diff --git a/app/pe/pe_affichage.py b/app/pe/pe_affichage.py index e66934f4..4bb2b33d 100644 --- a/app/pe/pe_affichage.py +++ b/app/pe/pe_affichage.py @@ -12,6 +12,8 @@ if not PE_DEBUG: else: pe_print = print # print function +# Affichage dans le tableur pe en cas d'absence de notes +SANS_NOTE = "-" def nom_semestre_etape(semestre: FormSemestre, avec_fid=False) -> str: """Nom d'un semestre à afficher dans le descriptif des étapes de la scolarité diff --git a/app/pe/pe_comp.py b/app/pe/pe_comp.py index 8a2a8171..8b1f8985 100644 --- a/app/pe/pe_comp.py +++ b/app/pe/pe_comp.py @@ -75,81 +75,55 @@ TODO:: A améliorer si BUT en moins de 6 semestres PARCOURS = { "S1": { "aggregat": ["S1"], - "ordre": 1, - "affichage_court": "S1", - "affichage_long": "Semestre 1", + "descr": "Semestre 1 (S1)", }, "S2": { "aggregat": ["S2"], - "ordre": 2, - "affichage_court": "S2", - "affichage_long": "Semestre 2", + "descr": "Semestre 2 (S2)", }, "1A": { "aggregat": ["S1", "S2"], - "ordre": 3, - "affichage_court": "1A", - "affichage_long": "1ère année", + "descr": "BUT1 (S1+S2)", }, "S3": { "aggregat": ["S3"], - "ordre": 4, - "affichage_court": "S3", - "affichage_long": "Semestre 3", + "descr": "Semestre 3 (S3)", }, "S4": { "aggregat": ["S4"], - "ordre": 5, - "affichage_court": "S4", - "affichage_long": "Semestre 4", + "descr": "Semestre 4 (S4)", }, "2A": { "aggregat": ["S3", "S4"], - "ordre": 6, - "affichage_court": "2A", - "affichage_long": "2ème année", + "descr": "BUT2 (S3+S4)", }, "3S": { "aggregat": ["S1", "S2", "S3"], - "ordre": 7, - "affichage_court": "S1+S2+S3", - "affichage_long": "BUT du semestre 1 au semestre 3", + "descr": "Moyenne du semestre 1 au semestre 3 (S1+S2+S3)", }, "4S": { "aggregat": ["S1", "S2", "S3", "S4"], - "ordre": 8, - "affichage_court": "BUT", - "affichage_long": "BUT du semestre 1 au semestre 4", + "descr": "Moyenne du semestre 1 au semestre 4 (S1+S2+S3+S4)", }, "S5": { "aggregat": ["S5"], - "ordre": 9, - "affichage_court": "S5", - "affichage_long": "Semestre 5", + "descr": "Semestre 5 (S5)", }, "S6": { "aggregat": ["S6"], - "ordre": 10, - "affichage_court": "S6", - "affichage_long": "Semestre 6", + "descr": "Semestre 6 (S6)", }, "3A": { "aggregat": ["S5", "S6"], - "ordre": 11, - "affichage_court": "3A", - "affichage_long": "3ème année", + "descr": "3ème année (S5+S6)", }, "5S": { "aggregat": ["S1", "S2", "S3", "S4", "S5"], - "ordre": 12, - "affichage_court": "S1+S2+S3+S4+S5", - "affichage_long": "BUT du semestre 1 au semestre 5", + "descr": "Moyenne du semestre 1 au semestre 5 (S1+S2+S3+S4+S5)", }, "6S": { "aggregat": ["S1", "S2", "S3", "S4", "S5", "S6"], - "ordre": 13, - "affichage_court": "BUT", - "affichage_long": "BUT (tout semestre inclus)", + "descr": "Moyenne globale BUT (S1+S2+S3+S4+S5+S6)", }, } NBRE_SEMESTRES_DIPLOMANT = 6 diff --git a/app/pe/pe_jury.py b/app/pe/pe_jury.py index dca92de3..0d9d2c82 100644 --- a/app/pe/pe_jury.py +++ b/app/pe/pe_jury.py @@ -46,6 +46,9 @@ import io import os from zipfile import ZipFile +import numpy as np + +from app.pe.pe_tabletags import TableTag from app.scodoc.gen_tables import SeqGenTable from app.pe.pe_etudiant import EtudiantsJuryPE from app.pe.pe_trajectoire import TrajectoiresJuryPE, Trajectoire @@ -332,13 +335,18 @@ class JuryPE(object): # La trajectoire de l'étudiant sur l'aggrégat trajectoire = self.trajectoires.suivi[etudid][aggregat] + # La note de l'étudiant (chargement à venir) + note = np.nan + + # L'affichage de l'aggrégat dans le tableur excel + descr = pe_comp.PARCOURS[aggregat]["descr"] # Les moyennes par tag de cette trajectoire donnees[etudid] |= { - (aggregat, "", "notes"): "-", - (aggregat, "groupe", "class."): "-", - (aggregat, "groupe", "min"): "-", - (aggregat, "groupe", "moy"): "-", - (aggregat, "groupe", "max"): "-", + (descr, "", "note"): pe_affichage.SANS_NOTE, + (descr, "statistique du groupe", "class."): pe_affichage.SANS_NOTE, + (descr, "statistique du groupe", "min"): pe_affichage.SANS_NOTE, + (descr, "statistique du groupe", "moy"): pe_affichage.SANS_NOTE, + (descr, "statistique du groupe", "max"): pe_affichage.SANS_NOTE, } if trajectoire: trajectoire_tagguee = self.trajectoires_tagguees[ @@ -346,50 +354,34 @@ class JuryPE(object): ] if tag in trajectoire_tagguee.moyennes_tags: bilan = trajectoire_tagguee.moyennes_tags[tag] - - donnees[etudid] |= { - (aggregat, "", "notes"): round( - bilan["notes"].loc[etudid], 2 - ), - ( - aggregat, - "groupe", - "class", - ): f"{bilan['classements'].loc[etudid]}/{bilan['nb_inscrits']}", - (aggregat, "groupe", "min"): round( - bilan["min"], 2 - ), - (aggregat, "groupe", "moy"): round( - bilan["moy"], 2 - ), - (aggregat, "groupe", "max"): round( - bilan["max"], 2 - ) - } + note = TableTag.get_note_for_df(bilan, etudid) + if note != np.nan: + donnees[etudid] |= { + (descr, "", "note"): note, + (descr, "statistique du groupe", "class."): TableTag.get_class_for_df(bilan, etudid), + (descr, "statistique du groupe", "min"): TableTag.get_min_for_df(bilan), + (descr, "statistique du groupe", "moy"): TableTag.get_moy_for_df(bilan), + (descr, "statistique du groupe", "max"): TableTag.get_max_for_df(bilan) + } """L'interclassement""" interclass = self.interclassements_taggues[aggregat] donnees[etudid] |= { - (aggregat, f"promotion {self.diplome}", "class."): "-", - (aggregat, f"promotion {self.diplome}", "min"): "-", - (aggregat, f"promotion {self.diplome}", "moy"): "-", - (aggregat, f"promotion {self.diplome}", "max"): "-", + (descr, f"statistique de la promotion {self.diplome}", "class."): pe_affichage.SANS_NOTE, + (descr, f"statistique de la promotion {self.diplome}", "min"): pe_affichage.SANS_NOTE, + (descr, f"statistique de la promotion {self.diplome}", "moy"): pe_affichage.SANS_NOTE, + (descr, f"statistique de la promotion {self.diplome}", "max"): pe_affichage.SANS_NOTE, } if tag in interclass.moyennes_tags: bilan = interclass.moyennes_tags[tag] - donnees[etudid] |= { - (aggregat, f"promotion {self.diplome}", "class."): f"{bilan['classements'].loc[etudid]}/{bilan['nb_inscrits']}", - (aggregat, f"promotion {self.diplome}", "min"): round( - bilan["min"], 2 - ), - (aggregat, f"promotion {self.diplome}", "moy"): round( - bilan["moy"], 2 - ), - (aggregat, f"promotion {self.diplome}", "max"): round( - bilan["max"], 2 - ) - } + if note != np.nan: + donnees[etudid] |= { + (descr, f"statistique de la promotion {self.diplome}", "class."): TableTag.get_class_for_df(bilan, etudid), + (descr, f"statistique de la promotion {self.diplome}", "min"): TableTag.get_min_for_df(bilan), + (descr, f"statistique de la promotion {self.diplome}", "moy"): TableTag.get_moy_for_df(bilan), + (descr, f"statistique de la promotion {self.diplome}", "max"): TableTag.get_max_for_df(bilan) + } # Fin de l'aggrégat # Construction du dataFrame @@ -492,3 +484,4 @@ def compute_interclassements( ) aggregats_interclasses_taggues[nom_aggregat] = interclass return aggregats_interclasses_taggues + diff --git a/app/pe/pe_tabletags.py b/app/pe/pe_tabletags.py index ae4a7fe4..9df18c01 100644 --- a/app/pe/pe_tabletags.py +++ b/app/pe/pe_tabletags.py @@ -48,8 +48,6 @@ TAGS_RESERVES = ["but"] class TableTag(object): - - def __init__(self): """Classe centralisant différentes méthodes communes aux SemestreTag, TrajectoireTag, AggregatInterclassTag @@ -105,3 +103,36 @@ class TableTag(object): df = df.join(self.moyennes_tags[tag]["classements"].rename(f"class {tag}")) return df.to_csv(sep=";") + + @classmethod + def get_min_for_df(cls, bilan: dict) -> float: + """Partant d'un dictionnaire `bilan` généralement une moyennes_tags pour un tag donné, + revoie le min renseigné pour affichage dans un df""" + return round(bilan["min"], 2) + + @classmethod + def get_max_for_df(cls, bilan: dict) -> float: + """Partant d'un dictionnaire `bilan` généralement une moyennes_tags pour un tag donné, + renvoie le max renseigné pour affichage dans un df""" + return round(bilan["max"], 2) + + @classmethod + def get_moy_for_df(cls, bilan: dict) -> float: + """Partant d'un dictionnaire `bilan` généralement une moyennes_tags pour un tag donné, + renvoie la moyenne renseignée pour affichage dans un df""" + return round(bilan["moy"], 2) + + @classmethod + def get_class_for_df(cls, bilan: dict, etudid: int) -> str: + """Partant d'un dictionnaire `bilan` généralement une moyennes_tags pour un tag donné, + renvoie le classement ramené au nombre d'inscrits, + pour un étudiant donné par son etudid""" + return f"{bilan['classements'].loc[etudid]}/{bilan['nb_inscrits']}" + + + @classmethod + def get_note_for_df(cls, bilan: dict, etudid: int): + """Partant d'un dictionnaire `bilan` généralement une moyennes_tags pour un tag donné, + renvoie la note (moyenne) + pour un étudiant donné par son etudid""" + return round(bilan["notes"].loc[etudid], 2) \ No newline at end of file