Jury BUT: fix pour cas GB avec NaN + présentation btableau multi-parcours
This commit is contained in:
parent
9f42244612
commit
0c05c4f31d
@ -8,6 +8,7 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
import numpy as np
|
||||||
from flask import g, url_for
|
from flask import g, url_for
|
||||||
|
|
||||||
from app.but import jury_but
|
from app.but import jury_but
|
||||||
@ -182,9 +183,16 @@ def build_table_jury_but_html(
|
|||||||
class RowCollector:
|
class RowCollector:
|
||||||
"""Une ligne de la table"""
|
"""Une ligne de la table"""
|
||||||
|
|
||||||
def __init__(self, cells: dict = None, titles: dict = None, convert_values=True):
|
def __init__(
|
||||||
|
self,
|
||||||
|
cells: dict = None,
|
||||||
|
titles: dict = None,
|
||||||
|
convert_values=True,
|
||||||
|
column_classes: dict = None,
|
||||||
|
):
|
||||||
self.titles = titles
|
self.titles = titles
|
||||||
self.row = cells or {} # col_id : str
|
self.row = cells or {} # col_id : str
|
||||||
|
self.column_classes = column_classes # col_id : str, css class
|
||||||
self.idx = 0
|
self.idx = 0
|
||||||
self.last_etud_cell_idx = 0
|
self.last_etud_cell_idx = 0
|
||||||
if convert_values:
|
if convert_values:
|
||||||
@ -198,6 +206,17 @@ class RowCollector:
|
|||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
return self.row[key]
|
return self.row[key]
|
||||||
|
|
||||||
|
def get_row_dict(self):
|
||||||
|
"La ligne, comme un dict"
|
||||||
|
# create empty cells
|
||||||
|
for col_id in self.titles:
|
||||||
|
if col_id not in self.row:
|
||||||
|
self.row[col_id] = ""
|
||||||
|
klass = self.column_classes.get(col_id)
|
||||||
|
if klass:
|
||||||
|
self.row[f"_{col_id}_class"] = klass
|
||||||
|
return self.row
|
||||||
|
|
||||||
def add_cell(
|
def add_cell(
|
||||||
self,
|
self,
|
||||||
col_id: str,
|
col_id: str,
|
||||||
@ -205,8 +224,9 @@ class RowCollector:
|
|||||||
content: str,
|
content: str,
|
||||||
classes: str = "",
|
classes: str = "",
|
||||||
idx: int = None,
|
idx: int = None,
|
||||||
|
column_class="",
|
||||||
):
|
):
|
||||||
"Add a row to our table. classes is a list of css class names"
|
"""Add a row to our table. classes is a list of css class names"""
|
||||||
self.idx = idx if idx is not None else self.idx
|
self.idx = idx if idx is not None else self.idx
|
||||||
self.row[col_id] = content
|
self.row[col_id] = content
|
||||||
if classes:
|
if classes:
|
||||||
@ -216,6 +236,7 @@ class RowCollector:
|
|||||||
self.titles[f"_{col_id}_col_order"] = self.idx
|
self.titles[f"_{col_id}_col_order"] = self.idx
|
||||||
if classes:
|
if classes:
|
||||||
self.titles[f"_{col_id}_class"] = classes
|
self.titles[f"_{col_id}_class"] = classes
|
||||||
|
self.column_classes[col_id] = column_class
|
||||||
self.idx += 1
|
self.idx += 1
|
||||||
|
|
||||||
def add_etud_cells(self, etud: Identite, formsemestre: FormSemestre):
|
def add_etud_cells(self, etud: Identite, formsemestre: FormSemestre):
|
||||||
@ -254,13 +275,18 @@ class RowCollector:
|
|||||||
if val < BUT_BARRE_UE8:
|
if val < BUT_BARRE_UE8:
|
||||||
note_class = " moy_ue_warning" # notes très basses
|
note_class = " moy_ue_warning" # notes très basses
|
||||||
self.add_cell(
|
self.add_cell(
|
||||||
col_id, dec_ue.ue.acronyme, self.fmt_note(val), "col_ue" + note_class
|
col_id,
|
||||||
|
dec_ue.ue.acronyme,
|
||||||
|
self.fmt_note(val),
|
||||||
|
"col_ue" + note_class,
|
||||||
|
column_class="col_ue",
|
||||||
)
|
)
|
||||||
self.add_cell(
|
self.add_cell(
|
||||||
col_id + "_code",
|
col_id + "_code",
|
||||||
dec_ue.ue.acronyme,
|
dec_ue.ue.acronyme,
|
||||||
dec_ue.code_valide or "",
|
dec_ue.code_valide or "",
|
||||||
"col_ue_code recorded_code",
|
"col_ue_code recorded_code",
|
||||||
|
column_class="col_ue",
|
||||||
)
|
)
|
||||||
|
|
||||||
def add_rcue_cells(self, dec_rcue: DecisionsProposeesRCUE):
|
def add_rcue_cells(self, dec_rcue: DecisionsProposeesRCUE):
|
||||||
@ -308,7 +334,11 @@ class RowCollector:
|
|||||||
if len(deca.rcues_annee) > 0:
|
if len(deca.rcues_annee) > 0:
|
||||||
# permet un tri par nb de niveaux validables + moyenne gen indicative S_pair
|
# permet un tri par nb de niveaux validables + moyenne gen indicative S_pair
|
||||||
if deca.res_pair and deca.etud.id in deca.res_pair.etud_moy_gen:
|
if deca.res_pair and deca.etud.id in deca.res_pair.etud_moy_gen:
|
||||||
moy_gen_d = f"{int(deca.res_pair.etud_moy_gen[deca.etud.id]*1000):05}"
|
moy = deca.res_pair.etud_moy_gen[deca.etud.id]
|
||||||
|
if np.isnan(moy):
|
||||||
|
moy_gen_d = "x"
|
||||||
|
else:
|
||||||
|
moy_gen_d = f"{int(moy*1000):05}"
|
||||||
else:
|
else:
|
||||||
moy_gen_d = "x"
|
moy_gen_d = "x"
|
||||||
self["_rcues_validables_order"] = f"{deca.nb_validables:04d}-{moy_gen_d}"
|
self["_rcues_validables_order"] = f"{deca.nb_validables:04d}-{moy_gen_d}"
|
||||||
@ -326,11 +356,12 @@ def get_table_jury_but(
|
|||||||
"""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)
|
||||||
titles = {} # column_id : title
|
titles = {} # column_id : title
|
||||||
|
column_classes = {}
|
||||||
rows = []
|
rows = []
|
||||||
for etudid in formsemestre2.etuds_inscriptions:
|
for etudid in formsemestre2.etuds_inscriptions:
|
||||||
etud: Identite = Identite.query.get(etudid)
|
etud: Identite = Identite.query.get(etudid)
|
||||||
deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre2)
|
deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre2)
|
||||||
row = RowCollector(titles=titles)
|
row = RowCollector(titles=titles, column_classes=column_classes)
|
||||||
row.add_etud_cells(etud, formsemestre2)
|
row.add_etud_cells(etud, formsemestre2)
|
||||||
row.idx = 100 # laisse place pour les colonnes de groupes
|
row.idx = 100 # laisse place pour les colonnes de groupes
|
||||||
# --- Nombre de niveaux
|
# --- Nombre de niveaux
|
||||||
@ -365,10 +396,11 @@ def get_table_jury_but(
|
|||||||
""",
|
""",
|
||||||
"col_lien_saisie_but",
|
"col_lien_saisie_but",
|
||||||
)
|
)
|
||||||
rows.append(row.row)
|
rows.append(row)
|
||||||
if len(rows) > 0:
|
rows_dict = [row.get_row_dict() for row in rows]
|
||||||
res2.recap_add_partitions(rows, titles, col_idx=row.last_etud_cell_idx + 1)
|
if len(rows_dict) > 0:
|
||||||
|
res2.recap_add_partitions(rows_dict, titles, col_idx=row.last_etud_cell_idx + 1)
|
||||||
column_ids = [title for title in titles if not title.startswith("_")]
|
column_ids = [title for title in titles if not title.startswith("_")]
|
||||||
column_ids.sort(key=lambda col_id: titles.get("_" + col_id + "_col_order", 1000))
|
column_ids.sort(key=lambda col_id: titles.get("_" + col_id + "_col_order", 1000))
|
||||||
rows.sort(key=lambda row: row["_nom_disp_order"])
|
rows_dict.sort(key=lambda row: row["_nom_disp_order"])
|
||||||
return rows, titles, column_ids
|
return rows_dict, titles, column_ids
|
||||||
|
Loading…
Reference in New Issue
Block a user