formsemestre_status: affiche modules avec évals bloquées

This commit is contained in:
Emmanuel Viennet 2024-02-26 13:55:04 +01:00
parent 49a5ec488d
commit 0cf3b0a782
4 changed files with 31 additions and 11 deletions

View File

@ -205,6 +205,7 @@ class ResultatsSemestre(ResultatsCache):
"coefficient" : float, # 0 si None "coefficient" : float, # 0 si None
"description" : str, # de l'évaluation, "" si None "description" : str, # de l'évaluation, "" si None
"etat" { "etat" {
"blocked" : bool, # vrai si prise en compte bloquée
"evalcomplete" : bool, "evalcomplete" : bool,
"last_modif" : datetime.datetime | None, # saisie de note la plus récente "last_modif" : datetime.datetime | None, # saisie de note la plus récente
"nb_notes" : int, # nb notes d'étudiants inscrits "nb_notes" : int, # nb notes d'étudiants inscrits
@ -232,13 +233,14 @@ class ResultatsSemestre(ResultatsCache):
return { return {
"coefficient": evaluation.coefficient, "coefficient": evaluation.coefficient,
"description": evaluation.description, "description": evaluation.description,
"evaluation_id": evaluation.id,
"jour": evaluation.date_debut or datetime.datetime(1900, 1, 1),
"etat": { "etat": {
"blocked": evaluation.is_blocked(),
"evalcomplete": etat.is_complete, "evalcomplete": etat.is_complete,
"nb_notes": etat.nb_notes, "nb_notes": etat.nb_notes,
"last_modif": last_modif, "last_modif": last_modif,
}, },
"evaluation_id": evaluation.id,
"jour": evaluation.date_debut or datetime.datetime(1900, 1, 1),
"publish_incomplete": evaluation.publish_incomplete, "publish_incomplete": evaluation.publish_incomplete,
} }

View File

@ -273,8 +273,9 @@ def do_evaluation_etat(
def _summarize_evals_etats(etat_evals: list[dict]) -> dict: def _summarize_evals_etats(etat_evals: list[dict]) -> dict:
"""Synthétise les états d'une liste d'évaluations """Synthétise les états d'une liste d'évaluations
evals: list of mappings (etats), evals: list of mappings (etats),
utilise e["etat"]["evalcomplete"], e["etat"]["nb_notes"], e["etat"]["last_modif"] utilise e["blocked"], e["etat"]["evalcomplete"], e["etat"]["nb_notes"], e["etat"]["last_modif"]
-> ->
nb_evals : nb total qcq soit état
nb_eval_completes (= prises en compte) nb_eval_completes (= prises en compte)
nb_evals_en_cours (= avec des notes, mais pas complete) nb_evals_en_cours (= avec des notes, mais pas complete)
nb_evals_vides (= sans aucune note) nb_evals_vides (= sans aucune note)
@ -282,14 +283,16 @@ def _summarize_evals_etats(etat_evals: list[dict]) -> dict:
Une eval est "complete" ssi tous les etudiants *inscrits* ont une note. Une eval est "complete" ssi tous les etudiants *inscrits* ont une note.
""" """
nb_evals_completes, nb_evals_en_cours, nb_evals_vides = 0, 0, 0 nb_evals_completes, nb_evals_en_cours, nb_evals_vides, nb_evals_blocked = 0, 0, 0, 0
dates = [] dates = []
for e in etat_evals: for e in etat_evals:
if e["etat"]["blocked"]:
nb_evals_blocked += 1
if e["etat"]["evalcomplete"]: if e["etat"]["evalcomplete"]:
nb_evals_completes += 1 nb_evals_completes += 1
elif e["etat"]["nb_notes"] == 0: elif e["etat"]["nb_notes"] == 0:
nb_evals_vides += 1 nb_evals_vides += 1
else: elif not e["etat"]["blocked"]:
nb_evals_en_cours += 1 nb_evals_en_cours += 1
last_modif = e["etat"]["last_modif"] last_modif = e["etat"]["last_modif"]
if last_modif is not None: if last_modif is not None:
@ -299,6 +302,8 @@ def _summarize_evals_etats(etat_evals: list[dict]) -> dict:
last_modif = sorted(dates)[-1] if dates else "" last_modif = sorted(dates)[-1] if dates else ""
return { return {
"nb_evals": len(etat_evals),
"nb_evals_blocked": nb_evals_blocked,
"nb_evals_completes": nb_evals_completes, "nb_evals_completes": nb_evals_completes,
"nb_evals_en_cours": nb_evals_en_cours, "nb_evals_en_cours": nb_evals_en_cours,
"nb_evals_vides": nb_evals_vides, "nb_evals_vides": nb_evals_vides,

View File

@ -1235,6 +1235,7 @@ def formsemestre_tableau_modules(
and etat["nb_evals_en_cours"] == 0 and etat["nb_evals_en_cours"] == 0
and etat["nb_evals_vides"] == 0 and etat["nb_evals_vides"] == 0
and not etat["attente"] and not etat["attente"]
and not etat["nb_evals_blocked"] > 0
): ):
tr_classes = f"formsemestre_status_green{fontorange}" tr_classes = f"formsemestre_status_green{fontorange}"
else: else:
@ -1243,6 +1244,8 @@ def formsemestre_tableau_modules(
tr_classes += " modimpl_attente" tr_classes += " modimpl_attente"
if not mod_is_conforme: if not mod_is_conforme:
tr_classes += " modimpl_non_conforme" tr_classes += " modimpl_non_conforme"
if etat["nb_evals_blocked"] > 0:
tr_classes += " modimpl_has_blocked"
H.append( H.append(
f""" f"""
<tr class="{tr_classes}"> <tr class="{tr_classes}">
@ -1284,17 +1287,20 @@ def formsemestre_tableau_modules(
ModuleType.SAE, ModuleType.SAE,
): ):
H.append('<td class="evals">') H.append('<td class="evals">')
nb_evals = ( nb_evals = etat["nb_evals"]
etat["nb_evals_completes"]
+ etat["nb_evals_en_cours"]
+ etat["nb_evals_vides"]
)
if nb_evals != 0: if nb_evals != 0:
if etat["nb_evals_blocked"] > 0:
blocked_txt = f""", <span class="nb_evals_blocked">{
etat["nb_evals_blocked"]} bloquée{'s'
if etat["nb_evals_blocked"] > 1 else ''}</span>"""
else:
blocked_txt = ""
H.append( H.append(
f"""<a href="{moduleimpl_status_url}" f"""<a href="{moduleimpl_status_url}"
title="les évaluations 'ok' sont celles prises en compte dans les calculs" title="les évaluations 'ok' sont celles prises en compte dans les calculs"
class="formsemestre_status_link">{nb_evals} prévues, class="formsemestre_status_link">{nb_evals} prévues,
{etat["nb_evals_completes"]} ok</a>""" {etat["nb_evals_completes"]} ok {blocked_txt}
</a>"""
) )
if etat["nb_evals_en_cours"] > 0: if etat["nb_evals_en_cours"] > 0:
H.append( H.append(

View File

@ -1821,6 +1821,13 @@ tr.modimpl_non_conforme td, tr.modimpl_attente td {
padding-top: 4px; padding-top: 4px;
padding-bottom: 4px; padding-bottom: 4px;
} }
tr.modimpl_has_blocked span.nb_evals_blocked {
font-weight: bold;
color: red;
background-color: yellow;
padding-left: 2px;
padding-right: 2px;
}
table.formsemestre_status a.redlink { table.formsemestre_status a.redlink {
text-decoration: none; text-decoration: none;
} }