1
0
forked from ScoDoc/ScoDoc

Ajout colonne autorisations passage dans table recap jury

This commit is contained in:
Emmanuel Viennet 2023-02-12 02:21:31 +01:00
parent c39c622104
commit 58ecc52440
4 changed files with 38 additions and 15 deletions

View File

@ -7,7 +7,7 @@
"""Résultats semestre: méthodes communes aux formations classiques et APC """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 collections.abc import Generator
from functools import cached_property from functools import cached_property
import numpy as np 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 FormSemestre, FormSemestreUECoef
from app.models import Identite from app.models import Identite
from app.models import ModuleImpl, ModuleImplInscription from app.models import ModuleImpl, ModuleImplInscription
from app.models import ScolarAutorisationInscription
from app.models.ues import UniteEns from app.models.ues import UniteEns
from app.scodoc.sco_cache import ResultatsSemestreCache from app.scodoc.sco_cache import ResultatsSemestreCache
from app.scodoc.sco_codes_parcours import UE_SPORT from app.scodoc.sco_codes_parcours import UE_SPORT
from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc import sco_groups
from app.scodoc import sco_utils as scu from app.scodoc import sco_utils as scu
# Il faut bien distinguer # Il faut bien distinguer
@ -84,6 +84,7 @@ class ResultatsSemestre(ResultatsCache):
"""Coefs APC: rows = UEs (sans bonus), columns = modimpl, value = coef.""" """Coefs APC: rows = UEs (sans bonus), columns = modimpl, value = coef."""
self.validations = None self.validations = None
self.autorisations_inscription = None
self.moyennes_matieres = {} self.moyennes_matieres = {}
"""Moyennes de matières, si calculées. { matiere_id : Series, index etudid }""" """Moyennes de matières, si calculées. { matiere_id : Series, index etudid }"""
@ -179,12 +180,28 @@ class ResultatsSemestre(ResultatsCache):
) )
# --- JURY... # --- JURY...
def load_validations(self) -> ValidationsSemestre: def get_formsemestre_validations(self) -> ValidationsSemestre:
"""Load validations, set attribute and return value""" """Load validations if not already stored, set attribute and return value"""
if not self.validations: if not self.validations:
self.validations = res_sem.load_formsemestre_validations(self.formsemestre) self.validations = res_sem.load_formsemestre_validations(self.formsemestre)
return self.validations 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]: def get_etud_ue_validables(self, etudid: int) -> list[UniteEns]:
"""Liste des UEs du semestre qui doivent être validées """Liste des UEs du semestre qui doivent être validées
@ -242,8 +259,8 @@ class ResultatsSemestre(ResultatsCache):
UE capitalisées. UE capitalisées.
""" """
# Supposant qu'il y a peu d'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. # on recalcule les moyennes gen des etuds ayant des UEs capitalisées.
self.load_validations() self.get_formsemestre_validations()
ue_capitalisees = self.validations.ue_capitalisees ue_capitalisees = self.validations.ue_capitalisees
for etudid in ue_capitalisees.index: for etudid in ue_capitalisees.index:
recompute_mg = False recompute_mg = False

View File

@ -282,7 +282,7 @@ class NotesTableCompat(ResultatsSemestre):
if self.get_etud_etat(etudid) == DEF: if self.get_etud_etat(etudid) == DEF:
return {} return {}
else: else:
validations = self.load_validations() validations = self.get_formsemestre_validations()
return validations.decisions_jury_ues.get(etudid, None) return validations.decisions_jury_ues.get(etudid, None)
def get_etud_ects_valides(self, etudid: int, decisions_ues: dict = False) -> 0: def get_etud_ects_valides(self, etudid: int, decisions_ues: dict = False) -> 0:
@ -309,7 +309,7 @@ class NotesTableCompat(ResultatsSemestre):
"compense_formsemestre_id": None, "compense_formsemestre_id": None,
} }
else: else:
validations = self.load_validations() validations = self.get_formsemestre_validations()
return validations.decisions_jury.get(etudid, None) return validations.decisions_jury.get(etudid, None)
def get_etud_mat_moy(self, matiere_id: int, etudid: int) -> str: def get_etud_mat_moy(self, matiere_id: int, etudid: int) -> str:

View File

@ -88,7 +88,7 @@ class TableJury(TableRecap):
que pour les formations classiques, ce code n'est pas utilisé en BUT. que pour les formations classiques, ce code n'est pas utilisé en BUT.
""" """
res = self.res res = self.res
autorisations = res.get_autorisations_inscription()
for row in self.rows: for row in self.rows:
etud = row.etud etud = row.etud
if not res.is_apc: if not res.is_apc:
@ -108,7 +108,17 @@ class TableJury(TableRecap):
self.foot_title_row.cells["jury_code_sem"].target_attrs[ self.foot_title_row.cells["jury_code_sem"].target_attrs[
"title" "title"
] = """Code jury sur le semestre""" ] = """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)) a_saisir = (not res.validations) or (not res.validations.has_decision(etud))
row.add_cell( row.add_cell(
"jury_link", "jury_link",

View File

@ -365,11 +365,7 @@ class Row(Element):
group: groupe de colonnes group: groupe de colonnes
classes is a list of css class names classes is a list of css class names
""" """
if (classes is None) or (group not in classes): classes = classes.copy() if classes else []
# ajoute le nom de groupe aux classes
classes = [group or ""] + (classes or [])
else:
classes = classes.copy()
if group: if group:
self.table.column_classes[col_id].add(group) self.table.column_classes[col_id].add(group)
if column_classes: if column_classes: