Tableau recap. codes jury BUT

This commit is contained in:
Emmanuel Viennet 2022-06-25 12:32:00 +02:00
parent d776bdca66
commit cc4fd76187
3 changed files with 81 additions and 15 deletions

View File

@ -34,12 +34,17 @@ from app.scodoc.sco_exceptions import ScoValueError
def formsemestre_saisie_jury_but( 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: ) -> str:
"""formsemestre est un semestre PAIR """formsemestre est un semestre PAIR
Si readonly, ne montre pas le lien "saisir la décision" Si readonly, ne montre pas le lien "saisir la décision"
=> page html complète => page html complète
Si mode == "recap", table recap des codes, sans liens de saisie.
""" """
# Quick & Dirty # Quick & Dirty
# pour chaque etud de res2 trié # pour chaque etud de res2 trié
@ -55,7 +60,9 @@ def formsemestre_saisie_jury_but(
if formsemestre2.semestre_id % 2 != 0: if formsemestre2.semestre_id % 2 != 0:
raise ScoValueError("Cette page ne fonctionne que sur les semestres pairs") 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: if not rows:
return ( return (
'<div class="table_recap"><div class="message">aucun étudiant !</div></div>' '<div class="table_recap"><div class="message">aucun étudiant !</div></div>'
@ -63,8 +70,9 @@ def formsemestre_saisie_jury_but(
filename = scu.sanitize_filename( filename = scu.sanitize_filename(
f"""jury-but-{formsemestre2.titre_num()}-{time.strftime("%Y-%m-%d")}""" 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( 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 = [ H = [
html_sco_header.sco_header( html_sco_header.sco_header(
@ -77,16 +85,45 @@ def formsemestre_saisie_jury_but(
formsemestre_id=formsemestre2.id formsemestre_id=formsemestre2.id
), ),
] ]
if mode == "recap":
H.append(
"""<h3>Décisions de jury enregistrées pour les étudiants de ce semestre</h3>"""
)
H.append( H.append(
f""" f"""
{table_html} {table_html}
<div class="table_jury_but_links"> <div class="table_jury_but_links">
<p><a class="sdtlink" href="{url_for( """
)
if (mode == "recap") and not readonly:
H.append(
f"""
<p><a class="stdlink" href="{url_for(
"notes.formsemestre_saisie_jury",
scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre2.id)
}">Saisie des décisions du jury</a>
</p>"""
)
else:
H.append(
f"""
<p><a class="stdlink" href="{url_for(
"notes.formsemestre_validation_auto_but", "notes.formsemestre_validation_auto_but",
scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre2.id) scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre2.id)
}">Calcul automatique des décisions du jury</a></p> }">Calcul automatique des décisions du jury</a>
</p>
<p><a class="stdlink" href="{url_for(
"notes.formsemestre_jury_but_recap",
scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre2.id)
}">Tableau récapitulatif des décisions du jury</a>
</p>
"""
)
H.append(
f"""
</div> </div>
{html_sco_header.sco_footer()} {html_sco_header.sco_footer()}
@ -96,12 +133,12 @@ def formsemestre_saisie_jury_but(
def build_table_jury_but_html( 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: ) -> str:
"""assemble la table html""" """assemble la table html"""
footer_rows = [] # inutile pour l'instant, à voir XXX footer_rows = [] # inutilisé pour l'instant
H = [ H = [
f"""<div class="table_recap"><table class="table_recap apc jury table_jury_but" f"""<div class="table_recap"><table class="table_recap apc jury table_jury_but {klass}"
data-filename="{filename}">""" data-filename="{filename}">"""
] ]
# header # header
@ -274,7 +311,7 @@ class RowCollector:
def get_table_jury_but( def get_table_jury_but(
formsemestre2: FormSemestre, readonly: bool = False formsemestre2: FormSemestre, readonly: bool = False, mode="jury"
) -> tuple[list[dict], list[str], list[str]]: ) -> tuple[list[dict], list[str], list[str]]:
"""Construit la table des résultats annuels pour le jury BUT""" """Construit la table des résultats annuels pour le jury BUT"""
res2: ResultatsSemestreBUT = res_sem.load_formsemestre_results(formsemestre2) res2: ResultatsSemestreBUT = res_sem.load_formsemestre_results(formsemestre2)
@ -302,7 +339,7 @@ def get_table_jury_but(
"col_code_annee", "col_code_annee",
) )
# --- Le lien de saisie # --- Le lien de saisie
if not readonly: if not readonly and not mode == "recap":
row.add_cell( row.add_cell(
"lien_saisie", "lien_saisie",
"", "",
@ -316,6 +353,7 @@ def get_table_jury_but(
{"modif." if deca.code_valide else "saisie"} {"modif." if deca.code_valide else "saisie"}
décision</a> décision</a>
""", """,
"col_lien_saisie_but",
) )
rows.append(row.row) rows.append(row.row)
if len(rows) > 0: if len(rows) > 0:

View File

@ -1,6 +1,14 @@
// Tableau recap notes // Tableau recap notes
$(function () { $(function () {
$(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: // Les boutons dépendent du mode BUT ou classique:
let buttons = [ let buttons = [
{ {
@ -125,7 +133,7 @@ $(function () {
"columnDefs": [ "columnDefs": [
{ {
// cache les codes, le détail de l'identité, les groupes, les colonnes admission et les vides // 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, visible: false,
}, },
{ {
@ -175,10 +183,13 @@ $(function () {
$(this).addClass('selected'); $(this).addClass('selected');
} }
}); });
// Pour montrer et highlihter l'étudiant sélectionné: // Pour montrer et surligner l'étudiant sélectionné:
$(function () { $(function () {
document.querySelector("#row_selected").scrollIntoView(); let row_selected = document.querySelector("#row_selected");
window.scrollBy(0, -50); if (row_selected) {
document.querySelector("#row_selected").classList.add("selected"); row_selected.scrollIntoView();
window.scrollBy(0, -50);
row_selected.classList.add("selected");
}
}); });
}); });

View File

@ -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( sco_publish(
"/formsemestre_lettres_individuelles", "/formsemestre_lettres_individuelles",
sco_pvjury.formsemestre_lettres_individuelles, sco_pvjury.formsemestre_lettres_individuelles,