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
6 changed files with 65 additions and 24 deletions
Showing only changes of commit 802e8f4648 - Show all commits

View File

@ -35,7 +35,9 @@ class ParametrageClasseurPE(FlaskForm):
cohorte_restreinte = BooleanField( cohorte_restreinte = BooleanField(
"Restreindre aux étudiants inscrits dans le semestre" "Restreindre aux étudiants inscrits dans le semestre"
) )
moyennes_tags = BooleanField("Générer les moyennes sur les tags de modules") moyennes_tags = BooleanField(
"Générer les moyennes sur les tags de modules personnalisés (cf. programme de formation)"
)
moyennes_ue_res_sae = BooleanField( moyennes_ue_res_sae = BooleanField(
"Générer les moyennes des ressources et des SAEs par UE" "Générer les moyennes des ressources et des SAEs par UE"
) )

View File

@ -56,10 +56,11 @@ class ResSemBUTTag(ResultatsSemestreBUT, pe_tabletags.TableTag):
Il s'appuie principalement sur un ResultatsSemestreBUT. Il s'appuie principalement sur un ResultatsSemestreBUT.
""" """
def __init__(self, formsemestre: FormSemestre): def __init__(self, formsemestre: FormSemestre, options={}):
""" """
Args: Args:
formsemestre: le ``FormSemestre`` sur lequel il se base formsemestre: le ``FormSemestre`` sur lequel il se base
options: Un dictionnaire d'options
""" """
ResultatsSemestreBUT.__init__(self, formsemestre) ResultatsSemestreBUT.__init__(self, formsemestre)
pe_tabletags.TableTag.__init__(self) pe_tabletags.TableTag.__init__(self)
@ -118,7 +119,11 @@ class ResSemBUTTag(ResultatsSemestreBUT, pe_tabletags.TableTag):
pe_affichage.pe_print(f"--> UEs/Compétences : {aff}") pe_affichage.pe_print(f"--> UEs/Compétences : {aff}")
# Les tags personnalisés et auto: # Les tags personnalisés et auto:
tags_dict = self._get_tags_dict() if "moyennes_tags" in options:
tags_dict = self._get_tags_dict(avec_moyennes_tags=options["moyennes_tags"])
else:
tags_dict = self._get_tags_dict()
pe_affichage.pe_print( pe_affichage.pe_print(
f"""--> {pe_affichage.aff_tags_par_categories(tags_dict)}""" f"""--> {pe_affichage.aff_tags_par_categories(tags_dict)}"""
) )
@ -347,7 +352,7 @@ class ResSemBUTTag(ResultatsSemestreBUT, pe_tabletags.TableTag):
return df_ues return df_ues
def _get_tags_dict(self): def _get_tags_dict(self, avec_moyennes_tags=True):
"""Renvoie les tags personnalisés (déduits des modules du semestre) """Renvoie les tags personnalisés (déduits des modules du semestre)
et les tags automatiques ('but'), et toutes leurs informations, et les tags automatiques ('but'), et toutes leurs informations,
dans un dictionnaire de la forme : dans un dictionnaire de la forme :
@ -359,10 +364,12 @@ class ResSemBUTTag(ResultatsSemestreBUT, pe_tabletags.TableTag):
Le dictionnaire structuré des tags ("personnalises" vs. "auto") Le dictionnaire structuré des tags ("personnalises" vs. "auto")
""" """
dict_tags = {"personnalises": dict(), "auto": dict()} dict_tags = {"personnalises": dict(), "auto": dict()}
# Les tags perso
dict_tags["personnalises"] = get_synthese_tags_personnalises_semestre( if avec_moyennes_tags:
self.formsemestre # Les tags perso (seulement si l'option d'utiliser les tags perso est choisie)
) dict_tags["personnalises"] = get_synthese_tags_personnalises_semestre(
self.formsemestre
)
# Les tags automatiques # Les tags automatiques
# Déduit des compétences # Déduit des compétences

View File

@ -127,10 +127,15 @@ def aff_tags_par_categories(dict_tags):
""" """
noms_tags_perso = sorted(list(set(dict_tags["personnalises"].keys()))) noms_tags_perso = sorted(list(set(dict_tags["personnalises"].keys())))
noms_tags_auto = sorted(list(set(dict_tags["auto"].keys()))) # + noms_tags_comp noms_tags_auto = sorted(list(set(dict_tags["auto"].keys()))) # + noms_tags_comp
aff_tags_auto = ", ".join([f"👜{nom}" for nom in noms_tags_auto]) if noms_tags_perso:
aff_tags_perso = ", ".join([f"👜{nom}" for nom in noms_tags_perso]) aff_tags_perso = ", ".join([f"👜{nom}" for nom in noms_tags_perso])
aff_tags_auto = ", ".join([f"👜{nom}" for nom in noms_tags_auto])
return f"Tags du programme de formation : {aff_tags_perso} + Automatiques : {aff_tags_auto}"
else:
aff_tags_auto = ", ".join([f"👜{nom}" for nom in noms_tags_auto])
return f"Tags automatiques {aff_tags_auto} (aucun tag personnalisé)"
# Affichage # Affichage
return f"Tags du programme de formation : {aff_tags_perso} + Automatiques : {aff_tags_auto}"
def aff_trajectoires_suivies_par_etudiants(etudiants): def aff_trajectoires_suivies_par_etudiants(etudiants):

View File

@ -75,22 +75,46 @@ class JuryPE(object):
1. l'année d'obtention du DUT, 1. l'année d'obtention du DUT,
2. tous les étudiants susceptibles à ce stade (au regard de leur parcours) d'être diplomés. 2. tous les étudiants susceptibles à ce stade (au regard de leur parcours) d'être diplomés.
Les options sont :
``
options = {
"cohorte_restreinte": False,
"moyennes_tags": True,
"moyennes_ue_res_sae": True,
"moyennes_ues_rcues": True,
"min_max_moy": False,
"synthese_individuelle_etud": False,
}
Args: Args:
diplome : l'année d'obtention du diplome BUT et du jury de PE (généralement février XXXX) diplome : l'année d'obtention du diplome BUT et du jury de PE (généralement février XXXX)
""" """
def __init__(self, diplome: int): def __init__(self, diplome: int, formsemestre_id_base, options=None):
pe_affichage.pe_start_log() pe_affichage.pe_start_log()
self.diplome = diplome self.diplome = diplome
"L'année du diplome" "L'année du diplome"
self.formsemestre_id_base = formsemestre_id_base
"""L'identifiant du formsemestre ayant servi à lancer le jury"""
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" "Nom du zip où ranger les fichiers générés"
# Les options
self.options = options
"""Options de configuration"""
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, info=True,
) )
pe_affichage.pe_print("Options", info=True)
for cle, val in self.options.items():
pe_affichage.pe_print(f" > {cle} -> {val}", 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"""***********************************************************""" f"""***********************************************************"""
@ -180,7 +204,7 @@ class JuryPE(object):
self.ressembuttags = {} self.ressembuttags = {}
for frmsem_id, formsemestre in formsemestres.items(): for frmsem_id, formsemestre in formsemestres.items():
# Crée le semestre_tag et exécute les calculs de moyennes # Crée le semestre_tag et exécute les calculs de moyennes
ressembuttag = pe_ressemtag.ResSemBUTTag(formsemestre) ressembuttag = pe_ressemtag.ResSemBUTTag(formsemestre, options=self.options)
self.ressembuttags[frmsem_id] = ressembuttag self.ressembuttags[frmsem_id] = ressembuttag
# Ajoute les étudiants découverts dans les ressembuttags aux données des étudiants # Ajoute les étudiants découverts dans les ressembuttags aux données des étudiants
# nbre_etudiants_ajoutes = self.etudiants.add_etudiants( # nbre_etudiants_ajoutes = self.etudiants.add_etudiants(
@ -529,9 +553,10 @@ class JuryPE(object):
pe_affichage.pe_print(f"=> Export excel de {', '.join(onglets)}", info=True) pe_affichage.pe_print(f"=> Export excel de {', '.join(onglets)}", info=True)
output.seek(0) output.seek(0)
self.add_file_to_zip( if onglets:
zipfile, f"synthese_jury_{self.diplome}_par_tag.xlsx", output.read() self.add_file_to_zip(
) zipfile, f"synthese_jury_{self.diplome}_par_tag.xlsx", output.read()
)
def _gen_html_synthese_par_etudiant(self, zipfile: ZipFile): def _gen_html_synthese_par_etudiant(self, zipfile: ZipFile):
"""Synthèse des éléments du jury PE, étudiant par étudiant""" """Synthèse des éléments du jury PE, étudiant par étudiant"""

View File

@ -77,7 +77,10 @@ def pe_view_sem_recap(formsemestre_id: int):
form = ParametrageClasseurPE() form = ParametrageClasseurPE()
cosemestres_tries = pe_comp.tri_semestres_par_rang(cosemestres) cosemestres_tries = pe_comp.tri_semestres_par_rang(cosemestres)
affichage_cosemestres_tries = {rang: ", ".join([sem.titre_annee() for sem in cosemestres_tries[rang]]) for rang in cosemestres_tries} affichage_cosemestres_tries = {
rang: ", ".join([sem.titre_annee() for sem in cosemestres_tries[rang]])
for rang in cosemestres_tries
}
if request.method == "GET": if request.method == "GET":
return render_template( return render_template(
"pe/pe_view_sem_recap.j2", "pe/pe_view_sem_recap.j2",
@ -86,12 +89,12 @@ def pe_view_sem_recap(formsemestre_id: int):
formsemestre=formsemestre, formsemestre=formsemestre,
sco=ScoData(formsemestre=formsemestre), sco=ScoData(formsemestre=formsemestre),
cosemestres=affichage_cosemestres_tries, cosemestres=affichage_cosemestres_tries,
rangs_tries=sorted(affichage_cosemestres_tries.keys()) rangs_tries=sorted(affichage_cosemestres_tries.keys()),
) )
# request.method == "POST" # request.method == "POST"
if form.validate_on_submit(): if form.validate_on_submit():
jury = pe_jury.JuryPE(annee_diplome, options=form.data) jury = pe_jury.JuryPE(annee_diplome, formsemestre_id, options=form.data)
if not jury.diplomes_ids: if not jury.diplomes_ids:
flash("aucun étudiant à considérer !") flash("aucun étudiant à considérer !")
return redirect( return redirect(

View File

@ -43,11 +43,7 @@
<h3>Avis de poursuites d'études de la promo {{ annee_diplome }}</h3> <h3>Avis de poursuites d'études de la promo {{ annee_diplome }}</h3>
{{ wtf.quick_form(form) }}
<div class="help" style="margin-top: 16px;">
Seront (a minima) pris en compte les étudiants ayant été inscrits aux semestres suivants :
<div class="help">
Seront pris en compte les étudiants ayant (au moins) été inscrits à l'un des semestres suivants : Seront pris en compte les étudiants ayant (au moins) été inscrits à l'un des semestres suivants :
<ul> <ul>
@ -57,6 +53,9 @@
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
</div>
<h3>Options</h3>
{{ wtf.quick_form(form) }}
{% endblock app_content %} {% endblock app_content %}