summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenise sur Lya <sekhmet@lya>2020-06-22 17:19:56 +0200
committerDenise sur Lya <sekhmet@lya>2020-06-22 17:19:56 +0200
commitd03279e72fcb75ddf784fbd0dcce2b2b15f5ff09 (patch)
treec5135bd0258461017b0eb564118cf29d0d06d277
parent442a69cbb7957120b908dd59abef0a315906ad2d (diff)
downloadoms-d03279e72fcb75ddf784fbd0dcce2b2b15f5ff09.tar.gz
oms-d03279e72fcb75ddf784fbd0dcce2b2b15f5ff09.tar.zst
oms-d03279e72fcb75ddf784fbd0dcce2b2b15f5ff09.zip
Gros nettoyage du code + quelques typos FAQ
-rw-r--r--app.py12
-rw-r--r--configuration.py84
-rw-r--r--data/FAQ_data.txt8
-rw-r--r--data/changelog_data.txt5
-rw-r--r--gestionOMS.py1
-rw-r--r--gestion_donnees.py56
-rw-r--r--gestion_erreurs.py7
-rw-r--r--gestion_unites.py10
-rw-r--r--static/style.css2
-rw-r--r--templates/contact.html2
-rw-r--r--templates/index.html5
-rw-r--r--trace_courbe.py26
12 files changed, 104 insertions, 114 deletions
diff --git a/app.py b/app.py
index d6f8507..5e62e10 100644
--- a/app.py
+++ b/app.py
@@ -7,7 +7,7 @@ import matplotlib.pyplot as plt
7import base64 7import base64
8from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 8from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
9 9
10from configuration import * 10from configuration import config_init
11from gestion_erreurs import * 11from gestion_erreurs import *
12from gestion_donnees import * 12from gestion_donnees import *
13from gestion_unites import * 13from gestion_unites import *
@@ -15,8 +15,6 @@ from trace_courbe import *
15from faq import * 15from faq import *
16 16
17 17
18
19
20app = flask.Flask(__name__) 18app = flask.Flask(__name__)
21 19
22@app.route('/',methods=['POST','GET']) 20@app.route('/',methods=['POST','GET'])
@@ -27,8 +25,10 @@ def index():
27 if 'fichier_donnees' in flask.request.files: 25 if 'fichier_donnees' in flask.request.files:
28 ## charger les donneés dans le formulaire 26 ## charger les donneés dans le formulaire
29 fichier = flask.request.files['fichier_donnees'] 27 fichier = flask.request.files['fichier_donnees']
30 28 chaine = fichier.read()
31 val_form2 = fichier_json_vers_configdonnees(fichier,liste_err) 29 val_form2 = fichier_json_vers_configdonnees(chaine,liste_err)
30 if val_form2 == {}:
31 return flask.render_template("index.html",err=liste_err[2]+liste_err[1]+liste_err[0],valform=val_form)
32 val_form.update(val_form2) 32 val_form.update(val_form2)
33 #return str(val_form['nb_data']) 33 #return str(val_form['nb_data'])
34 return flask.render_template("index.html",err=liste_err[1],valform=val_form) 34 return flask.render_template("index.html",err=liste_err[1],valform=val_form)
@@ -110,6 +110,6 @@ def changelog():
110 110
111 return flask.render_template("changelog.html",table = table_version,err=[]) 111 return flask.render_template("changelog.html",table = table_version,err=[])
112 112
113
114if __name__ == "__main__": 113if __name__ == "__main__":
114 print("Mode debug maison : "+str(niveau_debug))
115 app.run(host='0.0.0.0',debug=True) \ No newline at end of file 115 app.run(host='0.0.0.0',debug=True) \ No newline at end of file
diff --git a/configuration.py b/configuration.py
index 07cbf0e..70b020d 100644
--- a/configuration.py
+++ b/configuration.py
@@ -2,37 +2,39 @@
2# -*- coding: utf-8 -*- 2# -*- coding: utf-8 -*-
3 3
4### Toutes les "constantes" de config importés pour ce qui concerne les courbes 4### Toutes les "constantes" de config importés pour ce qui concerne les courbes
5CONFIG = {}
5 6
6# fichiers 7# fichiers
7 8
8chemin_oms = "data_OMS/" 9CONFIG["chemin_oms"] = "data_OMS/"
10
11CONFIG["fichiersOMS"] = {
12 "perc_garcon": "wfa_boys_p_exp.txt",
13 "perc_fille": "wfa_girls_p_exp.txt",
14 "z_garcon": "wfa_boys_z_exp.txt",
15 "z_fille": "wfa_girls_z_exp.txt",
16 "perc_mixte": "wfa_mix_p_exp.txt",
17 "z_mixte": "wfa_mix_z_exp.txt"
18 }
9 19
10f_poids_perc_garcon = chemin_oms+"wfa_boys_p_exp.txt" 20# ajouter le chemin
11f_poids_perc_fille = chemin_oms+"wfa_girls_p_exp.txt" 21for (cle,val) in CONFIG["fichiersOMS"].items():
12f_poids_z_garcon = chemin_oms+"wfa_boys_z_exp.txt" 22 CONFIG["fichiersOMS"][cle] = CONFIG["chemin_oms"]+val
13f_poids_z_fille = chemin_oms+"wfa_girls_z_exp.txt"
14f_poids_z_mixte = chemin_oms+"wfa_mix_z_exp.txt"
15f_poids_perc_mixte = chemin_oms+"wfa_mix_p_exp.txt"
16 23
17# Pour les courbes percentiles 24# Pour les courbes percentiles
18liste_data_choisie_p = [(5,1),(7,5),(8,10),(10,25),(11,50),(12,75), (14,90), 25CONFIG["liste_data_choisie_p"] = [(5,1),(7,5),(8,10),(10,25),(11,50),(12,75), (14,90),
19 (15,95),(17,99)] 26 (15,95),(17,99)]
20liste_data_choisie_p.sort(reverse=True) 27CONFIG["liste_data_choisie_p"].sort(reverse = True)
21 28
22# pour le sigma : (colonne,sigma) 29# pour le sigma : (colonne,sigma)
23liste_data_choisie_z = [(2,-3),(3,-2),(4,-1),(5,0),(6,1),(7,2),(8,3)] 30CONFIG["liste_data_choisie_z"] = [(2,-3),(3,-2),(4,-1),(5,0),(6,1),(7,2),(8,3)]
24liste_data_choisie_z.sort(reverse=True) 31CONFIG["liste_data_choisie_z"].sort(reverse=True)
25 32
26# config, côté python 33# config, côté python
27CONFIG = {}
28
29# les unités acceptées 34# les unités acceptées
30CONFIG["liste_unites"] = ["jours", "semaines", "mois", "années"] 35CONFIG["liste_unites"] = ["jours", "semaines", "mois", "années"]
31 36
32# nombre de jours dans autre chose 37# nombre de jours dans les autres unités
33jours_dans_mois = 30.4375
34jours_dans_annee = 365.25
35jours_dans_semaine = 7
36CONFIG["jours_dans_mois"] = 30.4375 38CONFIG["jours_dans_mois"] = 30.4375
37CONFIG["jours_dans_annee"] = 365.25 39CONFIG["jours_dans_annee"] = 365.25
38CONFIG["jours_dans_semaine"] = 7 40CONFIG["jours_dans_semaine"] = 7
@@ -44,16 +46,17 @@ CONFIG["jours_maxi_courbe"] = round(5.5*CONFIG["jours_dans_annee"])
44CONFIG["jours_mini_courbe"] = 10 46CONFIG["jours_mini_courbe"] = 10
45CONFIG["jours_defaut_donneesvides"]= round(6*CONFIG["jours_dans_mois"]) # si données vides, 6 mois 47CONFIG["jours_defaut_donneesvides"]= round(6*CONFIG["jours_dans_mois"]) # si données vides, 6 mois
46# poids max (protection) 48# poids max (protection)
47poids_maxi = 80 49CONFIG["poids_maxi"] = 80
48# taille max du nom 50# taille max du nom
49longueur_max_nom_bebe = 100 51CONFIG["longueur_max_nom_bebe"] = 100
50 52
51#largeurs et hauteurs min et max 53#largeurs et hauteurs min et max
52largeur_graphique_max = 40
53largeur_graphique_min = 3
54 54
55hauteur_graphique_max = 40 55CONFIG["largeur_graphique_max"] = 30
56hauteur_graphique_min = 2 56CONFIG["largeur_graphique_min"] = 3
57
58CONFIG["hauteur_graphique_max"] = 30
59CONFIG["hauteur_graphique_min"] = 2
57 60
58CONFIG["couleurs"] = { 61CONFIG["couleurs"] = {
59 "courbe1" : (0,0,1), 62 "courbe1" : (0,0,1),
@@ -83,40 +86,15 @@ DEFAUT["couleurs"]["courbe3"] = "#FF0000" # rouge
83DEFAUT["couleurs"]["fond"]= "#FFFFFF" # blanc 86DEFAUT["couleurs"]["fond"]= "#FFFFFF" # blanc
84DEFAUT["couleurs"]["cadretxt"] = "#000000" # noir 87DEFAUT["couleurs"]["cadretxt"] = "#000000" # noir
85DEFAUT["couleurs"]["grille"] = "#7f7f7f" # gris 88DEFAUT["couleurs"]["grille"] = "#7f7f7f" # gris
86#couleur_defaut_1 = "#0000FF" # bleu
87#couleur_defaut_2 = "#00FF00" # vert
88#couleur_defaut_3 = "#FF0000" # rouge
89
90#couleur_defaut_1_tuple = (0,0,1)
91#couleur_defaut_2_tuple = (0,1,0)
92#couleur_defaut_3_tuple = (1,0,0)
93
94# couleurs par défaut fond
95#couleur_defaut_fond = "#FFFFFF"
96#couleur_defaut_fond_tuple = (1,1,1)
97#couleur_defaut_cadretxt = "#000000"
98#couleur_defaut_cadretxt_tuple = (0,0,0)
99#couleur_defaut_grille = "#7f7f7f"
100#couleur_defaut_grille_tuple = (0.5,0.5,0.5)
101 89
102#couleur_defaut_erreur = (0,0,0) # noir 90# Remplissage du formulaire, autres
91DEFAUT["age_0"]= "0j"
92DEFAUT["legende"] = "oui"
93DEFAUT["positionlegende"] = "hg"
103 94
104 95
105# initialiser la config 96# initialiser la config
106def config_init(): 97def config_init():
107 c = DEFAUT.copy() 98 return DEFAUT.copy()
108 c.update({
109 "age_0": "0j",
110 "legende": "oui",
111 "positionlegende": "hg",
112# "couleur1": couleur_defaut_1,
113# "couleur2": couleur_defaut_2,
114# "couleur3": couleur_defaut_3,
115# "couleur_fond": couleur_defaut_fond,
116# "couleur_grille": couleur_defaut_grille,
117# "couleur_cadretxt": couleur_defaut_cadretxt
118 })
119
120 return c
121 99
122 100
diff --git a/data/FAQ_data.txt b/data/FAQ_data.txt
index 2313fa8..a81de6a 100644
--- a/data/FAQ_data.txt
+++ b/data/FAQ_data.txt
@@ -2,12 +2,12 @@
2 2
3"Utilisation","Comment sauvegarder mes données pour une prochaine fois ?","L'outil ne propose pas de sauvegarde en ligne, car il ne garde aucune donnée personnelle. Vous pouvez télécharger vos propres données (dans un format adapté) en cliquant sur «&nbsp;Télécharger les données&nbsp;». Enregistrez ce fichier quelque part. Pour les réutiliser, utilisez la partie ""Importer le fichier de données"" puis ""Charger les données"" : les champs seront alors pré-remplis et vous pourrez les modifier ou ajouter des données (par exemple une pesée récente)." 3"Utilisation","Comment sauvegarder mes données pour une prochaine fois ?","L'outil ne propose pas de sauvegarde en ligne, car il ne garde aucune donnée personnelle. Vous pouvez télécharger vos propres données (dans un format adapté) en cliquant sur «&nbsp;Télécharger les données&nbsp;». Enregistrez ce fichier quelque part. Pour les réutiliser, utilisez la partie ""Importer le fichier de données"" puis ""Charger les données"" : les champs seront alors pré-remplis et vous pourrez les modifier ou ajouter des données (par exemple une pesée récente)."
4 4
5"Utilisation","Je ne comprends pas comment saisir les données âge/poids !","Pour chaque pesée, vous avez le choix entre donner son âge, ou donner la date de la pesée. Pour la date de la pesée, il faut que vous ayiez rempli la date de naissance (sinon l'outil ne peut pas calculer l'âge !). Pour l'âge, vous pouvez indiquer en années, mois, semaines, jours, et mélanger plusieurs unités. Par exemple 2m3j pour «&nbsp;2 mois 3 jours&nbsp;». Ne remplissez qu'un des deux champs : âge ou date. Puis saisissez le poids en kilogrammes dans la colonne de droite. <br> 5"Utilisation","Je ne comprends pas comment saisir les données âge/poids !","Pour chaque pesée, vous avez le choix entre donner son âge, ou donner la date de la pesée. Pour la date de la pesée, il faut que vous ayez rempli la date de naissance (sinon l'outil ne peut pas calculer l'âge !). Pour l'âge, vous pouvez indiquer en années, mois, semaines, jours, et mélanger plusieurs unités. Par exemple 2m3j pour «&nbsp;2 mois 3 jours&nbsp;». Ne remplissez qu'un des deux champs : âge ou date. Puis saisissez le poids en kilogrammes dans la colonne de droite. <br>
6Si vous manquez de lignes, vous pouvez cliquer sur ""Ajouter des lignes"" pour avoir plus de champs de données. Il n'y a pas de problème à laisser des champs vides, ils seront simplement ignorés." 6Si vous manquez de lignes, vous pouvez cliquer sur ""Ajouter des lignes"" pour avoir plus de champs de données. Il n'y a pas de problème à laisser des champs vides, ils seront simplement ignorés."
7 7
8"Utilisation","Une erreur s'affiche en bas de ma courbe, je ne comprends pas.","Si le message d'erreur n'est pas clair pour vous, c'est qu'il est probablement dû à un souci interne. Si vous le pouvez, contactez l'administratrice, en citant le message d'erreur et en donnant les données qui ont amené à cette erreur (fichier de données, ou données saisies). Merci d'avance ! :)" 8"Utilisation","Une erreur s'affiche en bas de ma courbe, je ne comprends pas.","Si le message d'erreur n'est pas clair pour vous, c'est qu'il est probablement dû à un souci interne. Si vous le pouvez, contactez l'administratrice, en citant le message d'erreur et en donnant les données qui ont amené à cette erreur (fichier de données, ou données saisies). Merci d'avance ! :)"
9 9
10"Courbe","À quoi sert ce site ?","Il sert à tracer la courbe de poids des bébés et jeunes enfants en fonction de leur âge, comme sur le carnet de santé, et la compare aux courbes de références de l'Organisation Mondiale de la Santé." 10"Courbe","À quoi sert ce site ?","Il sert à tracer la courbe de poids des bébés et jeunes enfants en fonction de leur âge, comme sur le carnet de santé, et la compare aux courbes de références de l'Organisation Mondiale de la Santé. Ces courbes sont a priori prévues pour des enfants nés à terme en bonne santé. Pour un enfant prématuré ou à situation particulière, référez vous à un.e professionnel.le de santé."
11 11
12"Courbe","Pourquoi des courbes OMS et pas des courbes françaises ?","Les particularités de ces données sont les suivantes : bébés et enfants choisis dans différents pays du monde (et non dans un seul pays), dans des familles raisonnablement aisées (pour éviter les problèmes liés à la malnutrition), et des bébés allaités. Plus d'infos <a href=""https://www.who.int/childgrowth/standards/technical_report/en/"">ici</a> (en anglais). L'idée générale était de donner une «&nbsp;référence&nbsp;» de croissance de l'enfant de l'espèce humaine. Cela ne veut pas dire que les courbes du carnet de santé français sont mauvaises (si vous avez celles datant d'avant 2018, elles sont un peu anciennes par contre), de fait, elles sont très peu différentes. Pour les autres pays je ne sais pas, je n'ai pas comparé." 12"Courbe","Pourquoi des courbes OMS et pas des courbes françaises ?","Les particularités de ces données sont les suivantes : bébés et enfants choisis dans différents pays du monde (et non dans un seul pays), dans des familles raisonnablement aisées (pour éviter les problèmes liés à la malnutrition), et des bébés allaités. Plus d'infos <a href=""https://www.who.int/childgrowth/standards/technical_report/en/"">ici</a> (en anglais). L'idée générale était de donner une «&nbsp;référence&nbsp;» de croissance de l'enfant de l'espèce humaine. Cela ne veut pas dire que les courbes du carnet de santé français sont mauvaises (si vous avez celles datant d'avant 2018, elles sont un peu anciennes par contre), de fait, elles sont très peu différentes. Pour les autres pays je ne sais pas, je n'ai pas comparé."
13 13
@@ -23,8 +23,8 @@ Vous trouverez <a href=""static/courbe_oms_gf_1an.png"">ici</a> et <a href=""sta
23"Courbe","C'est quoi la différence entre la courbe percentiles et moyenne/écarts-types ?","Ce sont deux manières de comparer son enfant à la «&nbsp;référence&nbsp;». Si vous ne savez pas la différence entre une moyenne et une médiane, retenez juste que ce sont des calculs un peu différents, mais cela ne change pas l'allure de la courbe, si votre enfant «&nbsp;suit&nbsp;» un couloir sur un type de courbe ce sera pareil sur l'autre. Vous pouvez au pire choisir celle que vous préférez. ;) 23"Courbe","C'est quoi la différence entre la courbe percentiles et moyenne/écarts-types ?","Ce sont deux manières de comparer son enfant à la «&nbsp;référence&nbsp;». Si vous ne savez pas la différence entre une moyenne et une médiane, retenez juste que ce sont des calculs un peu différents, mais cela ne change pas l'allure de la courbe, si votre enfant «&nbsp;suit&nbsp;» un couloir sur un type de courbe ce sera pareil sur l'autre. Vous pouvez au pire choisir celle que vous préférez. ;)
24<br>Pour les curieuses et les curieux : 24<br>Pour les curieuses et les curieux :
25<ul> 25<ul>
26<li>Médiane et percentiles : si votre enfant est (par exemple) au 30e percentile, cela signifie que 29% des enfants sont plus petits que lui, et 31% sont plus grands. Cela donne une idée de où se situe l'enfant par rapport aux autres. <a href=""https://fr.wikipedia.org/wiki/Centile"">Plus d'infos (maths)</a></li> 26<li>Médiane et percentiles : si votre enfant est (par exemple) au 30e percentile, cela signifie qu'il est dans la 30e «&nbsp;tranche&nbsp;» sur 100 tranches. Autrement dit 29% des enfants sont plus légers que lui, et 70% sont plus lourds. Cela donne une idée de où il se situe par rapport aux autres. <a href=""https://fr.wikipedia.org/wiki/Centile"">Plus d'infos (maths)</a></li>
27<li>Moyenne et écart-types : la moyenne est obtenue en faisant la somme et en divisant par le nombre d'enfants. L'écart-type (noté &sigma; ou z) est une sorte d'«&nbsp;écart moyen&nbsp;» à la moyenne. On regarde donc généralement la moyenne, la moyenne + 1&sigma;, moyenne +2&sigma;, moyenne -1 &sigma;, etc. <a href=""https://fr.wikipedia.org/wiki/%C3%89cart_type"">Plus d'infos (maths)</a></li> 27<li>Moyenne et écart-types : la moyenne est obtenue en faisant la somme et en divisant par le nombre d'enfants. L'écart-type (noté &sigma;) est une sorte d'«&nbsp;écart moyen&nbsp;» à la moyenne. On regarde donc généralement la moyenne, la moyenne + 1&sigma;, moyenne +2&sigma;, moyenne -1 &sigma;, etc. <a href=""https://fr.wikipedia.org/wiki/%C3%89cart_type"">Plus d'infos (maths)</a></li>
28</ul> 28</ul>
29Si la répartition des données est «&nbsp;bonne&nbsp;» (on parle de gaussienne entre matheuses et matheux), alors la moyenne correspond à la médiane, la moyenne + 1&sigma; correspond environ au 84e percentile, la moyenne -1&sigma; correspond au 16e percentile. Pour ces données, il semble que ce soit assez proche d'une gaussienne." 29Si la répartition des données est «&nbsp;bonne&nbsp;» (on parle de gaussienne entre matheuses et matheux), alors la moyenne correspond à la médiane, la moyenne + 1&sigma; correspond environ au 84e percentile, la moyenne -1&sigma; correspond au 16e percentile. Pour ces données, il semble que ce soit assez proche d'une gaussienne."
30 30
diff --git a/data/changelog_data.txt b/data/changelog_data.txt
index 9dce153..fa9ea5c 100644
--- a/data/changelog_data.txt
+++ b/data/changelog_data.txt
@@ -1,3 +1,8 @@
1"Version 0.6","21/06/2020","<ul>
2<li>Amélioration des boutons par cerise</li>
3<li>Encore du code amélioré derrière</li>
4</ul>"
5
1"Version 0.5","19/06/2020","<ul> 6"Version 0.5","19/06/2020","<ul>
2<li>Amélioration du code (ça se voit pas mais...)</li> 7<li>Amélioration du code (ça se voit pas mais...)</li>
3<li>Des changements dans le format d'export des données. Les anciens fichiers json vont probablement bugguer un peu.</li> 8<li>Des changements dans le format d'export des données. Les anciens fichiers json vont probablement bugguer un peu.</li>
diff --git a/gestionOMS.py b/gestionOMS.py
index cc63432..cebd1eb 100644
--- a/gestionOMS.py
+++ b/gestionOMS.py
@@ -6,7 +6,6 @@ Created on Mon May 18 08:59:11 2020
6@author: sekhmet 6@author: sekhmet
7""" 7"""
8from gestion_erreurs import * 8from gestion_erreurs import *
9from configuration import *
10from gestion_couleurs import * 9from gestion_couleurs import *
11 10
12import csv 11import csv
diff --git a/gestion_donnees.py b/gestion_donnees.py
index 2068bb3..d214bcd 100644
--- a/gestion_donnees.py
+++ b/gestion_donnees.py
@@ -1,7 +1,7 @@
1#!/usr/bin/env python3 1#!/usr/bin/env python3
2# -*- coding: utf-8 -*- 2# -*- coding: utf-8 -*-
3 3
4from configuration import * 4from configuration import CONFIG,DEFAUT
5from gestion_erreurs import * 5from gestion_erreurs import *
6from gestion_couleurs import * 6from gestion_couleurs import *
7import datetime 7import datetime
@@ -28,15 +28,15 @@ def convertit_jours_vers_python(chaine,liste_err):
28 else: 28 else:
29 if lettre == 'a' or lettre == 'A': 29 if lettre == 'a' or lettre == 'A':
30 # On a trouvé l'année, on ajoute tout ce qui est trouvé jusque là 30 # On a trouvé l'année, on ajoute tout ce qui est trouvé jusque là
31 agejours += int(chainenombre)*jours_dans_annee 31 agejours += int(chainenombre)*CONFIG["jours_dans_annee"]
32 chainenombre = "" 32 chainenombre = ""
33 elif lettre == 'm' or lettre == 'M': 33 elif lettre == 'm' or lettre == 'M':
34 # On a trouvé le mois 34 # On a trouvé le mois
35 agejours += int(chainenombre)*jours_dans_mois 35 agejours += int(chainenombre)*CONFIG["jours_dans_mois"]
36 chainenombre = "" 36 chainenombre = ""
37 elif lettre == 's' or lettre == 'S': 37 elif lettre == 's' or lettre == 'S':
38 # la semaine 38 # la semaine
39 agejours += int(chainenombre)*jours_dans_semaine 39 agejours += int(chainenombre)*CONFIG["jours_dans_semaine"]
40 chainenombre = "" 40 chainenombre = ""
41 elif lettre == 'j' or lettre == 'J': 41 elif lettre == 'j' or lettre == 'J':
42 # On a trouvé le jour 42 # On a trouvé le jour
@@ -56,10 +56,10 @@ def convertit_jours_vers_python(chaine,liste_err):
56def convertit_age_vers_texte(nombre): 56def convertit_age_vers_texte(nombre):
57 """ convertit un nombre de jours en un truc plus lisible en mois, années, jours 57 """ convertit un nombre de jours en un truc plus lisible en mois, années, jours
58 et renvoie une chaîne sous la forme 3a2m1j par exemple""" 58 et renvoie une chaîne sous la forme 3a2m1j par exemple"""
59 annees = int(nombre / jours_dans_annee) 59 annees = int(nombre / CONFIG["jours_dans_annee"])
60 restant = nombre - annees*jours_dans_annee 60 restant = nombre - annees*CONFIG["jours_dans_annee"]
61 mois = int(restant/jours_dans_mois) 61 mois = int(restant/CONFIG["jours_dans_mois"])
62 jours= round(nombre - mois*jours_dans_mois - annees*jours_dans_annee) 62 jours= round(nombre - mois*CONFIG["jours_dans_mois"] - annees*CONFIG["jours_dans_annee"])
63 63
64 chaine = "" 64 chaine = ""
65 if annees >0: 65 if annees >0:
@@ -95,7 +95,7 @@ def convertit_poids_vers_python(chaine,liste_err):
95 except: 95 except:
96 warning("Poids impossible à lire : "+chaine,liste_err) 96 warning("Poids impossible à lire : "+chaine,liste_err)
97 poids = 0 97 poids = 0
98 if not( 0<=poids<poids_maxi): 98 if not( 0<=poids<CONFIG["poids_maxi"]):
99 warning("Poids incohérent : "+str(poids),liste_err) 99 warning("Poids incohérent : "+str(poids),liste_err)
100 poids = 0 100 poids = 0
101 return poids 101 return poids
@@ -153,7 +153,7 @@ def gere_configuration(data,liste_err):
153 # Pour le nom, osef qu'il soit vide 153 # Pour le nom, osef qu'il soit vide
154 nom = data.get("nom","") 154 nom = data.get("nom","")
155 # Par contre s'il est trop long on le tronque 155 # Par contre s'il est trop long on le tronque
156 configuration["nom"] = nom[:longueur_max_nom_bebe] 156 configuration["nom"] = nom[:CONFIG["longueur_max_nom_bebe"]]
157 157
158 sexe = data.get("sexe","") 158 sexe = data.get("sexe","")
159 if not (sexe in ["F","M","N"]): 159 if not (sexe in ["F","M","N"]):
@@ -204,12 +204,12 @@ def gere_configuration(data,liste_err):
204 except: 204 except:
205 warning("La largeur "+largeur+"est invalide !",liste_err) 205 warning("La largeur "+largeur+"est invalide !",liste_err)
206 largeur = DEFAUT["largeur_graphique"] 206 largeur = DEFAUT["largeur_graphique"]
207 if largeur > largeur_graphique_max: 207 if largeur > CONFIG["largeur_graphique_max"]:
208 largeur = largeur_graphique_max 208 largeur = CONFIG["largeur_graphique_max"]
209 warning("Largeur trop grande !",liste_err) 209 warning("Largeur du graphique trop grande !",liste_err)
210 elif largeur < largeur_graphique_min: 210 elif largeur < CONFIG["largeur_graphique_min"]:
211 largeur = largeur_graphique_min 211 largeur = CONFIG["largeur_graphique_min"]
212 warning("Largeur trop petite !",liste_err) 212 warning("Largeur du graphique trop petite !",liste_err)
213 configuration["largeur"] = largeur 213 configuration["largeur"] = largeur
214 214
215 hauteur = data.get("hauteur","") 215 hauteur = data.get("hauteur","")
@@ -221,12 +221,12 @@ def gere_configuration(data,liste_err):
221 except: 221 except:
222 warning("La hauteur "+hauteur+"est invalide !",liste_err) 222 warning("La hauteur "+hauteur+"est invalide !",liste_err)
223 hauteur = DEFAUT["hauteur_graphique"] 223 hauteur = DEFAUT["hauteur_graphique"]
224 if hauteur > hauteur_graphique_max: 224 if hauteur > CONFIG["hauteur_graphique_max"]:
225 hauteur = hauteur_graphique_max 225 hauteur = CONFIG["hauteur_graphique_max"]
226 warning("Hauteur trop grande !",liste_err) 226 warning("Hauteur du graphique trop grande !",liste_err)
227 elif hauteur < hauteur_graphique_min: 227 elif hauteur < CONFIG["hauteur_graphique_min"]:
228 hauteur = hauteur_graphique_min 228 hauteur = CONFIG["hauteur_graphique_min"]
229 warning("Hauteur trop petite !",liste_err) 229 warning("Hauteur du graphique trop petite !",liste_err)
230 configuration["hauteur"] = hauteur 230 configuration["hauteur"] = hauteur
231 231
232 # existence et position de la légende 232 # existence et position de la légende
@@ -316,10 +316,14 @@ def donnees_vers_json(l_jours,l_poids,config):
316 return json.dumps(gros_dico, indent=2,ensure_ascii=False ) 316 return json.dumps(gros_dico, indent=2,ensure_ascii=False )
317 317
318 318
319def fichier_json_vers_configdonnees(fichier,liste_err): 319def fichier_json_vers_configdonnees(chaine,liste_err):
320 """ prend le json importé et l'exporte vers les valeurs du formulaire """ 320 """ prend le json importé (chaine) et l'exporte vers les valeurs du formulaire """
321 chaine = fichier.read() 321 debug("json vers config : Prêt à interpréter le json",liste_err)
322 valform = json.loads(chaine) 322 try:
323 valform = json.loads(chaine)
324 except :
325 erreur("Impossible de lire le fichier json !",liste_err)
326 return {}
323 # Il faut maintenant récupérer les l_jours et l_poids puis les remettre 327 # Il faut maintenant récupérer les l_jours et l_poids puis les remettre
324 # sous forme de age_i et poids_i 328 # sous forme de age_i et poids_i
325 l_jours= valform.get("data_j",[]) 329 l_jours= valform.get("data_j",[])
diff --git a/gestion_erreurs.py b/gestion_erreurs.py
index 4c9d602..b9f8471 100644
--- a/gestion_erreurs.py
+++ b/gestion_erreurs.py
@@ -2,10 +2,9 @@
2# -*- coding: utf-8 -*- 2# -*- coding: utf-8 -*-
3 3
4## Gestion des erreurs en flask 4## Gestion des erreurs en flask
5import sys
5 6
6 7niveau_debug = ("debug" in sys.argv)
7niveau_debug = True
8
9 8
10def initialise_erreurs(): 9def initialise_erreurs():
11 """ retourne deux trois vides, erreurs fatales (0), warnings(1), debug:""" 10 """ retourne deux trois vides, erreurs fatales (0), warnings(1), debug:"""
@@ -25,7 +24,9 @@ def warning(message,listeerreurs):
25 listeerreurs[1].append("Alerte : "+message) 24 listeerreurs[1].append("Alerte : "+message)
26 25
27def debug(message,liste_erreurs): 26def debug(message,liste_erreurs):
27 global niveau_debug
28 if niveau_debug: 28 if niveau_debug:
29 #if app.debug == True:
29 print("##Debug : "+message) 30 print("##Debug : "+message)
30 liste_erreurs[2].append("# Debug : "+message) 31 liste_erreurs[2].append("# Debug : "+message)
31 32
diff --git a/gestion_unites.py b/gestion_unites.py
index 27cad7e..afbc479 100644
--- a/gestion_unites.py
+++ b/gestion_unites.py
@@ -1,7 +1,7 @@
1#!/usr/bin/env python3 1#!/usr/bin/env python3
2# -*- coding: utf-8 -*- 2# -*- coding: utf-8 -*-
3 3
4from configuration import * 4from configuration import CONFIG
5from gestion_erreurs import * 5from gestion_erreurs import *
6 6
7##################### outils pour affichage et choix de l'unité 7##################### outils pour affichage et choix de l'unité
@@ -10,7 +10,7 @@ def choix_unite(maxi):
10 """ en fonction de l'âge maxi, on choisit une unité pertinente : jours, mois, année""" 10 """ en fonction de l'âge maxi, on choisit une unité pertinente : jours, mois, année"""
11 if maxi<40: 11 if maxi<40:
12 return "jours" 12 return "jours"
13 elif maxi<25*jours_dans_mois: 13 elif maxi<25*CONFIG["jours_dans_mois"]:
14 return "mois" 14 return "mois"
15 else: 15 else:
16 return "années" 16 return "années"
@@ -21,11 +21,11 @@ def convertitunite(jours,unite,liste_err):
21 if unite=="jours": 21 if unite=="jours":
22 return jours 22 return jours
23 elif unite=="mois": 23 elif unite=="mois":
24 return jours/jours_dans_mois 24 return jours/CONFIG["jours_dans_mois"]
25 elif unite=="années": 25 elif unite=="années":
26 return jours/jours_dans_annee 26 return jours/CONFIG["jours_dans_annee"]
27 elif unite=="semaines": 27 elif unite=="semaines":
28 return jours/jours_dans_semaine 28 return jours/CONFIG["jours_dans_semaine"]
29 else: 29 else:
30 warning("erreur sur l'unité : "+unite+" On laisse en jours",liste_err) 30 warning("erreur sur l'unité : "+unite+" On laisse en jours",liste_err)
31 return jours 31 return jours
diff --git a/static/style.css b/static/style.css
index a661762..88f77fb 100644
--- a/static/style.css
+++ b/static/style.css
@@ -50,7 +50,7 @@ img#courbe {
50} 50}
51 51
52.icon_button { 52.icon_button {
53 display: inline-block; 53 display: block;
54 cursor: pointer; 54 cursor: pointer;
55 position: relative; 55 position: relative;
56} 56}
diff --git a/templates/contact.html b/templates/contact.html
index 324466a..6da2e96 100644
--- a/templates/contact.html
+++ b/templates/contact.html
@@ -1,7 +1,7 @@
1{% extends "base.html" %} 1{% extends "base.html" %}
2{% block contenu %} 2{% block contenu %}
3<p>Si vous avez une question, un commentaire, une idée, vous pouvez me contacter à l'adresse suivante : oms arobase le nom de domaine.</p> 3<p>Si vous avez une question, un commentaire, une idée, vous pouvez me contacter à l'adresse suivante : oms arobase le nom de domaine.</p>
4<p>Vous pouvez également me retrouver sur le <a href="https://forum.lllfrance.org/">forum LLL</a>, sous le nom de Sekhmet.</p> 4<p>Vous pouvez également me retrouver sur le <a href="https://forum.lllfrance.org/">forum LLL</a>, sous le pseudo de Sekhmet.</p>
5 5
6<p><strong>Merci</strong> à celles et ceux qui m'ont aidée à mettre en place cet outil : 6<p><strong>Merci</strong> à celles et ceux qui m'ont aidée à mettre en place cet outil :
7<ul> 7<ul>
diff --git a/templates/index.html b/templates/index.html
index 0b2a4c5..7e00234 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -6,8 +6,6 @@
6 6
7<h2>Données de l'enfant</h2> 7<h2>Données de l'enfant</h2>
8 8
9<!--<h3>Importer un fichier </h3>
10<div class="bouton" onclick="affiche_cache('import_donnees',this)">Afficher</div>-->
11<div id="import_donnees"> 9<div id="import_donnees">
12 <form action="/" method="post" enctype="multipart/form-data" id="form_import_donnees"> 10 <form action="/" method="post" enctype="multipart/form-data" id="form_import_donnees">
13 11
@@ -18,13 +16,12 @@
18 <span class="icon_legend">Importer un fichier</span> 16 <span class="icon_legend">Importer un fichier</span>
19 </label> 17 </label>
20 <input type="file" name="fichier_donnees" id="fichier_donnees" oninput="upload_file()"> 18 <input type="file" name="fichier_donnees" id="fichier_donnees" oninput="upload_file()">
21 <!--<input type="submit" name="valider_fichier" value="Charger les données">-->
22</form> 19</form>
23</div> 20</div>
24 21
25<form id="donnees_enfant"> 22<form id="donnees_enfant">
26 23
27 24<!-- saisie des données -->
28 25
29<h3>Informations sur l'enfant</h3> 26<h3>Informations sur l'enfant</h3>
30<div> 27<div>
diff --git a/trace_courbe.py b/trace_courbe.py
index 8fecd56..2139d39 100644
--- a/trace_courbe.py
+++ b/trace_courbe.py
@@ -1,15 +1,18 @@
1#!/usr/bin/env python3 1#!/usr/bin/env python3
2# -*- coding: utf-8 -*- 2# -*- coding: utf-8 -*-
3from configuration import * 3from configuration import CONFIG
4from gestionOMS import * 4from gestionOMS import *
5from gestion_unites import * 5from gestion_unites import *
6 6
7import matplotlib.pyplot as plt 7import matplotlib.pyplot as plt
8 8
9# Essentiellement, la fonction qui trace la courbe
10
11
9def cree_figure(conf,l_jours,l_poids,liste_err): 12def cree_figure(conf,l_jours,l_poids,liste_err):
10 debug("debut de cree_figure",liste_err) 13 debug("debut de cree_figure",liste_err)
11 try: 14 try:
12 liste_data_labels_p,liste_data_labels_z = renvoie_liste_labels(conf,liste_data_choisie_p,liste_data_choisie_z,liste_err) 15 liste_data_labels_p,liste_data_labels_z = renvoie_liste_labels(conf,CONFIG["liste_data_choisie_p"],CONFIG["liste_data_choisie_z"],liste_err)
13 except: 16 except:
14 erreur("bug avec liste data labels",liste_err) 17 erreur("bug avec liste data labels",liste_err)
15 return "" 18 return ""
@@ -43,30 +46,31 @@ def cree_figure(conf,l_jours,l_poids,liste_err):
43 # percentiles 46 # percentiles
44 liste_data_labels = liste_data_labels_p 47 liste_data_labels = liste_data_labels_p
45 if conf["sexe"] == "M": 48 if conf["sexe"] == "M":
46 fichier_oms = f_poids_perc_garcon 49 fichier_oms = CONFIG["fichiersOMS"]["perc_garcon"]#f_poids_perc_garcon
47 titre += " (percentiles, garçon)" 50 titre += " (percentiles, garçon)"
48 elif conf["sexe"] == "F": 51 elif conf["sexe"] == "F":
49 fichier_oms = f_poids_perc_fille 52 fichier_oms = CONFIG["fichiersOMS"]["perc_fille"]
50 titre += " (percentiles, fille)" 53 titre += " (percentiles, fille)"
51 else: 54 else:
52 fichier_oms = f_poids_perc_mixte 55 fichier_oms = CONFIG["fichiersOMS"]["perc_mixte"]
53 titre += " (percentiles)" 56 titre += " (percentiles)"
54 elif conf["typecourbe"] == "Z": 57 elif conf["typecourbe"] == "Z":
55 liste_data_labels = liste_data_labels_z 58 liste_data_labels = liste_data_labels_z
56 if conf["sexe"] == "G": 59 if conf["sexe"] == "M":
57 fichier_oms = f_poids_z_garcon 60 fichier_oms = CONFIG["fichiersOMS"]["z_garcon"]
58 titre += " (moyenne et écarts-types, garçon)" 61 titre += " (moyenne et écarts-types, garçon)"
59 elif conf["sexe"] == "F": 62 elif conf["sexe"] == "F":
60 fichier_oms = f_poids_z_fille 63 fichier_oms = CONFIG["fichiersOMS"]["z_fille"]
61 titre += " (moyenne et écarts-types, fille)" 64 titre += " (moyenne et écarts-types, fille)"
62 else: 65 else:
63 fichier_oms = f_poids_z_mixte 66 fichier_oms = CONFIG["fichiersOMS"]["z_mixte"]
64 titre += " (moyenne et écarts-types)" 67 titre += " (moyenne et écarts-types)"
65 else: 68 else:
66 erreur("Type de courbe invalide"+conf["typecourbe"],liste_err) 69 erreur("Type de courbe invalide"+conf["typecourbe"],liste_err)
67 return "" 70 return ""
68 71
69 debug("cree_figure : géré le type de courbe ok",liste_err) 72 debug("cree_figure : géré le type de courbe ok. Liste des data labels : "+str(liste_data_labels),liste_err)
73 debug("Fichier d'où extraire les données : "+fichier_oms,liste_err)
70 74
71 # Si y'a un nom on met "courbe de machin" 75 # Si y'a un nom on met "courbe de machin"
72 if conf["nom"] !="": 76 if conf["nom"] !="":
@@ -110,6 +114,8 @@ def cree_figure(conf,l_jours,l_poids,liste_err):
110 (colonne_min,_,_) = liste_data_labels[-1] 114 (colonne_min,_,_) = liste_data_labels[-1]
111 (colonne_max,_,_) = liste_data_labels[0] 115 (colonne_max,_,_) = liste_data_labels[0]
112 116
117 debug("cree_figure : colonnes min et max : "+str(colonne_min)+" "+str(colonne_max),liste_err)
118
113 poids_min = min(extraire_colonne(t,colonne_min,jour_maxi)) 119 poids_min = min(extraire_colonne(t,colonne_min,jour_maxi))
114 poids_max = max(extraire_colonne(t,colonne_max,jour_maxi)) 120 poids_max = max(extraire_colonne(t,colonne_max,jour_maxi))
115 if l_jours != []: 121 if l_jours != []: