forked from ScoDoc/ScoDoc
Update opolka/ScoDoc from ScoDoc/ScoDoc #2
@ -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}"
|
||||||
self.zipdata = io.BytesIO()
|
"Nom du zip où ranger les fichiers générés"
|
||||||
self.zipfile = ZipFile(self.zipdata, "w")
|
|
||||||
|
|
||||||
"""Chargement des étudiants à prendre en compte dans le jury"""
|
self.zipdata = io.BytesIO()
|
||||||
|
with ZipFile(self.zipdata, "w") as zipfile:
|
||||||
|
# Chargement des étudiants à prendre en compte dans le jury
|
||||||
pe_comp.pe_print(
|
pe_comp.pe_print(
|
||||||
f"""*** Recherche et chargement des étudiants diplômés en {
|
f"""*** Recherche et chargement des étudiants diplômés en {
|
||||||
self.diplome} pour la formation {self.formation_id}"""
|
self.diplome} pour la formation {self.formation_id}"""
|
||||||
)
|
)
|
||||||
self.etudiants = EtudiantsJuryPE(self.diplome) # Les infos sur les étudiants
|
self.etudiants = EtudiantsJuryPE(
|
||||||
|
self.diplome
|
||||||
|
) # Les infos sur les étudiants
|
||||||
self.etudiants.find_etudiants(self.formation_id)
|
self.etudiants.find_etudiants(self.formation_id)
|
||||||
self.diplomes_ids = self.etudiants.diplomes_ids
|
self.diplomes_ids = self.etudiants.diplomes_ids
|
||||||
|
|
||||||
"""Génère les semestres taggués (avec le calcul des moyennes) pour le jury PE"""
|
# Génère les semestres taggués (avec le calcul des moyennes) pour le jury PE
|
||||||
pe_comp.pe_print("*** Génère les semestres taggués")
|
pe_comp.pe_print("*** Génère les semestres taggués")
|
||||||
self.semestres_taggues = compute_semestres_tag(self.etudiants)
|
self.semestres_taggues = compute_semestres_tag(self.etudiants)
|
||||||
|
|
||||||
if pe_comp.PE_DEBUG:
|
if pe_comp.PE_DEBUG:
|
||||||
"""Intègre le bilan des semestres taggués au zip final"""
|
# Intègre le bilan des semestres taggués au zip final
|
||||||
for fid in self.semestres_taggues:
|
for formsemestretag in self.semestres_taggues.values():
|
||||||
formsemestretag = self.semestres_taggues[fid]
|
|
||||||
filename = formsemestretag.nom.replace(" ", "_") + ".csv"
|
filename = formsemestretag.nom.replace(" ", "_") + ".csv"
|
||||||
pe_comp.pe_print(f" - Export csv de {filename} ")
|
pe_comp.pe_print(f" - Export csv de {filename} ")
|
||||||
self.add_file_to_zip(
|
self.add_file_to_zip(
|
||||||
filename, formsemestretag.str_tagtable(), path="details_semestres"
|
zipfile,
|
||||||
|
filename,
|
||||||
|
formsemestretag.str_tagtable(),
|
||||||
|
path="details_semestres",
|
||||||
)
|
)
|
||||||
|
|
||||||
"""Génère les trajectoires (combinaison de semestres suivis
|
# Génère les trajectoires (combinaison de semestres suivis
|
||||||
par un étudiant pour atteindre le semestre final d'un aggrégat)
|
# par un étudiant pour atteindre le semestre final d'un aggrégat)
|
||||||
"""
|
|
||||||
pe_comp.pe_print(
|
pe_comp.pe_print(
|
||||||
"*** Génère les trajectoires (différentes combinaisons de semestres) des étudiants"
|
"*** Génère les trajectoires (différentes combinaisons de semestres) des étudiants"
|
||||||
)
|
)
|
||||||
self.trajectoires = TrajectoiresJuryPE(self.diplome)
|
self.trajectoires = TrajectoiresJuryPE(self.diplome)
|
||||||
self.trajectoires.cree_trajectoires(self.etudiants)
|
self.trajectoires.cree_trajectoires(self.etudiants)
|
||||||
|
|
||||||
"""Génère les moyennes par tags des trajectoires"""
|
# Génère les moyennes par tags des trajectoires
|
||||||
pe_comp.pe_print("*** Calcule les moyennes par tag des trajectoires possibles")
|
pe_comp.pe_print(
|
||||||
|
"*** Calcule les moyennes par tag des trajectoires possibles"
|
||||||
|
)
|
||||||
self.trajectoires_tagguees = compute_trajectoires_tag(
|
self.trajectoires_tagguees = compute_trajectoires_tag(
|
||||||
self.trajectoires, self.etudiants, self.semestres_taggues
|
self.trajectoires, self.etudiants, self.semestres_taggues
|
||||||
)
|
)
|
||||||
|
|
||||||
if pe_comp.PE_DEBUG:
|
if pe_comp.PE_DEBUG:
|
||||||
"""Intègre le bilan des trajectoires tagguées au zip final"""
|
# Intègre le bilan des trajectoires tagguées au zip final
|
||||||
for trajectoire_id in self.trajectoires_tagguees:
|
for trajectoire_tagguee in self.trajectoires_tagguees.values():
|
||||||
trajectoire_tagguee = self.trajectoires_tagguees[trajectoire_id]
|
|
||||||
filename = trajectoire_tagguee.get_repr().replace(" ", "_") + ".csv"
|
filename = trajectoire_tagguee.get_repr().replace(" ", "_") + ".csv"
|
||||||
pe_comp.pe_print(f" - Export csv de {filename} ")
|
pe_comp.pe_print(f" - Export csv de {filename} ")
|
||||||
self.add_file_to_zip(
|
self.add_file_to_zip(
|
||||||
|
zipfile,
|
||||||
filename,
|
filename,
|
||||||
trajectoire_tagguee.str_tagtable(),
|
trajectoire_tagguee.str_tagtable(),
|
||||||
path="details_semestres",
|
path="details_semestres",
|
||||||
)
|
)
|
||||||
|
|
||||||
"""Génère les interclassements (par promo et) par (nom d') aggrégat"""
|
# Génère les interclassements (par promo et) par (nom d') aggrégat
|
||||||
pe_comp.pe_print("*** Génère les interclassements par aggrégat")
|
pe_comp.pe_print("*** Génère les interclassements par aggrégat")
|
||||||
self.interclassements_taggues = compute_interclassements(
|
self.interclassements_taggues = compute_interclassements(
|
||||||
self.etudiants, self.trajectoires, self.trajectoires_tagguees
|
self.etudiants, self.trajectoires, self.trajectoires_tagguees
|
||||||
)
|
)
|
||||||
|
|
||||||
if pe_comp.PE_DEBUG:
|
if pe_comp.PE_DEBUG:
|
||||||
"""Intègre le bilan des aggrégats (par promo) au zip final"""
|
# Intègre le bilan des aggrégats (par promo) au zip final
|
||||||
for nom_aggregat in self.interclassements_taggues:
|
for interclass_tag in self.interclassements_taggues.values():
|
||||||
interclass_tag = self.interclassements_taggues[nom_aggregat]
|
|
||||||
filename = interclass_tag.get_repr().replace(" ", "_") + ".csv"
|
filename = interclass_tag.get_repr().replace(" ", "_") + ".csv"
|
||||||
pe_comp.pe_print(f" - Export csv de {filename} ")
|
pe_comp.pe_print(f" - Export csv de {filename} ")
|
||||||
self.add_file_to_zip(
|
self.add_file_to_zip(
|
||||||
|
zipfile,
|
||||||
filename,
|
filename,
|
||||||
interclass_tag.str_tagtable(),
|
interclass_tag.str_tagtable(),
|
||||||
path="details_semestres",
|
path="details_semestres",
|
||||||
)
|
)
|
||||||
|
|
||||||
"""Synthèse des éléments du jury PE"""
|
# Synthèse des éléments du jury PE
|
||||||
self.synthese = self.synthetise_juryPE()
|
self.synthese = self.synthetise_juryPE()
|
||||||
|
|
||||||
# Export des données => mode 1 seule feuille -> supprimé
|
# Export des données => mode 1 seule feuille -> supprimé
|
||||||
pe_comp.pe_print("*** Export du jury de synthese")
|
pe_comp.pe_print("*** Export du jury de synthese")
|
||||||
filename = "synthese_jury_" + str(self.diplome) + ".xlsx"
|
output = io.BytesIO()
|
||||||
with pd.ExcelWriter(filename, engine="openpyxl") as writer:
|
|
||||||
for onglet in self.synthese:
|
with pd.ExcelWriter(output, engine="openpyxl") as writer:
|
||||||
df = self.synthese[onglet]
|
for onglet, df in self.synthese.items():
|
||||||
df.to_excel(
|
# écriture dans l'onglet:
|
||||||
writer, onglet, index=True, header=True
|
df.to_excel(writer, onglet, index=True, header=True)
|
||||||
) # écriture dans l'onglet
|
output.seek(0)
|
||||||
# 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
|
||||||
|
|
||||||
|
@ -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 = {
|
||||||
|
@ -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 = []
|
||||||
|
Loading…
Reference in New Issue
Block a user