From a680b2f78891692be215013481e167da2fffb5d8 Mon Sep 17 00:00:00 2001 From: Denise sur Lya Date: Tue, 16 Feb 2021 14:24:18 +0100 Subject: [PATCH] =?utf8?q?nettoyage=20du=20code=20+=20passage=20en=20"d?= =?utf8?q?=C3=A9faut"=20de=20la=20grille=20am=C3=A9lior=C3=A9e=20(am=C3=A9?= =?utf8?q?lior=C3=A9e).=20Correction=20d'un=20l=C3=A9ger=20bug=20sur=20l'?= =?utf8?q?=C3=A9chelle=20en=20y.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- app.py | 23 ++++--- configuration.py | 1 + data/changelog_data.txt | 2 + gestionOMS.py | 4 +- gestion_couleurs.py | 2 +- gestion_donnees.py | 23 ++++--- gestion_erreurs.py | 4 +- gestion_unites.py | 14 ++--- templates/index.html | 2 +- trace_courbe.py | 135 ++++++++++++++++++++-------------------- 10 files changed, 108 insertions(+), 102 deletions(-) diff --git a/app.py b/app.py index 3f4da5c..02d88c4 100644 --- a/app.py +++ b/app.py @@ -8,11 +8,10 @@ import base64 from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas from configuration import config_init,CONFIG -from gestion_erreurs import * -from gestion_donnees import * -from gestion_unites import * -from trace_courbe import * -from faq import * +from gestion_erreurs import initialise_erreurs, debug, niveau_debug +import gestion_donnees as donnees +from trace_courbe import cree_figure +import faq as f app = flask.Flask(__name__) @@ -26,7 +25,7 @@ def index(): ## charger les donneés dans le formulaire fichier = flask.request.files['fichier_donnees'] chaine = fichier.read() - val_form2 = fichier_json_vers_configdonnees(chaine,liste_err) + val_form2 = donnees.fichier_json_vers_configdonnees(chaine,liste_err) if val_form2 == {}: return flask.render_template("index.html",err=liste_err[2]+liste_err[1]+liste_err[0],valform=val_form) val_form.update(val_form2) @@ -45,15 +44,15 @@ def courbe_image(ext): data = flask.request.form # récupérer les données du formulaire proprement - config,listes_jours,listes_donnees = web_vers_python(data,liste_err) + config,listes_jours,listes_donnees = donnees.web_vers_python(data,liste_err) debug(" * On a récupéré et traité les données du formulaire web",liste_err) - texte = donnees_vers_json(listes_jours["poids"],listes_donnees["poids"],listes_jours["taille"],listes_donnees["taille"], config) + texte = donnees.donnees_vers_json(listes_jours["poids"],listes_donnees["poids"],listes_jours["taille"],listes_donnees["taille"], config) debug("texte prêt à être exporté : "+texte,liste_err) # noter le nom de l'enfant pour l'export - nomenfant = simplifie_nom(config['nom']) + nomenfant = donnees.simplifie_nom(config['nom']) # créer les figures try: @@ -105,15 +104,15 @@ def contact(): @app.route("/faq") def faq(): - table_faq = lire_fichier_csv_simple(fichier_FAQ) - l_categ,table_qr = extraire_tables_par_cat(table_faq) + table_faq = f.lire_fichier_csv_simple(f.fichier_FAQ) + l_categ,table_qr = f.extraire_tables_par_cat(table_faq) return flask.render_template("faq.html",lcateg=l_categ,tableqr=table_qr,err=[]) @app.route("/changelog") def changelog(): - table_version = lire_fichier_csv_simple(fichier_changelog) + table_version = f.lire_fichier_csv_simple(f.fichier_changelog) return flask.render_template("changelog.html",table = table_version,err=[]) diff --git a/configuration.py b/configuration.py index 242f179..fd6df9e 100644 --- a/configuration.py +++ b/configuration.py @@ -113,6 +113,7 @@ DEFAUT["tracevide"] = "" DEFAUT["memechelle"] = "" DEFAUT["positionlegende"] = "hg" DEFAUT["prolongercourbes"] = "" +DEFAUT["grilleamelio"] = "oui" DEFAUT["prematurite"] = "0j" diff --git a/data/changelog_data.txt b/data/changelog_data.txt index f59e7b7..f0b26b0 100644 --- a/data/changelog_data.txt +++ b/data/changelog_data.txt @@ -1,3 +1,5 @@ +"Version 2.261","16/02/2021","

Du mieux sur la gestion de la grille améliorée, qui passe en ""par défaut"" maintenant. Plus une correction de bug sur l'échelle du graphique, et du code nettoyé. On dirait pas comme ça, hein ? N'hésitez pas à me signaler tout vilain bug persistant !

" + "Version 2.26","15/02/2021","

Nouveauté en bêta-test : grille améliorée. Pour le moment on peut cocher pour avoir cette fonctionnalité.

" "Version 2.25","12/02/2021","

Nouveauté : possibilité de ""prolonger"" la courbe de poids/taille en pointillés. L'extrapolation est faite à partir de la dernière donnée. À tester encore !

" diff --git a/gestionOMS.py b/gestionOMS.py index cebd1eb..b00b93b 100644 --- a/gestionOMS.py +++ b/gestionOMS.py @@ -5,8 +5,8 @@ Created on Mon May 18 08:59:11 2020 @author: sekhmet """ -from gestion_erreurs import * -from gestion_couleurs import * +#from gestion_erreurs import erreur, warning, debug +from gestion_couleurs import degrade_choix import csv diff --git a/gestion_couleurs.py b/gestion_couleurs.py index c1b3690..3230f3d 100644 --- a/gestion_couleurs.py +++ b/gestion_couleurs.py @@ -4,7 +4,7 @@ ### Gérer les couleurs -from gestion_erreurs import * +from gestion_erreurs import warning def rgb_vers_tuple(chaine,defaut,liste_err): """ convertit une chaine rgb genre #00FF1B diff --git a/gestion_donnees.py b/gestion_donnees.py index 208be4a..169f3da 100644 --- a/gestion_donnees.py +++ b/gestion_donnees.py @@ -2,9 +2,9 @@ # -*- coding: utf-8 -*- from configuration import CONFIG,DEFAUT -from gestion_erreurs import * -from gestion_couleurs import * -from gestion_unites import * +from gestion_erreurs import debug, warning, erreur, initialise_erreurs +from gestion_couleurs import rgb_vers_tuple, tuple_vers_rgb +from gestion_unites import choix_unite import datetime import json import unidecode @@ -73,6 +73,7 @@ def convertit_age_vers_texte(nombre): if jours>0 or nombre ==0: # si c'est la naissance, faut beien écrire 0j quand même chaine += str(jours)+"j" return chaine + ########################## # fonction qui calcule "auto" le maxi du graphique en fonction du max @@ -150,7 +151,7 @@ def delta_date(date1,datenaissance): d = date1 - datenaissance jours = d.days if jours<0: - erreur_continue("La différence entre les dates est négative... :/") + warning("La différence entre les dates est négative... :/") return -1 return jours @@ -179,7 +180,7 @@ def web_vers_python(data,liste_err): -########### Fonctions qui gèretn les données +########### Fonctions qui gèretn les données web vers python def gere_checkbox(chaine): """ prend en arg une chaine, et renvoie "oui" si c'est "on" (sortie de la checkbox) @@ -193,6 +194,7 @@ def gere_configuration(data,liste_err): """ prend en argument le dictionnaire de requête (configuration imparfaite), et construit le dictionnaire de configuration qui va bien. Vérifie que chaque entrée est cohérente évidemment.""" + # Initialisation configuration = {"non_sauve": {}} # Pour le nom, osef qu'il soit vide @@ -292,6 +294,7 @@ def gere_configuration(data,liste_err): configuration["prolongercourbes"] = gere_checkbox(data.get("prolongercourbes","")) + # Ceci n'a pas besoin d'être sauvé configuration["non_sauve"]["grilleamelio"] = gere_checkbox(data.get("grilleamelio","")) configuration["couleurs"] = {} @@ -303,7 +306,7 @@ def gere_configuration(data,liste_err): return configuration - +## web vers python : données def gere_donnees(data,naissance,typedonnee,liste_err): """ prend en argument le dictionnaire de requête, et la date de naissance (éventuellement vide), et construit deux listes : @@ -347,6 +350,7 @@ def gere_donnees(data,naissance,typedonnee,liste_err): return (l_jours,l_donnee) +# python vers Json #### export vers json def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config): @@ -378,7 +382,7 @@ def fusionne_donnees(listes_jours,listes_donnees): de données (par la même clé de type de données). Il faut les fusionner pour avoir une liste de dictionnaires, de type ("age":truc, "donnee1":truc, "donnee2":truc, ...) triée par ordre de jours. Si jamais une des données est vide, le champ du dictionnaire n'est pas rempli""" -# nb_donnees = len(listes_jours) + def fini(lj): """ teste si les listes sont toutes vides """ for l in lj.values(): @@ -411,10 +415,11 @@ def fusionne_donnees(listes_jours,listes_donnees): return liste_f - +### COnversion json vers formulaire # Json -> formulaire HTML def fichier_json_vers_configdonnees(chaine,liste_err): - """ prend le json importé (chaine) et l'exporte vers les valeurs du formulaire """ + """ prend le json importé (chaine) et l'exporte vers les valeurs du formulaire + Renvoyé sous forme de dictionnaire (mais adapté au formulaire web)""" debug("json vers config : Prêt à interpréter le json",liste_err) try: valform = json.loads(chaine) diff --git a/gestion_erreurs.py b/gestion_erreurs.py index 7fffb06..910aabd 100644 --- a/gestion_erreurs.py +++ b/gestion_erreurs.py @@ -23,9 +23,9 @@ def warning(message,listeerreurs): print("** Warning : "+message) listeerreurs[1].append("Alerte : "+message) -def debug(message,liste_erreurs): +def debug(message,listeerreurs): global niveau_debug if niveau_debug: print("##Debug : "+message) - liste_erreurs[2].append("# Debug : "+message) + listeerreurs[2].append("# Debug : "+message) diff --git a/gestion_unites.py b/gestion_unites.py index b97d90b..d4089bd 100644 --- a/gestion_unites.py +++ b/gestion_unites.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- from configuration import CONFIG -from gestion_erreurs import * +from gestion_erreurs import warning ##################### outils pour affichage et choix de l'unité @@ -31,7 +31,7 @@ def choix_echelle_data(typedonnees, donneemax): if donneemax>15: return (5,1) elif donneemax > 10: - return (2,1) + return (1,0.5) else: return (1,0.2) if typedonnees == "taille": @@ -53,25 +53,25 @@ def choix_echelle_temps(unite, tempsmaxi): if unite=="jours": if tempsmaxi > 60: # pourquoi mettre en jours ? return (30,1) - elif tempsmaxi >20: + elif tempsmaxi >15: return (7,1) else: return (1,0) if unite=="semaines": if tempsmaxi >50: return (5,1) - elif tempsmaxi > 15: + elif tempsmaxi > 10: return (2,1) else: return (1,1/7) # On met en jours if unite=="mois": - if tempsmaxi > 30: - return (2,1) + if tempsmaxi > 24: + return (12,1) elif tempsmaxi > 10: return (1,0) else: - return (1,0.25) # on met en semaines + return (1,0.25) # on met en semaines à peu près (quart de mois) if unite=="années": return (1,1/12) # années / mois diff --git a/templates/index.html b/templates/index.html index e5d4d24..34be454 100644 --- a/templates/index.html +++ b/templates/index.html @@ -96,7 +96,7 @@
  • Prolonger les courbes (expérimental) :
  • -
  • +
  • Dimensions du graphique :
  • diff --git a/trace_courbe.py b/trace_courbe.py index 9cb4845..c3e1691 100644 --- a/trace_courbe.py +++ b/trace_courbe.py @@ -1,9 +1,10 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- from configuration import CONFIG -from gestionOMS import * -from gestion_unites import * +import gestionOMS as oms +import gestion_unites as u from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python +from gestion_erreurs import debug, erreur, warning from numpy import arange import matplotlib.pyplot as plt @@ -12,18 +13,22 @@ import matplotlib.pyplot as plt def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): - debug("debut de cree_figure",liste_err) + """ conf est le dictionnaire de config. l_jours et l_poids les listes des temps (en jours) et de données + (donc pas forcément du poids) + typedonnee est le type de données (voir CONFIG["liste_typedonnees"] + liste_err la liste des erreurs à compléter (voir gestion_erreurs)) + Renvoie la figure tracée""" + debug("debut de cree_figure. Config : "+str(conf),liste_err) try: - liste_data_labels_p,liste_data_labels_z = renvoie_liste_labels(conf,CONFIG["liste_data_choisie_p"],CONFIG["liste_data_choisie_z"],liste_err) + liste_data_labels_p,liste_data_labels_z = oms.renvoie_liste_labels(conf,CONFIG["liste_data_choisie_p"],CONFIG["liste_data_choisie_z"],liste_err) except: erreur("bug avec liste data labels",liste_err) return "" - # maxi saisi par l'utilisateur ? + ######################## Gestion des bornes ############################# + # y a-t-il un maxi saisi par l'utilisateur ? if conf["maxi"] ==0: # Est-ce qu'on a donné un maxi quand même (car même échelle) ? - print(conf) - print(conf["non_sauve"]) if conf["non_sauve"].get("maxi",0) == 0: jour_maxi = calcule_max_graphique(l_jours) else: @@ -31,42 +36,41 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): else: jour_maxi = conf["maxi"]+1 - # On s'assure que c'est bien compris dans les bornes jour_maxi = max(CONFIG["jours_mini_courbe"],min(jour_maxi,CONFIG["jours_maxi_courbe"])) - debug("cree_figure : gestion du jour max ok : "+str(jour_maxi),liste_err) + debug("cree_figure : gestion du jour max : "+str(jour_maxi),liste_err) + ##################### Gestion des unités ############################### # si l'unité n'est pas précisée, ni en "non sauvé" ni par l'utilisateur if conf["unite"] == "" and conf["non_sauve"].get("unite","") == "": - unite = choix_unite(jour_maxi) + unite = u.choix_unite(jour_maxi) debug("Unité non précisée, on choisit "+unite,liste_err) elif conf["unite"] != "": unite = conf["unite"] else: unite = conf["non_sauve"]["unite"] - #debug("prématurité dans la config : "+conf["prematurite"],liste_err) + ##################### Gestion de la prématurité #######################" prema = int(convertit_jours_vers_python(conf["prematurite"],liste_err)) ## Gestion des prémas, deux cas : # Si agecorrige est oui, alors on veut juste soustraire la valeur de préma # à toutes les données. # Si agecorrige est non, alors on veut ajouter la valeur de préma aux courbes de référence. - - debug("Prématurité : "+str(prema)+" age corrigé : "+conf["agecorrige"],liste_err) - + debug("Prématurité : "+str(prema)+" age corrigé : "+conf["agecorrige"],liste_err) if prema>0 and conf["agecorrige"] == "oui": l_jours = [j-prema for j in l_jours] jour_maxi = jour_maxi - prema -# debug("liste des jours : "+str(l_jours),liste_err) - l_jours_conv = convertit_tableau(l_jours,unite,liste_err) + + ###################### Conversion des unités ###########################"" + l_jours_conv = u.convertit_tableau(l_jours,unite,liste_err) # Attention, comme les jours commencent à partir de 0, faut enlever 1 pour avoir la borne... - age_maxi = convertitunite(jour_maxi-1,unite,liste_err) + age_maxi = u.convertitunite(jour_maxi-1,unite,liste_err) debug("cree_figure : conversion des unités ok : "+str(l_jours_conv),liste_err) + #####################" Courbes OMS et titre ######################################" titre = "Courbe de "+typedonnee+" OMS" - if conf["typecourbe"] == "P": # percentiles liste_data_labels = liste_data_labels_p @@ -98,7 +102,6 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): if conf["nom"] !="": titre += " de " +conf["nom"] - if prema>0: titre+= ", préma de "+conf["prematurite"] if conf["agecorrige"] == "oui": @@ -106,30 +109,28 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): else: titre+=" (courbe en âge réel, données OMS décalées)" - debug("cree_figure : géré le type de courbe ok. Liste des data labels : "+str(liste_data_labels),liste_err) + #debug("cree_figure : géré le type de courbe ok. Liste des data labels : "+str(liste_data_labels),liste_err) debug("Fichier d'où extraire les données : "+fichier_oms,liste_err) + - - - # convertir les unités - #### Partie code OMS #### On extrait les données des courbes, et on convertit les jours dans l'unité voulues try: - t = lire_fichier_csv(fichier_oms) + t = oms.lire_fichier_csv(fichier_oms) except: - liste_err[0].append("Impossible d'ouvrir le fichier "+fichier_oms) + erreur("cree_figure : Impossible d'ouvrir le fichier "+fichier_oms, liste_err) return "" - debug("cree_figure : on va convertir données OMS à la bonne unité",liste_err) + debug("cree_figure : Conversion des données OMS à la bonne unité",liste_err) try: - coljour= (extraire_colonne(t,0,jour_maxi)) + coljour= (oms.extraire_colonne(t,0,jour_maxi)) if prema>0 and conf["agecorrige"] != "oui": coljour = [j + prema for j in coljour] - coljour = convertit_tableau(coljour,unite,liste_err) + coljour = u.convertit_tableau(coljour,unite,liste_err) except: erreur("Problème à la conversion du tableau OMS. jour_maxi = "+str(jour_maxi)+" unite = "+unite,liste_err) return "" + ##################### Création de la figure et du graphique ################### debug("cree_figure : prête à créer la figure",liste_err) #### La figure, params @@ -142,36 +143,13 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): plt.rcParams['legend.edgecolor'] = conf["couleurs"]["grille"] ax = plt.axes() + ###################### Tracé des différentes courbes #Tracé des courbes OMS for (i,label,couleur) in liste_data_labels: - ax.plot(coljour,extraire_colonne(t,i,jour_maxi),label=label,color=couleur) - #warning("colonne"+str(i)+str(label)+str(couleur),liste_err) + ax.plot(coljour,oms.extraire_colonne(t,i,jour_maxi),label=label,color=couleur) debug("cree_figure : tracé des courbes OMS ok",liste_err) - - - ##### Tracé des courbes OMS fini - - # On extrait la valeur min et la valeur max des poids - (colonne_min,_,_) = liste_data_labels[-1] - (colonne_max,_,_) = liste_data_labels[0] - - debug("cree_figure : colonnes min et max : "+str(colonne_min)+" "+str(colonne_max),liste_err) - - poids_min = min(extraire_colonne(t,colonne_min,jour_maxi)) - poids_max = max(extraire_colonne(t,colonne_max,jour_maxi)) - if l_jours != []: - poids_min = min(min(l_poids),poids_min) - poids_max = max(max(l_poids),poids_max) - # On ajuste un peu ces min et max - # min : valeur min -1kg - poids_min = max(0,poids_min-1) - #max : +5% - poids_max = poids_max * 1.05 - - - debug("cree_figure : prête à tracer la courbe de l'enfant",liste_err) - + ### Tracé pour de bon if l_jours != []: ax.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleurs"]["cadretxt"],marker='o') @@ -186,20 +164,44 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): dates_extrapole = list(range(date_fin, jour_maxi)) donnees_extrapole = prolongecourbe(t, date_fin, l_poids[-1], dates_extrapole, conf["typecourbe"], liste_err) #print("données extrapolées !") - dates_extrapole = convertit_tableau(dates_extrapole,unite,liste_err) + dates_extrapole = u.convertit_tableau(dates_extrapole,unite,liste_err) # tracé des données extrapolées plt.plot(dates_extrapole, donnees_extrapole,color=conf["couleurs"]["cadretxt"], linestyle=(0, (5,7)), marker=None) + debug("Tracé de la courbe extrapolée ok", liste_err) else: debug("On ne trace pas de courbe enfant", liste_err) - debug("Début de la gestion de l'échelle", liste_err) + ###################" Gestion de l'échelle ##################### + debug("Courbes tracées. Il n'y a plus qu'à gérer l'échelle", liste_err) ### échelle à régler + + # On extrait la valeur min et la valeur max des poids des courbes OMS et des données + (colonne_min,_,_) = liste_data_labels[-1] + (colonne_max,_,_) = liste_data_labels[0] + # poids max OMS + poids_min = min(oms.extraire_colonne(t,colonne_min,jour_maxi)) + poids_max = max(oms.extraire_colonne(t,colonne_max,jour_maxi)) + if l_jours != []: + poids_min = min(min(l_poids),poids_min) + # Pour le poids max, voir la dernière valeur du tableau + i = 0 + while i=len(ligneoms): - warning("prolongation de courbe : pas réussi... donnée au dessus !", liste_err) + warning("prolongation de courbe : pas réussi... donnée trop haute !", liste_err) return [] if i==idep: - warning("prolongation de courbe : pas réussi... donnée en dessous !", liste_err) + warning("prolongation de courbe : pas réussi... donnée trop basse !", liste_err) return [] # Le coeff : donnee = coeff * l[i-1]+ (1-coeff)*ligne[i] # On utilisera la même chose pour la nouvelle donnee - #print(ligneoms[i], ligneoms[i-1]) coeff = (donnee - ligneoms[i])/(ligneoms[i-1] - ligneoms[i]) - #print("coeff : "+str(coeff)) # extrapolations nouvdonnees = [] -- 2.41.0