BUT: tests unitaires yaml avec association UE/Competences

This commit is contained in:
Emmanuel Viennet 2022-12-08 13:59:23 +01:00
parent fcce474f5a
commit d8a15926e4
4 changed files with 73 additions and 11 deletions

View File

@ -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 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). la clé "TC" (toujours présente mais éventuellement liste vide si pas de tronc commun).
résultat: Résultat: couple
( [ ApcParcours ],
{ {
"TC" : [ ApcNiveau ], "TC" : [ ApcNiveau ],
parcour.id : [ ApcNiveau ] parcour.id : [ ApcNiveau ]
} }
)
""" """
parcours_ref = self.parcours.order_by(ApcParcours.numero).all() parcours_ref = self.parcours.order_by(ApcParcours.numero).all()
if parcour is None: if parcour is None:

View File

@ -52,6 +52,7 @@ class UniteEns(db.Model):
niveau_competence_id = db.Column(db.Integer, db.ForeignKey("apc_niveau.id")) niveau_competence_id = db.Column(db.Integer, db.ForeignKey("apc_niveau.id"))
niveau_competence = db.relationship("ApcNiveau", back_populates="ues") 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_id = db.Column(db.Integer, db.ForeignKey("apc_parcours.id"), index=True)
parcour = db.relationship("ApcParcours", back_populates="ues") parcour = db.relationship("ApcParcours", back_populates="ues")

View File

@ -1,9 +1,39 @@
# Tests unitaires jury BUT # Tests unitaires jury BUT
# Essais avec un BUT GB et deux parcours sur S1, S2, S3 # Essais avec un BUT GB et deux parcours sur S1, S2, S3
FormationFilename: scodoc_formation_BUT_GB_v1.xml ReferentielCompetences:
ReferentielCompetencesFilename: but-GB-05012022-081625.xml filename: but-GB-05012022-081625.xml
ReferentielCompetencesSpecialite: GB 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: FormSemestres:
# S1 et S2 avec les parcours séparés: # S1 et S2 avec les parcours séparés:
@ -45,6 +75,8 @@ Etudiants:
notes_modules: notes_modules:
R1.01: 12 R1.01: 12
R1.SEE.11: 15 R1.SEE.11: 15
deca:
codes_min: [ ]
S2_SEE: S2_SEE:
parcours: SEE parcours: SEE
S3: S3:

View File

@ -14,6 +14,7 @@ from app import db
from app.auth.models import User from app.auth.models import User
from app.but.import_refcomp import orebut_import_refcomp from app.but.import_refcomp import orebut_import_refcomp
from app.models import ( from app.models import (
ApcNiveau,
ApcParcours, ApcParcours,
ApcReferentielCompetences, ApcReferentielCompetences,
Evaluation, Evaluation,
@ -23,6 +24,7 @@ from app.models import (
Module, Module,
ModuleImpl, ModuleImpl,
ModuleUECoef, ModuleUECoef,
UniteEns,
) )
from app.scodoc import sco_formations 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. """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. 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) 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: # Lecture fichier XML local:
with open( with open(
os.path.join(RESOURCES_DIR, "formations", doc["FormationFilename"]), os.path.join(RESOURCES_DIR, "formations", formation_infos["filename"]),
encoding="utf-8", encoding="utf-8",
) as f: ) as f:
doc = f.read() doc = f.read()
@ -82,6 +86,29 @@ def setup_but_formation(doc: dict) -> Formation:
assert referentiel_competence assert referentiel_competence
formation.referentiel_competence_id = referentiel_competence.id formation.referentiel_competence_id = referentiel_competence.id
db.session.add(formation) 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() db.session.commit()
return formation return formation