From 21a794a760fa20a6ff86684a5c3112277ff22923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9o=20BARAS=20=28IUT1=20Grenoble=29?= Date: Sun, 25 Feb 2024 16:25:28 +0100 Subject: [PATCH] =?UTF-8?q?Diverses=20am=C3=A9liorations=20d'affichage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/pe/moys/pe_interclasstag.py | 53 +++++++++++++++++++++++++++++++++ app/pe/moys/pe_sxtag.py | 2 +- app/pe/pe_affichage.py | 2 +- app/pe/pe_jury.py | 24 +++++++-------- 4 files changed, 66 insertions(+), 15 deletions(-) diff --git a/app/pe/moys/pe_interclasstag.py b/app/pe/moys/pe_interclasstag.py index c7125607..3d2b5302 100644 --- a/app/pe/moys/pe_interclasstag.py +++ b/app/pe/moys/pe_interclasstag.py @@ -37,6 +37,7 @@ import pandas as pd import numpy as np 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.rcss import pe_rcs import app.pe.pe_comp as pe_comp @@ -82,6 +83,10 @@ class InterClassTag(pe_tabletags.TableTag): # Le type d'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 self.etuds: list[Identite] = list(etudiants_diplomes.values()) """Identités des étudiants diplômés""" @@ -114,9 +119,13 @@ class InterClassTag(pe_tabletags.TableTag): # Les données sur les tags self.tags_sorted = self._do_taglist() """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) 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 etudids_sorted = sorted(list(self.diplomes_ids)) @@ -127,10 +136,16 @@ class InterClassTag(pe_tabletags.TableTag): # Synthétise les moyennes/classements par tag self.moyennes_tags: dict[str, pe_moytag.MoyennesTag] = {} for tag in self.tags_sorted: + pe_affichage.pe_print(f"--> Moyenne 👜{tag} : ") + notes = self.compute_notes_matrice(tag, etudids_sorted, self.champs_sorted) + coeffs = self.compute_coeffs_matrice( tag, etudids_sorted, self.champs_sorted ) + + self.__aff_profil_coeffs(coeffs) + self.moyennes_tags[tag] = pe_moytag.MoyennesTag( tag, self.type, @@ -142,6 +157,29 @@ class InterClassTag(pe_tabletags.TableTag): """Une représentation textuelle""" 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): """Synthétise les tags à partir des TableTags (SXTag ou RCSTag) @@ -241,6 +279,21 @@ class InterClassTag(pe_tabletags.TableTag): dict_champs.extend(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): """Indique si l'interclassement a des tags (cas d'un interclassement sur un S5 qui n'a pas eu lieu) diff --git a/app/pe/moys/pe_sxtag.py b/app/pe/moys/pe_sxtag.py index 6f381feb..e81d0c6d 100644 --- a/app/pe/moys/pe_sxtag.py +++ b/app/pe/moys/pe_sxtag.py @@ -222,7 +222,7 @@ class SxTag(pe_tabletags.TableTag): # L'affichage ues = ", ".join(self.acronymes_sorted) 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): diff --git a/app/pe/pe_affichage.py b/app/pe/pe_affichage.py index 55d4f07e..b719e5f7 100644 --- a/app/pe/pe_affichage.py +++ b/app/pe/pe_affichage.py @@ -9,7 +9,7 @@ from flask import g from app import log -PE_DEBUG = True +PE_DEBUG = False # On stocke les logs PE dans g.scodoc_pe_log diff --git a/app/pe/pe_jury.py b/app/pe/pe_jury.py index cae47a69..f1539a96 100644 --- a/app/pe/pe_jury.py +++ b/app/pe/pe_jury.py @@ -203,8 +203,8 @@ class JuryPE(object): """ pe_affichage.pe_print( "***************************************************************************\n" - "*** Génère les trajectoires (≠tes combinaisons de semestres) des étudiants" - "***************************************************************************\n" + "*** Génère les trajectoires (≠tes combinaisons de semestres) des étudiants\n" + "***************************************************************************" ) self.rcss_jury.cree_trajectoires(self.etudiants) @@ -228,8 +228,8 @@ class JuryPE(object): # Génère les moyennes des RCS de type Sx pe_affichage.pe_print( "***************************************************************************\n" - "*** Calcule les moyennes des SxTag (moyennes d'un RCS de type Sx)" - "***************************************************************************\n" + "*** Calcule les moyennes des SxTag (moyennes d'un RCS de type Sx)\n" + "***************************************************************************" ) # 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 = {} for rcs_id, rcsemx in self.rcss_jury.rcsemxs.items(): self.rcss_tags[rcs_id] = pe_rcstag.RCSTag(rcsemx, self.sxtags) # Intègre le bilan des trajectoires tagguées au zip final + pe_affichage.pe_print("2) Bilan") output = io.BytesIO() with pd.ExcelWriter( # pylint: disable=abstract-class-instantiated output, engine="openpyxl" @@ -321,10 +323,10 @@ class JuryPE(object): df = rcs_tag.to_df() # Conversion colonnes en multiindex df = convert_colonnes_to_multiindex(df) - onglets += [onglet] + onglets += ["📊" + onglet] # écriture dans l'onglet 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) if onglets: @@ -342,7 +344,9 @@ class JuryPE(object): et ceux par compétences (sur les RCSTag). """ 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 = { pe_moytag.CODE_MOY_UE: {}, @@ -353,9 +357,6 @@ class JuryPE(object): # Les interclassements par UE 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( Sx, pe_moytag.CODE_MOY_UE, @@ -368,9 +369,6 @@ class JuryPE(object): # Les interclassements par compétences 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( nom_rcs, pe_moytag.CODE_MOY_COMPETENCES,