From f5079d9aef72f16d5a16aca1810f9f89f87fa409 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sat, 23 Mar 2024 13:23:26 +0100 Subject: [PATCH] Jury BUT: affiche la liste des modules avec note en ATTente --- app/but/jury_but.py | 25 +++++++++++++++++++++---- app/static/css/jury_but.css | 7 +++++++ app/templates/scolar/index.j2 | 8 +++++++- app/views/notes.py | 34 +++++++++++++++++++++------------- 4 files changed, 56 insertions(+), 18 deletions(-) diff --git a/app/but/jury_but.py b/app/but/jury_but.py index fe670d70..87bbe472 100644 --- a/app/but/jury_but.py +++ b/app/but/jury_but.py @@ -77,7 +77,7 @@ from app.models.but_refcomp import ( ApcNiveau, ApcParcours, ) -from app.models import Evaluation, Scolog, ScolarAutorisationInscription +from app.models import Evaluation, ModuleImpl, Scolog, ScolarAutorisationInscription from app.models.but_validations import ( ApcValidationAnnee, ApcValidationRCUE, @@ -796,16 +796,33 @@ class DecisionsProposeesAnnee(DecisionsProposees): if self.formsemestre_pair is not None: sco_cache.invalidate_formsemestre(formsemestre_id=self.formsemestre_pair.id) - def has_notes_en_attente(self) -> bool: - "Vrai si l'étudiant a au moins une note en attente dans le semestre origine de ce deca" - res = ( + def _get_current_res(self) -> ResultatsSemestreBUT: + "Les res. du semestre d'origine du deca" + return ( self.res_pair if self.formsemestre_pair and (self.formsemestre.id == self.formsemestre_pair.id) else self.res_impair ) + + def has_notes_en_attente(self) -> bool: + "Vrai si l'étudiant a au moins une note en attente dans le semestre origine de ce deca" + res = self._get_current_res() return res and self.etud.id in res.get_etudids_attente() + def get_modimpls_attente(self) -> list[ModuleImpl]: + "Liste des ModuleImpl dans lesquels l'étudiant à au moins une note en ATTente" + res = self._get_current_res() + modimpls_results = [ + modimpl_result + for modimpl_result in res.modimpls_results.values() + if self.etud.id in modimpl_result.etudids_attente + ] + modimpls = [ + db.session.get(ModuleImpl, mr.moduleimpl_id) for mr in modimpls_results + ] + return sorted(modimpls, key=lambda mi: (mi.module.numero, mi.module.code)) + def record_all(self, only_validantes: bool = False) -> bool: """Enregistre les codes qui n'ont pas été spécifiés par le formulaire, et sont donc en mode "automatique". diff --git a/app/static/css/jury_but.css b/app/static/css/jury_but.css index c75c1a50..525c532f 100644 --- a/app/static/css/jury_but.css +++ b/app/static/css/jury_but.css @@ -19,6 +19,13 @@ font-weight: bold; } +ul.modimpls_att { + margin-top: 8px; + margin-left: 32px; + padding-top: 0; + color: black; +} + .jury_but h3 { margin-top: 0px; } diff --git a/app/templates/scolar/index.j2 b/app/templates/scolar/index.j2 index c5c243f2..8b93dee0 100644 --- a/app/templates/scolar/index.j2 +++ b/app/templates/scolar/index.j2 @@ -16,6 +16,10 @@ table.listesems tr td.titresem { font-weight: bold; font-size: 110%; } +div.semlist { + padding-right: 8px; +} + table.semlist tr td.datesem { text-align: center; white-space: nowrap; @@ -113,7 +117,9 @@ table.semlist tbody tr td.modalite { url_for('scolar.export_table_dept_formsemestres', scodoc_dept=g.scodoc_dept) }}">{{scu.ICON_XLS|safe}} - {{ html_table_formsemestres|safe }} +
+ {{ html_table_formsemestres|safe }} +
{% else %}

Jury BUT
-
{etud.nomprenom}
+
{etud.html_link_fiche()}
{etud.photo_html(title="fiche de " + etud.nomprenom)}
Impossible de statuer sur cet étudiant: il est démissionnaire ou défaillant (voir sa fiche) + etud.url_fiche()}">sa fiche)
{navigation_div} @@ -2461,17 +2460,27 @@ def formsemestre_validation_but( inscription = deca.formsemestre_impair.etuds_inscriptions.get(etud.id) if (not inscription) or inscription.etat != scu.INSCRIT: etat_ins = scu.ETATS_INSCRIPTION.get(inscription.etat, "inconnu?") - warning += f"""
{etat_ins} en S{deca.formsemestre_impair.semestre_id}
""" + warning += f"""
{etat_ins} + en S{deca.formsemestre_impair.semestre_id}
""" if deca.formsemestre_pair: inscription = deca.formsemestre_pair.etuds_inscriptions.get(etud.id) if (not inscription) or inscription.etat != scu.INSCRIT: etat_ins = scu.ETATS_INSCRIPTION.get(inscription.etat, "inconnu?") - warning += f"""
{etat_ins} en S{deca.formsemestre_pair.semestre_id}
""" + warning += f"""
{etat_ins} + en S{deca.formsemestre_pair.semestre_id}
""" if has_notes_en_attente: - warning += f"""
{etud.nomprenom} a des notes en ATTente. - Vous devez régler cela avant de statuer en jury !
""" + warning += f"""
{etud.html_link_fiche() + } a des notes en ATTente dans les modules suivants. + Vous devez régler cela avant de statuer en jury ! +
" if evaluations_a_debloquer: links_evals = [ f"""{warning}""" H.append( f"""
@@ -2492,16 +2503,13 @@ def formsemestre_validation_but(
Jury BUT{deca.annee_but} - Parcours {(deca.parcour.libelle if deca.parcour else False) or "non spécifié"} - {deca.annee_scolaire_str()}
-
{etud.nomprenom}
+
{etud.html_link_fiche()}
{etud.photo_html(title="fiche de " + etud.nomprenom)} + etud.url_fiche()}">{etud.photo_html(title="fiche de " + etud.nomprenom)}
-
{warning} -