From 58ecc524408423f1ef6eb2ffee41175a6afb9f7f Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sun, 12 Feb 2023 02:21:31 +0100 Subject: [PATCH] Ajout colonne autorisations passage dans table recap jury --- app/comp/res_common.py | 29 +++++++++++++++++++++++------ app/comp/res_compat.py | 4 ++-- app/tables/jury_recap.py | 14 ++++++++++++-- app/tables/table_builder.py | 6 +----- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/app/comp/res_common.py b/app/comp/res_common.py index d6fdc7d6..f29b336c 100644 --- a/app/comp/res_common.py +++ b/app/comp/res_common.py @@ -7,7 +7,7 @@ """Résultats semestre: méthodes communes aux formations classiques et APC """ -from collections import Counter +from collections import Counter, defaultdict from collections.abc import Generator from functools import cached_property import numpy as np @@ -22,11 +22,11 @@ from app.comp.moy_mod import ModuleImplResults from app.models import FormSemestre, FormSemestreUECoef from app.models import Identite from app.models import ModuleImpl, ModuleImplInscription +from app.models import ScolarAutorisationInscription from app.models.ues import UniteEns from app.scodoc.sco_cache import ResultatsSemestreCache from app.scodoc.sco_codes_parcours import UE_SPORT from app.scodoc.sco_exceptions import ScoValueError -from app.scodoc import sco_groups from app.scodoc import sco_utils as scu # Il faut bien distinguer @@ -84,6 +84,7 @@ class ResultatsSemestre(ResultatsCache): """Coefs APC: rows = UEs (sans bonus), columns = modimpl, value = coef.""" self.validations = None + self.autorisations_inscription = None self.moyennes_matieres = {} """Moyennes de matières, si calculées. { matiere_id : Series, index etudid }""" @@ -179,12 +180,28 @@ class ResultatsSemestre(ResultatsCache): ) # --- JURY... - def load_validations(self) -> ValidationsSemestre: - """Load validations, set attribute and return value""" + def get_formsemestre_validations(self) -> ValidationsSemestre: + """Load validations if not already stored, set attribute and return value""" if not self.validations: self.validations = res_sem.load_formsemestre_validations(self.formsemestre) return self.validations + def get_autorisations_inscription(self) -> dict[int : list[int]]: + """Les autorisations d'inscription venant de ce formsemestre. + Lit en base et cache le résultat. + Resultat: { etudid : [ indices de semestres ]} + Note: les etudids peuvent ne plus être inscrits ici. + Seuls ceux avec des autorisations enregistrées sont présents dans le résultat. + """ + if not self.autorisations_inscription: + autorisations = ScolarAutorisationInscription.query.filter_by( + origin_formsemestre_id=self.formsemestre.id + ) + self.autorisations_inscription = defaultdict(list) + for aut in autorisations: + self.autorisations_inscription[aut.etudid].append(aut.semestre_id) + return self.autorisations_inscription + def get_etud_ue_validables(self, etudid: int) -> list[UniteEns]: """Liste des UEs du semestre qui doivent être validées @@ -242,8 +259,8 @@ class ResultatsSemestre(ResultatsCache): UE capitalisées. """ # Supposant qu'il y a peu d'UE capitalisées, - # on recalcule les moyennes gen des etuds ayant des UE capitalisée. - self.load_validations() + # on recalcule les moyennes gen des etuds ayant des UEs capitalisées. + self.get_formsemestre_validations() ue_capitalisees = self.validations.ue_capitalisees for etudid in ue_capitalisees.index: recompute_mg = False diff --git a/app/comp/res_compat.py b/app/comp/res_compat.py index 8a835694..6c48ae2c 100644 --- a/app/comp/res_compat.py +++ b/app/comp/res_compat.py @@ -282,7 +282,7 @@ class NotesTableCompat(ResultatsSemestre): if self.get_etud_etat(etudid) == DEF: return {} else: - validations = self.load_validations() + validations = self.get_formsemestre_validations() return validations.decisions_jury_ues.get(etudid, None) def get_etud_ects_valides(self, etudid: int, decisions_ues: dict = False) -> 0: @@ -309,7 +309,7 @@ class NotesTableCompat(ResultatsSemestre): "compense_formsemestre_id": None, } else: - validations = self.load_validations() + validations = self.get_formsemestre_validations() return validations.decisions_jury.get(etudid, None) def get_etud_mat_moy(self, matiere_id: int, etudid: int) -> str: diff --git a/app/tables/jury_recap.py b/app/tables/jury_recap.py index 13df372d..1a91ac9d 100644 --- a/app/tables/jury_recap.py +++ b/app/tables/jury_recap.py @@ -88,7 +88,7 @@ class TableJury(TableRecap): que pour les formations classiques, ce code n'est pas utilisé en BUT. """ res = self.res - + autorisations = res.get_autorisations_inscription() for row in self.rows: etud = row.etud if not res.is_apc: @@ -108,7 +108,17 @@ class TableJury(TableRecap): self.foot_title_row.cells["jury_code_sem"].target_attrs[ "title" ] = """Code jury sur le semestre""" - + # Autorisations inscription + row.add_cell( + "autorisations_inscription", + "Passage", + ", ".join("S" + str(i) for i in sorted(autorisations[etud.id])) + if etud.id in autorisations + else "", + group="jury_code_sem", + classes=["recorded_code"], + ) + # Lien saisie ou visu jury a_saisir = (not res.validations) or (not res.validations.has_decision(etud)) row.add_cell( "jury_link", diff --git a/app/tables/table_builder.py b/app/tables/table_builder.py index 829f3642..1f74d7d9 100644 --- a/app/tables/table_builder.py +++ b/app/tables/table_builder.py @@ -365,11 +365,7 @@ class Row(Element): group: groupe de colonnes classes is a list of css class names """ - if (classes is None) or (group not in classes): - # ajoute le nom de groupe aux classes - classes = [group or ""] + (classes or []) - else: - classes = classes.copy() + classes = classes.copy() if classes else [] if group: self.table.column_classes[col_id].add(group) if column_classes: