Diverses améliorations d'affichage

This commit is contained in:
Cléo Baras 2024-02-25 16:25:28 +01:00
parent 960f8a3462
commit 21a794a760
4 changed files with 66 additions and 15 deletions

View File

@ -37,6 +37,7 @@ import pandas as pd
import numpy as np import numpy as np
from app.models import Identite from app.models import Identite
from app.pe import pe_affichage
from app.pe.moys import pe_tabletags, pe_moy, pe_moytag, pe_sxtag from app.pe.moys import pe_tabletags, pe_moy, pe_moytag, pe_sxtag
from app.pe.rcss import pe_rcs from app.pe.rcss import pe_rcs
import app.pe.pe_comp as pe_comp import app.pe.pe_comp as pe_comp
@ -82,6 +83,10 @@ class InterClassTag(pe_tabletags.TableTag):
# Le type d'interclassement # Le type d'interclassement
self.type = type_interclassement self.type = type_interclassement
pe_affichage.pe_print(
f"--> Interclassement par 🗂️{type_interclassement} pour le RCS ⏯️{nom_rcs}"
)
# Les informations sur les étudiants diplômés # Les informations sur les étudiants diplômés
self.etuds: list[Identite] = list(etudiants_diplomes.values()) self.etuds: list[Identite] = list(etudiants_diplomes.values())
"""Identités des étudiants diplômés""" """Identités des étudiants diplômés"""
@ -114,9 +119,13 @@ class InterClassTag(pe_tabletags.TableTag):
# Les données sur les tags # Les données sur les tags
self.tags_sorted = self._do_taglist() self.tags_sorted = self._do_taglist()
"""Liste des tags (triés par ordre alphabétique)""" """Liste des tags (triés par ordre alphabétique)"""
aff_tag = ["👜" + tag for tag in self.tags_sorted]
pe_affichage.pe_print(f"--> Tags : {', '.join(aff_tag)}")
# Les données sur les UEs (si SxTag) ou compétences (si RCSTag) # Les données sur les UEs (si SxTag) ou compétences (si RCSTag)
self.champs_sorted = self._do_ues_ou_competences_list() self.champs_sorted = self._do_ues_ou_competences_list()
"""Les champs (UEs ou compétences) de l'interclassement"""
self._aff_comp_ou_ues_debug()
# Construit la matrice de notes # Construit la matrice de notes
etudids_sorted = sorted(list(self.diplomes_ids)) etudids_sorted = sorted(list(self.diplomes_ids))
@ -127,10 +136,16 @@ class InterClassTag(pe_tabletags.TableTag):
# Synthétise les moyennes/classements par tag # Synthétise les moyennes/classements par tag
self.moyennes_tags: dict[str, pe_moytag.MoyennesTag] = {} self.moyennes_tags: dict[str, pe_moytag.MoyennesTag] = {}
for tag in self.tags_sorted: for tag in self.tags_sorted:
pe_affichage.pe_print(f"--> Moyenne 👜{tag} : ")
notes = self.compute_notes_matrice(tag, etudids_sorted, self.champs_sorted) notes = self.compute_notes_matrice(tag, etudids_sorted, self.champs_sorted)
coeffs = self.compute_coeffs_matrice( coeffs = self.compute_coeffs_matrice(
tag, etudids_sorted, self.champs_sorted tag, etudids_sorted, self.champs_sorted
) )
self.__aff_profil_coeffs(coeffs)
self.moyennes_tags[tag] = pe_moytag.MoyennesTag( self.moyennes_tags[tag] = pe_moytag.MoyennesTag(
tag, tag,
self.type, self.type,
@ -142,6 +157,29 @@ class InterClassTag(pe_tabletags.TableTag):
"""Une représentation textuelle""" """Une représentation textuelle"""
return f"{self.nom_rcs} par {self.type}" return f"{self.nom_rcs} par {self.type}"
def __aff_profil_coeffs(self, matrice_coeffs_moy_gen):
"""Extrait de la matrice des coeffs, les différents types d'inscription
et de coefficients (appelés profil) des étudiants et les affiche
(pour debug)
"""
# Les profils des coeffs d'UE (pour debug)
profils = []
for i in matrice_coeffs_moy_gen.index:
val = matrice_coeffs_moy_gen.loc[i].fillna("-")
val = " | ".join([str(v) for v in val])
if val not in profils:
profils += [val]
# L'affichage
if len(profils) > 1:
profils_aff = "\n" + "\n".join([" " * 10 + prof for prof in profils])
else:
profils_aff = "\n".join(profils)
pe_affichage.pe_print(
f" > Moyenne calculée avec pour coeffs (de compétences) : {profils_aff}"
)
def _do_taglist(self): def _do_taglist(self):
"""Synthétise les tags à partir des TableTags (SXTag ou RCSTag) """Synthétise les tags à partir des TableTags (SXTag ou RCSTag)
@ -241,6 +279,21 @@ class InterClassTag(pe_tabletags.TableTag):
dict_champs.extend(champs) dict_champs.extend(champs)
return sorted(set(dict_champs)) return sorted(set(dict_champs))
def _aff_comp_ou_ues_debug(self):
"""Affichage pour debug"""
aff_comp = []
for comp in self.champs_sorted:
liste = []
if self.type == pe_moytag.CODE_MOY_UE:
liste += ["📍" + comp]
else:
liste += ["💡" + comp]
if self.type == pe_moytag.CODE_MOY_UE:
pe_affichage.pe_print(f"--> UEs : {', '.join(aff_comp)}")
else:
pe_affichage.pe_print(f"--> Compétences : {', '.join(aff_comp)}")
def has_tags(self): def has_tags(self):
"""Indique si l'interclassement a des tags (cas d'un """Indique si l'interclassement a des tags (cas d'un
interclassement sur un S5 qui n'a pas eu lieu) interclassement sur un S5 qui n'a pas eu lieu)

View File

@ -222,7 +222,7 @@ class SxTag(pe_tabletags.TableTag):
# L'affichage # L'affichage
ues = ", ".join(self.acronymes_sorted) ues = ", ".join(self.acronymes_sorted)
pe_affichage.pe_print( pe_affichage.pe_print(
f" > MoyTag 👜{tag} pour UES: {ues} avec pour coeffs : {profils_aff}" f" > MoyTag 👜{tag} pour UEs : {ues} avec pour coeffs : {profils_aff}"
) )
def has_notes(self, tag): def has_notes(self, tag):

View File

@ -9,7 +9,7 @@
from flask import g from flask import g
from app import log from app import log
PE_DEBUG = True PE_DEBUG = False
# On stocke les logs PE dans g.scodoc_pe_log # On stocke les logs PE dans g.scodoc_pe_log

View File

@ -203,8 +203,8 @@ class JuryPE(object):
""" """
pe_affichage.pe_print( pe_affichage.pe_print(
"***************************************************************************\n" "***************************************************************************\n"
"*** Génère les trajectoires (≠tes combinaisons de semestres) des étudiants" "*** Génère les trajectoires (≠tes combinaisons de semestres) des étudiants\n"
"***************************************************************************\n" "***************************************************************************"
) )
self.rcss_jury.cree_trajectoires(self.etudiants) self.rcss_jury.cree_trajectoires(self.etudiants)
@ -228,8 +228,8 @@ class JuryPE(object):
# Génère les moyennes des RCS de type Sx # Génère les moyennes des RCS de type Sx
pe_affichage.pe_print( pe_affichage.pe_print(
"***************************************************************************\n" "***************************************************************************\n"
"*** Calcule les moyennes des SxTag (moyennes d'un RCS de type Sx)" "*** Calcule les moyennes des SxTag (moyennes d'un RCS de type Sx)\n"
"***************************************************************************\n" "***************************************************************************"
) )
# Les SxTag (moyenne de Sx par UE) # Les SxTag (moyenne de Sx par UE)
@ -305,11 +305,13 @@ class JuryPE(object):
"""****************************************************""" """****************************************************"""
) )
pe_affichage.pe_print("1) Calcul des moyennes des RCSTag")
self.rcss_tags = {} self.rcss_tags = {}
for rcs_id, rcsemx in self.rcss_jury.rcsemxs.items(): for rcs_id, rcsemx in self.rcss_jury.rcsemxs.items():
self.rcss_tags[rcs_id] = pe_rcstag.RCSTag(rcsemx, self.sxtags) self.rcss_tags[rcs_id] = pe_rcstag.RCSTag(rcsemx, self.sxtags)
# Intègre le bilan des trajectoires tagguées au zip final # Intègre le bilan des trajectoires tagguées au zip final
pe_affichage.pe_print("2) Bilan")
output = io.BytesIO() output = io.BytesIO()
with pd.ExcelWriter( # pylint: disable=abstract-class-instantiated with pd.ExcelWriter( # pylint: disable=abstract-class-instantiated
output, engine="openpyxl" output, engine="openpyxl"
@ -321,10 +323,10 @@ class JuryPE(object):
df = rcs_tag.to_df() df = rcs_tag.to_df()
# Conversion colonnes en multiindex # Conversion colonnes en multiindex
df = convert_colonnes_to_multiindex(df) df = convert_colonnes_to_multiindex(df)
onglets += [onglet] onglets += ["📊" + onglet]
# écriture dans l'onglet # écriture dans l'onglet
df.to_excel(writer, onglet, index=True, header=True) df.to_excel(writer, onglet, index=True, header=True)
pe_affichage.pe_print(f"=> Export excel de {', '.join(onglets)}") pe_affichage.pe_print(f"--> Export excel de {', '.join(onglets)}")
output.seek(0) output.seek(0)
if onglets: if onglets:
@ -342,7 +344,9 @@ class JuryPE(object):
et ceux par compétences (sur les RCSTag). et ceux par compétences (sur les RCSTag).
""" """
pe_affichage.pe_print( pe_affichage.pe_print(
"*** Génère les interclassements sur chaque type de RCS/agrgégat" """******************************************************************\n"""
"""*** Génère les interclassements sur chaque type de RCS/agrgégat\n"""
"""******************************************************************"""
) )
self.interclasstags = { self.interclasstags = {
pe_moytag.CODE_MOY_UE: {}, pe_moytag.CODE_MOY_UE: {},
@ -353,9 +357,6 @@ class JuryPE(object):
# Les interclassements par UE # Les interclassements par UE
for Sx in pe_rcs.TOUS_LES_SEMESTRES: for Sx in pe_rcs.TOUS_LES_SEMESTRES:
pe_affichage.pe_print(
f"--> Interclassement par (acronyme d')UEs pour le RCS {Sx}"
)
interclass = pe_interclasstag.InterClassTag( interclass = pe_interclasstag.InterClassTag(
Sx, Sx,
pe_moytag.CODE_MOY_UE, pe_moytag.CODE_MOY_UE,
@ -368,9 +369,6 @@ class JuryPE(object):
# Les interclassements par compétences # Les interclassements par compétences
for nom_rcs in pe_rcs.TOUS_LES_RCS: for nom_rcs in pe_rcs.TOUS_LES_RCS:
pe_affichage.pe_print(
f"--> Interclassement par compétences pour le RCS {nom_rcs}"
)
interclass = pe_interclasstag.InterClassTag( interclass = pe_interclasstag.InterClassTag(
nom_rcs, nom_rcs,
pe_moytag.CODE_MOY_COMPETENCES, pe_moytag.CODE_MOY_COMPETENCES,