Optimisation: table recap jury (x3)

This commit is contained in:
Emmanuel Viennet 2023-06-21 12:33:45 +02:00
parent c8a974d460
commit 7c9f07c36e
2 changed files with 44 additions and 2 deletions

View File

@ -399,6 +399,12 @@ 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,
@ -412,6 +418,15 @@ class ApcNiveau(db.Model, XMLModel):
(dans ce cas, spécifier referentiel_competence) (dans ce cas, spécifier referentiel_competence)
Si competence est indiquée, filtre les niveaux de cette compétence. Si competence est indiquée, filtre les niveaux de cette compétence.
""" """
key = (
parcour.id if parcour else None,
annee,
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
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 = (
@ -428,10 +443,13 @@ 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)
return query.all() result = query.all()
cls._niveaux_annee_de_parcours_cache[key] = 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] = []
return [] return []
if competence is None: if competence is None:
@ -446,6 +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
return niveaux return niveaux

View File

@ -1,6 +1,7 @@
"""ScoDoc 9 models : Unités d'Enseignement (UE) """ScoDoc 9 models : Unités d'Enseignement (UE)
""" """
from flask import g
import pandas as pd import pandas as pd
from app import db, log from app import db, log
@ -8,7 +9,6 @@ from app.models import APO_CODE_STR_LEN
from app.models import SHORT_STR_LEN from app.models import SHORT_STR_LEN
from app.models.but_refcomp import ApcNiveau, ApcParcours from app.models.but_refcomp import ApcNiveau, ApcParcours
from app.models.modules import Module from app.models.modules import Module
from app.scodoc.sco_exceptions import ScoFormationConflict
from app.scodoc import sco_utils as scu from app.scodoc import sco_utils as scu
@ -107,6 +107,17 @@ class UniteEns(db.Model):
If convert_objects, convert all attributes to native types If convert_objects, convert all attributes to native types
(suitable for json encoding). (suitable for json encoding).
""" """
# cache car très utilisé par anciens codes
key = (self.id, convert_objects, with_module_ue_coefs)
_cache = getattr(g, "_ue_to_dict_cache", None)
if _cache:
result = g._ue_to_dict_cache.get(key, False)
if result is not False:
return result
else:
g._ue_to_dict_cache = {}
_cache = g._ue_to_dict_cache
e = dict(self.__dict__) e = dict(self.__dict__)
e.pop("_sa_instance_state", None) e.pop("_sa_instance_state", None)
e.pop("evaluation_ue_poids", None) e.pop("evaluation_ue_poids", None)
@ -133,6 +144,7 @@ class UniteEns(db.Model):
] ]
else: else:
e.pop("module_ue_coefs", None) e.pop("module_ue_coefs", None)
_cache[key] = e
return e return e
def annee(self) -> int: def annee(self) -> int:
@ -180,12 +192,23 @@ class UniteEns(db.Model):
le parcours indiqué. le parcours indiqué.
""" """
if parcour is not None: if parcour is not None:
key = (parcour.id, self.id, only_parcours)
ue_ects_cache = getattr(g, "_ue_ects_cache", None)
if ue_ects_cache:
ects = g._ue_ects_cache.get(key, False)
if ects is not False:
return ects
else:
g._ue_ects_cache = {}
ue_ects_cache = g._ue_ects_cache
ue_parcour = UEParcours.query.filter_by( ue_parcour = UEParcours.query.filter_by(
ue_id=self.id, parcours_id=parcour.id ue_id=self.id, parcours_id=parcour.id
).first() ).first()
if ue_parcour is not None and ue_parcour.ects is not None: if ue_parcour is not None and ue_parcour.ects is not None:
ue_ects_cache[key] = ue_parcour.ects
return ue_parcour.ects return ue_parcour.ects
if only_parcours: if only_parcours:
ue_ects_cache[key] = None
return None return None
return self.ects return self.ects