Update opolka/ScoDoc from ScoDoc/ScoDoc #2

Merged
opolka merged 1272 commits from ScoDoc/ScoDoc:master into master 2024-05-27 09:11:04 +02:00
5 changed files with 73 additions and 39 deletions
Showing only changes of commit 28b25ad681 - Show all commits

View File

@ -317,32 +317,39 @@ class InterClassTag(pe_tabletags.TableTag):
initialisation = False initialisation = False
df = pd.DataFrame() df = pd.DataFrame()
# Pour chaque rcs (suivi) associe la liste des etudids l'ayant suivi
asso_rcs_etudids = {}
for etudid in etudids_sorted: for etudid in etudids_sorted:
# Charge ses moyennes au RCSTag suivi rcs = self.suivis[etudid]
rcs = self.suivis[etudid] # Son Sx ou son RCSemX suivi
if rcs: if rcs:
rcstag = self.rcstags[rcs.rcs_id] # Son SxTag ou RCSTag if rcs.rcs_id not in asso_rcs_etudids:
# Charge la moyenne asso_rcs_etudids[rcs.rcs_id] = []
if tag in rcstag.moyennes_tags: asso_rcs_etudids[rcs.rcs_id].append(etudid)
moytag: pd.DataFrame = rcstag.moyennes_tags[tag]
df_moytag = moytag.to_df( for rcs_id, etudids in asso_rcs_etudids.items():
pole, # Charge ses moyennes au RCSTag suivi
aggregat=aggregat, rcstag = self.rcstags[rcs_id] # Le SxTag ou RCSTag
cohorte="Groupe", # 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 # Injecte les notes des étudiants
if not initialisation: df.loc[etudids, :] = df_moytag.loc[etudids, :]
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, :]
return df return df

View File

@ -124,7 +124,7 @@ class SxTag(pe_tabletags.TableTag):
self.tags_sorted = self.ressembuttag_final.tags_sorted self.tags_sorted = self.ressembuttag_final.tags_sorted
"""Tags (extraits du ReSemBUTTag final)""" """Tags (extraits du ReSemBUTTag final)"""
aff_tag = pe_affichage.repr_tags(self.tags_sorted) 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 # Les UE données par leur acronyme
self.acronymes_sorted = self.ressembuttag_final.acronymes_sorted self.acronymes_sorted = self.ressembuttag_final.acronymes_sorted

View File

@ -10,7 +10,7 @@ from flask import g
from app import log from app import log
from app.pe.rcss import pe_rcs from app.pe.rcss import pe_rcs
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

@ -88,12 +88,17 @@ class JuryPE(object):
"Nom du zip où ranger les fichiers générés" "Nom du zip où ranger les fichiers générés"
pe_affichage.pe_print( 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 # Chargement des étudiants à prendre en compte dans le jury
pe_affichage.pe_print( pe_affichage.pe_print(
f"""***********************************************************\n""" f"""***********************************************************"""
f"""*** Recherche des étudiants diplômés 🎓 en {self.diplome}\n""" )
pe_affichage.pe_print(
f"""*** Recherche des étudiants diplômés 🎓 en {self.diplome}""", info=True
)
pe_affichage.pe_print(
f"""***********************************************************""" f"""***********************************************************"""
) )
@ -109,7 +114,7 @@ class JuryPE(object):
self.zipdata = io.BytesIO() self.zipdata = io.BytesIO()
with ZipFile(self.zipdata, "w") as zipfile: with ZipFile(self.zipdata, "w") as zipfile:
if not self.diplomes_ids: if not self.diplomes_ids:
pe_affichage.pe_print("*** Aucun étudiant diplômé") pe_affichage.pe_print("*** Aucun étudiant diplômé", info=True)
else: else:
try: try:
self._gen_xls_diplomes(zipfile) self._gen_xls_diplomes(zipfile)
@ -157,14 +162,20 @@ class JuryPE(object):
def _gen_xls_ressembuttags(self, zipfile: ZipFile): def _gen_xls_ressembuttags(self, zipfile: ZipFile):
"""Calcule les moyennes par tag des résultats des Semestres BUT""" """Calcule les moyennes par tag des résultats des Semestres BUT"""
pe_affichage.pe_print( pe_affichage.pe_print(
f"""*************************************************************************\n""" f"""*************************************************************************"""
f"""*** Génère les ResSemBUTTag (ResSemestreBUT taggués)\n""" )
pe_affichage.pe_print(
f"""*** Génère les ResSemBUTTag (ResSemestreBUT taggués)""", info=True
)
pe_affichage.pe_print(
f"""*************************************************************************""" f"""*************************************************************************"""
) )
# Tous les formsestres des étudiants # Tous les formsestres des étudiants
formsemestres = get_formsemestres_etudiants(self.etudiants) 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 = {} self.ressembuttags = {}
for frmsem_id, formsemestre in formsemestres.items(): 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 # 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() 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"
@ -201,7 +212,9 @@ class JuryPE(object):
df = convert_colonnes_to_multiindex(df) df = convert_colonnes_to_multiindex(df)
# é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)}", info=True
)
output.seek(0) output.seek(0)
self.add_file_to_zip( self.add_file_to_zip(
@ -217,8 +230,13 @@ class JuryPE(object):
RCS (par ex: 'S2' ou '3S'). RCS (par ex: 'S2' ou '3S').
""" """
pe_affichage.pe_print( 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) """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. 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( 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() self.rcss_jury.cree_semxs()
pe_affichage.aff_semXs_suivis_par_etudiants(self.etudiants) pe_affichage.aff_semXs_suivis_par_etudiants(self.etudiants)

View File

@ -30,7 +30,7 @@
<p> <p>
Cette fonction génère un ensemble de feuilles de calcul (xlsx) Cette fonction génère un ensemble de feuilles de calcul (xlsx)
permettant d'éditer des avis de poursuites d'études pour les étudiants 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).
<br> <br>
De nombreux aspects sont paramétrables: De nombreux aspects sont paramétrables:
<a href="https://scodoc.org/AvisPoursuiteEtudes" <a href="https://scodoc.org/AvisPoursuiteEtudes"