Fix: edition de formations migrées (non affichages de certains modules)

This commit is contained in:
Emmanuel Viennet 2022-01-08 14:01:16 +01:00
parent 0c57aa83ca
commit f2e9fbb8cd
5 changed files with 22 additions and 10 deletions

View File

@ -97,14 +97,18 @@ class Formation(db.Model):
for sem in self.formsemestres: for sem in self.formsemestres:
sco_cache.invalidate_formsemestre(formsemestre_id=sem.id) sco_cache.invalidate_formsemestre(formsemestre_id=sem.id)
def force_semestre_modules_aux_ues(self) -> None: def sanitize_old_formation(self) -> None:
""" """
Affecte à chaque module de cette formation le semestre de son UE de rattachement, Corrige si nécessaire certains champs issus d'anciennes versions de ScoDoc:
- affecte à chaque module de cette formation le semestre de son UE de rattachement,
si elle en a une. si elle en a une.
- si le module_type n'est pas renseigné, le met à STANDARD.
Devrait être appelé lorsqu'on change le type de formation vers le BUT, et aussi Devrait être appelé lorsqu'on change le type de formation vers le BUT, et aussi
lorsqu'on change le semestre d'une UE BUT. lorsqu'on change le semestre d'une UE BUT.
Utile pour la migration des anciennes formations vers le BUT. Utile pour la migration des anciennes formations vers le BUT.
Invalide les caches coefs/poids.
En cas de changement, invalide les caches coefs/poids.
""" """
if not self.is_apc(): if not self.is_apc():
return return
@ -118,6 +122,10 @@ class Formation(db.Model):
mod.semestre_id = mod.ue.semestre_idx mod.semestre_id = mod.ue.semestre_idx
db.session.add(mod) db.session.add(mod)
change = True change = True
if mod.module_type is None:
mod.module_type = scu.ModuleType.STANDARD
db.session.add(mod)
change = True
db.session.commit() db.session.commit()
if change: if change:
self.invalidate_module_coefs() self.invalidate_module_coefs()

View File

@ -46,7 +46,10 @@ class UniteEns(db.Model):
modules = db.relationship("Module", lazy="dynamic", backref="ue") modules = db.relationship("Module", lazy="dynamic", backref="ue")
def __repr__(self): def __repr__(self):
return f"<{self.__class__.__name__}(id={self.id}, formation_id={self.formation_id}, acronyme='{self.acronyme}')>" return f"""<{self.__class__.__name__}(id={self.id}, formation_id={
self.formation_id}, acronyme='{self.acronyme}', semestre_idx={
self.semestre_idx} {
'EXTERNE' if self.is_external else ''})>"""
def to_dict(self): def to_dict(self):
"""as a dict, with the same conversions as in ScoDoc7""" """as a dict, with the same conversions as in ScoDoc7"""

View File

@ -62,7 +62,8 @@ def html_edit_formation_apc(
else: else:
semestre_ids = [semestre_idx] semestre_ids = [semestre_idx]
other_modules = formation.modules.filter( other_modules = formation.modules.filter(
Module.module_type != ModuleType.SAE, Module.module_type != ModuleType.RESSOURCE Module.module_type.is_distinct_from(ModuleType.SAE),
Module.module_type.is_distinct_from(ModuleType.RESSOURCE),
).order_by( ).order_by(
Module.semestre_id, Module.module_type.desc(), Module.numero, Module.code Module.semestre_id, Module.module_type.desc(), Module.numero, Module.code
) )

View File

@ -304,9 +304,9 @@ def do_formation_edit(args):
cnx = ndb.GetDBConnexion() cnx = ndb.GetDBConnexion()
sco_formations._formationEditor.edit(cnx, args) sco_formations._formationEditor.edit(cnx, args)
formation = Formation.query.get(args["formation_id"]) formation: Formation = Formation.query.get(args["formation_id"])
formation.invalidate_cached_sems() formation.invalidate_cached_sems()
formation.force_semestre_modules_aux_ues() formation.sanitize_old_formation()
def module_move(module_id, after=0, redirect=True): def module_move(module_id, after=0, redirect=True):

View File

@ -504,12 +504,12 @@ def ue_table(formation_id=None, semestre_idx=1, msg=""): # was ue_list
"""Liste des matières et modules d'une formation, avec liens pour """Liste des matières et modules d'une formation, avec liens pour
éditer (si non verrouillée). éditer (si non verrouillée).
""" """
from app.scodoc import sco_formations
from app.scodoc import sco_formsemestre_validation from app.scodoc import sco_formsemestre_validation
formation = Formation.query.get(formation_id) formation: Formation = Formation.query.get(formation_id)
if not formation: if not formation:
raise ScoValueError("invalid formation_id") raise ScoValueError("invalid formation_id")
formation.sanitize_old_formation()
parcours = formation.get_parcours() parcours = formation.get_parcours()
is_apc = parcours.APC_SAE is_apc = parcours.APC_SAE
locked = formation.has_locked_sems() locked = formation.has_locked_sems()
@ -1205,7 +1205,7 @@ def do_ue_edit(args, bypass_lock=False, dont_invalidate_cache=False):
if not dont_invalidate_cache: if not dont_invalidate_cache:
# Invalide les semestres utilisant cette formation: # Invalide les semestres utilisant cette formation:
formation.invalidate_cached_sems() formation.invalidate_cached_sems()
formation.force_semestre_modules_aux_ues() formation.sanitize_old_formation()
# essai edition en ligne: # essai edition en ligne: