diff --git a/app/but/jury_but_recap.py b/app/but/jury_but_recap.py
index 38e1fd68..a0a74b31 100644
--- a/app/but/jury_but_recap.py
+++ b/app/but/jury_but_recap.py
@@ -34,12 +34,17 @@ from app.scodoc.sco_exceptions import ScoValueError
def formsemestre_saisie_jury_but(
- formsemestre2: FormSemestre, readonly: bool = False, selected_etudid: int = None
+ formsemestre2: FormSemestre,
+ readonly: bool = False,
+ selected_etudid: int = None,
+ mode="jury",
) -> str:
"""formsemestre est un semestre PAIR
Si readonly, ne montre pas le lien "saisir la décision"
=> page html complète
+
+ Si mode == "recap", table recap des codes, sans liens de saisie.
"""
# Quick & Dirty
# pour chaque etud de res2 trié
@@ -55,7 +60,9 @@ def formsemestre_saisie_jury_but(
if formsemestre2.semestre_id % 2 != 0:
raise ScoValueError("Cette page ne fonctionne que sur les semestres pairs")
- rows, titles, column_ids = get_table_jury_but(formsemestre2, readonly=readonly)
+ rows, titles, column_ids = get_table_jury_but(
+ formsemestre2, readonly=readonly, mode=mode
+ )
if not rows:
return (
'
'
@@ -63,8 +70,9 @@ def formsemestre_saisie_jury_but(
filename = scu.sanitize_filename(
f"""jury-but-{formsemestre2.titre_num()}-{time.strftime("%Y-%m-%d")}"""
)
+ klass = "table_jury_but_bilan" if mode == "recap" else ""
table_html = build_table_jury_but_html(
- filename, rows, titles, column_ids, selected_etudid=selected_etudid
+ filename, rows, titles, column_ids, selected_etudid=selected_etudid, klass=klass
)
H = [
html_sco_header.sco_header(
@@ -77,16 +85,45 @@ def formsemestre_saisie_jury_but(
formsemestre_id=formsemestre2.id
),
]
+ if mode == "recap":
+ H.append(
+ """Décisions de jury enregistrées pour les étudiants de ce semestre
"""
+ )
H.append(
f"""
{table_html}
{html_sco_header.sco_footer()}
@@ -96,12 +133,12 @@ def formsemestre_saisie_jury_but(
def build_table_jury_but_html(
- filename: str, rows, titles, column_ids, selected_etudid: int = None
+ filename: str, rows, titles, column_ids, selected_etudid: int = None, klass=""
) -> str:
"""assemble la table html"""
- footer_rows = [] # inutile pour l'instant, à voir XXX
+ footer_rows = [] # inutilisé pour l'instant
H = [
- f""""""
]
# header
@@ -274,7 +311,7 @@ class RowCollector:
def get_table_jury_but(
- formsemestre2: FormSemestre, readonly: bool = False
+ formsemestre2: FormSemestre, readonly: bool = False, mode="jury"
) -> tuple[list[dict], list[str], list[str]]:
"""Construit la table des résultats annuels pour le jury BUT"""
res2: ResultatsSemestreBUT = res_sem.load_formsemestre_results(formsemestre2)
@@ -302,7 +339,7 @@ def get_table_jury_but(
"col_code_annee",
)
# --- Le lien de saisie
- if not readonly:
+ if not readonly and not mode == "recap":
row.add_cell(
"lien_saisie",
"",
@@ -316,6 +353,7 @@ def get_table_jury_but(
{"modif." if deca.code_valide else "saisie"}
décision
""",
+ "col_lien_saisie_but",
)
rows.append(row.row)
if len(rows) > 0:
diff --git a/app/static/js/table_recap.js b/app/static/js/table_recap.js
index 18829d8e..8d526441 100644
--- a/app/static/js/table_recap.js
+++ b/app/static/js/table_recap.js
@@ -1,6 +1,14 @@
// Tableau recap notes
$(function () {
$(function () {
+ let hidden_colums = ["codes", "identite_detail", "partition_aux", "partition_rangs", "admission", "col_empty"];
+ let mode_jury_but_bilan = $('table.table_recap').hasClass("table_jury_but_bilan");
+ if (mode_jury_but_bilan) {
+ // table bilan décisions: cache les notes
+ hidden_colums = hidden_colums.concat(["col_ue", "col_rcue", "col_lien_saisie_but"]);
+ } else {
+ hidden_colums = hidden_colums.concat(["recorded_code"]);
+ }
// Les boutons dépendent du mode BUT ou classique:
let buttons = [
{
@@ -125,7 +133,7 @@ $(function () {
"columnDefs": [
{
// cache les codes, le détail de l'identité, les groupes, les colonnes admission et les vides
- targets: ["codes", "identite_detail", "partition_aux", "partition_rangs", "admission", "col_empty", "recorded_code"],
+ targets: hidden_colums,
visible: false,
},
{
@@ -175,10 +183,13 @@ $(function () {
$(this).addClass('selected');
}
});
- // Pour montrer et highlihter l'étudiant sélectionné:
+ // Pour montrer et surligner l'étudiant sélectionné:
$(function () {
- document.querySelector("#row_selected").scrollIntoView();
- window.scrollBy(0, -50);
- document.querySelector("#row_selected").classList.add("selected");
+ let row_selected = document.querySelector("#row_selected");
+ if (row_selected) {
+ row_selected.scrollIntoView();
+ window.scrollBy(0, -50);
+ row_selected.classList.add("selected");
+ }
});
});
diff --git a/app/views/notes.py b/app/views/notes.py
index f00758b6..97aa43ba 100644
--- a/app/views/notes.py
+++ b/app/views/notes.py
@@ -2613,6 +2613,23 @@ def formsemestre_saisie_jury(formsemestre_id: int, selected_etudid: int = None):
)
+@bp.route("/formsemestre_jury_but_recap")
+@scodoc
+@permission_required(Permission.ScoView)
+@scodoc7func
+def formsemestre_jury_but_recap(formsemestre_id: int, selected_etudid: int = None):
+ """Tableau affichage des codes"""
+ readonly = not sco_permissions_check.can_validate_sem(formsemestre_id)
+ formsemestre = FormSemestre.query.get_or_404(formsemestre_id)
+ if not (formsemestre.formation.is_apc() and formsemestre.semestre_id % 2 == 0):
+ raise ScoValueError(
+ "formsemestre_jury_but_recap: réservé aux semestres pairs de BUT"
+ )
+ return jury_but_recap.formsemestre_saisie_jury_but(
+ formsemestre, readonly=readonly, selected_etudid=selected_etudid, mode="recap"
+ )
+
+
sco_publish(
"/formsemestre_lettres_individuelles",
sco_pvjury.formsemestre_lettres_individuelles,