Skip to content
Snippets Groups Projects
Commit 3c777278 authored by Emmanuel Viennet's avatar Emmanuel Viennet
Browse files

Styles table recap

parent 55d7270b
No related branches found
No related tags found
No related merge requests found
......@@ -37,7 +37,11 @@ from app.tables.recap import RowRecap, TableRecap
class TableJury(TableRecap):
pass
"""Cette table recap reprend les colonnes du tableau recap, sauf les évaluations,
et ajoute:
- les RCUEs
- le lien de saisie ou modif de la décision de jury
"""
class RowJury(RowRecap):
......
This diff is collapsed.
......@@ -4133,6 +4133,17 @@ table.table_recap td.col_ues_validables {
font-style: normal !important;
}
table.table_recap td.col_res,
table.table_recap th.col_res {
border-right: 1px dashed green;
border-left: 1px dashed green;
}
table.table_recap td.partition,
table.table_recap th.partition {
border-right: 1px solid rgb(221, 221, 221);
border-left: 1px solid rgb(221, 221, 221);
}
.green-arrow-up {
display: inline-block;
......@@ -4228,18 +4239,17 @@ table.table_recap tr.descr_evaluation {
vertical-align: top;
}
table.table_recap tr.apo {
table.table_recap tr.apo td:not(.identite_court) {
font-size: 75%;
font-family: monospace;
}
table.table_recap tr.apo td {
border: 1px solid gray;
background-color: #d8f5fe;
background-color: #f5fdf6;
}
table.table_recap tr.type_col {
font-size: 50%;
font-size: 40%;
font-family: monospace;
}
......
......@@ -110,18 +110,18 @@ class TableRecap(tb.Table):
for col_id in self.column_ids:
cell: tb.Cell = row_moy.cells.get(col_id)
if cell and "col_empty" in cell.classes:
self.column_classes[col_id].append("col_empty")
self.column_classes[col_id].add("col_empty")
def add_type_row(self):
"""Ligne avec la classe de chaque colonne recap."""
# récupère le type à partir des classes css (hack...)
# récupère le type à partir du groupe (enlève le préfixe "col_" si présent)
row_type = tb.BottomRow(
self,
"type_col",
left_title="Type col.",
left_title_col_ids=["prenom", "nom_short"],
category="bottom_infos",
classes=["bottom_info"],
classes=["bottom_info", "type_col"],
)
for col_id in self.column_ids:
group_name = self.column_group.get(col_id, "")
......@@ -180,7 +180,7 @@ class TableRecap(tb.Table):
left_title="Code Apogée",
left_title_col_ids=["prenom", "nom_short"],
category="bottom_infos",
classes=["bottom_info"],
classes=["bottom_info", "apo"],
)
# --- ECTS
......@@ -188,25 +188,58 @@ class TableRecap(tb.Table):
for ue in ues:
col_id = f"moy_ue_{ue.id}"
row_ects.add_cell(col_id, None, ue.ects)
# ajoute cell UE vides sur ligne coef pour borders verticales
# XXX TODO classes dans table sur colonne ajoutées à tous les TD
row_coef.add_cell(col_id, None, "")
row_ects.add_cell(
"moy_gen",
None,
sum([ue.ects or 0 for ue in ues if ue.type != UE_SPORT]),
)
# --- MIN, MAX, MOY, APO
row_min.add_cell("moy_gen", None, self.fmt_note(res.etud_moy_gen.min()))
row_max.add_cell("moy_gen", None, self.fmt_note(res.etud_moy_gen.max()))
row_moy.add_cell("moy_gen", None, self.fmt_note(res.etud_moy_gen.mean()))
row_min.add_cell(
"moy_gen",
None,
self.fmt_note(res.etud_moy_gen.min()),
# classes=["col_moy_gen"],
)
row_max.add_cell(
"moy_gen",
None,
self.fmt_note(res.etud_moy_gen.max()),
classes=["col_moy_gen"],
)
row_moy.add_cell(
"moy_gen",
None,
self.fmt_note(res.etud_moy_gen.mean()),
# classes=["col_moy_gen"],
)
for ue in ues:
col_id = f"moy_ue_{ue.id}"
row_min.add_cell(col_id, None, self.fmt_note(res.etud_moy_ue[ue.id].min()))
row_max.add_cell(col_id, None, self.fmt_note(res.etud_moy_ue[ue.id].max()))
row_moy.add_cell(col_id, None, self.fmt_note(res.etud_moy_ue[ue.id].mean()))
row_apo.add_cell(col_id, None, ue.code_apogee or "")
row_min.add_cell(
col_id,
None,
self.fmt_note(res.etud_moy_ue[ue.id].min()),
classes=["col_ue", "col_moy_ue"],
)
row_max.add_cell(
col_id,
None,
self.fmt_note(res.etud_moy_ue[ue.id].max()),
classes=["col_ue", "col_moy_ue"],
)
row_moy.add_cell(
col_id,
None,
self.fmt_note(res.etud_moy_ue[ue.id].mean()),
classes=["col_ue", "col_moy_ue"],
)
row_apo.add_cell(
col_id,
None,
ue.code_apogee or "",
classes=["col_ue", "col_moy_ue"],
)
for modimpl in res.formsemestre.modimpls_sorted:
if (modimpl.id, ue.id) in self.modimpl_ue_ids:
......@@ -260,13 +293,12 @@ class TableRecap(tb.Table):
group = None # group (dict) de l'étudiant dans cette partition
# dans NotesTableCompat, à revoir
etud_etat = self.res.get_etud_etat(row.id) # row.id == etudid
tr_classes = []
if etud_etat == scu.DEMISSION:
gr_name = "Dém."
tr_classes.append("dem")
row.add_class("dem")
elif etud_etat == DEF:
gr_name = "Déf."
tr_classes.append("def")
row.add_class("def")
else:
group = partition_etud_groups.get(etudid)
gr_name = group["group_name"] if group else ""
......@@ -519,7 +551,7 @@ class RowRecap(tb.Row):
"moy_gen",
"Moy",
table.fmt_note(moy_gen),
"col_moy_gen",
group="col_moy_gen",
classes=[note_class],
)
# Ajoute bulle sur titre du pied de table:
......@@ -553,7 +585,7 @@ class RowRecap(tb.Row):
val_fmt_html,
raw_content=val_fmt,
group=f"col_ue_{ue.id}",
classes=["col_ue_bonus"],
column_classes={"col_ue_bonus"},
)
# Les moyennes des modules (ou ressources et SAÉs) dans cette UE
self.add_ue_modimpls_cols(ue, ue_status["is_capitalized"])
......@@ -566,17 +598,18 @@ class RowRecap(tb.Row):
ue_valid_txt_html += " " + scu.EMO_WARNING
# place juste avant moy. gen.
table.insert_group("col_ues_validables", before="col_moy_gen")
classes = ["col_ue"]
cell_class = ""
if self.nb_ues_warning:
classes.append("moy_ue_warning")
cell_class = "moy_ue_warning"
elif self.nb_ues_validables < len(ues_sans_bonus):
classes.append("moy_inf")
cell_class = "moy_inf"
self.add_cell(
"ues_validables",
"UEs",
ue_valid_txt_html,
group="col_ues_validables",
classes=classes,
classes=[cell_class],
column_classes={"col_ue"},
raw_content=ue_valid_txt,
data={"order": self.nb_ues_validables}, # tri
)
......@@ -627,7 +660,8 @@ class RowRecap(tb.Row):
ue.acronyme,
table.fmt_note(val),
group=f"col_ue_{ue.id}",
classes=["col_ue", "col_moy_ue", note_class],
classes=[note_class],
column_classes={"col_ue", "col_moy_ue"},
)
table.foot_title_row.cells[col_id].target_attrs[
"title"
......@@ -678,10 +712,10 @@ class RowRecap(tb.Row):
val_fmt_html,
raw_content=val_fmt,
group=f"col_ue_{ue.id}_modules",
classes=[
column_classes={
f"col_{modimpl.module.type_abbrv()}",
f"mod_ue_{ue.id}",
],
},
)
if modimpl.module.module_type == scu.ModuleType.MALUS:
# positionne la colonne à droite de l'UE
......
......@@ -26,9 +26,9 @@ class Element:
self.data = data or {}
"data-xxx"
def html(self, extra_classes: list[str] = None) -> str:
def html(self, extra_classes: set[str] = None) -> str:
"html for element"
classes = [cls for cls in (self.classes + (extra_classes or [])) if cls]
classes = [cls for cls in (self.classes + (list(extra_classes or []))) if cls]
attrs_str = f"""class="{' '.join(classes)}" """ if classes else ""
# Autres attributs:
attrs_str += " " + " ".join([f'{k}="{v}"' for (k, v) in self.attrs.items()])
......@@ -40,6 +40,11 @@ class Element:
"Le contenu de l'élément, en html."
return str(self.content or "")
def add_class(self, klass: str):
"Add a class, do nothing if already there"
if klass not in self.classes:
self.classes.append(klass)
class Table(Element):
"""Construction d'une table de résultats
......@@ -81,7 +86,7 @@ class Table(Element):
self.foot = []
self.column_group = {}
"the group of the column: { col_id : group }"
self.column_classes: defaultdict[str, list[str]] = defaultdict(lambda: [])
self.column_classes: defaultdict[str, set[str]] = defaultdict(set)
"classe ajoutée à toutes les cellules de la colonne: { col_id : class }"
self.selected_row_id = selected_row_id
"l'id de la ligne sélectionnée"
......@@ -275,6 +280,7 @@ class Row(Element):
raw_content=None,
target_attrs: dict = None,
target: str = None,
column_classes: set[str] = None,
) -> "Cell":
"""Create cell and add it to the row.
group: groupe de colonnes
......@@ -285,6 +291,10 @@ class Row(Element):
classes = [group or ""] + (classes or [])
else:
classes = classes.copy()
if group:
self.table.column_classes[col_id].add(group)
if column_classes:
self.table.column_classes[col_id].update(column_classes)
cell = Cell(
content,
classes,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment