1
0
forked from ScoDoc/ScoDoc

traitement exceptions imports xml

This commit is contained in:
Emmanuel Viennet 2021-12-03 14:13:49 +01:00
parent ec93a8cdbc
commit 6627a9c6b2
9 changed files with 619 additions and 67 deletions

View File

@ -1,3 +1,8 @@
##############################################################################
# ScoDoc
# Copyright (c) 1999 - 2021 Emmanuel Viennet. All rights reserved.
# See LICENSE
##############################################################################
from xml.etree import ElementTree from xml.etree import ElementTree
from typing import TextIO from typing import TextIO
@ -14,14 +19,20 @@ from app.models.but_refcomp import (
ApcAnneeParcours, ApcAnneeParcours,
ApcParcoursNiveauCompetence, ApcParcoursNiveauCompetence,
) )
from app.scodoc.sco_exceptions import FormatError from app.scodoc.sco_exceptions import ScoFormatError
def orebut_import_refcomp(xml_file: TextIO, dept_id: int, orig_filename=None): def orebut_import_refcomp(xml_data: str, dept_id: int, orig_filename=None):
tree = ElementTree.parse(xml_file) """Importation XML Orébut
root = tree.getroot() peut lever TypeError ou ScoFormatError
Résultat: instance de ApcReferentielCompetences
"""
try:
root = ElementTree.XML(xml_data)
except ElementTree.ParseError:
raise ScoFormatError("fichier XML Orébut invalide")
if root.tag != "referentiel_competence": if root.tag != "referentiel_competence":
raise FormatError("élément racine 'referentiel_competence' manquant") raise ScoFormatError("élément racine 'referentiel_competence' manquant")
args = ApcReferentielCompetences.attr_from_xml(root.attrib) args = ApcReferentielCompetences.attr_from_xml(root.attrib)
args["dept_id"] = dept_id args["dept_id"] = dept_id
args["scodoc_orig_filename"] = orig_filename args["scodoc_orig_filename"] = orig_filename
@ -29,7 +40,7 @@ def orebut_import_refcomp(xml_file: TextIO, dept_id: int, orig_filename=None):
db.session.add(ref) db.session.add(ref)
competences = root.find("competences") competences = root.find("competences")
if not competences: if not competences:
raise FormatError("élément 'competences' manquant") raise ScoFormatError("élément 'competences' manquant")
for competence in competences.findall("competence"): for competence in competences.findall("competence"):
c = ApcCompetence(**ApcCompetence.attr_from_xml(competence.attrib)) c = ApcCompetence(**ApcCompetence.attr_from_xml(competence.attrib))
ref.competences.append(c) ref.competences.append(c)
@ -58,7 +69,7 @@ def orebut_import_refcomp(xml_file: TextIO, dept_id: int, orig_filename=None):
# --- PARCOURS # --- PARCOURS
parcours = root.find("parcours") parcours = root.find("parcours")
if not parcours: if not parcours:
raise FormatError("élément 'parcours' manquant") raise ScoFormatError("élément 'parcours' manquant")
for parcour in parcours.findall("parcour"): for parcour in parcours.findall("parcour"):
parc = ApcParcours(**ApcParcours.attr_from_xml(parcour.attrib)) parc = ApcParcours(**ApcParcours.attr_from_xml(parcour.attrib))
ref.parcours.append(parc) ref.parcours.append(parc)
@ -71,9 +82,9 @@ def orebut_import_refcomp(xml_file: TextIO, dept_id: int, orig_filename=None):
# Retrouve la competence # Retrouve la competence
comp = ref.competences.filter_by(titre=nom).all() comp = ref.competences.filter_by(titre=nom).all()
if len(comp) == 0: if len(comp) == 0:
raise FormatError(f"competence {nom} référencée mais on définie") raise ScoFormatError(f"competence {nom} référencée mais on définie")
elif len(comp) > 1: elif len(comp) > 1:
raise FormatError(f"competence {nom} ambigüe") raise ScoFormatError(f"competence {nom} ambigüe")
ass = ApcParcoursNiveauCompetence( ass = ApcParcoursNiveauCompetence(
niveau=niveau, annee_parcours=a, competence=comp[0] niveau=niveau, annee_parcours=a, competence=comp[0]
) )
@ -94,13 +105,14 @@ ref = ApcReferentielCompetences(**ApcReferentielCompetences.attr_from_xml(root.a
competences = root.find("competences") competences = root.find("competences")
if not competences: if not competences:
raise FormatError("élément 'competences' manquant") raise ScoFormatError("élément 'competences' manquant")
competence = competences.findall("competence")[0] # XXX competence = competences.findall("competence")[0] # XXX
from app.but.import_refcomp import * from app.but.import_refcomp import *
f = open("but-RT-refcomp-30112021.xml") dept_id = models.Departement.query.first().id
ref = orebut_import_refcomp(f, 0) data = open("tests/data/but-RT-refcomp-exemple.xml").read()
ref = orebut_import_refcomp(data, dept_id)
#------ #------
from app.but.import_refcomp import * from app.but.import_refcomp import *
ref = ApcReferentielCompetences.query.first() ref = ApcReferentielCompetences.query.first()

View File

@ -1,3 +1,8 @@
##############################################################################
# ScoDoc
# Copyright (c) 1999 - 2021 Emmanuel Viennet. All rights reserved.
# See LICENSE
##############################################################################
"""ScoDoc 9 models : Référentiel Compétence BUT 2021 """ScoDoc 9 models : Référentiel Compétence BUT 2021
""" """
from datetime import datetime from datetime import datetime

View File

@ -98,7 +98,7 @@ from chardet import detect as chardet_detect
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 log from app import log
from app.scodoc.sco_exceptions import ScoValueError, FormatError from app.scodoc.sco_exceptions import ScoValueError, ScoFormatError
from app.scodoc.gen_tables import GenTable from app.scodoc.gen_tables import GenTable
from app.scodoc.sco_vdi import ApoEtapeVDI from app.scodoc.sco_vdi import ApoEtapeVDI
from app.scodoc.sco_codes_parcours import code_semestre_validant from app.scodoc.sco_codes_parcours import code_semestre_validant
@ -681,7 +681,7 @@ class ApoData(object):
self.periode = periode # self.periode = periode #
try: try:
self.read_csv(data) self.read_csv(data)
except FormatError as e: except ScoFormatError as e:
# essaie de retrouver le nom du fichier pour enrichir le message d'erreur # essaie de retrouver le nom du fichier pour enrichir le message d'erreur
filename = "" filename = ""
if self.orig_filename is None: if self.orig_filename is None:
@ -689,7 +689,7 @@ class ApoData(object):
filename = self.titles.get("apoC_Fichier_Exp", filename) filename = self.titles.get("apoC_Fichier_Exp", filename)
else: else:
filename = self.orig_filename filename = self.orig_filename
raise FormatError( raise ScoFormatError(
"<h3>Erreur lecture du fichier Apogée <tt>%s</tt></h3><p>" % filename "<h3>Erreur lecture du fichier Apogée <tt>%s</tt></h3><p>" % filename
+ e.args[0] + e.args[0]
+ "</p>" + "</p>"
@ -759,13 +759,13 @@ class ApoData(object):
def read_csv(self, data: str): def read_csv(self, data: str):
if not data: if not data:
raise FormatError("Fichier Apogée vide !") raise ScoFormatError("Fichier Apogée vide !")
f = StringIOFileLineWrapper(data) # pour traiter comme un fichier f = StringIOFileLineWrapper(data) # pour traiter comme un fichier
# check that we are at the begining of Apogee CSV # check that we are at the begining of Apogee CSV
line = f.readline().strip() line = f.readline().strip()
if line != "XX-APO_TITRES-XX": if line != "XX-APO_TITRES-XX":
raise FormatError("format incorrect: pas de XX-APO_TITRES-XX") raise ScoFormatError("format incorrect: pas de XX-APO_TITRES-XX")
# 1-- En-tête: du début jusqu'à la balise XX-APO_VALEURS-XX # 1-- En-tête: du début jusqu'à la balise XX-APO_VALEURS-XX
idx = data.index("XX-APO_VALEURS-XX") idx = data.index("XX-APO_VALEURS-XX")
@ -779,13 +779,13 @@ class ApoData(object):
# 3-- La section XX-APO_TYP_RES-XX est ignorée: # 3-- La section XX-APO_TYP_RES-XX est ignorée:
line = f.readline().strip() line = f.readline().strip()
if line != "XX-APO_TYP_RES-XX": if line != "XX-APO_TYP_RES-XX":
raise FormatError("format incorrect: pas de XX-APO_TYP_RES-XX") raise ScoFormatError("format incorrect: pas de XX-APO_TYP_RES-XX")
_apo_skip_section(f) _apo_skip_section(f)
# 4-- Définition de colonnes: (on y trouve aussi l'étape) # 4-- Définition de colonnes: (on y trouve aussi l'étape)
line = f.readline().strip() line = f.readline().strip()
if line != "XX-APO_COLONNES-XX": if line != "XX-APO_COLONNES-XX":
raise FormatError("format incorrect: pas de XX-APO_COLONNES-XX") raise ScoFormatError("format incorrect: pas de XX-APO_COLONNES-XX")
self.cols = _apo_read_cols(f) self.cols = _apo_read_cols(f)
self.apo_elts = self._group_elt_cols(self.cols) self.apo_elts = self._group_elt_cols(self.cols)
@ -794,7 +794,7 @@ class ApoData(object):
while True: # skip while True: # skip
line = f.readline() line = f.readline()
if not line: if not line:
raise FormatError("format incorrect: pas de XX-APO_VALEURS-XX") raise ScoFormatError("format incorrect: pas de XX-APO_VALEURS-XX")
if line.strip() == "XX-APO_VALEURS-XX": if line.strip() == "XX-APO_VALEURS-XX":
break break
self.column_titles = f.readline() self.column_titles = f.readline()
@ -885,7 +885,7 @@ class ApoData(object):
""" """
m = re.match("[12][0-9]{3}", self.titles["apoC_annee"]) m = re.match("[12][0-9]{3}", self.titles["apoC_annee"])
if not m: if not m:
raise FormatError( raise ScoFormatError(
'Annee scolaire (apoC_annee) invalide: "%s"' % self.titles["apoC_annee"] 'Annee scolaire (apoC_annee) invalide: "%s"' % self.titles["apoC_annee"]
) )
return int(m.group(0)) return int(m.group(0))
@ -943,7 +943,7 @@ class ApoData(object):
log("Fichier Apogee invalide:") log("Fichier Apogee invalide:")
log("Colonnes declarees: %s" % declared) log("Colonnes declarees: %s" % declared)
log("Colonnes presentes: %s" % present) log("Colonnes presentes: %s" % present)
raise FormatError( raise ScoFormatError(
"""Fichier Apogee invalide<br/>Colonnes declarees: <tt>%s</tt> """Fichier Apogee invalide<br/>Colonnes declarees: <tt>%s</tt>
<br/>Colonnes presentes: <tt>%s</tt>""" <br/>Colonnes presentes: <tt>%s</tt>"""
% (declared, present) % (declared, present)
@ -1032,7 +1032,7 @@ def _apo_read_cols(f):
line = f.readline().strip(" " + APO_NEWLINE) line = f.readline().strip(" " + APO_NEWLINE)
fs = line.split(APO_SEP) fs = line.split(APO_SEP)
if fs[0] != "apoL_a01_code": if fs[0] != "apoL_a01_code":
raise FormatError("invalid line: %s (expecting apoL_a01_code)" % line) raise ScoFormatError("invalid line: %s (expecting apoL_a01_code)" % line)
col_keys = fs col_keys = fs
while True: # skip premiere partie (apoL_a02_nom, ...) while True: # skip premiere partie (apoL_a02_nom, ...)
@ -1052,14 +1052,14 @@ def _apo_read_cols(f):
# sanity check # sanity check
col_id = fs[0] # apoL_c0001, ... col_id = fs[0] # apoL_c0001, ...
if col_id in cols: if col_id in cols:
raise FormatError("duplicate column definition: %s" % col_id) raise ScoFormatError("duplicate column definition: %s" % col_id)
m = re.match(r"^apoL_c([0-9]{4})$", col_id) m = re.match(r"^apoL_c([0-9]{4})$", col_id)
if not m: if not m:
raise FormatError( raise ScoFormatError(
"invalid column id: %s (expecting apoL_c%04d)" % (line, col_id) "invalid column id: %s (expecting apoL_c%04d)" % (line, col_id)
) )
if int(m.group(1)) != i: if int(m.group(1)) != i:
raise FormatError("invalid column id: %s for index %s" % (col_id, i)) raise ScoFormatError("invalid column id: %s for index %s" % (col_id, i))
cols[col_id] = DictCol(list(zip(col_keys, fs))) cols[col_id] = DictCol(list(zip(col_keys, fs)))
cols[col_id].lineno = f.lineno # for debuging purpose cols[col_id].lineno = f.lineno # for debuging purpose
@ -1083,14 +1083,14 @@ def _apo_read_TITRES(f):
else: else:
log("Error read CSV: \nline=%s\nfields=%s" % (line, fields)) log("Error read CSV: \nline=%s\nfields=%s" % (line, fields))
log(dir(f)) log(dir(f))
raise FormatError( raise ScoFormatError(
"Fichier Apogee incorrect (section titres, %d champs au lieu de 2)" "Fichier Apogee incorrect (section titres, %d champs au lieu de 2)"
% len(fields) % len(fields)
) )
d[k] = v d[k] = v
# #
if not d.get("apoC_Fichier_Exp", None): if not d.get("apoC_Fichier_Exp", None):
raise FormatError("Fichier Apogee incorrect: pas de titre apoC_Fichier_Exp") raise ScoFormatError("Fichier Apogee incorrect: pas de titre apoC_Fichier_Exp")
# keep only basename: may be a windows or unix pathname # keep only basename: may be a windows or unix pathname
s = d["apoC_Fichier_Exp"].split("/")[-1] s = d["apoC_Fichier_Exp"].split("/")[-1]
s = s.split("\\")[-1] # for DOS paths, eg C:\TEMP\VL4RT_V3ASR.TXT s = s.split("\\")[-1] # for DOS paths, eg C:\TEMP\VL4RT_V3ASR.TXT

View File

@ -56,7 +56,7 @@ class ScoValueError(ScoException):
self.dest_url = dest_url self.dest_url = dest_url
class FormatError(ScoValueError): class ScoFormatError(ScoValueError):
pass pass

View File

@ -50,7 +50,7 @@ from app.scodoc import sco_tag_module
from app.scodoc import sco_xml from app.scodoc import sco_xml
import sco_version import sco_version
from app.scodoc.gen_tables import GenTable from app.scodoc.gen_tables import GenTable
from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.sco_exceptions import ScoValueError, ScoFormatError
from app.scodoc.sco_permissions import Permission from app.scodoc.sco_permissions import Permission
_formationEditor = ndb.EditableTable( _formationEditor = ndb.EditableTable(
@ -184,9 +184,9 @@ def formation_import_xml(doc: str, import_tags=True):
f = dom.getElementsByTagName("formation")[0] # or dom.documentElement f = dom.getElementsByTagName("formation")[0] # or dom.documentElement
D = sco_xml.xml_to_dicts(f) D = sco_xml.xml_to_dicts(f)
except: except:
raise ScoValueError( raise ScoFormatError(
"Le document xml ne correspond pas à un programme BUT. (élément 'formation' inexistant " """Ce document xml ne correspond pas à un programme exporté par ScoDoc.
"par exemple)." (élément 'formation' inexistant par exemple)."""
) )
assert D[0] == "formation" assert D[0] == "formation"
F = D[1] F = D[1]

View File

@ -47,7 +47,7 @@ from app.scodoc.sco_formsemestre_inscriptions import (
from app.scodoc.gen_tables import GenTable from app.scodoc.gen_tables import GenTable
from app.scodoc.sco_exceptions import ( from app.scodoc.sco_exceptions import (
AccessDenied, AccessDenied,
FormatError, ScoFormatError,
ScoException, ScoException,
ScoValueError, ScoValueError,
ScoInvalidDateError, ScoInvalidDateError,
@ -640,7 +640,7 @@ def scolars_import_admission(datafile, formsemestre_id=None, type_admission=None
if (idx_nom is None) or (idx_prenom is None): if (idx_nom is None) or (idx_prenom is None):
log("fields indices=" + ", ".join([str(x) for x in fields])) log("fields indices=" + ", ".join([str(x) for x in fields]))
log("fields titles =" + ", ".join([fields[x][0] for x in fields])) log("fields titles =" + ", ".join([fields[x][0] for x in fields]))
raise FormatError( raise ScoFormatError(
"scolars_import_admission: colonnes nom et prenom requises", "scolars_import_admission: colonnes nom et prenom requises",
dest_url=url_for( dest_url=url_for(
"scolar.form_students_import_infos_admissions", "scolar.form_students_import_infos_admissions",
@ -672,7 +672,7 @@ def scolars_import_admission(datafile, formsemestre_id=None, type_admission=None
try: try:
val = convertor(line[idx]) val = convertor(line[idx])
except ValueError: except ValueError:
raise FormatError( raise ScoFormatError(
'scolars_import_admission: valeur invalide, ligne %d colonne %s: "%s"' 'scolars_import_admission: valeur invalide, ligne %d colonne %s: "%s"'
% (nline, field_name, line[idx]), % (nline, field_name, line[idx]),
dest_url=url_for( dest_url=url_for(
@ -758,7 +758,7 @@ def adm_get_fields(titles, formsemestre_id):
convertor = adm_convert_text convertor = adm_convert_text
# doublons ? # doublons ?
if k in [x[0] for x in fields.values()]: if k in [x[0] for x in fields.values()]:
raise FormatError( raise ScoFormatError(
'scolars_import_admission: titre "%s" en double (ligne 1)' 'scolars_import_admission: titre "%s" en double (ligne 1)'
% (title), % (title),
dest_url=url_for( dest_url=url_for(

View File

@ -22,6 +22,7 @@ from app.models.formations import Formation
from app.models.but_refcomp import ApcReferentielCompetences from app.models.but_refcomp import ApcReferentielCompetences
from app.but.import_refcomp import orebut_import_refcomp from app.but.import_refcomp import orebut_import_refcomp
from app.but.forms.refcomp_forms import FormationRefCompForm, RefCompLoadForm from app.but.forms.refcomp_forms import FormationRefCompForm, RefCompLoadForm
from app.scodoc.sco_exceptions import ScoFormatError
from app.scodoc.sco_permissions import Permission from app.scodoc.sco_permissions import Permission
from app.views import notes_bp as bp from app.views import notes_bp as bp
@ -86,7 +87,16 @@ def refcomp_load(formation_id=None):
if form.validate_on_submit(): if form.validate_on_submit():
f = form.upload.data f = form.upload.data
filename = secure_filename(f.filename) filename = secure_filename(f.filename)
ref = orebut_import_refcomp(f, dept_id=g.scodoc_dept_id, orig_filename=filename) try:
xml_data = f.read()
ref = orebut_import_refcomp(
xml_data, dept_id=g.scodoc_dept_id, orig_filename=filename
)
except TypeError as exc:
raise ScoFormatError("fichier XML Orébut invalide") from exc
except ScoFormatError:
raise
if formation is not None: if formation is not None:
return redirect( return redirect(
url_for( url_for(

View File

@ -0,0 +1,544 @@
<?xml version="1.0" encoding="UTF-8"?>
<referentiel_competence specialite="RT" specialite_long="Réseaux et télécommunications" type="B.U.T.">
<competences>
<competence name="Administrer" numero="1" libelle_long="Administrer les réseaux et lInternet" couleur="c1">
<situations>
<situation>Conception et administration de linfrastructure du réseau informatique dune entreprise</situation>
<situation>Installation et administration des services réseau informatique dune entreprise</situation>
<situation>Déploiement et administration des solutions fixes pour les clients dun opérateur de télécommunication </situation>
</situations>
<composantes_essentielles>
<composante>en choisissant les solutions et technologies réseaux adaptées</composante>
<composante>en respectant les principes fondamentaux de la sécurité informatique</composante>
<composante>en utilisant une approche rigoureuse pour la résolution des dysfonctionnements </composante>
<composante>en respectant les règles métiers</composante>
<composante>en assurant une veille technologique </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Assister ladministrateur du réseau" annee="BUT1">
<acs>
<ac code="AC11.01">Maîtriser les lois fondamentales de lélectricité afin dintervenir sur des équipements de réseaux et télécommunications</ac>
<ac code="AC11.02">Comprendre l'architecture et les fondements des systèmes numériques, les principes du codage de l'information, des communications et de l'Internet</ac>
<ac code="AC11.03">Configurer les fonctions de base du réseau local</ac>
<ac code="AC11.04">Maîtriser les rôles et les principes fondamentaux des systèmes dexploitation afin dinteragir avec ceux-ci pour la configuration et l'administration des réseaux et services fournis </ac>
<ac code="AC11.05">Identifier les dysfonctionnements du réseau local et savoir les signaler</ac>
<ac code="AC11.06">Installer un poste client, expliquer la procédure mise en place</ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Administrer un réseau " annee="BUT2">
<acs>
<ac code="AC21.01">Configurer et dépanner le routage dynamique dans un réseau</ac>
<ac code="AC21.02">Configurer et expliquer une politique simple de QoS et les fonctions de base de la sécurité dun réseau</ac>
<ac code="AC21.03">Déployer des postes clients et des solutions virtualisées adaptées à une situation donnée</ac>
<ac code="AC21.04">Déployer des services réseaux avancés</ac>
<ac code="AC21.05">Identifier les réseaux opérateurs et larchitecture dInternet</ac>
<ac code="AC21.06">Travailler en équipe pour développer ses compétences professionnelles</ac>
</acs>
</niveau>
<niveau ordre="3" libelle="Concevoir un réseau" annee="BUT3">
<acs>
<ac code="AC31.01">Concevoir un projet de réseau informatique dune entreprise en intégrant les problématiques de haute disponibilité, de QoS, de sécurité et de supervision</ac>
<ac code="AC31.02">Réaliser la documentation technique de ce projet</ac>
<ac code="AC31.03">Réaliser une maquette de démonstration du projet</ac>
<ac code="AC31.04">Défendre/argumenter un projet </ac>
<ac code="AC31.05">Communiquer avec les acteurs du projet</ac>
<ac code="AC31.06">Gérer le projet et les différentes étapes de sa mise en œuvre en respectant les délais </ac>
</acs>
</niveau>
</niveaux>
</competence>
<competence name="Connecter" numero="2" libelle_long="Connecter les entreprises et les usagers " couleur="c2">
<situations>
<situation>Déploiement des supports et systèmes de transmission</situation>
<situation>Mise en service et administration des équipements daccès fixe ou mobile dun opérateur de télécommunications </situation>
<situation>Déploiement et administration des accès sans fil pour l'entreprise</situation>
<situation>Déploiement des systèmes de communications </situation>
</situations>
<composantes_essentielles>
<composante>en communiquant avec le client et les différents acteurs impliqués, parfois en anglais </composante>
<composante>en faisant preuve dune démarche scientifique</composante>
<composante>en choisissant les solutions et technologies adaptées</composante>
<composante>en proposant des solutions respectueuses de l'environnement </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Découvrir les transmissions et la ToIP" annee="BUT1">
<acs>
<ac code="AC12.01">Mesurer, analyser et commenter les signaux</ac>
<ac code="AC12.02">Caractériser des systèmes de transmissions élémentaires et découvrir la modélisation mathématique de leur fonctionnement </ac>
<ac code="AC12.03">Déployer des supports de transmission</ac>
<ac code="AC12.04">Connecter les systèmes de ToIP</ac>
<ac code="AC12.05">Communiquer avec un tiers (client, collaborateur...) et adapter son discours et sa langue à son interlocuteur</ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Maîtriser les différentes composantes des solutions de connexion des entreprises et des usagers" annee="BUT2">
<acs>
<ac code="AC22.01">Déployer et caractériser des systèmes de transmissions complexes </ac>
<ac code="AC22.02">Mettre en place un accès distant sécurisé</ac>
<ac code="AC22.03">Mettre en place une connexion multi-site via un réseau opérateur</ac>
<ac code="AC22.04">Déployer des réseaux daccès des opérateurs</ac>
<ac code="AC22.05">Capacité à questionner un cahier des charges RT</ac>
</acs>
</niveau>
<niveau ordre="3" libelle="Déployer une solution de connexion ou de communication sur IP" annee="BUT3">
<acs>
<ac code="AC32.01">Déployer un système de communication pour lentreprise</ac>
<ac code="AC32.02">Déployer un réseau daccès sans fil pour le réseau dentreprise en intégrant les enjeux de la sécurité</ac>
<ac code="AC32.03">Déployer un réseau daccès fixe ou mobile pour un opérateur de télécommunications en intégrant la sécurité </ac>
<ac code="AC32.04">Permettre aux collaborateurs de se connecter de manière sécurisée au système dinformation de lentreprise </ac>
<ac code="AC32.05">Collaborer en mode projet en français et en anglais </ac>
</acs>
</niveau>
</niveaux>
</competence>
<competence name="Programmer" numero="3" libelle_long="Créer des outils et applications informatiques pour les R&amp;T " couleur="c3">
<situations>
<situation>Conception, déploiement et maintenance du système dinformation dune entreprise </situation>
<situation>Automatisation du déploiement et de la maintenance des outils logiciels </situation>
<situation>Développement doutils informatiques à usage interne d'une équipe </situation>
</situations>
<composantes_essentielles>
<composante>en étant à lécoute des besoins du client</composante>
<composante>en documentant le travail réalisé</composante>
<composante>en utilisant les outils numériques à bon escient</composante>
<composante>en choisissant les outils de développement adaptés </composante>
<composante>en intégrant les problématiques de sécurité </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Sintégrer dans un service informatique" annee="BUT1">
<acs>
<ac code="AC13.01">Utiliser un système informatique et ses outils</ac>
<ac code="AC13.02">Lire, exécuter, corriger et modifier un programme</ac>
<ac code="AC13.03">Traduire un algorithme, dans un langage et pour un environnement donné</ac>
<ac code="AC13.04">Connaître larchitecture et les technologies dun site Web</ac>
<ac code="AC13.05">Choisir les mécanismes de gestion de données adaptés au développement de loutil et argumenter ses choix</ac>
<ac code="AC13.06">Sintégrer dans un environnement propice au développement et au travail collaboratif </ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Développer une application R&amp;T " annee="BUT2">
<acs>
<ac code="AC23.01">Automatiser ladministration système avec des scripts</ac>
<ac code="AC23.02">Développer une application à partir dun cahier des charges donné, pour le Web ou les périphériques mobiles </ac>
<ac code="AC23.03">Utiliser un protocole réseau pour programmer une application client/serveur</ac>
<ac code="AC23.04">Installer, administrer un système de gestion de données</ac>
<ac code="AC23.05">Accéder à un ensemble de données depuis une application et/ou un site web </ac>
</acs>
</niveau>
<niveau ordre="3" libelle="Piloter un projet de développement dune application R&amp;T" annee="BUT3">
<acs>
<ac code="AC33.01">Élaborer les spécifications techniques et le cahier des charges dune application informatique </ac>
<ac code="AC33.02">Mettre en place un environnement de travail collaboratif</ac>
<ac code="AC33.03">Participer à la formation des utilisateurs</ac>
<ac code="AC33.04">Déployer et maintenir une solution informatique </ac>
<ac code="AC33.05">Sinformer sur les évolutions et les nouveautés technologiques </ac>
<ac code="AC33.06">Sécuriser l'environnement numérique d'une application </ac>
</acs>
</niveau>
</niveaux>
</competence>
<competence name="Sécuriser" numero="4" libelle_long="Administrer un système dinformation sécurisé" couleur="c4">
<situations>
<situation>Analyse de lexistant et étude des besoins de sécurité dune petite structure </situation>
<situation>Évolution et mise en conformité du système dinformation dune entreprise </situation>
</situations>
<composantes_essentielles>
<composante>en visant un juste compromis entre exigences de sécurité et contraintes dutilisation </composante>
<composante>en respectant les normes et le cadre juridique</composante>
<composante>en intégrant les dernières technologies</composante>
<composante>en travaillant en équipe</composante>
<composante>en sensibilisant efficacement des utilisateurs </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Sensibiliser aux vulnérabilités d'un système d'information et aux remédiations possibles " annee="BUT2">
<acs>
<ac code="AC24.01Cyber">Connaître et utiliser les bonnes pratiques et les recommandations de cybersécurité</ac>
<ac code="AC24.02Cyber">Mettre en œuvre les outils fondamentaux de sécurisation dune infrastructure du réseau </ac>
<ac code="AC24.03Cyber">Sécuriser les services</ac>
<ac code="AC24.04Cyber">Choisir les outils cryptographiques adaptés au besoin fonctionnel du système dinformation </ac>
<ac code="AC24.05Cyber">Connaître les différents types dattaque</ac>
<ac code="AC24.06Cyber">Comprendre des documents techniques en anglais </ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Mettre en œuvre un système dinformation sécurisé pour une petite structure " annee="BUT3">
<acs>
<ac code="AC34.01Cyber">Participer activement à une analyse de risque pour définir une politique de sécurité pour une petite structure </ac>
<ac code="AC34.02Cyber">Mettre en œuvre des outils avancés de sécurisation dune infrastructure du réseau</ac>
<ac code="AC34.03Cyber">Sécuriser les systèmes dexploitation</ac>
<ac code="AC34.04Cyber">Proposer une architecture sécurisée de système d'information pour une petite structure </ac>
</acs>
</niveau>
</niveaux>
</competence>
<competence name="Orchestrer" numero="5" libelle_long="Coordonner des infrastructures modulaires" couleur="c4">
<situations>
<situation>Industrialisation du déploiement des infrastructures systèmes, réseaux et sécurité en sauvegardant et en restaurant ses configurations</situation>
<situation>Maintenance des outils pour lintégration et la mise en production du code logiciel</situation>
<situation>Administration dun cluster de containers </situation>
<situation>Analyse des performances dun système pour améliorer les processus de production </situation>
</situations>
<composantes_essentielles>
<composante>en respectant un cahier des charges</composante>
<composante>en documentant le travail réalisé</composante>
<composante>en intégrant les problématiques de sécurité</composante>
<composante>en assurant une veille technologique</composante>
<composante>en respectant les pratiques déquipes et des méthodes de production </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Assister ladministrateur infrastructure et Cloud " annee="BUT2">
<acs>
<ac code="AC24.01DevCloud">Proposer une solution Cloud adaptée à lentreprise </ac>
<ac code="AC24.02DevCloud">Virtualiser un environnement</ac>
<ac code="AC24.03DevCloud">Utiliser les services du Cloud</ac>
<ac code="AC24.04DevCloud">Analyser un service Cloud au travers des métriques </ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Administrer une infrastructure Cloud" annee="BUT3">
<acs>
<ac code="AC34.01DevCloud">Concevoir, administrer et superviser une infrastructure Cloud</ac>
<ac code="AC34.02DevCloud">Orchestrer les ressources Cloud</ac>
<ac code="AC34.03DevCloud">Investiguer sur les incidents et les résoudre afin daméliorer la qualité et la fiabilité des infrastructures </ac>
</acs>
</niveau>
</niveaux>
</competence>
<competence name="Etendre" numero="6" libelle_long="Gérer les infrastructures des réseaux mobiles " couleur="c4">
<situations>
<situation>Gestion des infrastructures dun opérateur de réseaux mobiles et dInternet des Objets</situation>
<situation>Gestion des infrastructures de réseaux mobiles dans le contexte industriel, personnel ou médical </situation>
</situations>
<composantes_essentielles>
<composante>en respectant les normes et protocoles en vigueur </composante>
<composante>en intégrant les dernières technologies mobiles </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Mettre en œuvre les réseaux pour la mobilité " annee="BUT2">
<acs>
<ac code="AC24.01IOM">Comprendre les architectures et spécificités des réseaux dédiés à l'IoT</ac>
<ac code="AC24.02IOM">Mettre en œuvre des systèmes de transmissions pour laccès à un réseau IoT</ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Raccorder des objets connectés aux réseaux mobiles " annee="BUT3">
<acs>
<ac code="AC34.01IOM">Comprendre les architectures, protocoles et services des réseaux mobiles 4G/5G</ac>
<ac code="AC34.02IOM">Choisir un réseau pour satisfaire les contraintes énergétiques et spectrales, en délai, en débit et en portée des objets connectés</ac>
<ac code="AC34.03IOM">Mettre en œuvre des réseaux mobiles personnels ou industriels</ac>
</acs>
</niveau>
</niveaux>
</competence>
<competence name="Piloter" numero="7" libelle_long="Mettre en œuvre des projets techniques et réglementaires des R&amp;T dans son activité " couleur="c4">
<situations>
<situation>Adéquation technique des solutions réseaux informatiques et télécoms à la demande client </situation>
<situation>Élaboration de solutions techniques clients adaptées</situation>
<situation>Accompagnement technique de la mise en place des solutions clients </situation>
</situations>
<composantes_essentielles>
<composante>en maîtrisant les enjeux techniques et réglementaires des nouvelles technologies</composante>
<composante>en pilotant un projet technique R&amp;T</composante>
<composante>en faisant preuve de vision stratégique en phase avec le marché des réseaux et des télécommunications </composante>
<composante>en collaborant de façon responsable avec des équipes </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Mettre en œuvre un projet R&amp;T " annee="BUT2">
<acs>
<ac code="AC24.01PPR">Compréhension dun cahier des charges technique R&amp;T </ac>
<ac code="AC24.02PPR">Planification des étapes dun projet technique R&amp;T</ac>
<ac code="AC24.03PPR">Co-animation dune équipe technique</ac>
<ac code="AC24.04PPR">Proposition de solutions techniques R&amp;T efficientes</ac>
<ac code="AC24.05PPR">Échanges vulgarisés ou techniques avec tous les acteurs dun projet </ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Opérationnaliser un projet R&amp;T " annee="BUT3">
<acs>
<ac code="AC34.01PPR">Rédaction d'un appel d'offres ou d'un cahier des charges technique R&amp;T</ac>
<ac code="AC34.02PPR">Animation technique déquipes pluridisciplinaires</ac>
<ac code="AC34.03PPR">Coordination déquipes sur une partie de projet R&amp;T ou sa totalité</ac>
<ac code="AC34.04PPR">Mise en place de solutions techniques R&amp;T efficientes</ac>
<ac code="AC34.05PPR">Livraison et suivi technique de projet R&amp;T</ac>
</acs>
</niveau>
</niveaux>
</competence>
<competence name="Rapprocher" numero="8" libelle_long="Gérer les infrastructures et les services des réseaux opérateurs " couleur="c4">
<situations>
<situation>Gestion des services dun ensemble de clients entreprises dun opérateur </situation>
<situation>Gestion du déploiement de nouvelles infrastructures </situation>
</situations>
<composantes_essentielles>
<composante>en respectant les règles métiers et les délais</composante>
<composante>en assurant une communication optimale avec le client</composante>
<composante>en mettant en place des processus opérationnels de gestion dincidents </composante>
<composante>en pilotant les acteurs terrain </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Gérer les infrastructures des réseaux opérateurs " annee="BUT2">
<acs>
<ac code="AC24.01ROM">Administrer les réseaux daccès fixes et mobiles</ac>
<ac code="AC24.02ROM">Virtualiser des services réseaux</ac>
<ac code="AC24.03ROM">Décrire/comprendre larchitecture et les offres des opérateurs </ac>
<ac code="AC24.04ROM">Gérer le routage/commutation et les interconnexions </ac>
<ac code="AC24.05ROM">Automatiser la gestion des équipements réseaux </ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Administrer les services des opérateurs de télécommunications " annee="BUT3">
<acs>
<ac code="AC34.01ROM">Administrer/superviser les infrastructures et les services télécom</ac>
<ac code="AC34.02ROM">Administrer et déployer des fonctions réseaux virtualisées et programmer le réseau</ac>
</acs>
</niveau>
</niveaux>
</competence>
<competence name="Surveiller" numero="9" libelle_long="Surveiller un système dinformation sécurisé" couleur="c5">
<situations>
<situation>Surveillance et analyse du système dinformation </situation>
<situation>Audit de sécurité</situation>
<situation>Gestion dun incident de sécurité </situation>
</situations>
<composantes_essentielles>
<composante>en assurant une veille permanente</composante>
<composante>en réalisant les mises à jour critiques</composante>
<composante>en automatisant des tâches</composante>
<composante>en sintégrant dans une équipe</composante>
<composante>en surveillant le comportement du réseau</composante>
<composante>en veillant au respect des contrats et à la conformité des obligations du système d'information </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Prendre en main les outils de surveillance et de test du système d'information " annee="BUT2">
<acs>
<ac code="AC25.01Cyber">Administrer les protections contre les logiciels malveillants </ac>
<ac code="AC25.02Cyber">Prendre en main des outils de test de pénétration réseau/système</ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Mettre en œuvre le système de surveillance dincidents de sécurité " annee="BUT3">
<acs>
<ac code="AC35.01Cyber">Surveiller lactivité du système dinformation</ac>
<ac code="AC35.02Cyber">Appliquer une méthodologie de tests de pénétration</ac>
<ac code="AC35.03Cyber">Réagir face à un incident de sécurité</ac>
<ac code="AC35.04Cyber">Administrer les outils de surveillance du système dinformation</ac>
</acs>
</niveau>
</niveaux>
</competence>
<competence name="Développer" numero="10" libelle_long="Accompagner le développement dapplications" couleur="c5">
<situations>
<situation>Déploiement dune application</situation>
<situation>Intervention sur la chaîne de développement dans une optique DevOps </situation>
<situation>Surveillance de la qualité de la production</situation>
<situation>Mise en place des services réseaux nécessaires au développement </situation>
</situations>
<composantes_essentielles>
<composante>en respectant un cahier des charges</composante>
<composante>en documentant le travail réalisé</composante>
<composante>en respectant les bonnes pratiques de développement et de production </composante>
<composante>en visant lamélioration continue </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Développer pour le Cloud " annee="BUT2">
<acs>
<ac code="AC25.01DevCloud">Développer un microservice</ac>
<ac code="AC25.02DevCloud">Mettre en production une application</ac>
<ac code="AC25.03DevCloud">Programmer son réseau par le code</ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Sintégrer dans une équipe DevOps " annee="BUT3">
<acs>
<ac code="AC35.01DevCloud">Adopter les pratiques de pilotage de projet</ac>
<ac code="AC35.02DevCloud">Concevoir, gérer et sécuriser un environnement de microservices </ac>
<ac code="AC35.03DevCloud">Gérer son infrastructure comme du code </ac>
<ac code="AC35.04DevCloud">Gérer une chaîne dintégration et/ou de déploiement continu </ac>
</acs>
</niveau>
</niveaux>
</competence>
<competence name="Exploiter" numero="11" libelle_long="Mettre en œuvre des applications et des protocoles sécurisés pour lInternet des Objets " couleur="c5">
<situations>
<situation>Déploiement dun système IoT de la source capteur aux traitements des données </situation>
<situation>Gestion, administration et sécurisation dun système IoT </situation>
</situations>
<composantes_essentielles>
<composante>en travaillant au sein dune équipe pluridisciplinaire</composante>
<composante>en respectant les normes et contraintes opérationnelles </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Mettre en œuvre des solutions pour lInternet des Objets " annee="BUT2">
<acs>
<ac code="AC25.01IOM">Intégrer des systèmes électroniques et des systèmes dexploitation embarqués </ac>
<ac code="AC25.02IOM">Mettre en œuvre des protocoles pour les réseaux de lIoT</ac>
<ac code="AC25.03IOM">Mettre en œuvre des applications et traiter des données issues des objets connectés </ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Créer des solutions sécurisées pour lInternet des Objets " annee="BUT3">
<acs>
<ac code="AC35.01IOM">Superviser et analyser le déploiement des réseaux sans-fil </ac>
<ac code="AC35.02IOM">Sécuriser les objets connectés</ac>
<ac code="AC35.03IOM">Créer et innover pour lIoT </ac>
</acs>
</niveau>
</niveaux>
</competence>
<competence name="Organiser" numero="12" libelle_long="Gérer des activités réseaux et télécommunications en termes organisationnels, relationnels, financiers et commerciaux" couleur="c5">
<situations>
<situation>Communication et stratégie technique en interne et en externe pour des projets R&amp;T </situation>
<situation>Suivi des objectifs opérationnels de projets R&amp;T</situation>
<situation>Pilotage de la relation client </situation>
</situations>
<composantes_essentielles>
<composante>en pilotant avec agilité des solutions techniques</composante>
<composante>en sachant communiquer à lécrit et à loral avec tous les acteurs dun projet</composante>
<composante>en respectant des contraintes technico-économiques (financières, éthiques, temporelles, contractuelles, qualité) </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Élaborer un projet technique " annee="BUT2">
<acs>
<ac code="AC25.01PPR">Prise en compte des contraintes dun pilotage de projet R&amp;T</ac>
<ac code="AC25.02PPR">Planification de solutions techniques R&amp;T efficientes</ac>
<ac code="AC25.03PPR">Prise de conscience des enjeux de la communication dans les relations interpersonnelles </ac>
<ac code="AC25.04PPR">Établissement dun relationnel de qualité </ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Mettre en place et suivre un projet technique " annee="BUT3">
<acs>
<ac code="AC35.01PPR">Rigueur dans le pilotage dun projet R&amp;T dans sa globalité</ac>
<ac code="AC35.02PPR">Flexibilité dans la gestion des équipes et des tâches</ac>
<ac code="AC35.03PPR">Prise de responsabilité envers les équipes</ac>
<ac code="AC35.04PPR">Valorisation de solutions déployées, ou doffres techniques, ou doffres commerciales </ac>
<ac code="AC35.05PPR">Force de propositions de solutions R&amp;T innovantes responsables</ac>
</acs>
</niveau>
</niveaux>
</competence>
<competence name="Unifier" numero="13" libelle_long="Gérer les communications unifiées et la vidéo sur Internet " couleur="c5">
<situations>
<situation>Déploiement et administration des services de communication </situation>
<situation>Administration des services multimédia </situation>
</situations>
<composantes_essentielles>
<composante>en automatisant la gestion réseau des communications </composante>
<composante>en sécurisant les infrastructures</composante>
<composante>en gérant les interconnexions</composante>
<composante>en assurant une communication optimale avec le client </composante>
<composante>en respectant les règles métiers et les délais </composante>
</composantes_essentielles>
<niveaux>
<niveau ordre="1" libelle="Mettre en oeuvre le système de téléphonie de lentreprise " annee="BUT2">
<acs>
<ac code="AC25.01ROM">Choisir une architecture et déployer des services de ToIP </ac>
<ac code="AC25.02ROM">Administrer un service de téléphonie pour lentreprise </ac>
<ac code="AC25.03ROM">Mettre en place une politique de QoS pour les applications </ac>
</acs>
</niveau>
<niveau ordre="2" libelle="Administrer les communications unifiées et les services vidéo de lentreprise" annee="BUT3">
<acs>
<ac code="AC35.01ROM">Administrer les services multimédias pour une entreprise</ac>
</acs>
</niveau>
</niveaux>
</competence>
</competences>
<parcours>
<parcour numero="1" libelle="Cybersécurité" code="Cyber">
<annee ordre="1">
<competence nom="Administrer" niveau="1"/>
<competence nom="Connecter" niveau="1"/>
<competence nom="Programmer" niveau="1"/>
</annee>
<annee ordre="2">
<competence nom="Administrer" niveau="2"/>
<competence nom="Connecter" niveau="2"/>
<competence nom="Programmer" niveau="2"/>
<competence nom="Sécuriser" niveau="1"/>
<competence nom="Surveiller" niveau="1"/>
</annee>
<annee ordre="3">
<competence nom="Administrer" niveau="3"/>
<competence nom="Connecter" niveau="3"/>
<competence nom="Programmer" niveau="3"/>
<competence nom="Sécuriser" niveau="2"/>
<competence nom="Surveiller" niveau="2"/>
</annee>
</parcour>
<parcour numero="2" libelle="Développement système et cloud" code="DevCloud">
<annee ordre="1">
<competence nom="Administrer" niveau="1"/>
<competence nom="Connecter" niveau="1"/>
<competence nom="Programmer" niveau="1"/>
</annee>
<annee ordre="2">
<competence nom="Administrer" niveau="2"/>
<competence nom="Connecter" niveau="2"/>
<competence nom="Programmer" niveau="2"/>
<competence nom="Orchestrer" niveau="1"/>
<competence nom="Développer" niveau="1"/>
</annee>
<annee ordre="3">
<competence nom="Administrer" niveau="3"/>
<competence nom="Connecter" niveau="3"/>
<competence nom="Programmer" niveau="3"/>
<competence nom="Orchestrer" niveau="2"/>
<competence nom="Développer" niveau="2"/>
</annee>
</parcour>
<parcour numero="3" libelle="Internet des objets et mobilité" code="IOM">
<annee ordre="1">
<competence nom="Administrer" niveau="1"/>
<competence nom="Connecter" niveau="1"/>
<competence nom="Programmer" niveau="1"/>
</annee>
<annee ordre="2">
<competence nom="Administrer" niveau="2"/>
<competence nom="Connecter" niveau="2"/>
<competence nom="Programmer" niveau="2"/>
<competence nom="Etendre" niveau="1"/>
<competence nom="Exploiter" niveau="1"/>
</annee>
<annee ordre="3">
<competence nom="Administrer" niveau="3"/>
<competence nom="Connecter" niveau="3"/>
<competence nom="Programmer" niveau="3"/>
<competence nom="Etendre" niveau="2"/>
<competence nom="Exploiter" niveau="2"/>
</annee>
</parcour>
<parcour numero="4" libelle="Pilotage de projets de réseaux" code="PPR">
<annee ordre="1">
<competence nom="Administrer" niveau="1"/>
<competence nom="Connecter" niveau="1"/>
<competence nom="Programmer" niveau="1"/>
</annee>
<annee ordre="2">
<competence nom="Administrer" niveau="2"/>
<competence nom="Connecter" niveau="2"/>
<competence nom="Programmer" niveau="2"/>
<competence nom="Piloter" niveau="1"/>
<competence nom="Organiser" niveau="1"/>
</annee>
<annee ordre="3">
<competence nom="Administrer" niveau="3"/>
<competence nom="Connecter" niveau="3"/>
<competence nom="Programmer" niveau="3"/>
<competence nom="Piloter" niveau="2"/>
<competence nom="Organiser" niveau="2"/>
</annee>
</parcour>
<parcour numero="5" libelle="Réseaux Opérateurs et Multimédia" code="ROM">
<annee ordre="1">
<competence nom="Administrer" niveau="1"/>
<competence nom="Connecter" niveau="1"/>
<competence nom="Programmer" niveau="1"/>
</annee>
<annee ordre="2">
<competence nom="Administrer" niveau="2"/>
<competence nom="Connecter" niveau="2"/>
<competence nom="Programmer" niveau="2"/>
<competence nom="Rapprocher" niveau="1"/>
<competence nom="Unifier" niveau="1"/>
</annee>
<annee ordre="3">
<competence nom="Administrer" niveau="3"/>
<competence nom="Connecter" niveau="3"/>
<competence nom="Programmer" niveau="3"/>
<competence nom="Rapprocher" niveau="2"/>
<competence nom="Unifier" niveau="2"/>
</annee>
</parcour>
</parcours>
</referentiel_competence>

View File

@ -8,6 +8,7 @@ import io
from flask import g from flask import g
import app import app
from app import db from app import db
from app import models
from app.but.import_refcomp import orebut_import_refcomp from app.but.import_refcomp import orebut_import_refcomp
from app.models.but_refcomp import ( from app.models.but_refcomp import (
ApcReferentielCompetences, ApcReferentielCompetences,
@ -15,39 +16,19 @@ from app.models.but_refcomp import (
ApcSituationPro, ApcSituationPro,
) )
ref_xml = """<?xml version="1.0" encoding="UTF-8"?>
<referentiel_competence specialite="RT" specialite_long="Réseaux et télécommunications" type="B.U.T.">
<competences>
<competence name="Administrer" numero="1" libelle_long="Administrer les réseaux et lInternet"
couleur="c1">
<situations>
<situation>Conception et administration de linfrastructure du réseau informatique dune entreprise</situation>
<situation>Installation et administration des services réseau informatique dune entreprise</situation>
</situations>
</competence>
<competence name="Tester" numero="2" libelle_long="Tester...">
<situations>
<situation>
Tests unitaires d'une application.
</situation>
</situations>
</competence>
</competences>
<parcours>
<parcour>
</parcour>
</parcours>
</referentiel_competence>
"""
def test_but_refcomp(test_client): def test_but_refcomp(test_client):
"""modèles ref. comp.""" """modèles ref. comp."""
f = io.StringIO(ref_xml) xml_data = open("tests/data/but-RT-refcomp-exemple.xml").read()
ref = orebut_import_refcomp(0, f) dept_id = models.Departement.query.first().id
assert ref.references.count() == 2 ref = orebut_import_refcomp(xml_data, dept_id)
assert ref.competences[0].situations.count() == 2 assert ref.competences.count() == 13
assert ref.competences[0].situations.count() == 3
assert ref.competences[0].situations[0].libelle.startswith("Conception ") assert ref.competences[0].situations[0].libelle.startswith("Conception ")
assert (
ref.competences[-1].situations[-1].libelle
== "Administration des services multimédia"
)
# test cascades on delete # test cascades on delete
db.session.delete(ref) db.session.delete(ref)
db.session.commit() db.session.commit()