From 8b5845ffdbffa3cf291bfef8e224c1d81bdd09de Mon Sep 17 00:00:00 2001 From: Denise sur Lya Date: Tue, 28 Jul 2020 00:19:54 +0200 Subject: [PATCH] =?utf8?q?Courbe=20de=20taille=20ajout=C3=A9e=20+=20plein?= =?utf8?q?=20de=20params=20qui=20vont=20avec?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- app.py | 61 +- configuration.py | 39 +- data/FAQ_data.txt | 20 +- data/changelog_data.txt | 9 + data_OMS/lhfa_boys_p_exp.txt | 1858 +++++++++++++++++++++++++++++++++ data_OMS/lhfa_boys_z_exp.txt | 1858 +++++++++++++++++++++++++++++++++ data_OMS/lhfa_girls_p_exp.txt | 1858 +++++++++++++++++++++++++++++++++ data_OMS/lhfa_girls_z_exp.txt | 1858 +++++++++++++++++++++++++++++++++ data_OMS/lhfa_mix_p_exp.txt | 1858 +++++++++++++++++++++++++++++++++ data_OMS/lhfa_mix_z_exp.txt | 1858 +++++++++++++++++++++++++++++++++ gestion_donnees.py | 209 +++- gestion_erreurs.py | 3 +- static/requetes.js | 31 +- static/style.css | 2 +- templates/base.html | 4 +- templates/index.html | 39 +- trace_courbe.py | 51 +- 17 files changed, 11474 insertions(+), 142 deletions(-) create mode 100644 data_OMS/lhfa_boys_p_exp.txt create mode 100644 data_OMS/lhfa_boys_z_exp.txt create mode 100644 data_OMS/lhfa_girls_p_exp.txt create mode 100644 data_OMS/lhfa_girls_z_exp.txt create mode 100644 data_OMS/lhfa_mix_p_exp.txt create mode 100644 data_OMS/lhfa_mix_z_exp.txt diff --git a/app.py b/app.py index 5e62e10..3f4da5c 100644 --- a/app.py +++ b/app.py @@ -7,7 +7,7 @@ import matplotlib.pyplot as plt import base64 from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas -from configuration import config_init +from configuration import config_init,CONFIG from gestion_erreurs import * from gestion_donnees import * from gestion_unites import * @@ -44,46 +44,53 @@ def courbe_image(ext): liste_err = initialise_erreurs() data = flask.request.form - # Régler la configuration et les données - config = gere_configuration(data,liste_err) - l_jours,l_poids = gere_donneespoids(data,config["naissance"],liste_err) - - + # récupérer les données du formulaire proprement + config,listes_jours,listes_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(l_jours,l_poids,config) + texte = 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']) - # créer la figure + # créer les figures try: - fig = cree_figure(config,l_jours,l_poids,liste_err) + debug("création des figures...",liste_err) + textes_images = {} + for typed in CONFIG["liste_typedonnees"]: + if config["tracevide"] == "oui" or listes_jours[typed] != []: + debug("On trace la courbe de "+typed,liste_err) + fig = cree_figure(config,listes_jours[typed],listes_donnees[typed],typed,liste_err) + output = io.BytesIO() + FigureCanvas(fig).print_png(output) + plt.close(fig) + textes_images[typed] = base64.b64encode(output.getvalue()).decode("ascii") + else: + textes_images[typed] = "" + result = "success" - output = io.BytesIO() - FigureCanvas(fig).print_png(output) - - plt.close(fig) except: result = "fail" - liste_err[0].append("Impossible de générer la courbe ! Config : "+str(config)) + liste_err[0].append("Impossible de générer les courbes ! Config : "+str(config)) if ext == "b64": + reponse = { "result":result, + "export_txt": texte, + "nomenfant": nomenfant} if result == "success": - reponse = flask.jsonify({ "result":result, - "messages": liste_err[1], - "image": base64.b64encode(output.getvalue()).decode("ascii"), - "export_txt": texte, - "nomenfant": nomenfant}) + reponse["messages"] = liste_err[0] else: - reponse = flask.jsonify({ "result":result, - "messages": liste_err[2]+liste_err[1]+liste_err[0], - "image": "", - "export_txt": texte, - "nomenfant": nomenfant}) - return reponse - - elif ext == "png" and result == "success": + reponse["messages"] = liste_err[2]+liste_err[1]+liste_err[0] + + for typed in CONFIG["liste_typedonnees"]: + reponse["image_"+typed] = textes_images.get(typed,"") + + return flask.jsonify(reponse) + elif ext == "png" and result == "success": # à voir cette partie car il faudrait voir ce qu'on y renvoie... vu + # qu'il n'y a plus une courbe mais plusieurs. Là ça renverra la dernière générée. return flask.Response(output.getvalue(), mimetype='image/png') elif ext == "png": return flask.render_template("erreur_fatale.html",erreur="Impossible de générer la courbe") diff --git a/configuration.py b/configuration.py index 70b020d..c56e569 100644 --- a/configuration.py +++ b/configuration.py @@ -4,22 +4,40 @@ ### Toutes les "constantes" de config importés pour ce qui concerne les courbes CONFIG = {} +# les unités acceptées +CONFIG["liste_unites"] = ["jours", "semaines", "mois", "années"] +CONFIG["liste_typedonnees"] = ["poids","taille"] +CONFIG["unites_typedonnees"] = {"poids": "kg", "taille":"cm"} + + # fichiers CONFIG["chemin_oms"] = "data_OMS/" +CONFIG["fichiersOMS"] = {} -CONFIG["fichiersOMS"] = { +CONFIG["fichiersOMS"]["poids"] = { "perc_garcon": "wfa_boys_p_exp.txt", "perc_fille": "wfa_girls_p_exp.txt", "z_garcon": "wfa_boys_z_exp.txt", "z_fille": "wfa_girls_z_exp.txt", "perc_mixte": "wfa_mix_p_exp.txt", - "z_mixte": "wfa_mix_z_exp.txt" + "z_mixte": "wfa_mix_z_exp.txt", + } +CONFIG["fichiersOMS"]["taille"] = { + "perc_garcon": "lhfa_boys_p_exp.txt", + "perc_fille": "lhfa_girls_p_exp.txt", + "z_garcon": "lhfa_boys_z_exp.txt", + "z_fille": "lhfa_girls_z_exp.txt", + "perc_mixte": "lhfa_mix_p_exp.txt", + "z_mixte": "lhfa_mix_z_exp.txt", } + # ajouter le chemin -for (cle,val) in CONFIG["fichiersOMS"].items(): - CONFIG["fichiersOMS"][cle] = CONFIG["chemin_oms"]+val +for typed in CONFIG["liste_typedonnees"]: + + for (cle,val) in CONFIG["fichiersOMS"][typed].items(): + CONFIG["fichiersOMS"][typed][cle] = CONFIG["chemin_oms"]+val # Pour les courbes percentiles CONFIG["liste_data_choisie_p"] = [(5,1),(7,5),(8,10),(10,25),(11,50),(12,75), (14,90), @@ -31,8 +49,6 @@ CONFIG["liste_data_choisie_z"] = [(2,-3),(3,-2),(4,-1),(5,0),(6,1),(7,2),(8,3)] CONFIG["liste_data_choisie_z"].sort(reverse=True) # config, côté python -# les unités acceptées -CONFIG["liste_unites"] = ["jours", "semaines", "mois", "années"] # nombre de jours dans les autres unités CONFIG["jours_dans_mois"] = 30.4375 @@ -44,9 +60,10 @@ CONFIG["jours_dans_semaine"] = 7 # jours maxi et mini CONFIG["jours_maxi_courbe"] = round(5.5*CONFIG["jours_dans_annee"]) CONFIG["jours_mini_courbe"] = 10 -CONFIG["jours_defaut_donneesvides"]= round(6*CONFIG["jours_dans_mois"]) # si données vides, 6 mois +CONFIG["jours_defaut_donneesvides"]= round(6.4*CONFIG["jours_dans_mois"]) # si données vides, 6 mois et quelque # poids max (protection) CONFIG["poids_maxi"] = 80 +CONFIG["taille_maxi"] = 150 # taille max du nom CONFIG["longueur_max_nom_bebe"] = 100 @@ -90,11 +107,17 @@ DEFAUT["couleurs"]["grille"] = "#7f7f7f" # gris # Remplissage du formulaire, autres DEFAUT["age_0"]= "0j" DEFAUT["legende"] = "oui" +DEFAUT["typecourbe"] = "P" +DEFAUT["unite"] = "" +DEFAUT["tracevide"] = "" +DEFAUT["memechelle"] = "" DEFAUT["positionlegende"] = "hg" # initialiser la config def config_init(): - return DEFAUT.copy() + c = DEFAUT.copy() + c["non_sauve"] = {} + return c diff --git a/data/FAQ_data.txt b/data/FAQ_data.txt index a81de6a..2dec7db 100644 --- a/data/FAQ_data.txt +++ b/data/FAQ_data.txt @@ -7,19 +7,17 @@ Si vous manquez de lignes, vous pouvez cliquer sur ""Ajouter des lignes"" pour a "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 ! :)" -"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é." +"Courbe","À quoi sert ce site ?","Il sert à tracer les courbes de croissance 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é." -"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 ici (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é." +"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 ici (en anglais). Les courbes du carnet de santé français récent (si vous avez celles datant d'avant 2018, elles sont un peu anciennes par contre) sont basées sur un échantillon assez large de bébés français, allaités ou non (et donc peu allaités en proportion). Il y a quelques différences entre les bébés allaités et non allaités, surtout dans les premiers mois." -"Courbe","Mon enfant doit-il être dans la moyenne ?","Il y a des petits bébés, des gros bébés, des bébés moyens. En général, un bébé en bonne santé ""suit"" un couloir de courbe, que ce soit la courbe des « bébés crevettes Â» ou des « bébés dodus Â». Un changement de couloir (poids en baisse le plus souvent) peut éventuellement être signe d'un problème. Ou pas. Dans tous les cas, référez vous à des professionnels de santé et/ou de la petite enfance." +"Courbe","Mais est-ce que tu pourrais faire la courbe du carnet de santé quand même pour voir ?","Je veux bien, mais à ma connaissance, les données ne sont pas publiques..." -"Courbe","Pourquoi jusqu'à 5 ans ?","Les données de référence de l'OMS sont fournies jusqu'à 5 ans pour le poids." - -"Courbe","Pourquoi faire des courbes de référence différenciées selon le sexe ?","Il se trouve que l'évolution de poids diffère selon ce critère. S'il s'agissait d'une simple différence de poids en moyenne, une courbe mixte serait adaptée (puisqu'on s'intéresse à l'allure de la courbe et non au poids absolu), mais les courbes sont légèrement différentes.
-Vous trouverez ici et là deux graphiques où on voit les courbes de poids garçons et filles superposées." +"Courbe","Pourquoi jusqu'à 5 ans ?","Les données de référence de l'OMS sont fournies jusqu'à 5 ans pour le poids et la taille." "Courbe","Pourquoi une courbe de « neutre Â» ? Et c'est quoi ?","Pourquoi pas ? C'est simplement une courbe moyennée des courbes garçon/fille. Ce n'est absolument pas une vraie référence, mais ça ne coûtait rien d'essayer. Je n'ai aucune connaissance dans les données de croissance des enfants intersexes, et s'il existe pour ces enfants des courbes de référence, peut-être que celle-ci aurait du sens, peut-être pas. Elle permet accessoirement de générer une courbe « acceptable Â» même si on n'a pas spécifié sexe masculin/féminin. Au pire vous pouvez considérer que c'est une « courbe jouet Â»." + "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. ;)
Pour les curieuses et les curieux :