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 import functools
from operator import attrgetter from operator import attrgetter
from flask import g
from flask_sqlalchemy.query import Query from flask_sqlalchemy.query import Query
from sqlalchemy.orm import class_mapper from sqlalchemy.orm import class_mapper
import sqlalchemy import sqlalchemy
@ -399,12 +400,6 @@ class ApcNiveau(db.Model, XMLModel):
"""Vrai si ce niveau fait partie du Tronc Commun""" """Vrai si ce niveau fait partie du Tronc Commun"""
return len(self.parcours) == self.competence.referentiel.parcours.count() 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 @classmethod
def niveaux_annee_de_parcours( def niveaux_annee_de_parcours(
cls, cls,
@ -424,9 +419,14 @@ class ApcNiveau(db.Model, XMLModel):
referentiel_competence.id if referentiel_competence else None, referentiel_competence.id if referentiel_competence else None,
competence.id if competence else None, competence.id if competence else None,
) )
result = cls._niveaux_annee_de_parcours_cache.get(key) _cache = getattr(g, "_niveaux_annee_de_parcours_cache", None)
if result: if _cache:
return result 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}: if annee not in {1, 2, 3}:
raise ValueError("annee invalide pour un parcours BUT") raise ValueError("annee invalide pour un parcours BUT")
referentiel_competence = ( referentiel_competence = (
@ -444,12 +444,12 @@ class ApcNiveau(db.Model, XMLModel):
if competence is not None: if competence is not None:
query = query.filter(ApcCompetence.id == competence.id) query = query.filter(ApcCompetence.id == competence.id)
result = query.all() result = query.all()
cls._niveaux_annee_de_parcours_cache[key] = result _cache[key] = result
return result return result
annee_parcour: ApcAnneeParcours = parcour.annees.filter_by(ordre=annee).first() annee_parcour: ApcAnneeParcours = parcour.annees.filter_by(ordre=annee).first()
if not annee_parcour: if not annee_parcour:
cls._niveaux_annee_de_parcours_cache[key] = [] _cache[key] = []
return [] return []
if competence is None: if competence is None:
@ -464,7 +464,7 @@ class ApcNiveau(db.Model, XMLModel):
niveaux: list[ApcNiveau] = competence.niveaux.filter_by( niveaux: list[ApcNiveau] = competence.niveaux.filter_by(
annee=f"BUT{int(annee)}" annee=f"BUT{int(annee)}"
).all() ).all()
cls._niveaux_annee_de_parcours_cache[key] = niveaux _cache[key] = niveaux
return niveaux return niveaux