Nettoie le code pour l'orienter objet
This commit is contained in:
parent
da84905424
commit
b396eee006
@ -118,18 +118,19 @@ print(f"{nbre_ressources} ressources")
|
|||||||
ressources = {"S1" : [], "S2": []}
|
ressources = {"S1" : [], "S2": []}
|
||||||
|
|
||||||
for r in liste_ressources:
|
for r in liste_ressources:
|
||||||
nettoie_titre_ressource(r)
|
r.nettoie_titre_ressource()
|
||||||
nettoie_heure_ressource(r)
|
r.nettoie_heures()
|
||||||
nettoie_code(r, type="ressource")
|
r.nettoie_code()
|
||||||
nettoie_semestre(r)
|
r.nettoie_semestre()
|
||||||
nettoie_acs(r)
|
r.nettoie_acs()
|
||||||
nettoie_sae(r)
|
r.nettoie_sae()
|
||||||
nettoie_prerequis(r)
|
r.nettoie_prerequis()
|
||||||
nettoie_mots_cles(r)
|
r.nettoie_mots_cles()
|
||||||
|
|
||||||
|
|
||||||
# Remet en forme le descriptif
|
# Remet en forme le descriptif
|
||||||
split_description(r)
|
r.split_description()
|
||||||
nettoie_contenus_ressource(r)
|
r.nettoie_contenu()
|
||||||
|
|
||||||
# Remet en forme les mots-clés
|
# Remet en forme les mots-clés
|
||||||
# Tri dans le bon semestre
|
# Tri dans le bon semestre
|
||||||
|
@ -105,8 +105,8 @@ for i in range(1, len(docu)): # A priori un tableau
|
|||||||
r.charge_ac(apprentissages)
|
r.charge_ac(apprentissages)
|
||||||
|
|
||||||
# nettoie le titre et le code
|
# nettoie le titre et le code
|
||||||
nettoie_titre_sae(r)
|
r.nettoie_titre_sae()
|
||||||
nettoie_code(r, type="sae")
|
r.nettoie_code()
|
||||||
|
|
||||||
last_sae = r.code
|
last_sae = r.code
|
||||||
liste_exemples[r.code] = []
|
liste_exemples[r.code] = []
|
||||||
@ -167,13 +167,13 @@ saes = {"S1" : [], "S2": []}
|
|||||||
|
|
||||||
for s in liste_saes:
|
for s in liste_saes:
|
||||||
print(f"{s.nom}")
|
print(f"{s.nom}")
|
||||||
nettoie_heure_sae(s)
|
s.nettoie_heures_sae()
|
||||||
nettoie_semestre(s)
|
s.nettoie_semestre()
|
||||||
nettoie_acs(s)
|
s.nettoie_acs()
|
||||||
nettoie_ressources(s)
|
s.nettoie_ressources()
|
||||||
# nettoie_description(s) => rien à faire ?
|
s.nettoie_description()
|
||||||
nettoie_livrables_sae(s)
|
s.nettoie_livrables_sae()
|
||||||
nettoie_mots_cles(s)
|
s.nettoie_mots_cles()
|
||||||
|
|
||||||
# Tri dans le bon semestre
|
# Tri dans le bon semestre
|
||||||
saes[s.semestre] += [s]
|
saes[s.semestre] += [s]
|
||||||
@ -186,12 +186,7 @@ for s in liste_exemples: # la sae
|
|||||||
exemples[sem][s] = []
|
exemples[sem][s] = []
|
||||||
for e in liste_exemples[s]:
|
for e in liste_exemples[s]:
|
||||||
print(f"{s} : {e.nom}")
|
print(f"{s} : {e.nom}")
|
||||||
# nettoie_description(s) => rien à faire ?
|
e.nettoie_champs()
|
||||||
nettoie_description(e)
|
|
||||||
nettoie_problematique(e)
|
|
||||||
if e.nom.startswith("Concevoir"):
|
|
||||||
print("ici")
|
|
||||||
nettoie_modalite(e)
|
|
||||||
|
|
||||||
# Tri dans le bon semestre
|
# Tri dans le bon semestre
|
||||||
exemples[sem][s].append(e)
|
exemples[sem][s].append(e)
|
||||||
|
@ -110,10 +110,10 @@ def get_officiel_sae_name_by_code(code):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def get_code_from_nom_using_dict(ressource, dico):
|
def get_code_from_nom_using_dict(nom, dico):
|
||||||
"""Récupère le code d'une ressource d'après son nom en utilisant les noms officiels
|
"""Récupère le code d'une ressource d'après son nom en utilisant les noms officiels
|
||||||
des ressources du yaml si dico == DATA_RESSOURCES ; sinon fait de même avec les SAE"""
|
des ressources du yaml si dico == DATA_RESSOURCES ; sinon fait de même avec les SAE"""
|
||||||
nom = supprime_accent_espace(ressource.nom)
|
nom = supprime_accent_espace(nom)
|
||||||
for sem in dico:
|
for sem in dico:
|
||||||
for code in dico[sem]:
|
for code in dico[sem]:
|
||||||
nom_data = supprime_accent_espace(dico[sem][code])
|
nom_data = supprime_accent_espace(dico[sem][code])
|
||||||
|
@ -11,9 +11,14 @@ __LOGGER = logging.getLogger(__name__)
|
|||||||
|
|
||||||
class Docx():
|
class Docx():
|
||||||
"""Classe de base pour les ressources/saé/exemples du docx"""
|
"""Classe de base pour les ressources/saé/exemples du docx"""
|
||||||
|
__LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
def __init__(self, nom, brut):
|
def __init__(self, nom, brut):
|
||||||
self.nom = nom
|
self.nom = nom
|
||||||
self.brut = brut # les données brutes de la ressource
|
self.brut = brut # les données brutes de la ressource/saé
|
||||||
|
self.semestre = None # le semestre de la ressource/saé (chargé ultérieurement)
|
||||||
|
self.apprentissages = None # les acs (chargés ultérieurement)
|
||||||
|
self.mots = None # les mots-clés chargés ultérieurement
|
||||||
|
|
||||||
def charge_ac(self, apprentissages):
|
def charge_ac(self, apprentissages):
|
||||||
self.apprentissages = apprentissages
|
self.apprentissages = apprentissages
|
||||||
@ -21,6 +26,71 @@ class Docx():
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
print(self.nom + " " + self.code)
|
print(self.nom + " " + self.code)
|
||||||
|
|
||||||
|
def nettoie_semestre(self):
|
||||||
|
"""Pour une ressource, ou une SAE, nettoie le champ semestre"""
|
||||||
|
if self.semestre:
|
||||||
|
if "1" in self.semestre:
|
||||||
|
self.semestre = "S1"
|
||||||
|
elif "2" in self.semestre:
|
||||||
|
self.semestre = "S2"
|
||||||
|
else:
|
||||||
|
Docx.__LOGGER.warning(f"nettoie_semestre : dans \"{self.nom}, PAS de semestre => rattaché au S2")
|
||||||
|
self.semestre = "S2"
|
||||||
|
else:
|
||||||
|
Docx.__LOGGER.warning(f"nettoie_semestre : dans \"{self.nom}, PAS de semestre => rattaché au S2")
|
||||||
|
self.semestre = "S2"
|
||||||
|
|
||||||
|
def nettoie_acs(self):
|
||||||
|
"""Nettoie les acs d'une ressource ou d'une saé,
|
||||||
|
en les remplaçant par leur code pour les 3 compétences"""
|
||||||
|
|
||||||
|
if len(self.apprentissages) != 3:
|
||||||
|
Docx.__LOGGER.warning(f"nettoie_acs : Problème dans le nombre de compétences de {self.nom}")
|
||||||
|
|
||||||
|
dico = {}
|
||||||
|
for comp in range(3):
|
||||||
|
donnees = self.apprentissages[comp] # chaine de caractères listant les ACS
|
||||||
|
|
||||||
|
acs_avec_code = devine_acs_by_code(donnees) # récupère les codes des acs
|
||||||
|
acs_avec_code = [ac.replace(" ", "") for ac in acs_avec_code] # supprime les espaces inutiles
|
||||||
|
|
||||||
|
acs_avec_nom = devine_code_by_nom_from_dict(donnees, DATA_ACS) # récupère les codes en utilisant les noms
|
||||||
|
acs_avec_nom = [ac.replace(" ", "") for ac in acs_avec_nom] # supprime les espaces inutiles
|
||||||
|
|
||||||
|
if acs_avec_code and set(acs_avec_nom).intersection(set(acs_avec_code)) != set(acs_avec_nom):
|
||||||
|
Docx.__LOGGER.warning(f"Dans {self.nom}, revoir les ACS : {acs_avec_code} vs {acs_avec_nom}")
|
||||||
|
|
||||||
|
acs_finaux = sorted(list(set(acs_avec_code + acs_avec_nom)))
|
||||||
|
dico["RT" + str(comp + 1)] = acs_finaux
|
||||||
|
|
||||||
|
self.apprentissages = dico # Mise à jour du champ
|
||||||
|
|
||||||
|
def nettoie_mots_cles(self):
|
||||||
|
mots = self.mots # .encode('utf8', 'ignore').decode('utf8')
|
||||||
|
mots = mots.replace(".", "").replace(";", ",")
|
||||||
|
liste_mots = mots.split(",")
|
||||||
|
liste_mots = [l.rstrip() for l in liste_mots] # supprime les espaces inutiles
|
||||||
|
mots = ", ".join(liste_mots)
|
||||||
|
self.mots = mots
|
||||||
|
|
||||||
|
def nettoie_titre(self, data_titres):
|
||||||
|
"""Nettoie le titre d'une ressource ou d'une SAE en utilisant les titres officiels
|
||||||
|
fournis dans le yaml (via le dictionnaire DATA_RESSOURCES)"""
|
||||||
|
|
||||||
|
def devine_nom(champ):
|
||||||
|
champ_purge = supprime_accent_espace(champ)
|
||||||
|
for sem in data_titres:
|
||||||
|
for code in data_titres[sem]:
|
||||||
|
nom_purge = supprime_accent_espace(data_titres[sem][code])
|
||||||
|
if champ_purge.startswith(nom_purge):
|
||||||
|
return data_titres[sem][code] # le bon nom
|
||||||
|
|
||||||
|
old = self.nom
|
||||||
|
titre = devine_nom(self.nom)
|
||||||
|
if titre and titre != old:
|
||||||
|
Docx.__LOGGER.warning(f"nettoie_titre : {old} => titre \"{titre}\"")
|
||||||
|
self.nom = titre
|
||||||
|
|
||||||
def dico_to_yaml(self, dico):
|
def dico_to_yaml(self, dico):
|
||||||
if self.code == "R108":
|
if self.code == "R108":
|
||||||
print("ici")
|
print("ici")
|
||||||
@ -31,7 +101,7 @@ class Docx():
|
|||||||
lignes_finales = []
|
lignes_finales = []
|
||||||
for (i, ligne) in enumerate(lignes):
|
for (i, ligne) in enumerate(lignes):
|
||||||
if ligne.rstrip() == "":
|
if ligne.rstrip() == "":
|
||||||
if i != len(lignes)-1 and lignes[i+1].rstrip() == "":
|
if i != len(lignes)-1 and lignes[i+1].rstrip() != "":
|
||||||
lignes_finales.append(ligne) # ajoute la ligne si la suivante n'est pas vide
|
lignes_finales.append(ligne) # ajoute la ligne si la suivante n'est pas vide
|
||||||
else:
|
else:
|
||||||
lignes_finales.append(ligne)
|
lignes_finales.append(ligne)
|
||||||
@ -41,6 +111,7 @@ class Docx():
|
|||||||
|
|
||||||
class RessourceDocx(Docx):
|
class RessourceDocx(Docx):
|
||||||
"""Classe modélisant les ressources, lorsqu'elles sont extraites du docx"""
|
"""Classe modélisant les ressources, lorsqu'elles sont extraites du docx"""
|
||||||
|
__LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
def charge_informations(self, code, semestre, heures_encadrees, tp, sae, prerequis, description, mots):
|
def charge_informations(self, code, semestre, heures_encadrees, tp, sae, prerequis, description, mots):
|
||||||
self.code = code
|
self.code = code
|
||||||
@ -54,6 +125,102 @@ class RessourceDocx(Docx):
|
|||||||
self.contenu = None
|
self.contenu = None
|
||||||
self.mots = mots
|
self.mots = mots
|
||||||
|
|
||||||
|
|
||||||
|
def nettoie_titre_ressource(self, data_titres):
|
||||||
|
"""Nettoie le titre d'une ressource ou d'une SAE en utilisant les titres officiels
|
||||||
|
fournis dans le yaml (via le dictionnaire DATA_RESSOURCES)"""
|
||||||
|
self.nettoie_titre(DATA_RESSOURCES)
|
||||||
|
|
||||||
|
def nettoie_code(self):
|
||||||
|
"""Recherche le code de la forme RXXX"""
|
||||||
|
if self.code:
|
||||||
|
codes = devine_ressources_by_code(self.code)
|
||||||
|
|
||||||
|
if len(codes) == 1:
|
||||||
|
self.code = codes[0]
|
||||||
|
else:
|
||||||
|
code_devine = get_code_from_nom_using_dict(self.nom, DATA_RESSOURCES)
|
||||||
|
if code_devine:
|
||||||
|
RessourceDocx.__LOGGER.warning(f"nettoie_code : \"{self.nom}\" => code {code_devine}")
|
||||||
|
self.code = code_devine
|
||||||
|
else:
|
||||||
|
self.code = None
|
||||||
|
|
||||||
|
if not self.code:
|
||||||
|
RessourceDocx.__LOGGER.warning(f"nettoie_code : \"{self.nom}\" => code manquant")
|
||||||
|
|
||||||
|
def nettoie_prerequis(self):
|
||||||
|
"""Nettoie les prérequis"""
|
||||||
|
if self.prerequis:
|
||||||
|
self.prerequis = nettoie_liste_ressources(self.prerequis)
|
||||||
|
if not self.prerequis:
|
||||||
|
self.prerequis = "Aucun"
|
||||||
|
|
||||||
|
def nettoie_sae(self):
|
||||||
|
"""Nettoie le champ SAe d'une ressource en détectant les codes"""
|
||||||
|
SAE_avec_code = devine_sae_by_code(self.sae)
|
||||||
|
liste = [l.rstrip() for l in SAE_avec_code]
|
||||||
|
self.sae = liste
|
||||||
|
if not self.sae:
|
||||||
|
RessourceDocx.__LOGGER.warning(f"nettoie_sae: dans {self.nom} pas de SAE (:")
|
||||||
|
|
||||||
|
def nettoie_heures(self):
|
||||||
|
"""Nettoie le champ (horaire) (de la forme 46h ou 33...) pour en extraire la valeur numérique :
|
||||||
|
le champ peut contenir 2 volumes (heures formation puis heures tp), auquel cas les 2 valeurs sont renvoyées
|
||||||
|
dans un tuple"""
|
||||||
|
|
||||||
|
if self.heures_encadrees: # si les heures encadrées sont renseignées
|
||||||
|
volumes = nettoie_champ_heure(self.heures_encadrees)
|
||||||
|
if self.tp:
|
||||||
|
self.tp = nettoie_champ_heure(self.tp)
|
||||||
|
|
||||||
|
if isinstance(volumes, int):
|
||||||
|
self.heures_encadrees = volumes
|
||||||
|
elif isinstance(volumes, tuple):
|
||||||
|
self.heures_encadrees = volumes[0]
|
||||||
|
if not self.tp:
|
||||||
|
self.tp = volumes[1]
|
||||||
|
elif self.tp != volumes[1]:
|
||||||
|
RessourceDocx.__LOGGER.warning(r"nettoie_heure: ans {self.nom}, pb dans les heures tp/td")
|
||||||
|
else:
|
||||||
|
self.heures_encadrees = None
|
||||||
|
|
||||||
|
def split_description(self):
|
||||||
|
"""Découpe le champ description en un contexte+un contenu ; si pas possible """
|
||||||
|
champs = self.description.split("\n")
|
||||||
|
champs = [c for c in champs if c] # supprime les lignes vides
|
||||||
|
|
||||||
|
indicea = 0 # la ligne mentionnant le contexte
|
||||||
|
if True in [ligne.startswith("Contexte et ") for ligne in champs]: # la ligne commençant par Contenus
|
||||||
|
indicea = [ligne.startswith("Contexte et ") for ligne in champs].index(True)
|
||||||
|
|
||||||
|
indicec = 0
|
||||||
|
contexte = []
|
||||||
|
if True in [ligne.startswith("Contenus") for ligne in champs]: # la ligne commençant par Contenus
|
||||||
|
indicec = [ligne.startswith("Contenus") for ligne in champs].index(True)
|
||||||
|
if True in [ligne.startswith("Contexte et ") for ligne in champs]:
|
||||||
|
contexte = champs[indicea + 1:indicec]
|
||||||
|
else:
|
||||||
|
contexte = champs[:indicec]
|
||||||
|
# suppression des lignes vides
|
||||||
|
contexte = "\n".join(remove_ligne_vide(contexte))
|
||||||
|
# suppression des liens
|
||||||
|
contexte = remove_link(contexte)
|
||||||
|
if not contexte:
|
||||||
|
contexte = "Aucun"
|
||||||
|
contenu = "\n".join(champs[indicec + 1:])
|
||||||
|
|
||||||
|
# sauvegarde des champs
|
||||||
|
self.contexte = contexte
|
||||||
|
self.contenu = contenu
|
||||||
|
|
||||||
|
def nettoie_contenu(self):
|
||||||
|
"""Partant du contenu détaillé d'une ressource, la transforme
|
||||||
|
en markdown en générant les listes à puces"""
|
||||||
|
contenu = self.contenu.replace(" / ", "/")
|
||||||
|
self.contenu = convert_to_markdown(contenu)
|
||||||
|
|
||||||
|
|
||||||
def to_yaml(self):
|
def to_yaml(self):
|
||||||
"""Exporte la ressource en yaml"""
|
"""Exporte la ressource en yaml"""
|
||||||
dico = {"nom": self.nom,
|
dico = {"nom": self.nom,
|
||||||
@ -82,186 +249,16 @@ def nettoie_champ_heure(champ):
|
|||||||
volumes = sorted(volumes, reverse=True)
|
volumes = sorted(volumes, reverse=True)
|
||||||
return (int(volumes[0][:-1]), int(volumes[1][:-1]))
|
return (int(volumes[0][:-1]), int(volumes[1][:-1]))
|
||||||
|
|
||||||
def nettoie_heure_ressource(r):
|
|
||||||
"""Nettoie le champ (horaire) (de la forme 46h ou 33...) pour en extraire la valeur numérique :
|
|
||||||
le champ peut contenir 2 volumes (heures formation puis heures tp), auquel cas les 2 valeurs sont renvoyées
|
|
||||||
dans un tuple"""
|
|
||||||
|
|
||||||
if r.heures_encadrees: # si les heures encadrées sont renseignées
|
def nettoie_liste_ressources(contenu):
|
||||||
volumes = nettoie_champ_heure(r.heures_encadrees)
|
"""Nettoie un contenu contenant une liste ressources, en extrayant les codes ressources
|
||||||
if r.tp:
|
et en les fournissant les codes extraits dans une liste
|
||||||
r.tp = nettoie_champ_heure(r.tp)
|
"""
|
||||||
|
R_avec_code = devine_ressources_by_code(contenu)
|
||||||
if isinstance(volumes, int):
|
R_avec_nom = devine_code_by_nom_from_dict(contenu, DATA_RESSOURCES)
|
||||||
r.heures_encadrees = volumes
|
|
||||||
elif isinstance(volumes, tuple):
|
|
||||||
r.heures_encadrees = volumes[0]
|
|
||||||
if not r.tp:
|
|
||||||
r.tp = volumes[1]
|
|
||||||
elif r.tp != volumes[1]:
|
|
||||||
__LOGGER.warning(r"nettoie_heure: ans {r.nom}, pb dans les heures tp/td")
|
|
||||||
else:
|
|
||||||
r.heures_encadrees = None
|
|
||||||
#else:
|
|
||||||
#__LOGGER.warning("Heures non détectées")
|
|
||||||
|
|
||||||
|
|
||||||
def nettoie_heure_sae(r):
|
|
||||||
"""Nettoie les champs (horaires) des saes"""
|
|
||||||
|
|
||||||
if r.heures_encadrees: # si les heures encadrées sont renseignées
|
|
||||||
r.heures_encadrees = nettoie_champ_heure(r.heures_encadrees)
|
|
||||||
else:
|
|
||||||
__LOGGER.warning(r"nettoie_heure_sae: dans {r.nom}, manque les heures de formation")
|
|
||||||
r.heures_encadrees = "???"
|
|
||||||
if r.tp:
|
|
||||||
r.tp = nettoie_champ_heure(r.tp)
|
|
||||||
else:
|
|
||||||
__LOGGER.warning(r"nettoie_heure_sae: dans {r.nom}, manque les heures de tp")
|
|
||||||
r.tp = "???"
|
|
||||||
|
|
||||||
if r.projet:
|
|
||||||
r.projet = nettoie_champ_heure(r.projet)
|
|
||||||
else:
|
|
||||||
__LOGGER.warning(r"nettoie_heure_sae: dans {r.nom}, manque les heures de projet")
|
|
||||||
r.projet = "???"
|
|
||||||
try:
|
|
||||||
if r.heures_encadrees < r.tp:
|
|
||||||
__LOGGER.warning(r"nettoie_heure_sae: dans {r.nom}, pb dans les heures formations/tp")
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def nettoie_code(r, type = "ressource"):
|
|
||||||
"""Recherche les codes dans le champ:
|
|
||||||
* de la forme RXXX si type=ressource
|
|
||||||
* de la forme SAE|éXX si type=sae"""
|
|
||||||
|
|
||||||
champ = r.code
|
|
||||||
if r.code:
|
|
||||||
if type == "ressource":
|
|
||||||
codes = re.findall(r"(R[0-9][0-9][0-9])", champ)
|
|
||||||
else: # type = "sae"
|
|
||||||
codes = re.findall(r"(SAE[0-9][0-9]|SAÉ[0-9][0-9])", champ)
|
|
||||||
# ajout des É
|
|
||||||
codes = [c.replace("E", "É") for c in codes]
|
|
||||||
# if len(codes) > 1:
|
|
||||||
# __LOGGER.warning("plusieurs codes trouvés :(")
|
|
||||||
#elif len(codes) == 0:
|
|
||||||
# __LOGGER.warning("code manquant")
|
|
||||||
if len(codes) == 1:
|
|
||||||
r.code = codes[0]
|
|
||||||
else:
|
|
||||||
if type == "ressource":
|
|
||||||
code_devine = get_code_from_nom_using_dict(r, DATA_RESSOURCES)
|
|
||||||
else:
|
|
||||||
code_devine = get_code_from_nom_using_dict(r, DATA_SAES)
|
|
||||||
if code_devine:
|
|
||||||
__LOGGER.warning(f"nettoie_code : \"{r.nom}\" => code {code_devine}")
|
|
||||||
r.code = code_devine
|
|
||||||
else:
|
|
||||||
r.code = None
|
|
||||||
__LOGGER.warning(f"nettoie_code : \"{r.nom}\" => code manquant")
|
|
||||||
|
|
||||||
def nettoie_semestre(r):
|
|
||||||
"""Nettoie les semestres : semestre 1 => "S1", semestre 2 => "S2" """
|
|
||||||
if r.semestre:
|
|
||||||
if "1" in r.semestre:
|
|
||||||
r.semestre = "S1"
|
|
||||||
elif "2" in r.semestre:
|
|
||||||
r.semestre = "S2"
|
|
||||||
else:
|
|
||||||
__LOGGER.warning(f"nettoie_semestre : dans \"{r.nom}, PAS de semestre => rattaché au S2")
|
|
||||||
r.semestre = "S2"
|
|
||||||
else:
|
|
||||||
__LOGGER.warning(f"nettoie_semestre : dans \"{r.nom}, PAS de semestre => rattaché au S2")
|
|
||||||
r.semestre = "S2"
|
|
||||||
|
|
||||||
def nettoie_titre_ressource(r):
|
|
||||||
"""Nettoie le titre d'une ressource en utilisant les titres officiels fournis dans le
|
|
||||||
yaml (via le dictionnaire DATA_RESSOURCES)"""
|
|
||||||
def devine_nom_from_ressources(champ):
|
|
||||||
champ_purge = supprime_accent_espace(champ)
|
|
||||||
for sem in DATA_RESSOURCES:
|
|
||||||
for code in DATA_RESSOURCES[sem]:
|
|
||||||
nom_purge = supprime_accent_espace(DATA_RESSOURCES[sem][code])
|
|
||||||
if champ_purge.startswith(nom_purge):
|
|
||||||
return DATA_RESSOURCES[sem][code] # le bon nom
|
|
||||||
|
|
||||||
old = r.nom
|
|
||||||
titre = devine_nom_from_ressources(r.nom)
|
|
||||||
if titre and titre != old:
|
|
||||||
__LOGGER.warning(f"nettoie_titre_ressource : {old} => titre \"{titre}\"")
|
|
||||||
r.nom = titre
|
|
||||||
|
|
||||||
def nettoie_titre_sae(s):
|
|
||||||
"""Nettoie le titre d'une sae en utilisant les titres officiels fournis dans le
|
|
||||||
yaml (via le dictionnaire DATA_RESSOURCES)"""
|
|
||||||
def devine_nom_from_sae(champ):
|
|
||||||
champ_purge = supprime_accent_espace(champ)
|
|
||||||
for sem in DATA_SAES:
|
|
||||||
for code in DATA_SAES[sem]:
|
|
||||||
nom_purge = supprime_accent_espace(DATA_SAES[sem][code])
|
|
||||||
if champ_purge.startswith(nom_purge):
|
|
||||||
return DATA_SAES[sem][code] # le bon nom
|
|
||||||
|
|
||||||
old = s.nom
|
|
||||||
titre = devine_nom_from_sae(s.nom)
|
|
||||||
if titre and titre != old:
|
|
||||||
__LOGGER.warning(f"nettoie_titre_sae : {old} => titre \"{titre}\"")
|
|
||||||
s.nom = titre
|
|
||||||
|
|
||||||
def nettoie_acs(r):
|
|
||||||
"""Nettoie les acs d'une ressource en les remplaçant par leur code pour les 3 compétences"""
|
|
||||||
if len(r.apprentissages) != 3:
|
|
||||||
__LOGGER.warning(f"nettoie_acs : Problème dans le nombre de compétences de {r.nom}")
|
|
||||||
dico = {}
|
|
||||||
for comp in range(3):
|
|
||||||
donnees = r.apprentissages[comp] # chaine de caractères listant les ACS
|
|
||||||
# donnees = donnees.replace("\t", "").replace("-", "") # supprime les tabulations
|
|
||||||
acs_avec_code = devine_acs_by_code(donnees)
|
|
||||||
acs_avec_nom = devine_code_by_nom_from_dict(donnees, DATA_ACS)
|
|
||||||
if acs_avec_code and set(acs_avec_nom).intersection(set(acs_avec_code)) != set(acs_avec_nom):
|
|
||||||
__LOGGER.warning(f"Dans {r.nom}, revoir les ACS : {acs_avec_code} vs {acs_avec_nom}")
|
|
||||||
acs_finaux = acs_avec_code + acs_avec_nom
|
|
||||||
acs_finaux = [ac.replace(" ", "") for ac in acs_finaux]
|
|
||||||
acs_finaux = sorted(list(set(acs_finaux)))
|
|
||||||
dico["RT" + str(comp+1)] = acs_finaux
|
|
||||||
r.apprentissages = dico # [comp] = acs_finaux
|
|
||||||
|
|
||||||
def nettoie_sae(r):
|
|
||||||
"""Nettoie le champ SAe d'une ressource en détectant les codes"""
|
|
||||||
SAE_avec_code = devine_sae_by_code(r.sae)
|
|
||||||
liste = [l.rstrip() for l in SAE_avec_code]
|
|
||||||
r.sae = liste
|
|
||||||
if not r.sae:
|
|
||||||
__LOGGER.warning(f"nettoie_sae: dans {r.nom} pas de SAE (:")
|
|
||||||
|
|
||||||
def nettoie_ressources(r):
|
|
||||||
"""Nettoie le champ ressource d'une sae en détectant les codes"""
|
|
||||||
ressources_avec_code = devine_ressources_by_code(r.ressources)
|
|
||||||
liste = [l.rstrip() for l in ressources_avec_code]
|
|
||||||
r.ressources = liste
|
|
||||||
if not r.ressources:
|
|
||||||
__LOGGER.warning(f"nettoie_ressources: dans {r.nom} pas de ressources (:")
|
|
||||||
|
|
||||||
def nettoie_prerequis(r):
|
|
||||||
"""Nettoie les prérequis (ressource) en les remplaçant par leur code de ressource"""
|
|
||||||
R_avec_code = devine_ressources_by_code(r.prerequis)
|
|
||||||
R_avec_nom = devine_code_by_nom_from_dict(r.prerequis, DATA_RESSOURCES)
|
|
||||||
liste = R_avec_code + R_avec_nom
|
liste = R_avec_code + R_avec_nom
|
||||||
liste = [l.rstrip().replace(",", "").replace(".","") for l in liste] # supprime les espaces
|
liste = [l.rstrip().replace(",", "").replace(".", "") for l in liste] # supprime les espaces et les ponctuations restantes
|
||||||
R_finaux = sorted(list(set(liste)))
|
return sorted(list(set(liste)))
|
||||||
if R_finaux:
|
|
||||||
r.prerequis = R_finaux
|
|
||||||
else:
|
|
||||||
r.prerequis = "Aucun"
|
|
||||||
|
|
||||||
def nettoie_mots_cles(r):
|
|
||||||
mots = r.mots # .encode('utf8', 'ignore').decode('utf8')
|
|
||||||
mots = mots.replace(".", "").replace(";", ",")
|
|
||||||
mots = mots.replace(" ,", ",")
|
|
||||||
r.mots = mots
|
|
||||||
|
|
||||||
|
|
||||||
def devine_acs_by_code(champ):
|
def devine_acs_by_code(champ):
|
||||||
@ -277,6 +274,7 @@ def devine_acs_by_code(champ):
|
|||||||
|
|
||||||
return sorted(list(set(codes4)))
|
return sorted(list(set(codes4)))
|
||||||
|
|
||||||
|
|
||||||
def devine_ressources_by_code(champ):
|
def devine_ressources_by_code(champ):
|
||||||
"""Recherche les codes ressources de la forme RXXX dans champ ;
|
"""Recherche les codes ressources de la forme RXXX dans champ ;
|
||||||
"""
|
"""
|
||||||
@ -298,42 +296,12 @@ def devine_ressources_by_nom(donnees):
|
|||||||
|
|
||||||
def devine_sae_by_code(donnees):
|
def devine_sae_by_code(donnees):
|
||||||
"""Partant d'une chaine de caractères, détermine les codes des SAE"""
|
"""Partant d'une chaine de caractères, détermine les codes des SAE"""
|
||||||
codes = re.findall(r"(SAE\d\d)\D", donnees)
|
codes = re.findall(r"(SAE\d\d)", donnees)
|
||||||
codes += re.findall(r"(SAÉ\d\d)\D", donnees)# de code à 3 chiffres
|
codes += re.findall(r"(SAÉ\d\d)", donnees)# de code à 3 chiffres
|
||||||
for (i, code) in enumerate(codes):
|
for (i, code) in enumerate(codes):
|
||||||
codes[i] = codes[i].replace("E", "É")
|
codes[i] = codes[i].replace("E", "É")
|
||||||
return sorted(list(set(codes)))
|
return sorted(list(set(codes)))
|
||||||
|
|
||||||
def split_description(r):
|
|
||||||
"""Découpe le champ description en un contexte+un contenu ; si pas possible """
|
|
||||||
champs = r.description.split("\n")
|
|
||||||
champs = [c for c in champs if c] # supprime les lignes vides
|
|
||||||
|
|
||||||
indicea = 0 # la ligne mentionnant le contexte
|
|
||||||
if True in [ligne.startswith("Contexte et ") for ligne in champs]: # la ligne commençant par Contenus
|
|
||||||
indicea = [ligne.startswith("Contexte et ") for ligne in champs].index(True)
|
|
||||||
|
|
||||||
indicec = 0
|
|
||||||
contexte = []
|
|
||||||
if True in [ligne.startswith("Contenus") for ligne in champs]: # la ligne commençant par Contenus
|
|
||||||
indicec = [ligne.startswith("Contenus") for ligne in champs].index(True)
|
|
||||||
if True in [ligne.startswith("Contexte et ") for ligne in champs]:
|
|
||||||
contexte = champs[indicea+1:indicec]
|
|
||||||
else:
|
|
||||||
contexte = champs[:indicec]
|
|
||||||
# suppression des lignes vides
|
|
||||||
contexte = "\n".join(remove_ligne_vide(contexte))
|
|
||||||
# suppression des liens
|
|
||||||
contexte = remove_link(contexte)
|
|
||||||
if not contexte:
|
|
||||||
contexte = "Aucun"
|
|
||||||
contenu = "\n".join(champs[indicec+1:])
|
|
||||||
|
|
||||||
|
|
||||||
# sauvegarde des champs
|
|
||||||
r.contexte = contexte
|
|
||||||
r.contenu = contenu
|
|
||||||
|
|
||||||
def remove_link(contenu):
|
def remove_link(contenu):
|
||||||
liens = re.findall("(<a\s.*\">)", contenu)
|
liens = re.findall("(<a\s.*\">)", contenu)
|
||||||
for m in liens:
|
for m in liens:
|
||||||
@ -396,6 +364,8 @@ def remplace_marqueur_numerique_with_caracteres(contenu):
|
|||||||
|
|
||||||
def convert_to_markdown(contenu):
|
def convert_to_markdown(contenu):
|
||||||
"""Convertit un contenu avec des marqueurs en markdown"""
|
"""Convertit un contenu avec des marqueurs en markdown"""
|
||||||
|
contenu = remove_link(contenu) # supprime les liens
|
||||||
|
|
||||||
contenu = remplace_marqueur_numerique_with_caracteres(contenu)
|
contenu = remplace_marqueur_numerique_with_caracteres(contenu)
|
||||||
marqueurs_finaux = get_marqueurs(contenu)
|
marqueurs_finaux = get_marqueurs(contenu)
|
||||||
lignes = contenu.split("\n")
|
lignes = contenu.split("\n")
|
||||||
@ -411,50 +381,9 @@ def convert_to_markdown(contenu):
|
|||||||
return contenu
|
return contenu
|
||||||
|
|
||||||
|
|
||||||
def nettoie_contenus_ressource(r):
|
class SAEDocx(Docx):
|
||||||
"""Partant du contenu détaillé d'une ressource, la transforme
|
"""Classe modélisant un chapeau de SAé relu dans les docx"""
|
||||||
en markdown en générant les listes à puces"""
|
__LOGGER = logging.getLogger(__name__)
|
||||||
contenu = r.contenu.replace(" / ", "/")
|
|
||||||
contenu = convert_to_markdown(contenu)
|
|
||||||
r.contenu = contenu
|
|
||||||
|
|
||||||
def nettoie_livrables_sae(s):
|
|
||||||
"""Partant du contenu détaillé d'une ressource, la transforme
|
|
||||||
en markdown en générant les listes à puces"""
|
|
||||||
contenu = s.livrables
|
|
||||||
contenu = convert_to_markdown(contenu)
|
|
||||||
s.livrables = contenu
|
|
||||||
|
|
||||||
def nettoie_description(s):
|
|
||||||
"""Nettoie la description d'un exemple de SAE"""
|
|
||||||
contenu = s.description
|
|
||||||
contenu = remove_link(contenu) # supprime les liens
|
|
||||||
contenu = convert_to_markdown(contenu)
|
|
||||||
s.description = contenu
|
|
||||||
|
|
||||||
def nettoie_problematique(s):
|
|
||||||
"""Nettoie la description d'un exemple de SAE"""
|
|
||||||
if s.problematique:
|
|
||||||
contenu = s.problematique
|
|
||||||
contenu = convert_to_markdown(contenu)
|
|
||||||
s.problematique = contenu
|
|
||||||
else:
|
|
||||||
s.problematique = ""
|
|
||||||
|
|
||||||
def nettoie_modalite(s):
|
|
||||||
"""Nettoie les modalités (d'évaluation) d'un exemple de SAE"""
|
|
||||||
if s.modalite:
|
|
||||||
contenu = s.modalite
|
|
||||||
contenu = convert_to_markdown(contenu)
|
|
||||||
s.modalite = contenu
|
|
||||||
else:
|
|
||||||
s.modalite = f"Les même que les livrables et les productions de la {s.code}"
|
|
||||||
|
|
||||||
class SAEDocx():
|
|
||||||
|
|
||||||
def __init__(self, nom, brut):
|
|
||||||
self.nom = nom
|
|
||||||
self.brut = brut # les données brutes de la ressource
|
|
||||||
|
|
||||||
def charge_informations(self, code, semestre, heures_encadrees, tp, projet, description, ressources, livrables, mots):
|
def charge_informations(self, code, semestre, heures_encadrees, tp, projet, description, ressources, livrables, mots):
|
||||||
self.code = code
|
self.code = code
|
||||||
@ -467,9 +396,67 @@ class SAEDocx():
|
|||||||
self.livrables = livrables
|
self.livrables = livrables
|
||||||
self.mots = mots
|
self.mots = mots
|
||||||
|
|
||||||
|
def nettoie_titre_sae(self):
|
||||||
|
"""Nettoie le titre d'une SAE en utilisant les titres officiels
|
||||||
|
fournis dans le yaml (via le dictionnaire DATA_RESSOURCES)"""
|
||||||
|
self.nettoie_titre(DATA_SAES)
|
||||||
|
|
||||||
|
def nettoie_code(self):
|
||||||
|
"""Recherche les codes de la forme SAE|éXX """
|
||||||
|
if self.code:
|
||||||
|
codes = devine_sae_by_code(self.code)
|
||||||
|
if len(codes) == 1:
|
||||||
|
self.code = codes[0]
|
||||||
|
else:
|
||||||
|
code_devine = get_code_from_nom_using_dict(self.nom, DATA_SAES)
|
||||||
|
if code_devine:
|
||||||
|
SAEDocx.__LOGGER.warning(f"nettoie_code : \"{self.nom}\" => code {code_devine}")
|
||||||
|
self.code = code_devine
|
||||||
|
else:
|
||||||
|
self.code = None
|
||||||
|
if not self.code:
|
||||||
|
SAEDocx.__LOGGER.warning(f"nettoie_code : \"{self.nom}\" => code manquant")
|
||||||
|
|
||||||
|
def nettoie_heures_sae(self):
|
||||||
|
"""Nettoie les champs (horaires) des saes"""
|
||||||
|
if self.heures_encadrees: # si les heures encadrées sont renseignées
|
||||||
|
self.heures_encadrees = nettoie_champ_heure(self.heures_encadrees)
|
||||||
|
else:
|
||||||
|
SAEDocx.__LOGGER.warning(f"nettoie_heures_sae: dans {self.nom}, manque les heures de formation")
|
||||||
|
self.heures_encadrees = "???"
|
||||||
|
if self.tp:
|
||||||
|
self.tp = nettoie_champ_heure(self.tp)
|
||||||
|
else:
|
||||||
|
SAEDocx.__LOGGER.warning(f"nettoie_heures_sae: dans {self.nom}, manque les heures de tp")
|
||||||
|
self.tp = "???"
|
||||||
|
|
||||||
|
if self.projet:
|
||||||
|
self.projet = nettoie_champ_heure(self.projet)
|
||||||
|
else:
|
||||||
|
SAEDocx.__LOGGER.warning(f"nettoie_heures_sae: dans {self.nom}, manque les heures de projet")
|
||||||
|
self.projet = "???"
|
||||||
|
|
||||||
|
try:
|
||||||
|
if self.heures_encadrees < self.tp:
|
||||||
|
SAEDocx.__LOGGER.warning(f"nettoie_heures_sae: dans {self.nom}, pb dans les heures formations/tp")
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def nettoie_livrables_sae(self):
|
||||||
|
"""Partant du contenu détaillé d'une ressource, la transforme
|
||||||
|
en markdown en générant les listes à puces"""
|
||||||
|
self.livrables = convert_to_markdown(self.livrables)
|
||||||
|
|
||||||
|
def nettoie_ressources(self):
|
||||||
|
"""Nettoie le champ ressource d'une sae en détectant les codes"""
|
||||||
|
self.ressources = nettoie_liste_ressources(self.ressources)
|
||||||
|
if not self.ressources:
|
||||||
|
SAEDocx.__LOGGER.warning(f"nettoie_ressources: dans {self.nom} pas de ressources (:")
|
||||||
|
|
||||||
|
def nettoie_description(self):
|
||||||
|
"""Nettoie le champ description"""
|
||||||
|
self.description = convert_to_markdown(self.description)
|
||||||
|
|
||||||
def charge_ac(self, apprentissages):
|
|
||||||
self.apprentissages = apprentissages
|
|
||||||
|
|
||||||
def to_yaml(self):
|
def to_yaml(self):
|
||||||
"""Exporte la ressource en yaml"""
|
"""Exporte la ressource en yaml"""
|
||||||
@ -485,16 +472,14 @@ class SAEDocx():
|
|||||||
"livrables": folded(self.livrables),
|
"livrables": folded(self.livrables),
|
||||||
"motscles": self.mots if self.mots else ""
|
"motscles": self.mots if self.mots else ""
|
||||||
}
|
}
|
||||||
output = ruamel.yaml.dump(dico, Dumper=ruamel.yaml.RoundTripDumper,
|
return self.dico_to_yaml(dico)
|
||||||
allow_unicode=True, width=100)
|
|
||||||
output = output.replace("\n\n\n", "\n\n")
|
|
||||||
return output
|
|
||||||
|
|
||||||
|
|
||||||
class ExempleSAEDocx():
|
class ExempleSAEDocx(Docx):
|
||||||
|
"""Classe modélisant les exemples de SAE tel que relu dans les Docx"""
|
||||||
|
|
||||||
def __init__(self, nom, brut, code):
|
def __init__(self, nom, brut, code):
|
||||||
self.nom = nom
|
self.nom = nom.rstrip()
|
||||||
self.brut = brut # les données brutes de la ressource
|
self.brut = brut # les données brutes de la ressource
|
||||||
self.code = code # code de la SAE à laquelle l'exemple est raccroché
|
self.code = code # code de la SAE à laquelle l'exemple est raccroché
|
||||||
# Ajoute le semestre de la SAE
|
# Ajoute le semestre de la SAE
|
||||||
@ -506,6 +491,30 @@ class ExempleSAEDocx():
|
|||||||
self.problematique = problematique
|
self.problematique = problematique
|
||||||
self.modalite = modalite
|
self.modalite = modalite
|
||||||
|
|
||||||
|
def nettoie_description(self):
|
||||||
|
"""Nettoie la description d'un exemple de SAE"""
|
||||||
|
self.description = convert_to_markdown(self.description)
|
||||||
|
|
||||||
|
def nettoie_problematique(self):
|
||||||
|
"""Nettoie la description d'un exemple de SAE"""
|
||||||
|
if self.problematique:
|
||||||
|
self.problematique = convert_to_markdown(self.problematique)
|
||||||
|
else:
|
||||||
|
self.problematique = ""
|
||||||
|
|
||||||
|
def nettoie_modalite(self):
|
||||||
|
"""Nettoie les modalités (d'évaluation) d'un exemple de SAE"""
|
||||||
|
if self.modalite:
|
||||||
|
self.modalite = convert_to_markdown(self.modalite)
|
||||||
|
else:
|
||||||
|
self.modalite = f"Les même que les livrables et les productions de la {self.code}"
|
||||||
|
|
||||||
|
def nettoie_champs(self):
|
||||||
|
"""Déclenche le nettoyage des champs de l'exemple"""
|
||||||
|
self.nettoie_modalite()
|
||||||
|
self.nettoie_description()
|
||||||
|
self.nettoie_modalite()
|
||||||
|
|
||||||
def to_yaml(self):
|
def to_yaml(self):
|
||||||
"""Exporte la ressource en yaml"""
|
"""Exporte la ressource en yaml"""
|
||||||
dico = {"titre": self.nom,
|
dico = {"titre": self.nom,
|
||||||
@ -516,10 +525,7 @@ class ExempleSAEDocx():
|
|||||||
"problematique": folded(self.problematique) if self.problematique !="" else "",
|
"problematique": folded(self.problematique) if self.problematique !="" else "",
|
||||||
"modalite": folded(self.modalite),
|
"modalite": folded(self.modalite),
|
||||||
}
|
}
|
||||||
output = ruamel.yaml.dump(dico, Dumper=ruamel.yaml.RoundTripDumper,
|
return self.dico_to_yaml(dico)
|
||||||
allow_unicode=True, width=100)
|
|
||||||
output = output.replace("\n\n\n", "\n\n")
|
|
||||||
return output
|
|
||||||
|
|
||||||
if __name__=="__main__":
|
if __name__=="__main__":
|
||||||
# Eléments de test
|
# Eléments de test
|
||||||
|
Loading…
Reference in New Issue
Block a user