Referentiels/python/officiel.py

127 lines
5.4 KiB
Python
Raw Normal View History

import logging, yaml
import unicodedata
__LOGGER = logging.getLogger(__name__)
# Récupère les informations officielles sur les ressources (code/nom)
with open("pn/ressources.yml", 'r', encoding="utf8") as fid:
DATA_RESSOURCES = yaml.load(fid.read(), Loader=yaml.Loader)
# Récupère les données officielles des ACs
with open("pn/acs.yml", 'r', encoding="utf8") as fid:
DATA_ACS = yaml.load(fid.read(), Loader=yaml.Loader)
with open("pn/saes.yml", 'r', encoding="utf8") as fid:
DATA_SAES = yaml.load(fid.read(), Loader=yaml.Loader)
def supprime_accent_espace(chaine):
"""Met en minuscule, supprime les accents, les ponctuations et les espaces"""
purge = chaine.lower().replace("'", "").replace("", "")
purge = unicodedata.normalize('NFD', purge).encode('ascii', 'ignore').decode('ascii')
purge = purge.replace(" ", "")
return purge
def devine_code_by_nom_from_dict(champ, dico):
"""Partant d'une chaine de caractères décrivant une ressource, une SAé ou un ACS,
détermine le code présent dans le dico officiel (dico à double entrée),
Le dico officiel vient d'un .yml"""
acs = []
champ_purge = supprime_accent_espace(champ)
for comp in DATA_ACS:
for code in DATA_ACS[comp]:
acs_purge = supprime_accent_espace(DATA_ACS[comp][code])
if acs_purge in champ_purge:
acs += [code]
return sorted(list(set(acs)))
def get_matrices_ac_ressource(ressources, sem):
"""Calcul la matrice AC vs ressource pour un sem donné et renvoie la
chaine pour affichage dans un .txt"""
les_codes_acs = [code for comp in DATA_ACS for code in DATA_ACS[comp]]
nbre_acs = len(les_codes_acs)
ressem = ressources[sem] # les ressources du semestre
nbre_ressources_semestre = len(DATA_RESSOURCES[sem])
if len(ressem) != nbre_ressources_semestre:
__LOGGER.warning(f"Pb => il manque des ressources au {sem}")
matrice = [[False] * nbre_ressources_semestre for i in range(nbre_acs)]
for (i, r) in enumerate(ressem): # pour chaque ressource
for comp in r.apprentissages: # pour chaque comp
for (j, ac) in enumerate(les_codes_acs): # pour chaque ac
if ac in r.apprentissages[comp]: # si l'ac est prévue dans la ressource
matrice[j][i] = True
chaine = ""
ligne = "{:20s} | " + "{:4s} | " * nbre_ressources_semestre
valeurs = ("" for i in range(nbre_ressources_semestre + 1))
trait = "-" * len(ligne.format(*valeurs))
valeurs = [""] + [r.code if r.code else "????" for r in ressem] + [""] * (
nbre_ressources_semestre - len(ressem))
valeurs = tuple(valeurs)
chaine += ligne.format(*valeurs) + "\n" + trait + "\n"
for (j, ac) in enumerate(les_codes_acs):
valeurs = [ac] + [("X" if matrice[j][i] == True else "") for i in range(nbre_ressources_semestre)]
valeurs = tuple(valeurs)
chaine += ligne.format(*valeurs) + "\n"
chaine += trait + "\n"
2021-03-30 09:22:21 +02:00
return (matrice, chaine)
def affiche_bilan_heures(ressources, sem):
"""Renvoie une chaine décrivant un bilan des heures pour un sem donné"""
ligne = "{:20s} | {:75s} | {:10s} | {:10s} |"
trait = "-"*len(ligne.format("", "", "", ""))
ressem = ressources[sem] # les ressources du semestre
chaine = ""
chaine += trait + "\n"
chaine += ligne.format("Code", "Ressource", "Form.", "dont TP") + "\n"
chaine += trait + "\n"
for r in ressem:
chaine += ligne.format(r.code if r.code else "MANQUANT",
# r.nom[:30] + ("..." if len(r.nom) > 30 else "") ,
r.nom,
str(r.heures_encadrees) if r.heures_encadrees else "MANQUANT",
str(r.tp) if r.tp else "MANQUANT") + "\n"
heures_formation_total = sum([r.heures_encadrees for r in ressem if r.heures_encadrees != None])
heures_tp_total = sum([r.tp for r in ressem if r.tp != None])
chaine += trait + "\n"
chaine += ligne.format("", "Total", str(heures_formation_total), str(heures_tp_total)) + "\n"
chaine += trait + "\n"
return chaine
2021-03-30 12:14:27 +02:00
2021-04-02 14:59:08 +02:00
def get_officiel_name_by_code_using_dict(code, dico):
"""Extrait un nom à partir d'un code (pour les RESSOURCES ou les SAES)"""
for sem in dico:
for rcode in dico[sem]:
if rcode==code:
return dico[sem][code]
2021-03-30 12:14:27 +02:00
def get_officiel_ressource_name_by_code(code):
"""Pour un code valide, fournit le nom officiel de la ressource (sans connaissance du semestre)"""
2021-04-02 14:59:08 +02:00
return get_officiel_name_by_code_using_dict(code, DATA_RESSOURCES)
def get_officiel_sae_name_by_code(code):
"""Pour un code valide, fournit le nom officiel de la sae (sans connaissance du semestre)"""
2021-04-02 14:59:08 +02:00
return get_officiel_name_by_code_using_dict(code, DATA_SAES)
2021-04-03 09:53:25 +02:00
2021-04-02 14:59:08 +02:00
def get_code_from_nom_using_dict(ressource, dico):
"""Récupère le code d'une ressource d'après son nom en utilisant les noms officiels
2021-04-02 14:59:08 +02:00
des ressources du yaml si dico == DATA_RESSOURCES ; sinon fait de même avec les SAE"""
nom = supprime_accent_espace(ressource.nom)
2021-04-02 14:59:08 +02:00
for sem in dico:
for code in dico[sem]:
nom_data = supprime_accent_espace(dico[sem][code])
if nom.startswith(nom_data):
2021-04-03 09:53:25 +02:00
return code
def get_officiel_sem_sae_by_code(sae):
"""Récupère le semestre de la SAE d'après son code"""
for sem in DATA_SAES:
if sae in DATA_SAES[sem]:
return sem