From 440e9157b424cc2777eacf5a991556cad939c82b Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Tue, 30 Nov 2021 11:07:17 +0100 Subject: [PATCH] Import/export xml des formations (format ScoDoc) avec coefs UE --- app/scodoc/sco_formations.py | 50 +++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/app/scodoc/sco_formations.py b/app/scodoc/sco_formations.py index 8aa7c72c2..afdcbaee2 100644 --- a/app/scodoc/sco_formations.py +++ b/app/scodoc/sco_formations.py @@ -35,9 +35,10 @@ from flask import g, url_for, request from flask_login import current_user import app.scodoc.sco_utils as scu - import app.scodoc.notesdb as ndb +from app import db from app import log +from app.models import Formation, Module from app.scodoc import sco_codes_parcours from app.scodoc import sco_edit_matiere from app.scodoc import sco_edit_module @@ -103,7 +104,8 @@ def formation_export( """Get a formation, with UE, matieres, modules in desired format """ - F = formation_list(args={"formation_id": formation_id})[0] + formation = Formation.query.get_or_404(formation_id) + F = formation.to_dict() selector = {"formation_id": formation_id} if not export_external_ues: selector["is_external"] = False @@ -111,7 +113,9 @@ def formation_export( F["ue"] = ues for ue in ues: ue_id = ue["ue_id"] + ue["reference"] = ue_id # pour les coefficients if not export_ids: + del ue["id"] del ue["ue_id"] del ue["formation_id"] if ue["ects"] is None: @@ -121,17 +125,27 @@ def formation_export( for mat in mats: matiere_id = mat["matiere_id"] if not export_ids: + del mat["id"] del mat["matiere_id"] del mat["ue_id"] mods = sco_edit_module.module_list({"matiere_id": matiere_id}) mat["module"] = mods for mod in mods: + module_id = mod["module_id"] if export_tags: - # mod['tags'] = sco_tag_module.module_tag_list( module_id=mod['module_id']) tags = sco_tag_module.module_tag_list(module_id=mod["module_id"]) if tags: mod["tags"] = [{"name": x} for x in tags] + # + module = Module.query.get(module_id) + if module.is_apc(): + # Exporte les coefficients + mod["coefficients"] = [ + {"ue_reference": str(ue_id), "coef": str(coef)} + for (ue_id, coef) in module.get_ue_coef_dict().items() + ] if not export_ids: + del mod["id"] del mod["ue_id"] del mod["matiere_id"] del mod["module_id"] @@ -197,6 +211,9 @@ def formation_import_xml(doc: str, import_tags=True): ues_old2new = {} # xml ue_id : new ue_id modules_old2new = {} # xml module_id : new module_id # (nb: mecanisme utilise pour cloner semestres seulement, pas pour I/O XML) + + ue_reference_to_id = {} # pour les coefs APC (map reference -> ue_id) + modules_a_coefficienter = [] # Liste des modules avec coefs APC # -- create UEs for ue_info in D[2]: assert ue_info[0] == "ue" @@ -209,6 +226,9 @@ def formation_import_xml(doc: str, import_tags=True): ue_id = sco_edit_ue.do_ue_create(ue_info[1]) if xml_ue_id: ues_old2new[xml_ue_id] = ue_id + ue_reference = int(ue_info[1].get("reference")) + if ue_reference: + ue_reference_to_id[ue_reference] = ue_id # -- create matieres for mat_info in ue_info[2]: assert mat_info[0] == "matiere" @@ -228,11 +248,27 @@ def formation_import_xml(doc: str, import_tags=True): mod_id = sco_edit_module.do_module_create(mod_info[1]) if xml_module_id: modules_old2new[int(xml_module_id)] = mod_id - if import_tags: - if len(mod_info) > 2: - tag_names = [t[1]["name"] for t in mod_info[2]] + if len(mod_info) > 2: + module = Module.query.get(mod_id) + tag_names = [] + ue_coef_dict = {} + for child in mod_info[2]: + if child[0] == "tags" and import_tags: + tag_names.append(child[1]["name"]) + elif child[0] == "coefficients": + ue_reference = int(child[1]["ue_reference"]) + coef = float(child[1]["coef"]) + ue_coef_dict[ue_reference] = coef + if import_tags and tag_names: sco_tag_module.module_tag_set(mod_id, tag_names) - + if module.is_apc() and ue_coef_dict: + modules_a_coefficienter.append((module, ue_coef_dict)) + # Fixe les coefs APC (à la fin pour que les UE soient crées) + for module, ue_coef_dict_ref in modules_a_coefficienter: + # remap ue ids: + ue_coef_dict = {ue_reference_to_id[k]: v for (k, v) in ue_coef_dict_ref.items()} + module.set_ue_coef_dict(ue_coef_dict) + db.session.commit() return formation_id, modules_old2new, ues_old2new