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__)
## 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)
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:
@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=[])
# -*- 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
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
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
-########### 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)
""" 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
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"] = {}
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 :
return (l_jours,l_donnee)
+# python vers Json
#### export vers json
def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config):
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():
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)
#!/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
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:
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
if conf["nom"] !="":
titre += " de " +conf["nom"]
-
if prema>0:
titre+= ", préma de "+conf["prematurite"]
if conf["agecorrige"] == "oui":
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
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')
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(l_jours) and l_jours[i]<jour_maxi:
+ i=i+1
+ poids_max = max(max(l_poids[0:i+1]),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
+
+
+ # Grille custom ?
if conf["non_sauve"]["grilleamelio"] == "oui":
-
- pas=choix_echelle_data(typedonnee, poids_max)
+ debug("On a choisi la grille plus jolie", liste_err)
+ pas=u.choix_echelle_data(typedonnee, poids_max)
# data_min_arrondie
minechelle = int(poids_min/pas[0])*pas[0]
ax.set_yticks(echellemineure, minor=True)
# échelle en temps
- pas=choix_echelle_temps(unite, age_maxi)
+ pas=u.choix_echelle_temps(unite, age_maxi)
debug("pas choisis pour l'échelle en x : "+str(pas), liste_err)
echellemajeure = arange(0,age_maxi, pas[0])
ax.set_xticks(echellemajeure, minor=False)
ax.set_xticks(echellemineure, minor=True)
-
- #### Aspect du graphique
+ ################################# Aspect du graphique
debug("On commende la déco du graphique", liste_err)
fig.tight_layout()
- debug("Fin de cree_figure", liste_err)
+ debug("Fin de cree_figure, tout va bien.", liste_err)
return fig
-### Pour extrapoler la courbe
+######################################## Pour extrapoler la courbe
def prolongecourbe(tableauOMS, date, donnee, nouvdates, typecourbe, liste_err):
""" tableauOMS est le ableau des données OMS. date et donnee sont la date (jours)
i+=1
debug("prolongecourbe : on a trouvé la valeur de i : "+str(i),liste_err)
if 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 = []