From 66a3e38cc085dc000776d3e2ad3acd7ef57068a3 Mon Sep 17 00:00:00 2001 From: Denise sur Lya Date: Tue, 16 Jun 2020 00:32:10 +0200 Subject: =?UTF-8?q?Ajout=20de=20la=20FAQ,=20correction=20de=20bugs.=20Meil?= =?UTF-8?q?leure=20requ=C3=AAte=20de=20courbe.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FAQ_data.txt | 18 ++++++++++++++++++ app.py | 31 ++++++++++++++++++++++++++----- faq.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ gestion_donnees.py | 8 ++++---- static/requetes.js | 46 +++++++++++++++++++++++++++------------------- static/style.css | 4 ++++ templates/base.html | 1 + templates/faq.html | 30 ++++++++++++++++++++++++++++++ templates/index.html | 8 ++++++-- 9 files changed, 167 insertions(+), 30 deletions(-) create mode 100644 FAQ_data.txt create mode 100644 faq.py create mode 100644 templates/faq.html diff --git a/FAQ_data.txt b/FAQ_data.txt new file mode 100644 index 0000000..cce0a2d --- /dev/null +++ b/FAQ_data.txt @@ -0,0 +1,18 @@ +"Utilisation","Comment tracer la courbe ?","Remplissez le formulaire (vous pouvez laisser par défaut tous les champs qui ne vous « parlent » pas), puis cliquez sur ""Je veux la courbe !"". La courbe s'affiche plus bas. Si vous modifiez les données du formulaire, vous pouvez re-cliquer sur ce bouton pour la mettre à jour. Et c'est tout !" + +"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. Quand vous demandez à tracer la courbe, il s'affiche en bas un champ de texte. Si vous copiez-collez ce contenu et le gardez dans un fichier, vous n'aurez pas à re-saisir les données. 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)." + +"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.
+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." + +"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é." + +"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","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." + +"Divers","Pourquoi cet outil ?","Tout a commencé sur le forum de La Leche League, où de nombreuses mamans (et parfois quelques papas) viennent poser des questions sur l'allaitement. Souvent, se pose la question de la prise de poids du bébé, qui est un bon indicateur de si le bébé reçoit assez de lait. Le poids dans l'absolu étant peu pertinent, il est utile de « tracer » la courbe de poids. Il n'existe actuellement que peu d'outils qui permettent de le faire (l'OMS en fournit un qui ne fonctionne que sous windows), en voici un." + +"Divers","Mais qui es tu donc ?","Je suis une de ces nombreuses mamans qui s'est posée un jour (et un autre jour aussi) la question de la prise de poids de son enfant. Adepte de solutions libres et multi-plateforme, je n'ai rien trouvée qui me permette de tracer cette courbe, que ce soit pour mon enfant ou celui des autres. Je suis par ailleurs férue de programmation (et je l'enseigne d'ailleurs), et donc... voilà." + +"Technique","Quelle est la technologie utilisée derrière ?","Il s'agit de flask, un petit framework de développement web en python. Il y a une petite dose de JavaScript pour assaisonner le tout, et voilà." diff --git a/app.py b/app.py index 7348472..4f330d9 100644 --- a/app.py +++ b/app.py @@ -8,6 +8,8 @@ from gestion_erreurs import * from gestion_donnees import * from gestion_unites import * from trace_courbe import * +from faq import * + import matplotlib.pyplot as plt import base64 @@ -40,17 +42,27 @@ def courbe_image(ext): liste_err = initialise_erreurs() data = flask.request.form - config = gere_configuration(data,liste_err) - + # 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) + + # préparer l'export + texte = configuration_vers_texte(config) + texte += donnees_poids_vers_texte(l_jours,l_poids) + + # créer la figure fig = cree_figure(config,l_jours,l_poids,liste_err) - output = io.BytesIO() FigureCanvas(fig).print_png(output) - plt.close(fig) + if ext == "b64": - return flask.Response(base64.b64encode(output.getvalue()), mimetype='text/plain') + reponse = flask.jsonify({ "result":"success", + "messages": liste_err[1], + "image": base64.b64encode(output.getvalue()).decode("ascii"), + "export_txt": texte}) + return reponse + #return flask.Response(base64.b64encode(output.getvalue()), mimetype='text/plain') elif ext == "png": return flask.Response(output.getvalue(), mimetype='image/png') else: @@ -72,5 +84,14 @@ def export_donnees(): return flask.Response(texte,mimetype="text/plain") +@app.route("/faq") +def faq(): + + table_faq = lire_fichier_csv_simple(fichier_FAQ) + l_categ,table_qr = extraire_tables_par_cat(table_faq) + + return flask.render_template("faq.html",lcateg=l_categ,tableqr=table_qr,err=[]) + + if __name__ == "__main__": app.run(host='0.0.0.0',debug=True) \ No newline at end of file diff --git a/faq.py b/faq.py new file mode 100644 index 0000000..4ee8bfa --- /dev/null +++ b/faq.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +### Les fonctions et données pour la FAQ + +import csv +fichier_FAQ = "FAQ_data.txt" + +# Les questions seront dans une database sous la forme (categorie,question,reponse) + +def lire_fichier_csv_simple(fichier): + """ lire un fichier csv et le renvoyer en table""" + table=[] + with open(fichier, "r") as fichier_csv: + reader_notes = csv.reader(fichier_csv,delimiter=",",dialect="unix") + for ligne in reader_notes: + if ligne != []: + table.append(ligne) + return table + + + + + +# On trie par catégorie +#table_faq.sort(key=(lambda x: x[0])) + +def extraire_categories(table): + """ extrait les catégories (1ere colonne du tableau de tableau) + renvoie sous forme de liste""" + liste_cat = [] + for ligne in table: + if not (ligne[0] in liste_cat): + liste_cat.append(ligne[0]) + return liste_cat + +def extraire_tables_par_cat(table): + """ construit deux tables : une de catégories, une de tables de (q,r) + categ[i] va correspondre à tableqr[i] en terme de catégorie""" + categ = extraire_categories(table) + tableqr = [ [] for i in range(len(categ)) ] + + for ligne in table: + try: + cat = ligne[0] + (q,r) = [ligne[1],ligne[2]] + ind = categ.index(cat) + tableqr[ind].append((q,r)) + except: + print("Impossible de lire la ligne : "+str(ligne)) + + return (categ,tableqr) diff --git a/gestion_donnees.py b/gestion_donnees.py index 82491ca..9584386 100644 --- a/gestion_donnees.py +++ b/gestion_donnees.py @@ -73,12 +73,12 @@ def convertit_poids_vers_python(chaine,liste_err): chaine2 = chaine2.replace(" ","") try: - poids = float(chaine) + poids = float(chaine2) except: warning("Poids impossible à lire : "+chaine,liste_err) poids = 0 - if not( 0Accueil et saisie des données | À propos | + Foire Aux Questions diff --git a/templates/faq.html b/templates/faq.html new file mode 100644 index 0000000..301f5d7 --- /dev/null +++ b/templates/faq.html @@ -0,0 +1,30 @@ +{% extends "base.html" %} +{% block contenu %} +

Foire Aux Questions

+ +
+
    {% for cat in lcateg %} +
  • {{ cat }}
  • +{% endfor %} +
+
+ +
+{% for i in range(lcateg|length) %} +{% set qr = tableqr[i] %} + +

{{ lcateg[i] }}

+
    + {% for (q,r) in qr %} +
  • Q : {{ q|safe }}

    +

    R : {{ r|safe }}

    +
  • + {% endfor %} +
+ + +{% endfor %} +
+ + +{% endblock %} diff --git a/templates/index.html b/templates/index.html index f9de4a5..3d81e3e 100644 --- a/templates/index.html +++ b/templates/index.html @@ -55,7 +55,7 @@ Position :
- +
@@ -85,6 +85,10 @@ Position :