From e321bd525c7d91bca40b16767d0d4e827a1f3189 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sun, 14 May 2023 15:00:15 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Am=C3=A9liore=20import/export=20formations?= =?UTF-8?q?=20BUT=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 From 61d8ae2fd84c7adb8ff61d3b9a0a594ad0f01fd0 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sun, 14 May 2023 15:00:39 +0200 Subject: [PATCH 2/2] =?UTF-8?q?Corrige=20=C3=A9dition=20coefs=20BUT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/pn_modules.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/views/pn_modules.py b/app/views/pn_modules.py index c0e1152c..e18e707e 100644 --- a/app/views/pn_modules.py +++ b/app/views/pn_modules.py @@ -85,7 +85,14 @@ def table_modules_ue_coefs(formation_id, semestre_idx=None, parcours_id: int = N modules = [ mod for mod in modules - if (parcours_id in (p.id for p in mod.parcours)) or (mod.parcours is None) + if ((parcours_id in (p.id for p in mod.parcours)) or (mod.parcours is None)) + and mod.module_type in (scu.ModuleType.RESSOURCE, scu.ModuleType.SAE) + ] + else: # ne montre que les ressources et SAE (pas le bonus...) + modules = [ + mod + for mod in modules + if mod.module_type in (scu.ModuleType.RESSOURCE, scu.ModuleType.SAE) ] # Titre des modules, en ligne col_titres_mods = [ @@ -119,8 +126,8 @@ def table_modules_ue_coefs(formation_id, semestre_idx=None, parcours_id: int = N # met en gris les coefs qui devraient être nuls # car le module n'est pas dans le parcours de l'UE: if ( - (mod.parcours is not None) - and (ue.parcours) + mod.parcours + and ue.parcours and not {p.id for p in ue.parcours}.intersection(mod_parcours_ids) ): cell_style = style + " champs_coef_hors_parcours"