diff --git a/app/static/css/scodoc.css b/app/static/css/scodoc.css index 0d6af0da..d827e227 100644 --- a/app/static/css/scodoc.css +++ b/app/static/css/scodoc.css @@ -3994,6 +3994,7 @@ div.table_recap { div.table_recap table.table_recap { width: auto; + /* font-family: Consolas, monaco, monospace; */ } table.table_recap tr.selected td { diff --git a/app/static/js/table_recap.js b/app/static/js/table_recap.js index 0e2f9f10..2c4882a9 100644 --- a/app/static/js/table_recap.js +++ b/app/static/js/table_recap.js @@ -11,7 +11,7 @@ $(function () { 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"]); + hidden_colums = hidden_colums.concat(["col_lien_saisie_but"]); } // Etat (tri des colonnes) de la table: @@ -32,7 +32,7 @@ $(function () { } } - // Les colonnes visibles étant mémorisé, il faut initialiser les titres des boutons + // Les colonnes visibles étant mémorisées, il faut initialiser les titres des boutons function update_buttons_labels(dt) { console.log("update_buttons_labels"); dt.buttons('toggle_ident:name').text(dt.columns(".identite_detail").visible()[0] ? "Nom seul" : "Civ/Nom/Prénom"); diff --git a/app/tables/jury_recap.py b/app/tables/jury_recap.py index ba2d09c8..db9b4238 100644 --- a/app/tables/jury_recap.py +++ b/app/tables/jury_recap.py @@ -35,6 +35,8 @@ from app.scodoc import sco_pvjury from app.scodoc import sco_utils as scu from app.tables.recap import RowRecap, TableRecap +EMO_EMPTY_CODE_JURY = "🏮" # "🍽" "🚨" + class TableJury(TableRecap): """Cette table recap reprend les colonnes du tableau recap, sauf les évaluations, @@ -100,7 +102,11 @@ class TableJury(TableRecap): else: jury_code_sem = "" row.add_cell( - "jury_code_sem", "Jury", jury_code_sem, group="jury_code_sem" + "jury_code_sem", + "Jury", + jury_code_sem or "🍽", + raw_content=jury_code_sem, + group="jury_code_sem", ) self.foot_title_row.cells["jury_code_sem"].target_attrs[ "title" @@ -109,7 +115,7 @@ class TableJury(TableRecap): row.add_cell( "jury_link", "", - f"""{("modifier" if res.validations and res.validations.has_decision(etud) else "saisir") + f"""{("modifier" if res.validations and res.validations.has_decision(etud) else "➨ saisir") if res.formsemestre.etat else "voir"} décisions""", group="col_jury_link", target=url_for( @@ -223,7 +229,8 @@ class RowJury(RowRecap): self.add_cell( col_id + "_code", f"
{rcue.ue_1.acronyme}
{rcue.ue_2.acronyme}
", - dec_rcue.code_valide or "", + dec_rcue.code_valide or EMO_EMPTY_CODE_JURY, + raw_content=dec_rcue.code_valide or "", group="rcue", classes=["col_rcue_code", "recorded_code"], column_classes={"col_rcue"}, diff --git a/app/tables/recap.py b/app/tables/recap.py index 7431523c..c0f32e54 100644 --- a/app/tables/recap.py +++ b/app/tables/recap.py @@ -79,14 +79,26 @@ class TableRecap(tb.Table): ues = res.formsemestre.query_ues(with_sport=True) # avec bonus ues_sans_bonus = [ue for ue in ues if ue.type != UE_SPORT] - for etudid in res.formsemestre.etuds_inscriptions: - etud = Identite.query.get(etudid) - row = self.row_class(self, etud) - self.add_row(row) - row.add_etud_cols() - row.add_moyennes_cols(ues_sans_bonus) - if res.formsemestre.etuds_inscriptions: # table non vide + # Fixe l'ordre des groupes de colonnes communs: + groups = [ + "rang", + "identite_court", + "identite_detail", + "partition", + "cursus", + ] + if not res.formsemestre.block_moyenne_generale: + groups.append("col_moy_gen") + self.set_groups(groups) + + for etudid in res.formsemestre.etuds_inscriptions: + etud = Identite.query.get(etudid) + row = self.row_class(self, etud) + self.add_row(row) + row.add_etud_cols() + row.add_moyennes_cols(ues_sans_bonus) + self.add_partitions() self.add_cursus() self.add_admissions() @@ -199,28 +211,33 @@ class TableRecap(tb.Table): col_id = f"moy_ue_{ue.id}" row_ects.add_cell(col_id, None, ue.ects) + # la colonne où placer les valeurs agrégats + col_id = "moy_gen" if "moy_gen" in self.column_ids else "cursus" + col_group = "col_moy_gen" if "moy_gen" in self.column_ids else "cursus" row_ects.add_cell( - "moy_gen", + col_id, None, sum([ue.ects or 0 for ue in ues if ue.type != UE_SPORT]), + group=col_group, ) # --- MIN, MAX, MOY, APO row_min.add_cell( - "moy_gen", + col_id, None, self.fmt_note(res.etud_moy_gen.min()), - # classes=["col_moy_gen"], + group=col_group, ) row_max.add_cell( - "moy_gen", + col_id, None, self.fmt_note(res.etud_moy_gen.max()), - classes=["col_moy_gen"], + group=col_group, ) row_moy.add_cell( - "moy_gen", + col_id, None, self.fmt_note(res.etud_moy_gen.mean()), + group=col_group, ) for ue in ues: @@ -288,7 +305,6 @@ class TableRecap(tb.Table): La table contient des rows avec la clé etudid. Les colonnes ont la classe css "partition". """ - self.insert_group("partition", after="identite_court") self.group_titles["partition"] = "Partitions" partitions, partitions_etud_groups = sco_groups.get_formsemestre_groups( self.res.formsemestre.id @@ -473,8 +489,7 @@ class TableRecap(tb.Table): def add_cursus(self): """Ajoute colonne avec code cursus, eg 'S1 S2 S1' pour tous les étduiants de la table""" - self.insert_group("cursus", before="col_ues_validables") - cid = "code_cursus" + cid = "cursus" formation_code = self.res.formsemestre.formation.formation_code for row in self.rows: row.add_cell( @@ -591,11 +606,13 @@ class RowRecap(tb.Row): classes=[note_class], ) # Ajoute bulle sur titre du pied de table: - table.foot_title_row.cells["moy_gen"].target_attrs["title"] = ( - "Moyenne générale indicative" - if res.is_apc - else "Moyenne générale du semestre" - ) + cell = table.foot_title_row.cells.get("moy_gen") + if cell: + table.foot_title_row.cells["moy_gen"].target_attrs["title"] = ( + "Moyenne générale indicative" + if res.is_apc + else "Moyenne générale du semestre" + ) # --- Moyenne d'UE self.nb_ues_validables, self.nb_ues_warning = 0, 0 @@ -632,8 +649,6 @@ class RowRecap(tb.Row): ) = f"{self.nb_ues_validables}/{self.nb_ues_etud_parcours}" if self.nb_ues_warning: ue_valid_txt_html += " " + scu.EMO_WARNING - # place juste avant moy. gen. - table.insert_group("col_ues_validables", before="col_moy_gen") cell_class = "" if self.nb_ues_warning: cell_class = "moy_ue_warning" @@ -709,11 +724,11 @@ class RowRecap(tb.Row): if modimpl.module.module_type == scu.ModuleType.MALUS: if val and not isinstance(val, str) and not np.isnan(val): if val >= 0: - val_fmt_html = f"""+{ + val_fmt_html = f"""-{ val_fmt }""" else: - val_fmt_html = f"""-{ + val_fmt_html = f"""+{ table.fmt_note(-val)}""" else: val_fmt = val_fmt_html = "" # inscrit à ce malus, mais sans note diff --git a/sco_version.py b/sco_version.py index f450245e..64c7dc2c 100644 --- a/sco_version.py +++ b/sco_version.py @@ -1,7 +1,7 @@ # -*- mode: python -*- # -*- coding: utf-8 -*- -SCOVERSION = "9.4.37" +SCOVERSION = "9.4.38" SCONAME = "ScoDoc"