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
3 changed files with 94 additions and 91 deletions
Showing only changes of commit 871f5c1d61 - Show all commits

View File

@ -100,126 +100,127 @@ class JuryPE(object):
meme_programme: si True, impose un même programme pour tous les étudiants participant au jury, meme_programme: si True, impose un même programme pour tous les étudiants participant au jury,
si False, permet des programmes differents si False, permet des programmes differents
""" """
"L'année du diplome"
self.diplome = diplome self.diplome = diplome
"L'année du diplome"
"La formation associée au diplome"
self.formation_id = formation_id self.formation_id = formation_id
"La formation associée au diplome"
"Un zip où ranger les fichiers générés"
self.nom_export_zip = f"Jury_PE_{self.diplome}" self.nom_export_zip = f"Jury_PE_{self.diplome}"
"Nom du zip où ranger les fichiers générés"
self.zipdata = io.BytesIO() self.zipdata = io.BytesIO()
self.zipfile = ZipFile(self.zipdata, "w") with ZipFile(self.zipdata, "w") as zipfile:
# Chargement des étudiants à prendre en compte dans le jury
pe_comp.pe_print(
f"""*** Recherche et chargement des étudiants diplômés en {
self.diplome} pour la formation {self.formation_id}"""
)
self.etudiants = EtudiantsJuryPE(
self.diplome
) # Les infos sur les étudiants
self.etudiants.find_etudiants(self.formation_id)
self.diplomes_ids = self.etudiants.diplomes_ids
"""Chargement des étudiants à prendre en compte dans le jury""" # Génère les semestres taggués (avec le calcul des moyennes) pour le jury PE
pe_comp.pe_print( pe_comp.pe_print("*** Génère les semestres taggués")
f"""*** Recherche et chargement des étudiants diplômés en { self.semestres_taggues = compute_semestres_tag(self.etudiants)
self.diplome} pour la formation {self.formation_id}"""
)
self.etudiants = EtudiantsJuryPE(self.diplome) # Les infos sur les étudiants
self.etudiants.find_etudiants(self.formation_id)
self.diplomes_ids = self.etudiants.diplomes_ids
"""Génère les semestres taggués (avec le calcul des moyennes) pour le jury PE""" if pe_comp.PE_DEBUG:
pe_comp.pe_print("*** Génère les semestres taggués") # Intègre le bilan des semestres taggués au zip final
self.semestres_taggues = compute_semestres_tag(self.etudiants) for formsemestretag in self.semestres_taggues.values():
filename = formsemestretag.nom.replace(" ", "_") + ".csv"
pe_comp.pe_print(f" - Export csv de {filename} ")
self.add_file_to_zip(
zipfile,
filename,
formsemestretag.str_tagtable(),
path="details_semestres",
)
if pe_comp.PE_DEBUG: # Génère les trajectoires (combinaison de semestres suivis
"""Intègre le bilan des semestres taggués au zip final""" # par un étudiant pour atteindre le semestre final d'un aggrégat)
for fid in self.semestres_taggues: pe_comp.pe_print(
formsemestretag = self.semestres_taggues[fid] "*** Génère les trajectoires (différentes combinaisons de semestres) des étudiants"
filename = formsemestretag.nom.replace(" ", "_") + ".csv" )
pe_comp.pe_print(f" - Export csv de {filename} ") self.trajectoires = TrajectoiresJuryPE(self.diplome)
self.add_file_to_zip( self.trajectoires.cree_trajectoires(self.etudiants)
filename, formsemestretag.str_tagtable(), path="details_semestres"
)
"""Génère les trajectoires (combinaison de semestres suivis # Génère les moyennes par tags des trajectoires
par un étudiant pour atteindre le semestre final d'un aggrégat) pe_comp.pe_print(
""" "*** Calcule les moyennes par tag des trajectoires possibles"
pe_comp.pe_print( )
"*** Génère les trajectoires (différentes combinaisons de semestres) des étudiants" self.trajectoires_tagguees = compute_trajectoires_tag(
) self.trajectoires, self.etudiants, self.semestres_taggues
self.trajectoires = TrajectoiresJuryPE(self.diplome) )
self.trajectoires.cree_trajectoires(self.etudiants)
"""Génère les moyennes par tags des trajectoires""" if pe_comp.PE_DEBUG:
pe_comp.pe_print("*** Calcule les moyennes par tag des trajectoires possibles") # Intègre le bilan des trajectoires tagguées au zip final
self.trajectoires_tagguees = compute_trajectoires_tag( for trajectoire_tagguee in self.trajectoires_tagguees.values():
self.trajectoires, self.etudiants, self.semestres_taggues filename = trajectoire_tagguee.get_repr().replace(" ", "_") + ".csv"
) pe_comp.pe_print(f" - Export csv de {filename} ")
self.add_file_to_zip(
zipfile,
filename,
trajectoire_tagguee.str_tagtable(),
path="details_semestres",
)
if pe_comp.PE_DEBUG: # Génère les interclassements (par promo et) par (nom d') aggrégat
"""Intègre le bilan des trajectoires tagguées au zip final""" pe_comp.pe_print("*** Génère les interclassements par aggrégat")
for trajectoire_id in self.trajectoires_tagguees: self.interclassements_taggues = compute_interclassements(
trajectoire_tagguee = self.trajectoires_tagguees[trajectoire_id] self.etudiants, self.trajectoires, self.trajectoires_tagguees
filename = trajectoire_tagguee.get_repr().replace(" ", "_") + ".csv" )
pe_comp.pe_print(f" - Export csv de {filename} ")
self.add_file_to_zip(
filename,
trajectoire_tagguee.str_tagtable(),
path="details_semestres",
)
"""Génère les interclassements (par promo et) par (nom d') aggrégat""" if pe_comp.PE_DEBUG:
pe_comp.pe_print("*** Génère les interclassements par aggrégat") # Intègre le bilan des aggrégats (par promo) au zip final
self.interclassements_taggues = compute_interclassements( for interclass_tag in self.interclassements_taggues.values():
self.etudiants, self.trajectoires, self.trajectoires_tagguees filename = interclass_tag.get_repr().replace(" ", "_") + ".csv"
) pe_comp.pe_print(f" - Export csv de {filename} ")
self.add_file_to_zip(
zipfile,
filename,
interclass_tag.str_tagtable(),
path="details_semestres",
)
if pe_comp.PE_DEBUG: # Synthèse des éléments du jury PE
"""Intègre le bilan des aggrégats (par promo) au zip final""" self.synthese = self.synthetise_juryPE()
for nom_aggregat in self.interclassements_taggues:
interclass_tag = self.interclassements_taggues[nom_aggregat]
filename = interclass_tag.get_repr().replace(" ", "_") + ".csv"
pe_comp.pe_print(f" - Export csv de {filename} ")
self.add_file_to_zip(
filename,
interclass_tag.str_tagtable(),
path="details_semestres",
)
"""Synthèse des éléments du jury PE""" # Export des données => mode 1 seule feuille -> supprimé
self.synthese = self.synthetise_juryPE() pe_comp.pe_print("*** Export du jury de synthese")
output = io.BytesIO()
# Export des données => mode 1 seule feuille -> supprimé with pd.ExcelWriter(output, engine="openpyxl") as writer:
pe_comp.pe_print("*** Export du jury de synthese") for onglet, df in self.synthese.items():
filename = "synthese_jury_" + str(self.diplome) + ".xlsx" # écriture dans l'onglet:
with pd.ExcelWriter(filename, engine="openpyxl") as writer: df.to_excel(writer, onglet, index=True, header=True)
for onglet in self.synthese: output.seek(0)
df = self.synthese[onglet]
df.to_excel(
writer, onglet, index=True, header=True
) # écriture dans l'onglet
# worksheet = writer.sheets[onglet] # l'on
self.add_file_to_zip( self.add_file_to_zip(
filename, zipfile, f"synthese_jury_{self.diplome}.xlsx", output.read()
open(filename, "rb").read(), )
)
# Fin !!!! Tada :) # Fin !!!! Tada :)
def add_file_to_zip(self, filename: str, data, path=""): def add_file_to_zip(self, zipfile: ZipFile, filename: str, data, path=""):
"""Add a file to our zip """Add a file to given zip
All files under NOM_EXPORT_ZIP/ All files under NOM_EXPORT_ZIP/
path may specify a subdirectory path may specify a subdirectory
Args: Args:
zipfile: ZipFile
filename: Le nom du fichier à intégrer au zip filename: Le nom du fichier à intégrer au zip
data: Les données du fichier data: Les données du fichier
path: Un dossier dans l'arborescence du zip path: Un dossier dans l'arborescence du zip
""" """
path_in_zip = os.path.join(path, filename) # self.nom_export_zip, path_in_zip = os.path.join(path, filename) # self.nom_export_zip,
self.zipfile.writestr(path_in_zip, data) zipfile.writestr(path_in_zip, data)
def get_zipped_data(self): def get_zipped_data(self) -> io.BytesIO | None:
"""returns file-like data with a zip of all generated (CSV) files. """returns file-like data with a zip of all generated (CSV) files.
Reset file cursor at the beginning ! Warning: reset stream to the begining.
""" """
if self.zipfile:
self.zipfile.close()
self.zipfile = None
self.zipdata.seek(0) self.zipdata.seek(0)
return self.zipdata return self.zipdata

View File

@ -284,8 +284,8 @@ def _make_table_notes(
columns_ids = ["etudid", "nom", "prenom"] columns_ids = ["etudid", "nom", "prenom"]
else: else:
columns_ids = ["nomprenom"] columns_ids = ["nomprenom"]
if not hide_groups and fmt not in {"xls", "xml", "json"}: if not hide_groups and fmt not in {"xml", "json"}:
# n'indique pas les groupes en xls, json car notation "humaine" ici # n'indique pas les groupes en xml et json car notation "humaine" ici
columns_ids.append("group") columns_ids.append("group")
titles = { titles = {

View File

@ -212,8 +212,10 @@ class ModuleTag(ScoTag):
# API # API
def module_tag_search(term): # TODO placer dans la vraie API et ne plus utiliser sco_publish
def module_tag_search(term: str | int):
"""List all used tag names (for auto-completion)""" """List all used tag names (for auto-completion)"""
term = "" if term is None else str(term)
# restrict charset to avoid injections # restrict charset to avoid injections
if not scu.ALPHANUM_EXP.match(term): if not scu.ALPHANUM_EXP.match(term):
data = [] data = []