Optimisation: ajout cache par requete a FormSemestre.get_ues()

This commit is contained in:
Emmanuel Viennet 2023-07-24 16:48:41 +02:00 committed by iziram
parent 4e300c3dbb
commit 07f5f6c332
3 changed files with 43 additions and 22 deletions

View File

@ -282,6 +282,8 @@ def validation_rcue_record(etudid: int):
) )
operation = "record" operation = "record"
db.session.add(validation) 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() db.session.commit()
Scolog.logdb( Scolog.logdb(
method="validation_rcue_record", method="validation_rcue_record",

View File

@ -307,6 +307,17 @@ class FormSemestre(db.Model):
- et sont associées à l'un des parcours de ce formsemestre - et sont associées à l'un des parcours de ce formsemestre
(ou à aucun, donc tronc commun). (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 formation: Formation = self.formation
if formation.is_apc(): if formation.is_apc():
# UEs de tronc commun (sans parcours indiqué) # UEs de tronc commun (sans parcours indiqué)
@ -326,8 +337,7 @@ class FormSemestre(db.Model):
).filter(UniteEns.semestre_idx == self.semestre_id) ).filter(UniteEns.semestre_idx == self.semestre_id)
} }
) )
ues = sem_ues.values() ues = sorted(sem_ues.values(), key=attrgetter("numero", "acronyme"))
return sorted(ues, key=attrgetter("numero", "acronyme"))
else: else:
sem_ues = db.session.query(UniteEns).filter( sem_ues = db.session.query(UniteEns).filter(
ModuleImpl.formsemestre_id == self.id, ModuleImpl.formsemestre_id == self.id,
@ -336,7 +346,9 @@ class FormSemestre(db.Model):
) )
if not with_sport: if not with_sport:
sem_ues = sem_ues.filter(UniteEns.type != codes_cursus.UE_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 @cached_property
def modimpls_sorted(self) -> list[ModuleImpl]: def modimpls_sorted(self) -> list[ModuleImpl]:

View File

@ -63,24 +63,31 @@ def dict_pvjury(
Si with_parcours_decisions: ajoute infos sur code decision jury de tous les semestre du parcours Si with_parcours_decisions: ajoute infos sur code decision jury de tous les semestre du parcours
Résultat: Résultat:
{ {
'date' : date de la decision la plus recente, 'date' : str = date de la decision la plus recente, format dd/mm/yyyy,
'formsemestre' : sem, 'formsemestre' : dict = formsemestre,
'is_apc' : bool, 'is_apc' : bool,
'formation' : { 'acronyme' :, 'titre': ... } 'formation' : { 'acronyme' :, 'titre': ... }
'decisions' : { [ { 'identite' : {'nom' :, 'prenom':, ...,}, 'decisions' : [
{
'identite' : {'nom' :, 'prenom':, ...,},
'etat' : I ou D ou DEF 'etat' : I ou D ou DEF
'decision_sem' : {'code':, 'code_prev': }, 'decision_sem' : {'code':, 'code_prev': },
'decisions_ue' : { ue_id : { 'code' : ADM|CMP|AJ, 'event_date' :, 'decisions_ue' : {
'acronyme', 'numero': } }, ue_id : {
'code' : ADM|CMP|AJ,
'ects' : float,
'event_date' :str = "dd/mm/yyyy",
},
},
'autorisations' : [ { 'semestre_id' : { ... } } ], 'autorisations' : [ { 'semestre_id' : { ... } } ],
'validation_parcours' : True si parcours validé (diplome obtenu) 'validation_parcours' : True si parcours validé (diplome obtenu)
'prev_code' : code (calculé slt si with_prev), 'prev_code' : code (calculé slt si with_prev),
'mention' : mention (en fct moy gen), 'mention' : mention (en fct moy gen),
'sum_ects' : total ECTS acquis dans ce semestre (incluant les UE capitalisées) 'sum_ects' : total ECTS acquis dans ce semestre (incluant les UE capitalisées)
'sum_ects_capitalises' : somme des ECTS des UE capitalisees 'sum_ects_capitalises' : somme des ECTS des UE capitalisees
}
]
}, },
...
],
'decisions_dict' : { etudid : decision (comme ci-dessus) }, 'decisions_dict' : { etudid : decision (comme ci-dessus) },
} }
""" """