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" 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 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] def get_officiel_ressource_name_by_code(code): """Pour un code valide, fournit le nom officiel de la ressource (sans connaissance du semestre)""" 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)""" return get_officiel_name_by_code_using_dict(code, DATA_SAES) 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 des ressources du yaml si dico == DATA_RESSOURCES ; sinon fait de même avec les SAE""" nom = supprime_accent_espace(ressource.nom) for sem in dico: for code in dico[sem]: nom_data = supprime_accent_espace(dico[sem][code]) if nom.startswith(nom_data): 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