From e4ec2d3d510d6138430c48d5dc699c10ff8dc463 Mon Sep 17 00:00:00 2001
From: Denise sur Lya
Date: Thu, 22 Jul 2021 14:02:16 +0200
Subject: =?UTF-8?q?petites=20am=C3=A9liorations=20graphiques,=20ic=C3=B4ne?=
=?UTF-8?q?,=20etc?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app.py | 35 +++++++++--------------------------
configuration.py | 4 +++-
data/changelog_data.txt | 37 +++++++++++++++++--------------------
gestion_donnees.py | 44 +++++++++++++++++++++++++++++++++++++++++---
static/favicon.ico | Bin 0 -> 1246 bytes
static/outilspage.js | 16 ++++++++++++++--
static/requetes.js | 2 +-
static/style.css | 11 +++++++++--
templates/base.html | 3 ++-
templates/changelog.html | 25 ++++++++++++++++++-------
templates/index.html | 15 +++++++++++----
trace_courbe.py | 6 +-----
12 files changed, 126 insertions(+), 72 deletions(-)
create mode 100644 static/favicon.ico
diff --git a/app.py b/app.py
index 5875435..c11eb8b 100644
--- a/app.py
+++ b/app.py
@@ -8,9 +8,8 @@ import base64
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from configuration import config_init,CONFIG
-from gestion_erreurs import initialise_erreurs, debug, niveau_debug, warning
+from gestion_erreurs import initialise_erreurs, debug, niveau_debug
import gestion_donnees as donnees
-import gestion_couleurs as couleurs
from trace_courbe import cree_figure
import faq as f
@@ -32,12 +31,14 @@ def index():
beta=initialise_mode_beta()
liste_err = initialise_erreurs()
val_form = config_init()
+ ## Si on a chargé un fichier de données
if flask.request.method=="POST":
if 'fichier_donnees' in flask.request.files:
## charger les données dans le formulaire
fichier = flask.request.files['fichier_donnees']
chaine = fichier.read()
val_form2 = donnees.fichier_json_vers_configdonnees(chaine,liste_err)
+ # Si jamais le formulaire est vide, c'est qu'il y a eu une erreur !
if val_form2 == {}:
return flask.render_template("index.html",err=liste_err[2]+liste_err[1]+liste_err[0],valform=val_form, CONFIG=CONFIG, beta=beta)
val_form.update(val_form2)
@@ -55,35 +56,17 @@ def apropos():
def courbe_image(ext):
liste_err = initialise_erreurs()
data = flask.request.form
- enfants_add = [] # Enfants additionnels
- i=2
- while "couleur_donnees_"+str(i) in data: # Tant qu'il y a des données de ce type
- if 'fichier_donnees_'+str(i) in flask.request.files: # Un enfant à ajouter
- fichier = flask.request.files["fichier_donnees_"+str(i)]
- chaine = fichier.read() # On récupère la chaîne
- if len(chaine)>=5: # Si elle a une longueur à peu près raisonnable
- debug("Un fichier de données additionnel trouvé", liste_err)
- formulaire_2 = donnees.fichier_json_vers_configdonnees(chaine, liste_err)
- if formulaire_2 =={}:
- warning("Le fichier de données additionnel est vide ou mal formaté", liste_err)
- else:
- debug("Form 2 : "+str(formulaire_2), liste_err)
- # Récupérer sous forme python
- conf2, ljours2, listes_donnees2 = donnees.web_vers_python(formulaire_2,liste_err, court=True)
- debug("Form 2 données travaillées "+str(ljours2)+str(listes_donnees2), liste_err)
- # Le symbole et la couleur
- symb2 = donnees.gere_symbole(data.get("symbole_donnees_"+str(i)))
- coul2 = couleurs.rgb_vers_tuple(data.get("couleur_donnees_"+str(i),""),CONFIG["couleurs"]["cadretxt"],liste_err)
- enfant2 = donnees.eclate_donnees_additionnelles(conf2, ljours2, listes_donnees2, symb2, coul2)
- enfants_add.append(enfant2)
- i+=1
# récupérer les données du formulaire proprement
config,listes_jours,listes_donnees = donnees.web_vers_python(data,liste_err)
debug(" * On a récupéré et traité les données du formulaire web",liste_err)
+ # Gérer les enfants additionnels
+ enfants_add = donnees.gere_enfants_additionnels(data, flask.request.files, liste_err)
+ debug("Enfants additionnels récupérés : "+str(enfants_add), liste_err)
+
+ # Récupérer le texte à exporter
texte = donnees.donnees_vers_json(listes_jours["poids"],listes_donnees["poids"],listes_jours["taille"],listes_donnees["taille"], config)
-
debug("texte prêt à être exporté : "+texte,liste_err)
# noter le nom de l'enfant pour l'export
@@ -156,7 +139,7 @@ def changelog():
table_version = f.lire_fichier_csv_simple(f.fichier_changelog)
- return flask.render_template("changelog.html",table = table_version,err=[], beta=beta)
+ return flask.render_template("changelog.html",table = table_version, nblignes=CONFIG["nb_lignes_changelog"], err=[], beta=beta)
if __name__ == "__main__":
print("Mode debug maison : "+str(niveau_debug))
diff --git a/configuration.py b/configuration.py
index 0fc8f20..b22c6e3 100644
--- a/configuration.py
+++ b/configuration.py
@@ -5,7 +5,9 @@
CONFIG = {}
### La version de l'app
-CONFIG["version"] = 2.4
+CONFIG["version"] = 2.5
+# Nombre de versions anciennes dans le changelog
+CONFIG["nb_lignes_changelog"] = 4
# les unités acceptées
CONFIG["liste_unites"] = ["jours", "semaines", "mois", "années"]
diff --git a/data/changelog_data.txt b/data/changelog_data.txt
index cbe87ef..ba601e3 100644
--- a/data/changelog_data.txt
+++ b/data/changelog_data.txt
@@ -1,6 +1,8 @@
-"Version 2.45","29/06/2021","
Plus de courbes ! Et d'autres choses...
+"Version 2.5","29/06/2021","
Plus de courbes ! Et d'autres choses...
-
Un petit coup de peinture général.
+
Un petit coup de peinture général à divers endroits.
+
Une icône, enfin (il était temps...)
+
La page du suivi des versions (celle-ci) a été raccourcie (sauf si on veut tout voir).
On peut désormais personnaliser la couleur et le symbole de la courbe (principale).
Les dates sont maintenant exportées et importées. C'est plus sympa pour la lecture (pour le calcul, la donnée en âge l'emporte).
Une version de l'appli est incluse dans le fichier de sauvegarde. On affiche un petit message si la version du fichier importé est inférieure à celle du site, mais normalement tout reste compatible. Si vous voulez la toute dernière version, il suffit de ré-enregistrer vos données, tout simplement.
@@ -9,20 +11,18 @@
Courbes de plusieurs enfants :
Les données et la configuration sont celles de l'enfant qu'on a saisi en ""principal""
-
Pour les enfants en plus, il faut déjà avoir le fichier de données déjà généré.
-
On choisit alors une couleur et un symbole pour ces courbes additionnels
+
Pour les enfants en plus, il faut déjà avoir le fichier de données (généré par l'outil).
+
On choisit alors une couleur et un symbole pour ces courbes additionnelles.
-
-
"
+"
-"Version 2.31","28/04/2021","
Les calculs de données sont améliorés :
+"Version 2.31","28/04/2021","
Les calculs de données sont améliorés :
Si l'âge demandé (ou la donnée) est entre les données saisies, c'est une simple interpolation linéaire entre les données existantes,
Si c'est en dehors, alors on fait un calcul d'extrapolation comme avant
-En plus, on peut décider de marquer sur le graphique, ou pas, le point qu'on cherche.
-"
+
En plus, on peut décider de marquer sur le graphique, ou pas, le point qu'on cherche.
"
"Version 2.3001","13/03/2021","
Petit changement : on peut maintenant mettre le poids en grammes. Si le poids saisi est supérieur à 500 il sera automatiquement converti.
"
@@ -36,36 +36,33 @@ En plus, on peut décider de marquer sur le graphique, ou pas, le point qu'on ch
"Version 2.2001","13/11/2020","
Amélioration de l'affichage pour les prémas (masqués par défaut). Précision dans le texte + FAQ.
"
-"Version 2.2","12/11/2020","
Ajout de la possibilité d'avoir la courbe ajustée pour les prématurés. Attention c'est encore en bêta ! Le principe c'est simplement les courbes OMS décalées de la durée de prématurité, ce qui convient plus ou moins bien aux enfants nés prématurés une fois qu'ils ont atteint l'âge du terme en âge corrigé.
+"Version 2.2","12/11/2020","
Ajout de la possibilité d'avoir la courbe ajustée pour les prématurés. Attention c'est encore en bêta ! Le principe c'est simplement les courbes OMS décalées de la durée de prématurité, ce qui convient plus ou moins bien aux enfants nés prématurés une fois qu'ils ont atteint l'âge du terme en âge corrigé.
Si vous n'êtes pas concerné(e), laisser ""0j"" (0 jours) en prématurité (logique non ?)
Si vous préférez l'âge corrigé, cocher la case. L'âge de l'enfant sera alors potentiellement négatif.
Si vous préférez l'âge réel, c'est la courbe OMS qui sera alors décalée
-Tout retour sur cette fonctionnalité est le bienvenu !
-"
+Tout retour sur cette fonctionnalité est le bienvenu !"
-"Version 2.1","28/07/2020","
Bug corrigé : quand on ajoute des lignes, maintenant ça ajoute aussi des saisies de taille ! ^^
Par défaut, les saisies de taille sont masquées (car la plupart du temps on regarde le poids). On peut cliquer pour afficher les tailles.
-
"
+"
-"Version 2.0","28/07/2020","
Nouveauté : courbes de taille disponible !
+"Version 2.0","28/07/2020","
Nouveauté : courbes de taille disponible !
Il n'est pas nécessaire de saisir des tailles, l'appli trace ce qu'elle a en fonction de ce qu'on lui donne
Par défaut, les courbes vides (sans donnée) ne sont pas tracées. Si vous les voulez quand même (une courbe vide de référence), il suffit de cocher une case dans les préférences du graphique
Le format d'export de données est normalement compatible avec les fichiers exportés avant. Signalez moi tout bug à ce sujet !
On peut cocher ""même échelle sur tous les graphiques"" quand les graphiques différents n'ont pas les mêmes données (de temps) et qu'on veut quand même qu'ils soient ""alignés"", mais qu'on laisse l'appli choisir l'échelle.
Possibilité de saisir la date brute en texte. Pour certains navigateurs (sur smartphone ?) où il n'y avait pas cette possibilité et où il fallait parfois cliquer 15 fois pour saisir une date 15 mois plus tôt, ça va peut être être mieux. N'hésitez pas à faire plein de tests à ce sujet !
L'export des données est maintenant avec l'extension « .txt ». C'est exactement la même chose qu'avant (du json), et tout est compatible, car fondamentalement, l'extension c'est pour faire joli, hein, entre nous. Mais ça vous permettra de l'ouvrir sans avoir trop peur d'une part, et surtout c'est un format qui est « accepté » sur le forum LLL ;). Vous allez donc pouvoir plus facilement y poster votre fichier de données !
-
-"
+"
"Version 1.0001","24/06/2020","
Petit bug corrigé (lors du choix de l'âge maxi sur la courbe)
"
diff --git a/gestion_donnees.py b/gestion_donnees.py
index 8e19d8b..c24192e 100644
--- a/gestion_donnees.py
+++ b/gestion_donnees.py
@@ -428,6 +428,44 @@ def gere_donnees(data,naissance,typedonnee,liste_err):
return (l_jours,l_donnee)
+# web vers python : enfants additionnels
+def gere_enfants_additionnels(data, files, liste_err):
+ """ data est le dictionnaire de requête.
+ files est le dictionnaire des fichiers (flask.request.files).
+ Renvoie les enfants additionnels sous forme de liste de dictionnaires :
+ {typed: (conf, lj, ldonnees)}
+ Dans conf y'a les infos qu'il faut pour tracer la courbe additionnelle voulue.
+ """
+
+ enfants_add = [] # Enfants additionnels
+ # Les enfants additionnels commencent à 2 (puis 3, 4, etc)
+ i=2
+ while "couleur_donnees_"+str(i) in data: # Tant qu'il y a des données de ce type
+ if 'fichier_donnees_'+str(i) in files: # Un enfant à ajouter
+ fichier = files["fichier_donnees_"+str(i)]
+ chaine = fichier.read() # On récupère la chaîne
+ if len(chaine)>=5: # Si elle a une longueur à peu près raisonnable
+ debug("Un fichier de données additionnel trouvé", liste_err)
+ formulaire_2 = fichier_json_vers_configdonnees(chaine, liste_err)
+ if formulaire_2 =={}:
+ warning("Le fichier de données additionnel est vide ou mal formaté", liste_err)
+ else:
+ debug("Form 2 : "+str(formulaire_2), liste_err)
+ # Récupérer sous forme python
+ conf2, ljours2, listes_donnees2 = web_vers_python(formulaire_2,liste_err, court=True)
+ debug("Form 2 données travaillées "+str(ljours2)+str(listes_donnees2), liste_err)
+ # Le symbole et la couleur
+ symb2 = gere_symbole(data.get("symbole_donnees_"+str(i)))
+ coul2 = rgb_vers_tuple(data.get("couleur_donnees_"+str(i),""),CONFIG["couleurs"]["cadretxt"],liste_err)
+ enfant2 = eclate_donnees_additionnelles(conf2, ljours2, listes_donnees2, symb2, coul2)
+ enfants_add.append(enfant2)
+ i+=1
+
+ return enfants_add
+
+
+
+
# python vers Json
#### export vers json
@@ -559,9 +597,9 @@ def eclate_donnees_additionnelles(conf, ljours, ldonnees, symb, couleur):
""" conf est la config (on ne garde que le nom) pour un enfant additionnel,
ljours et ldonnees les dictionnaires de listes contenant les données.
symb est le symbole choisi pour cette courbe additionnelle (déjà vérifié)
- On fabrique un joli dictionnaire typed -> (conf lj, ldonnee) avec le nom de l'enfant,
+ On fabrique un joli dictionnaire typed -> (conf, lj, ldonnee) avec le nom de l'enfant,
et les données pour chaque typed"""
- print("test conf avant "+str(ldonnees)+str(ljours))
+ #print("test conf avant "+str(ldonnees)+str(ljours))
retour = {}
conf["symbole"] = symb # On ajoute le symbole additionnel
@@ -569,5 +607,5 @@ def eclate_donnees_additionnelles(conf, ljours, ldonnees, symb, couleur):
for typed in CONFIG["liste_typedonnees"]:
retour[typed] = (conf, ljours[typed], ldonnees[typed])
- print("test "+str(retour))
+ #print("test "+str(retour))
return retour
\ No newline at end of file
diff --git a/static/favicon.ico b/static/favicon.ico
new file mode 100644
index 0000000..1392469
Binary files /dev/null and b/static/favicon.ico differ
diff --git a/static/outilspage.js b/static/outilspage.js
index 72a9b91..dac70bf 100644
--- a/static/outilspage.js
+++ b/static/outilspage.js
@@ -44,11 +44,23 @@ function ajoutelignes()
}
-// Affichage de la textarea "export"
+// Affichage de la section "export"
function affiche_export()
{
document.getElementById("export").style.display = "block" ;
-
+}
+// Copier vers le presse-papiers
+function copietexte()
+{
+ var elt = document.getElementById("export_texte");
+
+ /* Select the text field */
+ elt.select();
+ elt.setSelectionRange(0, 99999); /* For mobile devices */
+
+ /* Copy the text inside the text field */
+ document.execCommand("copy");
+
}
function affiche_cache(id,elemcourant)
diff --git a/static/requetes.js b/static/requetes.js
index 5644469..ba2a81e 100644
--- a/static/requetes.js
+++ b/static/requetes.js
@@ -23,7 +23,7 @@ function appelle_image()
var calculextra = this.response.calculextra ;
// on affiche l'export des données
- document.getElementById('export').innerHTML = texte;
+ document.getElementById('export_texte').innerHTML = texte;
document.getElementById('sectionexport').style.display = "block";
diff --git a/static/style.css b/static/style.css
index 95cd55e..4b82077 100644
--- a/static/style.css
+++ b/static/style.css
@@ -37,12 +37,14 @@ img#courbe {
display: none;
}
-#export {
+#export_texte {
width: 25em;
height: 20em;
- display:none;
max-width: 100%
}
+#export {
+ display: none;
+}
#courbe_warnings {
display: none;
@@ -125,3 +127,8 @@ nav {
.data {
width:7em
}
+
+/* Page changelog */
+#suite_changelog {
+ display: none;
+}
diff --git a/templates/base.html b/templates/base.html
index b84df6f..58e094d 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -4,7 +4,8 @@
Courbes de croissance OMS de l'enfant
-
+
+
diff --git a/templates/changelog.html b/templates/changelog.html
index 7ba96cd..ed47f99 100644
--- a/templates/changelog.html
+++ b/templates/changelog.html
@@ -1,17 +1,28 @@
{% extends "base.html" %}
{% block contenu %}
+
Suivi des versions
{% for ligne in table %}
-
-
{{ ligne[0] }}
-
Le {{ ligne[1] }}
+
+
{{ ligne[0] }}
+
Le {{ ligne[1] }}
-
-{{ ligne[2]|safe }}
-
+
+ {{ ligne[2]|safe }}
+
+
+
+ {% if loop.index == nblignes and table | length > nblignes %}
+
+
+{% endif %}
diff --git a/templates/index.html b/templates/index.html
index 0ec6e9b..f25df0e 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -173,14 +173,17 @@
... et le voir sur le graphique.
-
Les résultats de calculs seront affichés en-dessous des courbes.
+
Les résultats de calculs seront affichés en-dessous des courbes. Ils ne seront pas sauvegardés.
+
Courbes multiples
Afficher
-
Si vous souhaitez tracer sur le même graphique les courbes de différents enfants, c'est ici. Il faut importer le fichier de données additionnel de l'autre enfant (ou des autres enfants). Seul le nom de l'enfant et ses données seront utilisés, les autres paramètres (courbe de référence suivant le sexe, maximum du graphique, ...) seront ceux de l'enfant « principal ».
+
Si vous souhaitez tracer sur le même graphique les courbes de différents enfants, c'est ici.
+
Il faut importer le fichier de données additionnel de l'autre enfant (ou des autres enfants). Seul le nom de l'enfant et ses données seront utilisés, les autres paramètres (courbe de référence suivant le sexe, maximum du graphique, ...) seront ceux de l'enfant « principal ».
+
Remarque : lors de l'export, seul l'enfant « principal » est sauvegardé.
{% for numero_enfant in range(2, CONFIG.nb_fichiers_enfants_add+2) %}
Enlever ce fichier |
Symbole :
+
Export des données
@@ -253,9 +257,12 @@
Télécharger les données
-
Si vous n'arrivez pas à télécharger les données, cliquez ici pour les voir en texte clair : il vous suffira de les copier/coller dans un fichier texte.