diff --git a/app/scodoc/sco_liste_notes.py b/app/scodoc/sco_liste_notes.py
index 733536c877ac2f9ac0cfcff88e49ff5f92df3915..b955814225fb60fcb68a0b9367227bb72665c167 100644
--- a/app/scodoc/sco_liste_notes.py
+++ b/app/scodoc/sco_liste_notes.py
@@ -310,10 +310,14 @@ def _make_table_notes(
rows = []
class KeyManager(dict):
- "comment : key (pour regrouper les comments a la fin)"
+ """(comment, date_saisie_iso) : key (pour regrouper les comments a la fin)
+ La date_saisie_iso est tronquée à la minute.
+ """
def __init__(self):
self.lastkey = 1
+ self.comment_to_idx = {}
+ self.sorted_keys = []
def nextkey(self) -> str:
"get new key (int)"
@@ -322,6 +326,20 @@ def _make_table_notes(
# self.lastkey = chr(ord(self.lastkey)+1)
return str(r)
+ def sort_keys(self):
+ "sort keys"
+ keys = sorted(self.keys(), key=lambda x: x[1]) # tri sur date
+ self.sorted_keys = keys
+ self.comment_to_idx = {k: i for i, k in enumerate(keys, start=1)}
+
+ def remplace_rows(self, rows):
+ "remplace les keys dans les rows"
+ for row in rows:
+ key = row.get("expl_key")
+ if key:
+ i = self.comment_to_idx[key]
+ row["expl_key"] = f"({i})"
+
key_mgr = KeyManager()
# code pour listings anonyme, à la place du nom
@@ -338,9 +356,7 @@ def _make_table_notes(
for etudid, etat in etudid_etats:
css_row_class = None
# infos identite etudiant
- etud: Identite = Identite.query.filter_by(
- id=etudid, dept_id=g.scodoc_dept_id
- ).first()
+ etud = Identite.get_etud(etudid, accept_none=True)
if etud is None:
continue
@@ -448,7 +464,11 @@ def _make_table_notes(
fmt=fmt,
)
columns_ids.append(e.id)
- #
+ # Renumerote les commentaires pour tri
+ # la colonne est 'expl_key' qui (explanation, date_saisie)
+ # on remplace par le numero
+ key_mgr.sort_keys()
+ key_mgr.remplace_rows(rows)
if args["anonymous_listing"]:
rows.sort(key=lambda x: x["code"] or "")
else:
@@ -669,22 +689,21 @@ def _make_table_notes(
<td style="padding-left: 50px; vertical-align: top;"><p>
"""
]
- commentkeys = list(key_mgr.items()) # [ (comment, key), ... ]
- commentkeys.sort(key=lambda x: int(x[1]))
- for comment, key in commentkeys:
+ for key in key_mgr.sorted_keys:
section_basse_html.append(
- f"""<span class="colcomment">({key})</span> <em>{comment}</em><br>"""
+ f"""<span class="colcomment">({key_mgr.comment_to_idx[key]})</span> <em>{key[0]}</em><br>"""
)
- if commentkeys:
+ if key_mgr.sorted_keys:
section_basse_html.append(
f"""<span><a class=stdlink" href="{ url_for(
- 'notes.evaluation_list_operations', scodoc_dept=g.scodoc_dept, evaluation_id=evaluation.id )
+ 'notes.evaluation_list_operations',
+ scodoc_dept=g.scodoc_dept, evaluation_id=evaluation.id )
}">Gérer les opérations</a></span><br>
"""
)
eval_info = ""
if evals_state[evaluation.id]["evalcomplete"]:
- eval_info = '<span class="eval_info eval_complete">Evaluation prise en compte dans les moyennes</span>'
+ eval_info = '<span class="eval_info eval_complete">Évaluation prise en compte dans les moyennes</span>'
elif evals_state[evaluation.id]["evalattente"]:
eval_info = '<span class="eval_info eval_attente">Il y a des notes en attente (les autres sont prises en compte)</span>'
else:
@@ -712,7 +731,7 @@ def _add_eval_columns(
row_note_max,
row_moys,
is_apc,
- K,
+ key_mgr,
note_sur_20,
keep_numeric,
fmt="html",
@@ -776,7 +795,11 @@ def _add_eval_columns(
sco_users.user_info(notes_db[etudid]["uid"])["nomcomplet"],
comment,
)
+ date_saisie = (
+ notes_db[etudid]["date"].replace(second=0, microsecond=0).isoformat()
+ )
else:
+ date_saisie = ""
if (etudid in etudids_actifs) and evaluation.publish_incomplete:
# Note manquante mais prise en compte immédiate: affiche ATT
val = scu.NOTES_ATTENTE
@@ -799,11 +822,9 @@ def _add_eval_columns(
row[f"_{evaluation.id}_td_attrs"] = f'class="{cell_class}" '
# regroupe les commentaires
if explanation:
- if explanation in K:
- expl_key = "(%s)" % K[explanation]
- else:
- K[explanation] = K.nextkey()
- expl_key = "(%s)" % K[explanation]
+ if (explanation, date_saisie) not in key_mgr:
+ key_mgr[(explanation, date_saisie)] = key_mgr.nextkey()
+ expl_key = (explanation, date_saisie)
else:
expl_key = ""