Améliore import/export formations BUT: identification des niveaux si libellés dupliqués. + Fix unicité apprentissages critiques-modules.

This commit is contained in:
Emmanuel Viennet 2024-07-10 18:27:13 +02:00
parent 45ec03ec11
commit f0f9158ac6
4 changed files with 65 additions and 9 deletions

View File

@ -604,6 +604,7 @@ app_critiques_modules = db.Table(
db.ForeignKey("apc_app_critique.id", ondelete="CASCADE"), db.ForeignKey("apc_app_critique.id", ondelete="CASCADE"),
primary_key=True, primary_key=True,
), ),
db.UniqueConstraint("module_id", "app_crit_id", name="uix_module_id_app_crit_id"),
) )

View File

@ -47,7 +47,6 @@ from app.scodoc import html_sco_header
from app.scodoc import sco_cache from app.scodoc import sco_cache
from app.scodoc import codes_cursus from app.scodoc import codes_cursus
from app.scodoc import sco_edit_ue from app.scodoc import sco_edit_ue
from app.scodoc import sco_formsemestre
def formation_delete(formation_id=None, dialog_confirmed=False): def formation_delete(formation_id=None, dialog_confirmed=False):

View File

@ -125,6 +125,9 @@ def formation_export_dict(
if formation.is_apc(): if formation.is_apc():
# BUT: indique niveau de compétence associé à l'UE # BUT: indique niveau de compétence associé à l'UE
if ue.niveau_competence: if ue.niveau_competence:
ue_dict["apc_niveau_competence_titre"] = (
ue.niveau_competence.competence.titre
)
ue_dict["apc_niveau_libelle"] = ue.niveau_competence.libelle ue_dict["apc_niveau_libelle"] = ue.niveau_competence.libelle
ue_dict["apc_niveau_annee"] = ue.niveau_competence.annee ue_dict["apc_niveau_annee"] = ue.niveau_competence.annee
ue_dict["apc_niveau_ordre"] = ue.niveau_competence.ordre ue_dict["apc_niveau_ordre"] = ue.niveau_competence.ordre
@ -219,7 +222,7 @@ def formation_export(
"""Get a formation, with UE, matieres, modules """Get a formation, with UE, matieres, modules
in desired format in desired format
""" """
formation: Formation = Formation.query.get_or_404(formation_id) formation = Formation.get_formation(formation_id)
f_dict = formation_export_dict( f_dict = formation_export_dict(
formation, formation,
export_ids=export_ids, export_ids=export_ids,
@ -258,29 +261,39 @@ def _formation_retreive_refcomp(f_dict: dict) -> int:
return refcomp.id return refcomp.id
else: else:
flash( flash(
f"Impossible de trouver le référentiel de compétence pour {refcomp_specialite} : est-il chargé ?" f"""Impossible de trouver le référentiel de compétence pour {
refcomp_specialite} : est-il chargé ?"""
) )
return None return None
def _formation_retreive_apc_niveau( def _formation_retreive_apc_niveau(
referentiel_competence_id: int, ue_dict: dict referentiel_competence_id: int, ue_dict: dict
) -> int: ) -> int | None:
"""Recherche dans le ref. de comp. un niveau pour cette UE. """Recherche dans le ref. de comp. un niveau pour cette UE.
Utilise (libelle, annee, ordre) comme clé. Utilise (libelle, annee, ordre) comme clé, ou
(competence_titre, libelle, annee, ordre) si présent.
""" """
libelle = ue_dict.get("apc_niveau_libelle") libelle = ue_dict.get("apc_niveau_libelle")
annee = ue_dict.get("apc_niveau_annee") annee = ue_dict.get("apc_niveau_annee")
ordre = ue_dict.get("apc_niveau_ordre") ordre = ue_dict.get("apc_niveau_ordre")
if all((libelle, annee, ordre)): competence_titre = ue_dict.get("apc_niveau_competence_titre")
niveau = None
if all((competence_titre, libelle, annee, ordre)):
niveau = (
ApcNiveau.query.filter_by(libelle=libelle, annee=annee, ordre=ordre)
.join(ApcCompetence)
.filter_by(referentiel_id=referentiel_competence_id, titre=competence_titre)
).first()
elif all((libelle, annee, ordre)):
niveau = ( niveau = (
ApcNiveau.query.filter_by(libelle=libelle, annee=annee, ordre=ordre) ApcNiveau.query.filter_by(libelle=libelle, annee=annee, ordre=ordre)
.join(ApcCompetence) .join(ApcCompetence)
.filter_by(referentiel_id=referentiel_competence_id) .filter_by(referentiel_id=referentiel_competence_id)
).first() ).first()
if niveau is not None:
return niveau.id return niveau.id if niveau is not None else None
return None
def formation_import_xml(doc: str, import_tags=True, use_local_refcomp=False): def formation_import_xml(doc: str, import_tags=True, use_local_refcomp=False):

View File

@ -0,0 +1,43 @@
"""fix_refcomp_geii
Revision ID: f6cb3d4e44ec
Revises: 9794534db935
Create Date: 2024-07-10 17:03:58.549168
Élimine éventuels doublons dans associations Apprentissages critiques du ref. comp.
Pour le cas de GEII seulement.
"""
from alembic import op
# revision identifiers, used by Alembic.
revision = "f6cb3d4e44ec"
down_revision = "9794534db935"
branch_labels = None
depends_on = None
def upgrade():
op.execute(
"""
CREATE TABLE apc_modules_acs_temp AS
SELECT DISTINCT module_id, app_crit_id
FROM apc_modules_acs;
DELETE FROM apc_modules_acs;
INSERT INTO apc_modules_acs (module_id, app_crit_id)
SELECT module_id, app_crit_id
FROM apc_modules_acs_temp;
"""
)
with op.batch_alter_table("apc_modules_acs", schema=None) as batch_op:
batch_op.create_unique_constraint(
"uix_module_id_app_crit_id", ["module_id", "app_crit_id"]
)
op.drop_table("apc_modules_acs_temp")
def downgrade():
with op.batch_alter_table("apc_modules_acs", schema=None) as batch_op:
batch_op.drop_constraint("uix_module_id_app_crit_id", type_="unique")