diff --git a/app/pe/moys/pe_interclasstag.py b/app/pe/moys/pe_interclasstag.py index 870435f5c..7150ebe85 100644 --- a/app/pe/moys/pe_interclasstag.py +++ b/app/pe/moys/pe_interclasstag.py @@ -317,32 +317,39 @@ class InterClassTag(pe_tabletags.TableTag): initialisation = False df = pd.DataFrame() + # Pour chaque rcs (suivi) associe la liste des etudids l'ayant suivi + asso_rcs_etudids = {} for etudid in etudids_sorted: - # Charge ses moyennes au RCSTag suivi - rcs = self.suivis[etudid] # Son Sx ou son RCSemX suivi + rcs = self.suivis[etudid] if rcs: - rcstag = self.rcstags[rcs.rcs_id] # Son SxTag ou RCSTag - # Charge la moyenne - if tag in rcstag.moyennes_tags: - moytag: pd.DataFrame = rcstag.moyennes_tags[tag] - df_moytag = moytag.to_df( - pole, - aggregat=aggregat, - cohorte="Groupe", + if rcs.rcs_id not in asso_rcs_etudids: + asso_rcs_etudids[rcs.rcs_id] = [] + asso_rcs_etudids[rcs.rcs_id].append(etudid) + + for rcs_id, etudids in asso_rcs_etudids.items(): + # Charge ses moyennes au RCSTag suivi + rcstag = self.rcstags[rcs_id] # Le SxTag ou RCSTag + # Charge la moyenne + if tag in rcstag.moyennes_tags: + moytag: pd.DataFrame = rcstag.moyennes_tags[tag] + df_moytag = moytag.to_df( + pole, + aggregat=aggregat, + cohorte="Groupe", + ) + + # Modif les colonnes au regard du 1er df_moytag significatif lu + if not initialisation: + df = pd.DataFrame( + np.nan, index=etudids_sorted, columns=df_moytag.columns ) + colonnes = list(df_moytag.columns) + for col in colonnes: + if col.endswith("rang"): + df[col] = df[col].astype(str) + initialisation = True - # Modif les colonnes au regard du 1er df_moytag significatif lu - if not initialisation: - df = pd.DataFrame( - np.nan, index=etudids_sorted, columns=df_moytag.columns - ) - colonnes = list(df_moytag.columns) - for col in colonnes: - if col.endswith("rang"): - df[col] = df[col].astype(str) - initialisation = True - - # Injecte les notes de l'étudiant - df.loc[etudid, :] = df_moytag.loc[etudid, :] + # Injecte les notes des étudiants + df.loc[etudids, :] = df_moytag.loc[etudids, :] return df diff --git a/app/pe/moys/pe_sxtag.py b/app/pe/moys/pe_sxtag.py index b1594593c..18cb8b3c8 100644 --- a/app/pe/moys/pe_sxtag.py +++ b/app/pe/moys/pe_sxtag.py @@ -124,7 +124,7 @@ class SxTag(pe_tabletags.TableTag): self.tags_sorted = self.ressembuttag_final.tags_sorted """Tags (extraits du ReSemBUTTag final)""" aff_tag = pe_affichage.repr_tags(self.tags_sorted) - pe_affichage.pe_print(f"--> Tags : {', '.join(aff_tag)}") + pe_affichage.pe_print(f"--> Tags : {aff_tag}") # Les UE données par leur acronyme self.acronymes_sorted = self.ressembuttag_final.acronymes_sorted diff --git a/app/pe/pe_affichage.py b/app/pe/pe_affichage.py index 54d6aff6f..61547a378 100644 --- a/app/pe/pe_affichage.py +++ b/app/pe/pe_affichage.py @@ -10,7 +10,7 @@ from flask import g from app import log from app.pe.rcss import pe_rcs -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 aff6b6b62..2d2fbde79 100644 --- a/app/pe/pe_jury.py +++ b/app/pe/pe_jury.py @@ -88,12 +88,17 @@ class JuryPE(object): "Nom du zip où ranger les fichiers générés" pe_affichage.pe_print( - f"Données de poursuite d'étude générées le {time.strftime('%d/%m/%Y à %H:%M')}\n" + f"Données de poursuite d'étude générées le {time.strftime('%d/%m/%Y à %H:%M')}\n", + info=True, ) # Chargement des étudiants à prendre en compte dans le jury pe_affichage.pe_print( - f"""***********************************************************\n""" - f"""*** Recherche des étudiants diplômés 🎓 en {self.diplome}\n""" + f"""***********************************************************""" + ) + pe_affichage.pe_print( + f"""*** Recherche des étudiants diplômés 🎓 en {self.diplome}""", info=True + ) + pe_affichage.pe_print( f"""***********************************************************""" ) @@ -109,7 +114,7 @@ class JuryPE(object): self.zipdata = io.BytesIO() with ZipFile(self.zipdata, "w") as zipfile: if not self.diplomes_ids: - pe_affichage.pe_print("*** Aucun étudiant diplômé") + pe_affichage.pe_print("*** Aucun étudiant diplômé", info=True) else: try: self._gen_xls_diplomes(zipfile) @@ -157,14 +162,20 @@ class JuryPE(object): def _gen_xls_ressembuttags(self, zipfile: ZipFile): """Calcule les moyennes par tag des résultats des Semestres BUT""" pe_affichage.pe_print( - f"""*************************************************************************\n""" - f"""*** Génère les ResSemBUTTag (ResSemestreBUT taggués)\n""" + f"""*************************************************************************""" + ) + pe_affichage.pe_print( + f"""*** Génère les ResSemBUTTag (ResSemestreBUT taggués)""", info=True + ) + pe_affichage.pe_print( f"""*************************************************************************""" ) # Tous les formsestres des étudiants formsemestres = get_formsemestres_etudiants(self.etudiants) - pe_affichage.pe_print(f"1) Génère les {len(formsemestres)} ResSemBUTTag") + pe_affichage.pe_print( + f"1) Génère les {len(formsemestres)} ResSemBUTTag", info=True + ) self.ressembuttags = {} for frmsem_id, formsemestre in formsemestres.items(): @@ -181,7 +192,7 @@ class JuryPE(object): # ) # Intègre le bilan des semestres taggués au zip final - pe_affichage.pe_print(f"2) Bilan") + pe_affichage.pe_print(f"2) Bilan", info=True) output = io.BytesIO() with pd.ExcelWriter( # pylint: disable=abstract-class-instantiated output, engine="openpyxl" @@ -201,7 +212,9 @@ class JuryPE(object): df = convert_colonnes_to_multiindex(df) # é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)}", info=True + ) output.seek(0) self.add_file_to_zip( @@ -217,8 +230,13 @@ class JuryPE(object): RCS (par ex: 'S2' ou '3S'). """ pe_affichage.pe_print( - "***************************************************************************\n" - "*** Génère les trajectoires (≠tes combinaisons de semestres) des étudiants\n" + "***************************************************************************" + ) + pe_affichage.pe_print( + "*** Génère les trajectoires (≠tes combinaisons de semestres) des étudiants", + info=True, + ) + pe_affichage.pe_print( "***************************************************************************" ) @@ -229,10 +247,19 @@ class JuryPE(object): """Génère les SemXs (trajectoires/combinaisons de semestre de même rang x) qui traduisent les différents chemins des étudiants pour valider un semestre Sx. """ - # Génère les regroupements de semestres de type Sx pe_affichage.pe_print( - "*** Génère les SemXs (RCS de même Sx donnant lieu à validation du semestre)" + "***************************************************************************" ) + pe_affichage.pe_print( + "*** Génère les SemXs (RCS de même Sx donnant lieu à validation du semestre)", + info=True, + ) + pe_affichage.pe_print( + "***************************************************************************" + ) + + # Génère les regroupements de semestres de type Sx + self.rcss_jury.cree_semxs() pe_affichage.aff_semXs_suivis_par_etudiants(self.etudiants) diff --git a/app/templates/pe/pe_view_sem_recap.j2 b/app/templates/pe/pe_view_sem_recap.j2 index 4766daac5..7a2630949 100644 --- a/app/templates/pe/pe_view_sem_recap.j2 +++ b/app/templates/pe/pe_view_sem_recap.j2 @@ -30,7 +30,7 @@

Cette fonction génère un ensemble de feuilles de calcul (xlsx) permettant d'éditer des avis de poursuites d'études pour les étudiants - de BUT diplômés. Les calculs sous-jacents peuvent prendre un peu de temps (1 à 2 minutes). + de BUT diplômés. Les calculs sous-jacents peuvent prendre un peu de temps (1 à 3 minutes).
De nombreux aspects sont paramétrables: