forked from ScoDoc/ScoDoc
Update opolka/ScoDoc from ScoDoc/ScoDoc #2
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
Loading…
Reference in New Issue
Block a user