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