Modify caching of ApcNiveaux

This commit is contained in:
Emmanuel Viennet 2023-06-21 13:09:04 +02:00
parent 7c9f07c36e
commit d2fbbad84b

View File

@ -9,6 +9,7 @@ from datetime import datetime
import functools
from operator import attrgetter
from flask import g
from flask_sqlalchemy.query import Query
from sqlalchemy.orm import class_mapper
import sqlalchemy
@ -399,12 +400,6 @@ class ApcNiveau(db.Model, XMLModel):
"""Vrai si ce niveau fait partie du Tronc Commun"""
return len(self.parcours) == self.competence.referentiel.parcours.count()
# Le ref. comp. ne change jamais (pas d'édition dans ScoDoc)
# on cache les résultats:
_niveaux_annee_de_parcours_cache: dict[
tuple[int, int, int, int], list["ApcNiveau"]
] = {}
@classmethod
def niveaux_annee_de_parcours(
cls,
@ -424,9 +419,14 @@ class ApcNiveau(db.Model, XMLModel):
referentiel_competence.id if referentiel_competence else None,
competence.id if competence else None,
)
result = cls._niveaux_annee_de_parcours_cache.get(key)
if result:
return result
_cache = getattr(g, "_niveaux_annee_de_parcours_cache", None)
if _cache:
result = g._niveaux_annee_de_parcours_cache.get(key, False)
if result is not False:
return result
else:
g._niveaux_annee_de_parcours_cache = {}
_cache = g._niveaux_annee_de_parcours_cache
if annee not in {1, 2, 3}:
raise ValueError("annee invalide pour un parcours BUT")
referentiel_competence = (
@ -444,12 +444,12 @@ class ApcNiveau(db.Model, XMLModel):
if competence is not None:
query = query.filter(ApcCompetence.id == competence.id)
result = query.all()
cls._niveaux_annee_de_parcours_cache[key] = result
_cache[key] = result
return result
annee_parcour: ApcAnneeParcours = parcour.annees.filter_by(ordre=annee).first()
if not annee_parcour:
cls._niveaux_annee_de_parcours_cache[key] = []
_cache[key] = []
return []
if competence is None:
@ -464,7 +464,7 @@ class ApcNiveau(db.Model, XMLModel):
niveaux: list[ApcNiveau] = competence.niveaux.filter_by(
annee=f"BUT{int(annee)}"
).all()
cls._niveaux_annee_de_parcours_cache[key] = niveaux
_cache[key] = niveaux
return niveaux