From e321bd525c7d91bca40b16767d0d4e827a1f3189 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sun, 14 May 2023 15:00:15 +0200 Subject: [PATCH] =?UTF-8?q?Am=C3=A9liore=20import/export=20formations=20BU?= =?UTF-8?q?T=20(ects=20par=20parcours)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/ues.py | 20 +++++----- app/scodoc/sco_formations.py | 37 +++++++++---------- ...{test_cursus_but.py => test_but_cursus.py} | 0 3 files changed, 28 insertions(+), 29 deletions(-) rename tests/unit/{test_cursus_but.py => test_but_cursus.py} (100%) diff --git a/app/models/ues.py b/app/models/ues.py index 588913dd..8bbdb99e 100644 --- a/app/models/ues.py +++ b/app/models/ues.py @@ -110,17 +110,19 @@ class UniteEns(db.Model): # ScoDoc7 output_formators e["ue_id"] = self.id e["numero"] = e["numero"] if e["numero"] else 0 - e["ects"] = e["ects"] # legacy - e["ects_by_parcours"] = {} - for up in UEParcours.query.filter_by(ue_id=self.id): - p = ApcParcours.query.get(up.parcours_id) - e["ects_by_parcours"][p.code] = self.get_ects(p) - e["coefficient"] = e["coefficient"] if e["coefficient"] else 0.0 e["code_apogee"] = e["code_apogee"] or "" # pas de None - e["parcours"] = [ - parcour.to_dict(with_annees=False) for parcour in self.parcours - ] + e["ects_by_parcours"] = { + parcour.code: self.get_ects(parcour) for parcour in self.parcours + } + e["parcours"] = [] + for parcour in self.parcours: + p_dict = parcour.to_dict(with_annees=False) + ects = self.get_ects(parcour, only_parcours=True) + if ects is not None: + p_dict["ects"] = ects + e["parcours"].append(p_dict) + if with_module_ue_coefs: if convert_objects: e["module_ue_coefs"] = [ diff --git a/app/scodoc/sco_formations.py b/app/scodoc/sco_formations.py index 88691b9c..cf0239b9 100644 --- a/app/scodoc/sco_formations.py +++ b/app/scodoc/sco_formations.py @@ -127,11 +127,7 @@ def formation_export_dict( ue_dict["apc_niveau_libelle"] = ue.niveau_competence.libelle ue_dict["apc_niveau_annee"] = ue.niveau_competence.annee ue_dict["apc_niveau_ordre"] = ue.niveau_competence.ordre - # Et les parcours: - if ue.parcours: - ue_dict["parcours"] = [ - parcour.to_dict(with_annees=False) for parcour in ue.parcours - ] + # pour les coefficients: ue_dict["reference"] = ue.id if ue_reference_style == "id" else ue.acronyme if not export_ids: @@ -367,14 +363,13 @@ def formation_import_xml(doc: str, import_tags=True, use_local_refcomp=False): assert ue if xml_ue_id: ues_old2new[xml_ue_id] = ue_id - # parcours BUT - # TODO XXX + # élément optionnel présent dans les exports BUT: ue_reference = ue_info[1].get("reference") if ue_reference: ue_reference_to_id[int(ue_reference)] = ue_id - # -- create matieres + # -- Create matieres for mat_info in ue_info[2]: # Backward compat: un seul parcours par UE (ScoDoc < 9.4.71) if mat_info[0] == "parcour": @@ -392,18 +387,20 @@ def formation_import_xml(doc: str, import_tags=True, use_local_refcomp=False): log(f"Warning: parcours {code_parcours} inexistant !") continue elif mat_info[0] == "parcours": - # Parcours (BUT), liste (ScoDoc > 9.4.70) - codes_parcours = mat_info[1]["code"] - for code_parcours in codes_parcours: - parcour = ApcParcours.query.filter_by( - code=code_parcours, - referentiel_id=referentiel_competence_id, - ).first() - if parcour: - ue.parcours.append(parcour) - else: - flash(f"Attention: parcours {code_parcours} inexistant !") - log(f"Warning: parcours {code_parcours} inexistant !") + # Parcours (BUT), liste (ScoDoc > 9.4.70), avec ECTS en option + code_parcours = mat_info[1]["code"] + ue_parcour_ects = mat_info[1].get("ects") + parcour = ApcParcours.query.filter_by( + code=code_parcours, + referentiel_id=referentiel_competence_id, + ).first() + if parcour: + ue.parcours.append(parcour) + else: + flash(f"Attention: parcours {code_parcours} inexistant !") + log(f"Warning: parcours {code_parcours} inexistant !") + if ue_parcour_ects is not None: + ue.set_ects(ue_parcour_ects, parcour) db.session.add(ue) continue diff --git a/tests/unit/test_cursus_but.py b/tests/unit/test_but_cursus.py similarity index 100% rename from tests/unit/test_cursus_but.py rename to tests/unit/test_but_cursus.py