Export Excel : Améliore les entêtes des colonnes + supprime l'affichage des classements des étudiants sans note

This commit is contained in:
Cléo Baras 2024-02-02 06:11:21 +01:00
parent 387af40b65
commit 66fbb0afbc
4 changed files with 82 additions and 82 deletions

View File

@ -12,6 +12,8 @@ if not PE_DEBUG:
else: else:
pe_print = print # print function 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: 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é

View File

@ -75,81 +75,55 @@ TODO:: A améliorer si BUT en moins de 6 semestres
PARCOURS = { PARCOURS = {
"S1": { "S1": {
"aggregat": ["S1"], "aggregat": ["S1"],
"ordre": 1, "descr": "Semestre 1 (S1)",
"affichage_court": "S1",
"affichage_long": "Semestre 1",
}, },
"S2": { "S2": {
"aggregat": ["S2"], "aggregat": ["S2"],
"ordre": 2, "descr": "Semestre 2 (S2)",
"affichage_court": "S2",
"affichage_long": "Semestre 2",
}, },
"1A": { "1A": {
"aggregat": ["S1", "S2"], "aggregat": ["S1", "S2"],
"ordre": 3, "descr": "BUT1 (S1+S2)",
"affichage_court": "1A",
"affichage_long": "1ère année",
}, },
"S3": { "S3": {
"aggregat": ["S3"], "aggregat": ["S3"],
"ordre": 4, "descr": "Semestre 3 (S3)",
"affichage_court": "S3",
"affichage_long": "Semestre 3",
}, },
"S4": { "S4": {
"aggregat": ["S4"], "aggregat": ["S4"],
"ordre": 5, "descr": "Semestre 4 (S4)",
"affichage_court": "S4",
"affichage_long": "Semestre 4",
}, },
"2A": { "2A": {
"aggregat": ["S3", "S4"], "aggregat": ["S3", "S4"],
"ordre": 6, "descr": "BUT2 (S3+S4)",
"affichage_court": "2A",
"affichage_long": "2ème année",
}, },
"3S": { "3S": {
"aggregat": ["S1", "S2", "S3"], "aggregat": ["S1", "S2", "S3"],
"ordre": 7, "descr": "Moyenne du semestre 1 au semestre 3 (S1+S2+S3)",
"affichage_court": "S1+S2+S3",
"affichage_long": "BUT du semestre 1 au semestre 3",
}, },
"4S": { "4S": {
"aggregat": ["S1", "S2", "S3", "S4"], "aggregat": ["S1", "S2", "S3", "S4"],
"ordre": 8, "descr": "Moyenne du semestre 1 au semestre 4 (S1+S2+S3+S4)",
"affichage_court": "BUT",
"affichage_long": "BUT du semestre 1 au semestre 4",
}, },
"S5": { "S5": {
"aggregat": ["S5"], "aggregat": ["S5"],
"ordre": 9, "descr": "Semestre 5 (S5)",
"affichage_court": "S5",
"affichage_long": "Semestre 5",
}, },
"S6": { "S6": {
"aggregat": ["S6"], "aggregat": ["S6"],
"ordre": 10, "descr": "Semestre 6 (S6)",
"affichage_court": "S6",
"affichage_long": "Semestre 6",
}, },
"3A": { "3A": {
"aggregat": ["S5", "S6"], "aggregat": ["S5", "S6"],
"ordre": 11, "descr": "3ème année (S5+S6)",
"affichage_court": "3A",
"affichage_long": "3ème année",
}, },
"5S": { "5S": {
"aggregat": ["S1", "S2", "S3", "S4", "S5"], "aggregat": ["S1", "S2", "S3", "S4", "S5"],
"ordre": 12, "descr": "Moyenne du semestre 1 au semestre 5 (S1+S2+S3+S4+S5)",
"affichage_court": "S1+S2+S3+S4+S5",
"affichage_long": "BUT du semestre 1 au semestre 5",
}, },
"6S": { "6S": {
"aggregat": ["S1", "S2", "S3", "S4", "S5", "S6"], "aggregat": ["S1", "S2", "S3", "S4", "S5", "S6"],
"ordre": 13, "descr": "Moyenne globale BUT (S1+S2+S3+S4+S5+S6)",
"affichage_court": "BUT",
"affichage_long": "BUT (tout semestre inclus)",
}, },
} }
NBRE_SEMESTRES_DIPLOMANT = 6 NBRE_SEMESTRES_DIPLOMANT = 6

View File

@ -46,6 +46,9 @@ import io
import os import os
from zipfile import ZipFile from zipfile import ZipFile
import numpy as np
from app.pe.pe_tabletags import TableTag
from app.scodoc.gen_tables import SeqGenTable from app.scodoc.gen_tables import SeqGenTable
from app.pe.pe_etudiant import EtudiantsJuryPE from app.pe.pe_etudiant import EtudiantsJuryPE
from app.pe.pe_trajectoire import TrajectoiresJuryPE, Trajectoire from app.pe.pe_trajectoire import TrajectoiresJuryPE, Trajectoire
@ -332,13 +335,18 @@ class JuryPE(object):
# La trajectoire de l'étudiant sur l'aggrégat # La trajectoire de l'étudiant sur l'aggrégat
trajectoire = self.trajectoires.suivi[etudid][aggregat] 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 # Les moyennes par tag de cette trajectoire
donnees[etudid] |= { donnees[etudid] |= {
(aggregat, "", "notes"): "-", (descr, "", "note"): pe_affichage.SANS_NOTE,
(aggregat, "groupe", "class."): "-", (descr, "statistique du groupe", "class."): pe_affichage.SANS_NOTE,
(aggregat, "groupe", "min"): "-", (descr, "statistique du groupe", "min"): pe_affichage.SANS_NOTE,
(aggregat, "groupe", "moy"): "-", (descr, "statistique du groupe", "moy"): pe_affichage.SANS_NOTE,
(aggregat, "groupe", "max"): "-", (descr, "statistique du groupe", "max"): pe_affichage.SANS_NOTE,
} }
if trajectoire: if trajectoire:
trajectoire_tagguee = self.trajectoires_tagguees[ trajectoire_tagguee = self.trajectoires_tagguees[
@ -346,49 +354,33 @@ class JuryPE(object):
] ]
if tag in trajectoire_tagguee.moyennes_tags: if tag in trajectoire_tagguee.moyennes_tags:
bilan = trajectoire_tagguee.moyennes_tags[tag] bilan = trajectoire_tagguee.moyennes_tags[tag]
note = TableTag.get_note_for_df(bilan, etudid)
if note != np.nan:
donnees[etudid] |= { donnees[etudid] |= {
(aggregat, "", "notes"): round( (descr, "", "note"): note,
bilan["notes"].loc[etudid], 2 (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),
aggregat, (descr, "statistique du groupe", "max"): TableTag.get_max_for_df(bilan)
"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
)
} }
"""L'interclassement""" """L'interclassement"""
interclass = self.interclassements_taggues[aggregat] interclass = self.interclassements_taggues[aggregat]
donnees[etudid] |= { donnees[etudid] |= {
(aggregat, f"promotion {self.diplome}", "class."): "-", (descr, f"statistique de la promotion {self.diplome}", "class."): pe_affichage.SANS_NOTE,
(aggregat, f"promotion {self.diplome}", "min"): "-", (descr, f"statistique de la promotion {self.diplome}", "min"): pe_affichage.SANS_NOTE,
(aggregat, f"promotion {self.diplome}", "moy"): "-", (descr, f"statistique de la promotion {self.diplome}", "moy"): pe_affichage.SANS_NOTE,
(aggregat, f"promotion {self.diplome}", "max"): "-", (descr, f"statistique de la promotion {self.diplome}", "max"): pe_affichage.SANS_NOTE,
} }
if tag in interclass.moyennes_tags: if tag in interclass.moyennes_tags:
bilan = interclass.moyennes_tags[tag] bilan = interclass.moyennes_tags[tag]
if note != np.nan:
donnees[etudid] |= { donnees[etudid] |= {
(aggregat, f"promotion {self.diplome}", "class."): f"{bilan['classements'].loc[etudid]}/{bilan['nb_inscrits']}", (descr, f"statistique de la promotion {self.diplome}", "class."): TableTag.get_class_for_df(bilan, etudid),
(aggregat, f"promotion {self.diplome}", "min"): round( (descr, f"statistique de la promotion {self.diplome}", "min"): TableTag.get_min_for_df(bilan),
bilan["min"], 2 (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)
(aggregat, f"promotion {self.diplome}", "moy"): round(
bilan["moy"], 2
),
(aggregat, f"promotion {self.diplome}", "max"): round(
bilan["max"], 2
)
} }
# Fin de l'aggrégat # Fin de l'aggrégat
@ -492,3 +484,4 @@ def compute_interclassements(
) )
aggregats_interclasses_taggues[nom_aggregat] = interclass aggregats_interclasses_taggues[nom_aggregat] = interclass
return aggregats_interclasses_taggues return aggregats_interclasses_taggues

View File

@ -48,8 +48,6 @@ TAGS_RESERVES = ["but"]
class TableTag(object): class TableTag(object):
def __init__(self): def __init__(self):
"""Classe centralisant différentes méthodes communes aux """Classe centralisant différentes méthodes communes aux
SemestreTag, TrajectoireTag, AggregatInterclassTag SemestreTag, TrajectoireTag, AggregatInterclassTag
@ -105,3 +103,36 @@ class TableTag(object):
df = df.join(self.moyennes_tags[tag]["classements"].rename(f"class {tag}")) df = df.join(self.moyennes_tags[tag]["classements"].rename(f"class {tag}"))
return df.to_csv(sep=";") 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)