diff --git a/app/models/but_refcomp.py b/app/models/but_refcomp.py index d1c4b3f8..38bf1711 100644 --- a/app/models/but_refcomp.py +++ b/app/models/but_refcomp.py @@ -126,11 +126,13 @@ class ApcReferentielCompetences(db.Model, XMLModel): on cherche les niveaux qui sont présents dans tous les parcours et les range sous la clé "TC" (toujours présente mais éventuellement liste vide si pas de tronc commun). - résultat: - { - "TC" : [ ApcNiveau ], - parcour.id : [ ApcNiveau ] - } + Résultat: couple + ( [ ApcParcours ], + { + "TC" : [ ApcNiveau ], + parcour.id : [ ApcNiveau ] + } + ) """ parcours_ref = self.parcours.order_by(ApcParcours.numero).all() if parcour is None: diff --git a/app/models/ues.py b/app/models/ues.py index 964dfae2..b56f209c 100644 --- a/app/models/ues.py +++ b/app/models/ues.py @@ -52,6 +52,7 @@ class UniteEns(db.Model): niveau_competence_id = db.Column(db.Integer, db.ForeignKey("apc_niveau.id")) niveau_competence = db.relationship("ApcNiveau", back_populates="ues") + # Une ue appartient soit à tous les parcours (tronc commun), soit à un seul: parcour_id = db.Column(db.Integer, db.ForeignKey("apc_parcours.id"), index=True) parcour = db.relationship("ApcParcours", back_populates="ues") diff --git a/tests/unit/cursus_but_gb.yaml b/tests/unit/cursus_but_gb.yaml index 458cf81c..c8b1f731 100644 --- a/tests/unit/cursus_but_gb.yaml +++ b/tests/unit/cursus_but_gb.yaml @@ -1,9 +1,39 @@ # Tests unitaires jury BUT # Essais avec un BUT GB et deux parcours sur S1, S2, S3 -FormationFilename: scodoc_formation_BUT_GB_v1.xml -ReferentielCompetencesFilename: but-GB-05012022-081625.xml -ReferentielCompetencesSpecialite: GB +ReferentielCompetences: + filename: but-GB-05012022-081625.xml + specialite: GB + +Formation: + filename: scodoc_formation_BUT_GB_v1.xml + # Association des UE aux compétences: + ues: + # Tronc commun GB: + 'UE 11': + annee: BUT1 + competence: Analyser + 'UE 12': + annee: BUT1 + competence: Experimenter + # Parcours SEE + 'UE 1.3 SEE': + annee: BUT1 + competence: Gérer + parcours: SEE + 'UE 1.4 SEE': + annee: BUT1 + competence: Traiter + parcours: SEE + # Parcours BMB + 'UE 1.3 BMB': + annee: BUT1 + competence: Mener + parcours: BMB + 'UE 1.4 BMB': + annee: BUT1 + competence: Réaliser + parcours: BMB FormSemestres: # S1 et S2 avec les parcours séparés: @@ -45,6 +75,8 @@ Etudiants: notes_modules: R1.01: 12 R1.SEE.11: 15 + deca: + codes_min: [ ] S2_SEE: parcours: SEE S3: diff --git a/tests/unit/test_but_jury.py b/tests/unit/test_but_jury.py index 199e8b1e..0445ed4d 100644 --- a/tests/unit/test_but_jury.py +++ b/tests/unit/test_but_jury.py @@ -14,6 +14,7 @@ from app import db from app.auth.models import User from app.but.import_refcomp import orebut_import_refcomp from app.models import ( + ApcNiveau, ApcParcours, ApcReferentielCompetences, Evaluation, @@ -23,6 +24,7 @@ from app.models import ( Module, ModuleImpl, ModuleUECoef, + UniteEns, ) from app.scodoc import sco_formations @@ -41,12 +43,14 @@ def setup_but_formation(doc: dict) -> Formation: """Importe la formation BUT, l'associe au référentiel de compétences. Après cette fonction, on a une formation chargée, et associée à son ref. comp. """ - refcomp_filename = doc["ReferentielCompetencesFilename"] - refcomp_specialite = doc["ReferentielCompetencesSpecialite"] app.set_sco_dept(DEPT) + refcomp_infos = doc["ReferentielCompetences"] + formation_infos = doc["Formation"] + refcomp_filename = refcomp_infos["filename"] + refcomp_specialite = refcomp_infos["specialite"] # Lecture fichier XML local: with open( - os.path.join(RESOURCES_DIR, "formations", doc["FormationFilename"]), + os.path.join(RESOURCES_DIR, "formations", formation_infos["filename"]), encoding="utf-8", ) as f: doc = f.read() @@ -82,6 +86,29 @@ def setup_but_formation(doc: dict) -> Formation: assert referentiel_competence formation.referentiel_competence_id = referentiel_competence.id db.session.add(formation) + # --- Association des UEs aux parcours niveaux de compétences + for ue_acronyme, ue_infos in formation_infos["ues"].items(): + ue: UniteEns = formation.ues.filter_by(acronyme=ue_acronyme).first() + assert ue is not None # l'UE doit exister dans la formation avec cet acronyme + # Parcours: + if ue_infos.get("parcours", False): + parcour = referentiel_competence.parcours.filter_by( + code=ue_infos["parcours"] + ).first() + assert parcour is not None # le parcours indiqué pour cette UE doit exister + ue.set_parcour(parcour) + + # Niveaux compétences: + competence = referentiel_competence.competences.filter_by( + titre=ue_infos["competence"] + ).first() + assert competence is not None # La compétence de titre indiqué doit exister + niveau: ApcNiveau = competence.niveaux.filter_by( + annee=ue_infos["annee"] + ).first() + assert niveau is not None # le niveau de l'année indiquée doit exister + ue.set_niveau_competence(niveau) + db.session.commit() return formation