diff --git a/app/scodoc/sco_undo_notes.py b/app/scodoc/sco_undo_notes.py
index d34b84385..9fbf4a228 100644
--- a/app/scodoc/sco_undo_notes.py
+++ b/app/scodoc/sco_undo_notes.py
@@ -180,7 +180,28 @@ def evaluation_list_operations(evaluation_id: int):
return tab.make_page()
-def formsemestre_list_saisies_notes(formsemestre_id, only_modifs=False, fmt="html"):
+def formsemestre_list_notes_intervenants(formsemestre: FormSemestre) -> list[User]:
+ "Liste des comptes ayant saisi au moins une note dans le semestre"
+ q1 = (
+ User.query.join(NotesNotes)
+ .join(Evaluation)
+ .join(ModuleImpl)
+ .filter_by(formsemestre_id=formsemestre.id)
+ .distinct()
+ )
+ q2 = (
+ User.query.join(NotesNotesLog)
+ .join(Evaluation, Evaluation.id == NotesNotesLog.evaluation_id)
+ .join(ModuleImpl)
+ .filter_by(formsemestre_id=formsemestre.id)
+ .distinct()
+ )
+ return sorted(q1.union(q2).all(), key=lambda x: x.sort_key())
+
+
+def formsemestre_list_saisies_notes(
+ formsemestre_id, only_modifs=False, user_name: str | None = None, fmt="html"
+):
"""Table listant toutes les opérations de saisies de notes, dans toutes
les évaluations du semestre.
"""
@@ -194,52 +215,67 @@ def formsemestre_list_saisies_notes(formsemestre_id, only_modifs=False, fmt="htm
.filter_by(formsemestre_id=formsemestre.id)
.order_by(model.date.desc())
)
-
+ if user_name:
+ user = db.session.query(User).filter_by(user_name=user_name).first()
+ if user:
+ notes_query = notes_query.join(User).filter(model.uid == user.id)
# Formate les notes
keep_numeric = fmt in scu.FORMATS_NUMERIQUES
rows = []
for note in notes_query:
ens = User.get_user(note.uid)
evaluation = note.evaluation
- rows.append(
- {
- "date": note.date.strftime(scu.DATEATIME_FMT),
- "_date_order": note.date.isoformat(),
- "code_nip": note.etudiant.code_nip,
- "nom": note.etudiant.nom_disp(),
- "prenom": note.etudiant.prenom_str,
- "date_evaluation": (
- evaluation.date_debut.strftime(scu.DATEATIME_FMT)
- if evaluation and note.evaluation.date_debut
- else ""
- ),
- "_date_evaluation_order": (
- note.evaluation.date_debut.isoformat()
- if evaluation and note.evaluation.date_debut
- else ""
- ),
- "value": scu.fmt_note(note.value, keep_numeric=keep_numeric),
- "module": (
- (
- note.evaluation.moduleimpl.module.code
- or note.evaluation.moduleimpl.module.titre
- )
- if evaluation
- else ""
- ),
- "evaluation": note.evaluation.description if evaluation else "",
- "_evaluation_target": (
- url_for(
- "notes.evaluation_listenotes",
- scodoc_dept=g.scodoc_dept,
- evaluation_id=note.evaluation_id,
- )
- if evaluation
- else ""
- ),
- "user_name": ens.user_name if ens else "",
- }
- )
+ row = {
+ "date": note.date.strftime(scu.DATEATIME_FMT),
+ "_date_order": note.date.isoformat(),
+ "code_nip": note.etudiant.code_nip,
+ "nom": note.etudiant.nom_disp(),
+ "prenom": note.etudiant.prenom_str,
+ "date_evaluation": (
+ evaluation.date_debut.strftime(scu.DATEATIME_FMT)
+ if evaluation and note.evaluation.date_debut
+ else ""
+ ),
+ "_date_evaluation_order": (
+ note.evaluation.date_debut.isoformat()
+ if evaluation and note.evaluation.date_debut
+ else ""
+ ),
+ "value": scu.fmt_note(note.value, keep_numeric=keep_numeric),
+ "module": (
+ (
+ note.evaluation.moduleimpl.module.code
+ or note.evaluation.moduleimpl.module.titre
+ )
+ if evaluation
+ else ""
+ ),
+ "evaluation": note.evaluation.description if evaluation else "",
+ "_evaluation_target": (
+ url_for(
+ "notes.evaluation_listenotes",
+ scodoc_dept=g.scodoc_dept,
+ evaluation_id=note.evaluation_id,
+ )
+ if evaluation
+ else ""
+ ),
+ "user_name": ens.user_name if ens else "",
+ }
+
+ if only_modifs:
+ # si c'est une modif de note, ajoute une colonne avec la nouvelle valeur
+ new = NotesNotes.query.filter_by(
+ evaluation_id=note.evaluation_id, etudid=note.etudid
+ ).first()
+ if new:
+ row["new_value"] = scu.fmt_note(new.value, keep_numeric=keep_numeric)
+ row["old_date"] = row["date"]
+ row["_old_date_order"] = row["_date_order"]
+ row["date"] = new.date.strftime(scu.DATEATIME_FMT)
+ row["_date_order"] = new.date.isoformat()
+
+ rows.append(row)
columns_ids = (
"date",
@@ -247,6 +283,13 @@ def formsemestre_list_saisies_notes(formsemestre_id, only_modifs=False, fmt="htm
"nom",
"prenom",
"value",
+ )
+ if only_modifs:
+ columns_ids += (
+ "new_value",
+ "old_date",
+ )
+ columns_ids += (
"user_name",
"module",
"evaluation",
@@ -257,7 +300,8 @@ def formsemestre_list_saisies_notes(formsemestre_id, only_modifs=False, fmt="htm
"code_nip": "NIP",
"nom": "nom",
"prenom": "prenom",
- "date": "Date",
+ "date": "Date modif." if only_modifs else "Date saisie",
+ "old_date": "Date saisie précédente",
"value": "Note",
"comment": "Remarque",
"user_name": "Enseignant",
@@ -266,6 +310,9 @@ def formsemestre_list_saisies_notes(formsemestre_id, only_modifs=False, fmt="htm
"evaluation": "Evaluation",
"date_evaluation": "Date éval.",
}
+ if only_modifs:
+ titles["value"] = "Ancienne note"
+ titles["new_value"] = "Nouvelle note"
table = GenTable(
titles=titles,
columns_ids=columns_ids,
@@ -277,13 +324,17 @@ def formsemestre_list_saisies_notes(formsemestre_id, only_modifs=False, fmt="htm
caption=f"Saisies de notes dans {formsemestre.titre_annee()}",
preferences=sco_preferences.SemPreferences(formsemestre_id),
base_url=f"""{request.base_url}?formsemestre_id={
- formsemestre_id}&only_modifs={int(only_modifs)}""",
+ formsemestre_id}&only_modifs={int(only_modifs)}"""
+ + (f"&user_name={user_name}" if user_name else ""),
origin=f"Généré par {sco_version.SCONAME} le " + scu.timedate_human_repr() + "",
table_id="formsemestre_list_saisies_notes",
filename=(
- f"modifs_notes_S{formsemestre.semestre_id}"
- if only_modifs
- else f"saisies_notes_S{formsemestre.semestre_id}"
+ (
+ f"modifs_notes-S{formsemestre.semestre_id}"
+ if only_modifs
+ else f"saisies_notes_S{formsemestre.semestre_id}"
+ )
+ + ("-" + user_name if user_name else "")
),
)
if fmt == "html":
@@ -293,6 +344,8 @@ def formsemestre_list_saisies_notes(formsemestre_id, only_modifs=False, fmt="htm
title="Opérations de saisies de notes",
only_modifs=only_modifs,
formsemestre_id=formsemestre.id,
+ intervenants=formsemestre_list_notes_intervenants(formsemestre),
+ user_name=user_name,
)
return table.make_page(fmt=fmt, page_title="Opérations de saisies de notes")
diff --git a/app/templates/formsemestre/list_saisies_notes.j2 b/app/templates/formsemestre/list_saisies_notes.j2
index 517d2142e..a7a5cb735 100644
--- a/app/templates/formsemestre/list_saisies_notes.j2
+++ b/app/templates/formsemestre/list_saisies_notes.j2
@@ -3,7 +3,7 @@
{% block styles %}
{{super()}}
@@ -22,7 +22,19 @@
{% if only_modifs %}checked{% endif %}>
Lister uniquement les modifications
- {{table.xls_export_button()|safe}} excel
+
+
+
+
+ {{table.xls_export_button()|safe}} excel
{{table.html()|safe}}
@@ -44,5 +56,16 @@
window.location.href = url.toString();
});
+
+ document.getElementById('user-select').addEventListener('change', function() {
+ var form = document.getElementById('filter-form');
+ var userName = this.value;
+
+ var url = new URL(window.location.href);
+ url.searchParams.set('formsemestre_id', {{formsemestre_id}});
+ url.searchParams.set('user_name', userName);
+
+ window.location.href = url.toString();
+ });
{% endblock %}
\ No newline at end of file
diff --git a/sco_version.py b/sco_version.py
index 9e646dd9c..768513011 100644
--- a/sco_version.py
+++ b/sco_version.py
@@ -3,7 +3,7 @@
"Infos sur version ScoDoc"
-SCOVERSION = "9.7.40"
+SCOVERSION = "9.7.41"
SCONAME = "ScoDoc"