From 9497c20a9d466afd6920491ad32b87098cfdf969 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Wed, 23 Mar 2022 22:30:22 +0100 Subject: [PATCH] recap_complet avec DataTables. + closes #295 --- app/scodoc/html_sco_header.py | 1 - app/scodoc/sco_liste_notes.py | 13 ++-- app/scodoc/sco_recapcomplet.py | 108 ++++++++++++++++++--------------- app/scodoc/sco_undo_notes.py | 3 +- app/static/css/scodoc.css | 11 ++++ app/static/js/scodoc.js | 8 ++- 6 files changed, 86 insertions(+), 58 deletions(-) diff --git a/app/scodoc/html_sco_header.py b/app/scodoc/html_sco_header.py index 6d128fd85..2cf0be400 100644 --- a/app/scodoc/html_sco_header.py +++ b/app/scodoc/html_sco_header.py @@ -105,7 +105,6 @@ _HTML_BEGIN = """ - - +
""" ] if sortcol: # sort table using JS sorttable H.append( """ """ % (int(sortcol)) ) - cells = '' - for i in range(len(F[0]) - 2): - if i in ue_index: - cls = "recap_tit_ue" - else: - cls = "recap_tit" - if ( - i == 0 or F[0][i] == "classement" - ): # Rang: force tri numerique pour sortable - cls = cls + " sortnumeric" - if F[0][i] in cod2mod: # lien vers etat module - modimpl = cod2mod[F[0][i]] - cells += '' % ( - cls, - modimpl.id, - modimpl.module.titre, - sco_users.user_info(modimpl.responsable_id)["nomcomplet"], - F[0][i], - ) - else: - cells += '' % (cls, F[0][i]) - if modejury: - cells += '' - ligne_titres = cells + "" - H.append(ligne_titres) # titres + + ligne_titres_head = _ligne_titres( + ue_index, F, cod2mod, modejury, with_modules_links=False + ) + ligne_titres_foot = _ligne_titres( + ue_index, F, cod2mod, modejury, with_modules_links=True + ) + + H.append("\n" + ligne_titres_head + "\n\n\n") if disable_etudlink: etudlink = "%(name)s" else: @@ -663,6 +629,9 @@ def make_formsemestre_recapcomplet( nblines = len(F) - 1 for l in F[1:]: etudid = l[-1] + if ir == nblines - 6: + H.append("") + H.append("") if ir >= nblines - 6: # dernieres lignes: el = l[1] @@ -692,7 +661,13 @@ def make_formsemestre_recapcomplet( for i in range(len(nsn)): if nsn[i] == "NA": nsn[i] = "-" - cells += '' % nsn[0] # rang + try: + order = int(nsn[0].split()[0]) + except: + order = 99999 + cells += ( + f'' # rang + ) cells += '' % el # nom etud (lien) if not hidebac: cells += '' % nsn[2] # bac @@ -760,7 +735,8 @@ def make_formsemestre_recapcomplet( cells += "" H.append(cells + "") - H.append(ligne_titres) + H.append(ligne_titres_foot) + H.append("") H.append("
%s%sDécision
%s{nsn[0]}%s%s
") # Form pour choisir partition de classement: @@ -828,6 +804,40 @@ def make_formsemestre_recapcomplet( raise ValueError("unknown format %s" % format) +def _ligne_titres(ue_index, F, cod2mod, modejury, with_modules_links=True): + """Cellules de la ligne de titre (haut ou bas)""" + cells = '' + for i in range(len(F[0]) - 2): + if i in ue_index: + cls = "recap_tit_ue" + else: + cls = "recap_tit" + attr = f'class="{cls}"' + if i == 0 or F[0][i] == "classement": # Rang: force tri numerique + try: + order = int(F[0][i].split()[0]) + except: + order = 99999 + attr += f' data-order="{order:05d}"' + if F[0][i] in cod2mod: # lien vers etat module + modimpl = cod2mod[F[0][i]] + if with_modules_links: + href = url_for( + "notes.moduleimpl_status", + scodoc_dept=g.scodoc_dept, + moduleimpl_id=modimpl.id, + ) + else: + href = "" + cells += f"""{F[0][i]}""" + else: + cells += f"{F[0][i]}" + if modejury: + cells += 'Décision' + return cells + "" + + def _list_notes_evals(evals: list[Evaluation], etudid: int) -> list[str]: """Liste des notes des evaluations completes de ce module (pour table xls avec evals) diff --git a/app/scodoc/sco_undo_notes.py b/app/scodoc/sco_undo_notes.py index 5d169b8bc..5cff6fe44 100644 --- a/app/scodoc/sco_undo_notes.py +++ b/app/scodoc/sco_undo_notes.py @@ -225,7 +225,8 @@ def formsemestre_list_saisies_notes(formsemestre_id, format="html"): columns_ids=columns_ids, rows=r, html_title="

Saisies de notes dans %s

" % sem["titreannee"], - html_class="table_leftalign table_coldate", + html_class="table_leftalign table_coldate gt_table_searchable", + html_class_ignore_default=True, html_sortable=True, caption="Saisies de notes dans %s" % sem["titreannee"], preferences=sco_preferences.SemPreferences(formsemestre_id), diff --git a/app/static/css/scodoc.css b/app/static/css/scodoc.css index 086a130e4..a20816462 100644 --- a/app/static/css/scodoc.css +++ b/app/static/css/scodoc.css @@ -3226,4 +3226,15 @@ span.ext_sem_moy { font-weight: bold; color: rgb(122, 40, 2); font-size: 120%; +} + +/* DataTables */ +table.dataTable tr.odd td { + background-color: #ecf5f4; +} +table.dataTable tr.gt_lastrow th { + text-align: right; +} +table.dataTable td.etudinfo, table.dataTable td.group { + text-align: left; } \ No newline at end of file diff --git a/app/static/js/scodoc.js b/app/static/js/scodoc.js index 7cb5bb626..25f4b26dd 100644 --- a/app/static/js/scodoc.js +++ b/app/static/js/scodoc.js @@ -67,7 +67,6 @@ $(function () { } }); - // Affiche un message transitoire function sco_message(msg, color) { if (color === undefined) { @@ -106,7 +105,7 @@ function get_query_args() { // Tables (gen_tables) $(function () { - $('table.gt_table').DataTable({ + var table_options = { "paging": false, "searching": false, "info": false, @@ -117,7 +116,10 @@ $(function () { }, "orderCellsTop": true, // cellules ligne 1 pour tri "aaSorting": [], // Prevent initial sorting - }); + }; + $('table.gt_table').DataTable(table_options); + table_options["searching"] = true; + $('table.gt_table_searchable').DataTable(table_options); });