diff --git a/app/api/jury.py b/app/api/jury.py index d3a1d14584..294eef2f66 100644 --- a/app/api/jury.py +++ b/app/api/jury.py @@ -282,6 +282,8 @@ def validation_rcue_record(etudid: int): ) operation = "record" db.session.add(validation) + # invalider bulletins (les autres résultats ne dépendent pas des RCUEs): + sco_cache.invalidate_formsemestre_etud(etud) db.session.commit() Scolog.logdb( method="validation_rcue_record", diff --git a/app/models/formsemestre.py b/app/models/formsemestre.py index bac99fdf87..b5e21b2528 100644 --- a/app/models/formsemestre.py +++ b/app/models/formsemestre.py @@ -305,6 +305,17 @@ class FormSemestre(db.Model): - et sont associées à l'un des parcours de ce formsemestre (ou à aucun, donc tronc commun). """ + # per-request caching + key = (self.id, with_sport) + _cache = getattr(g, "_formsemestre_get_ues_cache", None) + if _cache: + result = _cache.get(key, False) + if result is not False: + return result + else: + g._formsemestre_get_ues_cache = {} + _cache = g._formsemestre_get_ues_cache + formation: Formation = self.formation if formation.is_apc(): # UEs de tronc commun (sans parcours indiqué) @@ -324,8 +335,7 @@ class FormSemestre(db.Model): ).filter(UniteEns.semestre_idx == self.semestre_id) } ) - ues = sem_ues.values() - return sorted(ues, key=attrgetter("numero", "acronyme")) + ues = sorted(sem_ues.values(), key=attrgetter("numero", "acronyme")) else: sem_ues = db.session.query(UniteEns).filter( ModuleImpl.formsemestre_id == self.id, @@ -334,7 +344,9 @@ class FormSemestre(db.Model): ) if not with_sport: sem_ues = sem_ues.filter(UniteEns.type != codes_cursus.UE_SPORT) - return sem_ues.order_by(UniteEns.numero).all() + ues = sem_ues.order_by(UniteEns.numero).all() + _cache[key] = ues + return ues @cached_property def modimpls_sorted(self) -> list[ModuleImpl]: diff --git a/app/scodoc/sco_pv_dict.py b/app/scodoc/sco_pv_dict.py index f9861f54ff..e4e58ca121 100644 --- a/app/scodoc/sco_pv_dict.py +++ b/app/scodoc/sco_pv_dict.py @@ -63,25 +63,32 @@ def dict_pvjury( Si with_parcours_decisions: ajoute infos sur code decision jury de tous les semestre du parcours Résultat: { - 'date' : date de la decision la plus recente, - 'formsemestre' : sem, - 'is_apc' : bool, - 'formation' : { 'acronyme' :, 'titre': ... } - 'decisions' : { [ { 'identite' : {'nom' :, 'prenom':, ...,}, - 'etat' : I ou D ou DEF - 'decision_sem' : {'code':, 'code_prev': }, - 'decisions_ue' : { ue_id : { 'code' : ADM|CMP|AJ, 'event_date' :, - 'acronyme', 'numero': } }, - 'autorisations' : [ { 'semestre_id' : { ... } } ], - 'validation_parcours' : True si parcours validé (diplome obtenu) - 'prev_code' : code (calculé slt si with_prev), - 'mention' : mention (en fct moy gen), - 'sum_ects' : total ECTS acquis dans ce semestre (incluant les UE capitalisées) - 'sum_ects_capitalises' : somme des ECTS des UE capitalisees - } - ] - }, - 'decisions_dict' : { etudid : decision (comme ci-dessus) }, + 'date' : str = date de la decision la plus recente, format dd/mm/yyyy, + 'formsemestre' : dict = formsemestre, + 'is_apc' : bool, + 'formation' : { 'acronyme' :, 'titre': ... } + 'decisions' : [ + { + 'identite' : {'nom' :, 'prenom':, ...,}, + 'etat' : I ou D ou DEF + 'decision_sem' : {'code':, 'code_prev': }, + 'decisions_ue' : { + ue_id : { + 'code' : ADM|CMP|AJ, + 'ects' : float, + 'event_date' :str = "dd/mm/yyyy", + }, + }, + 'autorisations' : [ { 'semestre_id' : { ... } } ], + 'validation_parcours' : True si parcours validé (diplome obtenu) + 'prev_code' : code (calculé slt si with_prev), + 'mention' : mention (en fct moy gen), + 'sum_ects' : total ECTS acquis dans ce semestre (incluant les UE capitalisées) + 'sum_ects_capitalises' : somme des ECTS des UE capitalisees + }, + ... + ], + 'decisions_dict' : { etudid : decision (comme ci-dessus) }, } """ formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id)