diff options
-rw-r--r-- | app.py | 12 | ||||
-rw-r--r-- | configuration.py | 84 | ||||
-rw-r--r-- | data/FAQ_data.txt | 8 | ||||
-rw-r--r-- | data/changelog_data.txt | 5 | ||||
-rw-r--r-- | gestionOMS.py | 1 | ||||
-rw-r--r-- | gestion_donnees.py | 56 | ||||
-rw-r--r-- | gestion_erreurs.py | 7 | ||||
-rw-r--r-- | gestion_unites.py | 10 | ||||
-rw-r--r-- | static/style.css | 2 | ||||
-rw-r--r-- | templates/contact.html | 2 | ||||
-rw-r--r-- | templates/index.html | 5 | ||||
-rw-r--r-- | trace_courbe.py | 26 |
12 files changed, 104 insertions, 114 deletions
@@ -7,7 +7,7 @@ import matplotlib.pyplot as plt | |||
7 | import base64 | 7 | import base64 |
8 | from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas | 8 | from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas |
9 | 9 | ||
10 | from configuration import * | 10 | from configuration import config_init |
11 | from gestion_erreurs import * | 11 | from gestion_erreurs import * |
12 | from gestion_donnees import * | 12 | from gestion_donnees import * |
13 | from gestion_unites import * | 13 | from gestion_unites import * |
@@ -15,8 +15,6 @@ from trace_courbe import * | |||
15 | from faq import * | 15 | from faq import * |
16 | 16 | ||
17 | 17 | ||
18 | |||
19 | |||
20 | app = flask.Flask(__name__) | 18 | app = 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 | |||
114 | if __name__ == "__main__": | 113 | if __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 |
5 | CONFIG = {} | ||
5 | 6 | ||
6 | # fichiers | 7 | # fichiers |
7 | 8 | ||
8 | chemin_oms = "data_OMS/" | 9 | CONFIG["chemin_oms"] = "data_OMS/" |
10 | |||
11 | CONFIG["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 | ||
10 | f_poids_perc_garcon = chemin_oms+"wfa_boys_p_exp.txt" | 20 | # ajouter le chemin |
11 | f_poids_perc_fille = chemin_oms+"wfa_girls_p_exp.txt" | 21 | for (cle,val) in CONFIG["fichiersOMS"].items(): |
12 | f_poids_z_garcon = chemin_oms+"wfa_boys_z_exp.txt" | 22 | CONFIG["fichiersOMS"][cle] = CONFIG["chemin_oms"]+val |
13 | f_poids_z_fille = chemin_oms+"wfa_girls_z_exp.txt" | ||
14 | f_poids_z_mixte = chemin_oms+"wfa_mix_z_exp.txt" | ||
15 | f_poids_perc_mixte = chemin_oms+"wfa_mix_p_exp.txt" | ||
16 | 23 | ||
17 | # Pour les courbes percentiles | 24 | # Pour les courbes percentiles |
18 | liste_data_choisie_p = [(5,1),(7,5),(8,10),(10,25),(11,50),(12,75), (14,90), | 25 | CONFIG["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)] |
20 | liste_data_choisie_p.sort(reverse=True) | 27 | CONFIG["liste_data_choisie_p"].sort(reverse = True) |
21 | 28 | ||
22 | # pour le sigma : (colonne,sigma) | 29 | # pour le sigma : (colonne,sigma) |
23 | liste_data_choisie_z = [(2,-3),(3,-2),(4,-1),(5,0),(6,1),(7,2),(8,3)] | 30 | CONFIG["liste_data_choisie_z"] = [(2,-3),(3,-2),(4,-1),(5,0),(6,1),(7,2),(8,3)] |
24 | liste_data_choisie_z.sort(reverse=True) | 31 | CONFIG["liste_data_choisie_z"].sort(reverse=True) |
25 | 32 | ||
26 | # config, côté python | 33 | # config, côté python |
27 | CONFIG = {} | ||
28 | |||
29 | # les unités acceptées | 34 | # les unités acceptées |
30 | CONFIG["liste_unites"] = ["jours", "semaines", "mois", "années"] | 35 | CONFIG["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 |
33 | jours_dans_mois = 30.4375 | ||
34 | jours_dans_annee = 365.25 | ||
35 | jours_dans_semaine = 7 | ||
36 | CONFIG["jours_dans_mois"] = 30.4375 | 38 | CONFIG["jours_dans_mois"] = 30.4375 |
37 | CONFIG["jours_dans_annee"] = 365.25 | 39 | CONFIG["jours_dans_annee"] = 365.25 |
38 | CONFIG["jours_dans_semaine"] = 7 | 40 | CONFIG["jours_dans_semaine"] = 7 |
@@ -44,16 +46,17 @@ CONFIG["jours_maxi_courbe"] = round(5.5*CONFIG["jours_dans_annee"]) | |||
44 | CONFIG["jours_mini_courbe"] = 10 | 46 | CONFIG["jours_mini_courbe"] = 10 |
45 | CONFIG["jours_defaut_donneesvides"]= round(6*CONFIG["jours_dans_mois"]) # si données vides, 6 mois | 47 | CONFIG["jours_defaut_donneesvides"]= round(6*CONFIG["jours_dans_mois"]) # si données vides, 6 mois |
46 | # poids max (protection) | 48 | # poids max (protection) |
47 | poids_maxi = 80 | 49 | CONFIG["poids_maxi"] = 80 |
48 | # taille max du nom | 50 | # taille max du nom |
49 | longueur_max_nom_bebe = 100 | 51 | CONFIG["longueur_max_nom_bebe"] = 100 |
50 | 52 | ||
51 | #largeurs et hauteurs min et max | 53 | #largeurs et hauteurs min et max |
52 | largeur_graphique_max = 40 | ||
53 | largeur_graphique_min = 3 | ||
54 | 54 | ||
55 | hauteur_graphique_max = 40 | 55 | CONFIG["largeur_graphique_max"] = 30 |
56 | hauteur_graphique_min = 2 | 56 | CONFIG["largeur_graphique_min"] = 3 |
57 | |||
58 | CONFIG["hauteur_graphique_max"] = 30 | ||
59 | CONFIG["hauteur_graphique_min"] = 2 | ||
57 | 60 | ||
58 | CONFIG["couleurs"] = { | 61 | CONFIG["couleurs"] = { |
59 | "courbe1" : (0,0,1), | 62 | "courbe1" : (0,0,1), |
@@ -83,40 +86,15 @@ DEFAUT["couleurs"]["courbe3"] = "#FF0000" # rouge | |||
83 | DEFAUT["couleurs"]["fond"]= "#FFFFFF" # blanc | 86 | DEFAUT["couleurs"]["fond"]= "#FFFFFF" # blanc |
84 | DEFAUT["couleurs"]["cadretxt"] = "#000000" # noir | 87 | DEFAUT["couleurs"]["cadretxt"] = "#000000" # noir |
85 | DEFAUT["couleurs"]["grille"] = "#7f7f7f" # gris | 88 | DEFAUT["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 |
91 | DEFAUT["age_0"]= "0j" | ||
92 | DEFAUT["legende"] = "oui" | ||
93 | DEFAUT["positionlegende"] = "hg" | ||
103 | 94 | ||
104 | 95 | ||
105 | # initialiser la config | 96 | # initialiser la config |
106 | def config_init(): | 97 | def 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 « Télécharger les données ». 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 « Télécharger les données ». 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 « 2 mois 3 jours ». 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 « 2 mois 3 jours ». Ne remplissez qu'un des deux champs : âge ou date. Puis saisissez le poids en kilogrammes dans la colonne de droite. <br> |
6 | Si 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." | 6 | Si 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 « référence » 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 « référence » 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 « référence ». 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 « suit » 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 « référence ». 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 « suit » 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 « tranche » 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é σ ou z) est une sorte d'« écart moyen » à la moyenne. On regarde donc généralement la moyenne, la moyenne + 1σ, moyenne +2σ, moyenne -1 σ, 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é σ) est une sorte d'« écart moyen » à la moyenne. On regarde donc généralement la moyenne, la moyenne + 1σ, moyenne +2σ, moyenne -1 σ, etc. <a href=""https://fr.wikipedia.org/wiki/%C3%89cart_type"">Plus d'infos (maths)</a></li> |
28 | </ul> | 28 | </ul> |
29 | Si la répartition des données est « bonne » (on parle de gaussienne entre matheuses et matheux), alors la moyenne correspond à la médiane, la moyenne + 1σ correspond environ au 84e percentile, la moyenne -1σ correspond au 16e percentile. Pour ces données, il semble que ce soit assez proche d'une gaussienne." | 29 | Si la répartition des données est « bonne » (on parle de gaussienne entre matheuses et matheux), alors la moyenne correspond à la médiane, la moyenne + 1σ correspond environ au 84e percentile, la moyenne -1σ 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 | """ |
8 | from gestion_erreurs import * | 8 | from gestion_erreurs import * |
9 | from configuration import * | ||
10 | from gestion_couleurs import * | 9 | from gestion_couleurs import * |
11 | 10 | ||
12 | import csv | 11 | import 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 | ||
4 | from configuration import * | 4 | from configuration import CONFIG,DEFAUT |
5 | from gestion_erreurs import * | 5 | from gestion_erreurs import * |
6 | from gestion_couleurs import * | 6 | from gestion_couleurs import * |
7 | import datetime | 7 | import 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): | |||
56 | def convertit_age_vers_texte(nombre): | 56 | def 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 | ||
319 | def fichier_json_vers_configdonnees(fichier,liste_err): | 319 | def 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 |
5 | import sys | ||
5 | 6 | ||
6 | 7 | niveau_debug = ("debug" in sys.argv) | |
7 | niveau_debug = True | ||
8 | |||
9 | 8 | ||
10 | def initialise_erreurs(): | 9 | def 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 | ||
27 | def debug(message,liste_erreurs): | 26 | def 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 | ||
4 | from configuration import * | 4 | from configuration import CONFIG |
5 | from gestion_erreurs import * | 5 | from 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 -*- |
3 | from configuration import * | 3 | from configuration import CONFIG |
4 | from gestionOMS import * | 4 | from gestionOMS import * |
5 | from gestion_unites import * | 5 | from gestion_unites import * |
6 | 6 | ||
7 | import matplotlib.pyplot as plt | 7 | import matplotlib.pyplot as plt |
8 | 8 | ||
9 | # Essentiellement, la fonction qui trace la courbe | ||
10 | |||
11 | |||
9 | def cree_figure(conf,l_jours,l_poids,liste_err): | 12 | def 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 != []: |