diff --git a/app/forms/pe/pe_sem_recap.py b/app/forms/pe/pe_sem_recap.py index 37fd155c3..5a1a4a67a 100644 --- a/app/forms/pe/pe_sem_recap.py +++ b/app/forms/pe/pe_sem_recap.py @@ -35,7 +35,9 @@ class ParametrageClasseurPE(FlaskForm): cohorte_restreinte = BooleanField( "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( "Générer les moyennes des ressources et des SAEs par UE" ) diff --git a/app/pe/moys/pe_ressemtag.py b/app/pe/moys/pe_ressemtag.py index bc1a5c071..1583e8530 100644 --- a/app/pe/moys/pe_ressemtag.py +++ b/app/pe/moys/pe_ressemtag.py @@ -56,10 +56,11 @@ class ResSemBUTTag(ResultatsSemestreBUT, pe_tabletags.TableTag): Il s'appuie principalement sur un ResultatsSemestreBUT. """ - def __init__(self, formsemestre: FormSemestre): + def __init__(self, formsemestre: FormSemestre, options={}): """ Args: formsemestre: le ``FormSemestre`` sur lequel il se base + options: Un dictionnaire d'options """ ResultatsSemestreBUT.__init__(self, formsemestre) pe_tabletags.TableTag.__init__(self) @@ -118,7 +119,11 @@ class ResSemBUTTag(ResultatsSemestreBUT, pe_tabletags.TableTag): pe_affichage.pe_print(f"--> UEs/Compétences : {aff}") # 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( f"""--> {pe_affichage.aff_tags_par_categories(tags_dict)}""" ) @@ -347,7 +352,7 @@ class ResSemBUTTag(ResultatsSemestreBUT, pe_tabletags.TableTag): 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) et les tags automatiques ('but'), et toutes leurs informations, dans un dictionnaire de la forme : @@ -359,10 +364,12 @@ class ResSemBUTTag(ResultatsSemestreBUT, pe_tabletags.TableTag): Le dictionnaire structuré des tags ("personnalises" vs. "auto") """ dict_tags = {"personnalises": dict(), "auto": dict()} - # Les tags perso - dict_tags["personnalises"] = get_synthese_tags_personnalises_semestre( - self.formsemestre - ) + + if avec_moyennes_tags: + # 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 # Déduit des compétences diff --git a/app/pe/pe_affichage.py b/app/pe/pe_affichage.py index 61547a378..9eed827f8 100644 --- a/app/pe/pe_affichage.py +++ b/app/pe/pe_affichage.py @@ -127,10 +127,15 @@ def aff_tags_par_categories(dict_tags): """ noms_tags_perso = sorted(list(set(dict_tags["personnalises"].keys()))) 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]) - aff_tags_perso = ", ".join([f"👜{nom}" for nom in noms_tags_perso]) + if 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 - return f"Tags du programme de formation : {aff_tags_perso} + Automatiques : {aff_tags_auto}" def aff_trajectoires_suivies_par_etudiants(etudiants): diff --git a/app/pe/pe_jury.py b/app/pe/pe_jury.py index 8d8636eb8..b1022c228 100644 --- a/app/pe/pe_jury.py +++ b/app/pe/pe_jury.py @@ -75,22 +75,46 @@ class JuryPE(object): 1. l'année d'obtention du DUT, 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: 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() self.diplome = 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}" "Nom du zip où ranger les fichiers générés" + # Les options + + self.options = options + """Options de configuration""" + pe_affichage.pe_print( f"Données de poursuite d'étude générées le {time.strftime('%d/%m/%Y à %H:%M')}\n", 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 pe_affichage.pe_print( f"""***********************************************************""" @@ -180,7 +204,7 @@ class JuryPE(object): self.ressembuttags = {} for frmsem_id, formsemestre in formsemestres.items(): # 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 # Ajoute les étudiants découverts dans les ressembuttags aux données des étudiants # 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) output.seek(0) - self.add_file_to_zip( - zipfile, f"synthese_jury_{self.diplome}_par_tag.xlsx", output.read() - ) + if onglets: + 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): """Synthèse des éléments du jury PE, étudiant par étudiant""" diff --git a/app/pe/pe_view.py b/app/pe/pe_view.py index 2195b0f4b..2add21ba8 100644 --- a/app/pe/pe_view.py +++ b/app/pe/pe_view.py @@ -77,7 +77,10 @@ def pe_view_sem_recap(formsemestre_id: int): form = ParametrageClasseurPE() 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": return render_template( "pe/pe_view_sem_recap.j2", @@ -86,12 +89,12 @@ def pe_view_sem_recap(formsemestre_id: int): formsemestre=formsemestre, sco=ScoData(formsemestre=formsemestre), cosemestres=affichage_cosemestres_tries, - rangs_tries=sorted(affichage_cosemestres_tries.keys()) + rangs_tries=sorted(affichage_cosemestres_tries.keys()), ) # request.method == "POST" 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: flash("aucun étudiant à considérer !") return redirect( diff --git a/app/templates/pe/pe_view_sem_recap.j2 b/app/templates/pe/pe_view_sem_recap.j2 index 2642ba724..0ef4f7cc7 100644 --- a/app/templates/pe/pe_view_sem_recap.j2 +++ b/app/templates/pe/pe_view_sem_recap.j2 @@ -43,11 +43,7 @@

Avis de poursuites d'études de la promo {{ annee_diplome }}

- {{ wtf.quick_form(form) }} -
- Seront (a minima) pris en compte les étudiants ayant été inscrits aux semestres suivants : -
Seront pris en compte les étudiants ayant (au moins) été inscrits à l'un des semestres suivants : -
+ +

Options

+ {{ wtf.quick_form(form) }} + {% endblock app_content %} \ No newline at end of file