Import/export xml des formations (format ScoDoc) avec coefs UE

This commit is contained in:
Emmanuel Viennet 2021-11-30 11:07:17 +01:00
parent 5d8dad3711
commit 440e9157b4

View File

@ -35,9 +35,10 @@ from flask import g, url_for, request
from flask_login import current_user from flask_login import current_user
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb import app.scodoc.notesdb as ndb
from app import db
from app import log from app import log
from app.models import Formation, Module
from app.scodoc import sco_codes_parcours from app.scodoc import sco_codes_parcours
from app.scodoc import sco_edit_matiere from app.scodoc import sco_edit_matiere
from app.scodoc import sco_edit_module from app.scodoc import sco_edit_module
@ -103,7 +104,8 @@ def formation_export(
"""Get a formation, with UE, matieres, modules """Get a formation, with UE, matieres, modules
in desired format 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} selector = {"formation_id": formation_id}
if not export_external_ues: if not export_external_ues:
selector["is_external"] = False selector["is_external"] = False
@ -111,7 +113,9 @@ def formation_export(
F["ue"] = ues F["ue"] = ues
for ue in ues: for ue in ues:
ue_id = ue["ue_id"] ue_id = ue["ue_id"]
ue["reference"] = ue_id # pour les coefficients
if not export_ids: if not export_ids:
del ue["id"]
del ue["ue_id"] del ue["ue_id"]
del ue["formation_id"] del ue["formation_id"]
if ue["ects"] is None: if ue["ects"] is None:
@ -121,17 +125,27 @@ def formation_export(
for mat in mats: for mat in mats:
matiere_id = mat["matiere_id"] matiere_id = mat["matiere_id"]
if not export_ids: if not export_ids:
del mat["id"]
del mat["matiere_id"] del mat["matiere_id"]
del mat["ue_id"] del mat["ue_id"]
mods = sco_edit_module.module_list({"matiere_id": matiere_id}) mods = sco_edit_module.module_list({"matiere_id": matiere_id})
mat["module"] = mods mat["module"] = mods
for mod in mods: for mod in mods:
module_id = mod["module_id"]
if export_tags: 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"]) tags = sco_tag_module.module_tag_list(module_id=mod["module_id"])
if tags: if tags:
mod["tags"] = [{"name": x} for x in 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: if not export_ids:
del mod["id"]
del mod["ue_id"] del mod["ue_id"]
del mod["matiere_id"] del mod["matiere_id"]
del mod["module_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 ues_old2new = {} # xml ue_id : new ue_id
modules_old2new = {} # xml module_id : new module_id modules_old2new = {} # xml module_id : new module_id
# (nb: mecanisme utilise pour cloner semestres seulement, pas pour I/O XML) # (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 # -- create UEs
for ue_info in D[2]: for ue_info in D[2]:
assert ue_info[0] == "ue" 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]) ue_id = sco_edit_ue.do_ue_create(ue_info[1])
if xml_ue_id: if xml_ue_id:
ues_old2new[xml_ue_id] = 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 # -- create matieres
for mat_info in ue_info[2]: for mat_info in ue_info[2]:
assert mat_info[0] == "matiere" 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]) mod_id = sco_edit_module.do_module_create(mod_info[1])
if xml_module_id: if xml_module_id:
modules_old2new[int(xml_module_id)] = mod_id modules_old2new[int(xml_module_id)] = mod_id
if import_tags:
if len(mod_info) > 2: if len(mod_info) > 2:
tag_names = [t[1]["name"] for t in 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) 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 return formation_id, modules_old2new, ues_old2new