summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenise sur Lya <sekhmet@lya>2020-06-19 13:38:05 +0200
committerDenise sur Lya <sekhmet@lya>2020-06-19 13:38:05 +0200
commit915e90bbf0bee1d69c51a749a4f2be85b9fda091 (patch)
tree47649a1dd91b749b44ecb37c7628e4c92b9c093a
parentfd69b6b5fd9117baeb2b39fa75c3efa3740e2227 (diff)
downloadoms-915e90bbf0bee1d69c51a749a4f2be85b9fda091.tar.gz
oms-915e90bbf0bee1d69c51a749a4f2be85b9fda091.tar.zst
oms-915e90bbf0bee1d69c51a749a4f2be85b9fda091.zip
amélioration du code + page contact en cours + licences
-rw-r--r--COPYING10
-rw-r--r--LICENSE12
-rw-r--r--app.py30
-rw-r--r--configuration.py84
-rw-r--r--data_OMS/LICENSE (renamed from data_OMS/licence)0
-rw-r--r--gestionOMS.py6
-rw-r--r--gestion_donnees.py61
-rw-r--r--licence20
-rw-r--r--templates/apropos.html2
-rw-r--r--templates/base.html4
-rw-r--r--templates/contact.html14
-rw-r--r--templates/index.html26
-rw-r--r--trace_courbe.py24
13 files changed, 164 insertions, 129 deletions
diff --git a/COPYING b/COPYING
index d50c38d..13542f7 100644
--- a/COPYING
+++ b/COPYING
@@ -1,5 +1,9 @@
1-------------- 1--------------
2Attention : application de licences : 2Attention : application des licences :
3
4Le dossier data_OMS est sous licence CC BY-NC-SA 3.0 IGO
5https://creativecommons.org/licenses/by-nc-sa/3.0/igo/
6
7Le reste du projet est sous licence MIT "X11"
8https://fr.wikipedia.org/wiki/Licence_MIT
3 9
4Le dossier data_OMS est sous licence CC BY-NC-SA 3.0 IGO
5Le reste du projet est sous licence
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..404d44c
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,12 @@
1Ce projet, à l'exception du dossier data_OMS (voir fichier COPYING), est sous licence MIT "X11"
2(plus d'informations en français https://fr.wikipedia.org/wiki/Licence_MIT )
3
4----------------
5Copyright © 2020, Denise Maurice
6
7Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
9The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
11The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders X be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
12Except as contained in this notice, the name of Denise Maurice shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Denise Maurice.
diff --git a/app.py b/app.py
index 3deb7f6..93c5b30 100644
--- a/app.py
+++ b/app.py
@@ -27,7 +27,8 @@ def index():
27 ## charger les donneés dans le formulaire 27 ## charger les donneés dans le formulaire
28 fichier = flask.request.files['fichier_donnees'] 28 fichier = flask.request.files['fichier_donnees']
29 29
30 val_form = fichier_json_vers_configdonnees(fichier,liste_err) 30 val_form2 = fichier_json_vers_configdonnees(fichier,liste_err)
31 val_form.update(val_form2)
31 #return str(val_form['nb_data']) 32 #return str(val_form['nb_data'])
32 return flask.render_template("index.html",err=liste_err[1],valform=val_form) 33 return flask.render_template("index.html",err=liste_err[1],valform=val_form)
33 34
@@ -46,13 +47,15 @@ def courbe_image(ext):
46 config = gere_configuration(data,liste_err) 47 config = gere_configuration(data,liste_err)
47 l_jours,l_poids = gere_donneespoids(data,config["naissance"],liste_err) 48 l_jours,l_poids = gere_donneespoids(data,config["naissance"],liste_err)
48 49
49 #print(config) 50
50 51
51 texte = donnees_vers_json(l_jours,l_poids,config) 52 texte = donnees_vers_json(l_jours,l_poids,config)
52 53
53 # noter le nom de l'enfant pour l'export 54 # noter le nom de l'enfant pour l'export
54 nomenfant = simplifie_nom(config['nom']) 55 nomenfant = simplifie_nom(config['nom'])
55 56
57 #warning(str(config),liste_err)
58
56 # créer la figure 59 # créer la figure
57 try: 60 try:
58 fig = cree_figure(config,l_jours,l_poids,liste_err) 61 fig = cree_figure(config,l_jours,l_poids,liste_err)
@@ -63,7 +66,7 @@ def courbe_image(ext):
63 plt.close(fig) 66 plt.close(fig)
64 except: 67 except:
65 result = "fail" 68 result = "fail"
66 liste_err[0].append("Impossible de générer la courbe !") 69 liste_err[0].append("Impossible de générer la courbe ! Config : "+str(config))
67 70
68 71
69 if ext == "b64": 72 if ext == "b64":
@@ -88,23 +91,10 @@ def courbe_image(ext):
88 else: 91 else:
89 return flask.render_template("erreur_fatale.html",erreur="Le type d'image demandé n'est pas reconnu") 92 return flask.render_template("erreur_fatale.html",erreur="Le type d'image demandé n'est pas reconnu")
90 93
91 #return flask.Response(base64.b64encode(output.getvalue()), mimetype='text/plain') 94
92 95@app.route("/contact")
93#@app.route("/export_donnees",methods=['POST']) 96def contact():
94#def export_donnees(): 97 return flask.render_template("contact.html",err=[])
95# # exporte les données au format texte
96# liste_err = initialise_erreurs()
97# data = flask.request.form
98#
99# config = gere_configuration(data,liste_err)
100# l_jours,l_poids = gere_donneespoids(data,config["naissance"],liste_err)
101#
102# texte = configuration_vers_texte(config)
103# texte += donnees_poids_vers_texte(l_jours,l_poids)
104#
105# #texte = donnees_vers_json(l_jours,l_poids,config)
106# #return flask.Response(texte,mimetype="application/json")
107# return flask.Response(texte,mimetype="text/plain")
108 98
109@app.route("/faq") 99@app.route("/faq")
110def faq(): 100def faq():
diff --git a/configuration.py b/configuration.py
index e173ad9..3e65255 100644
--- a/configuration.py
+++ b/configuration.py
@@ -23,6 +23,9 @@ liste_data_choisie_p.sort(reverse=True)
23liste_data_choisie_z = [(2,-3),(3,-2),(4,-1),(5,0),(6,1),(7,2),(8,3)] 23liste_data_choisie_z = [(2,-3),(3,-2),(4,-1),(5,0),(6,1),(7,2),(8,3)]
24liste_data_choisie_z.sort(reverse=True) 24liste_data_choisie_z.sort(reverse=True)
25 25
26
27CONFIG = {}
28
26liste_unites_valides = ["jours", "semaines", "mois", "années"] 29liste_unites_valides = ["jours", "semaines", "mois", "années"]
27 30
28# nombre de jours dans autre chose 31# nombre de jours dans autre chose
@@ -30,63 +33,82 @@ jours_dans_mois = 30.4375
30jours_dans_annee = 365.25 33jours_dans_annee = 365.25
31jours_dans_semaine = 7 34jours_dans_semaine = 7
32 35
33
34## Maxi et mini de "sécurité" 36## Maxi et mini de "sécurité"
35# jours maxi 37# jours maxi
36jours_maxi_courbe = 6.2*jours_dans_annee 38jours_maxi_courbe = 5.5*jours_dans_annee
37# poids max (protection) 39# poids max (protection)
38poids_maxi = 80 40poids_maxi = 80
39# taille max du nom 41# taille max du nom
40longueur_max_nom_bebe = 100 42longueur_max_nom_bebe = 100
41 43
42
43### Taille du graphique par défaut (pouces, en 80 points par pouce)
44largeur_graphique = 10
45hauteur_graphique = 7
46
47#largeurs et hauteurs min et max 44#largeurs et hauteurs min et max
48largeur_graphique_max = 40 45largeur_graphique_max = 40
49largeur_graphique_min = 2 46largeur_graphique_min = 3
50 47
51hauteur_graphique_max = 40 48hauteur_graphique_max = 40
52hauteur_graphique_min = 2 49hauteur_graphique_min = 2
53 50
51
52
53## Configuration "par défaut" du graphique, tel qu'exporté ?
54DEFAUT = {}
55
56### Taille du graphique par défaut (pouces, en 80 points par pouce)
57DEFAUT["largeur"] = 10
58DEFAUT["hauteur"] = 7
59
54# Nombre de lignes par défaut dans le formulaire 60# Nombre de lignes par défaut dans le formulaire
55nombre_lignes_form = 5 61DEFAUT["nb_data"] = 6
56 62
57# couleurs par défaut 63# couleurs par défaut
58couleur_defaut_1 = "#0000FF" # bleu 64DEFAUT["couleurs"] = {}
59couleur_defaut_2 = "#00FF00" # vert 65DEFAUT["couleurs"]["courbe1"] = "#0000FF" # bleu
60couleur_defaut_3 = "#FF0000" # rouge 66DEFAUT["couleurs"]["courbe2"] = "#00FF00" # vert
61couleur_defaut_1_tuple = (0,0,1) 67DEFAUT["couleurs"]["courbe3"] = "#FF0000" # rouge
62couleur_defaut_2_tuple = (0,1,0) 68DEFAUT["couleurs"]["fond"]= "#FFFFFF" # blanc
63couleur_defaut_3_tuple = (1,0,0) 69DEFAUT["couleurs"]["cadretxt"] = "#000000" # noir
70DEFAUT["couleurs"]["grille"] = "#7f7f7f" # gris
71#couleur_defaut_1 = "#0000FF" # bleu
72#couleur_defaut_2 = "#00FF00" # vert
73#couleur_defaut_3 = "#FF0000" # rouge
74CONFIG["couleurs"] = {
75 "courbe1" : (0,0,1),
76 "courbe2" : (0,1,0),
77 "courbe3" : (1,0,0),
78 "fond": (1,1,1),
79 "cadretxt": (0,0,0),
80 "grille": (0.5,0.5,0.5)
81 }
82#couleur_defaut_1_tuple = (0,0,1)
83#couleur_defaut_2_tuple = (0,1,0)
84#couleur_defaut_3_tuple = (1,0,0)
64 85
65# couleurs par défaut fond 86# couleurs par défaut fond
66couleur_defaut_fond = "#FFFFFF" 87#couleur_defaut_fond = "#FFFFFF"
67couleur_defaut_fond_tuple = (1,1,1) 88#couleur_defaut_fond_tuple = (1,1,1)
68couleur_defaut_cadretxt = "#000000" 89#couleur_defaut_cadretxt = "#000000"
69couleur_defaut_cadretxt_tuple = (0,0,0) 90#couleur_defaut_cadretxt_tuple = (0,0,0)
70couleur_defaut_grille = "#7f7f7f" 91#couleur_defaut_grille = "#7f7f7f"
71couleur_defaut_grille_tuple = (0.5,0.5,0.5) 92#couleur_defaut_grille_tuple = (0.5,0.5,0.5)
72 93
73#couleur_defaut_erreur = (0,0,0) # noir 94#couleur_defaut_erreur = (0,0,0) # noir
74 95
75 96
76# initialiser la config 97# initialiser la config
77def config_init(): 98def config_init():
78 return {"largeur": largeur_graphique, 99 c = DEFAUT.copy()
79 "hauteur": hauteur_graphique, 100 c.update({
80 "nb_data":nombre_lignes_form,
81 "age_0": "0j", 101 "age_0": "0j",
82 "legende": "oui", 102 "legende": "oui",
83 "positionlegende": "hg", 103 "positionlegende": "hg",
84 "couleur1": couleur_defaut_1, 104# "couleur1": couleur_defaut_1,
85 "couleur2": couleur_defaut_2, 105# "couleur2": couleur_defaut_2,
86 "couleur3": couleur_defaut_3, 106# "couleur3": couleur_defaut_3,
87 "couleur_fond": couleur_defaut_fond, 107# "couleur_fond": couleur_defaut_fond,
88 "couleur_grille": couleur_defaut_grille, 108# "couleur_grille": couleur_defaut_grille,
89 "couleur_cadretxt": couleur_defaut_cadretxt 109# "couleur_cadretxt": couleur_defaut_cadretxt
90 } 110 })
111
112 return c
91 113
92 114
diff --git a/data_OMS/licence b/data_OMS/LICENSE
index 1e96007..1e96007 100644
--- a/data_OMS/licence
+++ b/data_OMS/LICENSE
diff --git a/gestionOMS.py b/gestionOMS.py
index 5b773d9..cc63432 100644
--- a/gestionOMS.py
+++ b/gestionOMS.py
@@ -46,9 +46,9 @@ def afficheecarttype(z):
46 46
47def renvoie_liste_labels(conf,liste_data_choisie_p,liste_data_choisie_z,liste_err): 47def renvoie_liste_labels(conf,liste_data_choisie_p,liste_data_choisie_z,liste_err):
48 """ fabrique les deux listes de labels OMS""" 48 """ fabrique les deux listes de labels OMS"""
49 #warning(str(liste_data_choisie_p),liste_err) 49 #warning(str(conf),liste_err)
50 liste_data_labels_p = [(nocol,affichepercentile(pc),degrade_choix(conf["couleur1"],conf["couleur2"],conf["couleur3"],pc)) for (nocol,pc) in liste_data_choisie_p] 50 liste_data_labels_p = [(nocol,affichepercentile(pc),degrade_choix(conf["couleurs"]["courbe1"],conf["couleurs"]["courbe2"],conf["couleurs"]["courbe3"],pc)) for (nocol,pc) in liste_data_choisie_p]
51 liste_data_labels_z = [(nocol,afficheecarttype(z),degrade_choix(conf["couleur1"],conf["couleur2"],conf["couleur3"],(z+3)/3*50) ) for (nocol,z) in liste_data_choisie_z] 51 liste_data_labels_z = [(nocol,afficheecarttype(z),degrade_choix(conf["couleurs"]["courbe1"],conf["couleurs"]["courbe2"],conf["couleurs"]["courbe3"],(z+3)/3*50) ) for (nocol,z) in liste_data_choisie_z]
52 return liste_data_labels_p,liste_data_labels_z 52 return liste_data_labels_p,liste_data_labels_z
53 53
54#liste_data_labels= liste_data_labels_z 54#liste_data_labels= liste_data_labels_z
diff --git a/gestion_donnees.py b/gestion_donnees.py
index caacaf0..12afd5a 100644
--- a/gestion_donnees.py
+++ b/gestion_donnees.py
@@ -7,6 +7,7 @@ from gestion_couleurs import *
7import datetime 7import datetime
8import json 8import json
9import unidecode 9import unidecode
10import copy
10 11
11 12
12############ Fonctions de conversion 13############ Fonctions de conversion
@@ -193,13 +194,13 @@ def gere_configuration(data,liste_err):
193 # dimensions du graphique 194 # dimensions du graphique
194 largeur = data.get("largeur","") 195 largeur = data.get("largeur","")
195 if largeur == "": 196 if largeur == "":
196 largeur = largeur_graphique 197 largeur = DEFAUT["largeur_graphique"]
197 else: 198 else:
198 try: 199 try:
199 largeur = int(largeur) 200 largeur = int(largeur)
200 except: 201 except:
201 warning("La largeur "+largeur+"est invalide !",liste_err) 202 warning("La largeur "+largeur+"est invalide !",liste_err)
202 largeur = largeur_graphique 203 largeur = DEFAUT["largeur_graphique"]
203 if largeur > largeur_graphique_max: 204 if largeur > largeur_graphique_max:
204 largeur = largeur_graphique_max 205 largeur = largeur_graphique_max
205 warning("Largeur trop grande !",liste_err) 206 warning("Largeur trop grande !",liste_err)
@@ -210,13 +211,13 @@ def gere_configuration(data,liste_err):
210 211
211 hauteur = data.get("hauteur","") 212 hauteur = data.get("hauteur","")
212 if hauteur == "": 213 if hauteur == "":
213 hauteur = hauteur_graphique 214 hauteur = DEFAUT["hauteur_graphique"]
214 else: 215 else:
215 try: 216 try:
216 hauteur = int(hauteur) 217 hauteur = int(hauteur)
217 except: 218 except:
218 warning("La hauteur "+hauteur+"est invalide !",liste_err) 219 warning("La hauteur "+hauteur+"est invalide !",liste_err)
219 hauteur = hauteur_graphique 220 hauteur = DEFAUT["hauteur_graphique"]
220 if hauteur > hauteur_graphique_max: 221 if hauteur > hauteur_graphique_max:
221 hauteur = hauteur_graphique_max 222 hauteur = hauteur_graphique_max
222 warning("Hauteur trop grande !",liste_err) 223 warning("Hauteur trop grande !",liste_err)
@@ -241,25 +242,33 @@ def gere_configuration(data,liste_err):
241 configuration["positionlegende"] = positionlegende 242 configuration["positionlegende"] = positionlegende
242 243
243 #warning("bla"+data["couleur1"],liste_err) 244 #warning("bla"+data["couleur1"],liste_err)
244 coul1 = rgb_vers_tuple(data.get("couleur1",""),couleur_defaut_1_tuple,liste_err) 245# coul1 = rgb_vers_tuple(data.get("couleur1",""),couleur_defaut_1_tuple,liste_err)
245 coul2 = rgb_vers_tuple(data.get("couleur2",""),couleur_defaut_2_tuple,liste_err) 246# coul2 = rgb_vers_tuple(data.get("couleur2",""),couleur_defaut_2_tuple,liste_err)
246 coul3 = rgb_vers_tuple(data.get("couleur3",""),couleur_defaut_3_tuple,liste_err) 247# coul3 = rgb_vers_tuple(data.get("couleur3",""),couleur_defaut_3_tuple,liste_err)
247 #warning("bla2"+str(coul1),liste_err) 248# #warning("bla2"+str(coul1),liste_err)
248 configuration["couleur1"] = coul1 249# configuration["couleur1"] = coul1
249 configuration["couleur2"] = coul2 250# configuration["couleur2"] = coul2
250 configuration["couleur3"] = coul3 251# configuration["couleur3"] = coul3
251 252
252 # couleur de fond 253 configuration["couleurs"] = {}
253 coul_fond = rgb_vers_tuple(data.get("couleur_fond",""),couleur_defaut_fond_tuple,liste_err) 254 # gérer les couleurs
254 configuration["couleur_fond"] = coul_fond 255 #warning("data : "+str(data),liste_err)
255 256 for clecouleur in DEFAUT["couleurs"]:
256 # couleur d'axes et de texte 257 coul = rgb_vers_tuple(data.get("couleur_"+clecouleur,""),CONFIG["couleurs"][clecouleur],liste_err)
257 coul_cadretxt = rgb_vers_tuple(data.get("couleur_cadretxt",""),couleur_defaut_cadretxt_tuple,liste_err) 258 configuration["couleurs"][clecouleur] = coul
258 configuration["couleur_cadretxt"] = coul_cadretxt
259 259
260 # couleur de la grille 260 #warning("config : "+str(configuration["couleurs"]),liste_err)
261 coul_grille = rgb_vers_tuple(data.get("couleur_grille",""),couleur_defaut_grille_tuple,liste_err) 261 # couleur de fond
262 configuration["couleur_grille"] = coul_grille 262# coul_fond = rgb_vers_tuple(data.get("couleur_fond",""),couleur_defaut_fond_tuple,liste_err)
263# configuration["couleur_fond"] = coul_fond
264#
265# # couleur d'axes et de texte
266# coul_cadretxt = rgb_vers_tuple(data.get("couleur_cadretxt",""),couleur_defaut_cadretxt_tuple,liste_err)
267# configuration["couleur_cadretxt"] = coul_cadretxt
268#
269# # couleur de la grille
270# coul_grille = rgb_vers_tuple(data.get("couleur_grille",""),couleur_defaut_grille_tuple,liste_err)
271# configuration["couleur_grille"] = coul_grille
263 #warning(str(configuration["couleur1"]),liste_err) 272 #warning(str(configuration["couleur1"]),liste_err)
264 273
265 return configuration 274 return configuration
@@ -306,7 +315,7 @@ def gere_donneespoids(data,naissance,liste_err):
306 315
307def donnees_vers_json(l_jours,l_poids,config): 316def donnees_vers_json(l_jours,l_poids,config):
308 """ retourne le json à renvoyer""" 317 """ retourne le json à renvoyer"""
309 gros_dico = config.copy() 318 gros_dico = copy.deepcopy(config)
310 l_jours2 = [convertit_age_vers_texte(d) for d in l_jours] 319 l_jours2 = [convertit_age_vers_texte(d) for d in l_jours]
311 gros_dico["data_j"] = l_jours2 320 gros_dico["data_j"] = l_jours2
312 gros_dico["data_p"] = l_poids 321 gros_dico["data_p"] = l_poids
@@ -316,8 +325,10 @@ def donnees_vers_json(l_jours,l_poids,config):
316 # gérer l'age maxi 325 # gérer l'age maxi
317 gros_dico["maxi"] = convertit_age_vers_texte(gros_dico["maxi"]) 326 gros_dico["maxi"] = convertit_age_vers_texte(gros_dico["maxi"])
318 # gérer les couleurs 327 # gérer les couleurs
319 for cle in ["couleur1", "couleur2", "couleur3", "couleur_fond","couleur_grille","couleur_cadretxt"]: 328# for cle in ["couleur1", "couleur2", "couleur3", "couleur_fond","couleur_grille","couleur_cadretxt"]:
320 gros_dico[cle] = tuple_vers_rgb(gros_dico[cle]) 329# gros_dico[cle] = tuple_vers_rgb(gros_dico[cle])
330 for clecouleur in DEFAUT["couleurs"]:
331 gros_dico["couleurs"][clecouleur] = tuple_vers_rgb(gros_dico["couleurs"][clecouleur])
321 332
322 333
323 334
@@ -341,7 +352,7 @@ def fichier_json_vers_configdonnees(fichier,liste_err):
341 valform["age_"+str(i)] = l_jours[i] 352 valform["age_"+str(i)] = l_jours[i]
342 valform["poids_"+str(i)] = l_poids[i] 353 valform["poids_"+str(i)] = l_poids[i]
343 354
344 valform["nb_data"] = max(long +2,nombre_lignes_form) 355 valform["nb_data"] = max(long +2,DEFAUT["nb_data"])
345 356
346 return valform 357 return valform
347 358
diff --git a/licence b/licence
deleted file mode 100644
index f9241d4..0000000
--- a/licence
+++ /dev/null
@@ -1,20 +0,0 @@
1Copyright (c) 2020 Denise Maurice
2
3Permission is hereby granted, free of charge, to any person obtaining a copy
4of this software and associated documentation files (the "Software"), to deal
5in the Software without restriction, including without limitation the rights
6to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7copies of the Software, and to permit persons to whom the Software is
8furnished to do so, subject to the following conditions:
9
10The above copyright notice and this permission notice shall be included in all
11copies or substantial portions of the Software.
12
13THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19SOFTWARE.
20
diff --git a/templates/apropos.html b/templates/apropos.html
index 9f2b076..b3c5199 100644
--- a/templates/apropos.html
+++ b/templates/apropos.html
@@ -5,6 +5,6 @@
5 5
6<p>Ces données, ainsi que ce site web, sont sous licence <a href="https://creativecommons.org/licenses/by-nc-sa/3.0/igo/">CC BY-NC-SA 3.0 IGO</a></p> 6<p>Ces données, ainsi que ce site web, sont sous licence <a href="https://creativecommons.org/licenses/by-nc-sa/3.0/igo/">CC BY-NC-SA 3.0 IGO</a></p>
7 7
8<p>Le code source (<a href="https://fr.wikipedia.org/wiki/Licence_MIT">licence MIT</a> sauf en ce qui concerne les données) est disponible là.</p> 8<p>Le code source (<a href="https://fr.wikipedia.org/wiki/Licence_MIT">licence MIT (licence X11)</a> sauf en ce qui concerne les données de l'OMS) est disponible <href="https://git.immae.eu/?p=perso/Denise/oms.git">là</href>.</p>
9 9
10{% endblock %} 10{% endblock %}
diff --git a/templates/base.html b/templates/base.html
index 694266c..8b96c17 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -32,9 +32,11 @@
32 <hr> 32 <hr>
33 33
34 <nav><a href="/">Accueil et saisie des données</a> | 34 <nav><a href="/">Accueil et saisie des données</a> |
35 <a href="/apropos">À propos</a> |
36 <a href="/faq">FAQ</a> | 35 <a href="/faq">FAQ</a> |
36 <a href="/contact">Contact</a> |
37 <a href="/apropos">À propos</a> |
37 <a href="/changelog">Changelog</a> 38 <a href="/changelog">Changelog</a>
39
38 </nav> 40 </nav>
39 41
40 </body> 42 </body>
diff --git a/templates/contact.html b/templates/contact.html
new file mode 100644
index 0000000..c4a54e8
--- /dev/null
+++ b/templates/contact.html
@@ -0,0 +1,14 @@
1{% extends "base.html" %}
2{% block contenu %}
3<p>Si vous avez une question, un commentaire, une idée, vous pouvez me contacter à l'adresse suivante : </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>
5
6<p><strong>Merci</strong> à celles et ceux qui m'ont aidée à mettre en place cet outil :
7<ul>
8 <li>immae pour l'hébergement et l'aide technique,</li>
9 <li>cerise pour le coup de peinture sur la façade,</li>
10 <li>arcanmster pour le côté "je tape partout pour voir si ça casse",</li>
11 <li>les bêta-testeuses enthousiastes du forum LLL, entre autres MmeMarguerite, Maman-chat, bloom et Nerialka</li>
12</ul></p>
13
14{% endblock %}
diff --git a/templates/index.html b/templates/index.html
index 2b1b82b..3404f22 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -29,8 +29,8 @@
29<h3>Informations sur l'enfant</h3> 29<h3>Informations sur l'enfant</h3>
30<ul> 30<ul>
31<li><label>Nom de l'enfant&nbsp;:</label> <input type="text" name="nom" value="{{ valform.nom }}"></li> 31<li><label>Nom de l'enfant&nbsp;:</label> <input type="text" name="nom" value="{{ valform.nom }}"></li>
32<li><label>Sexe&nbsp;:</label> <input type="radio" name="sexe" value="F" {%if valform.sexe == "F" %}checked{% endif %}> féminin 32<li><label>Sexe&nbsp;:</label> <label><input type="radio" name="sexe" value="F" {%if valform.sexe == "F" %}checked{% endif %}> féminin </label>
33| <input type="radio" name="sexe" value="M" {%if valform.sexe == "M"%} checked {% endif %}> masculin | <input type="radio" name="sexe" value="N" {%if valform.sexe == "N"%} checked {% endif %}> neutre (expérimental)</li> 33| <label><input type="radio" name="sexe" value="M" {%if valform.sexe == "M"%} checked {% endif %}> masculin</label> | <label><input type="radio" name="sexe" value="N" {%if valform.sexe == "N"%} checked {% endif %}> neutre (expérimental)</label></li>
34<li><label>Date de naissance&nbsp;: </label> <input type="date" name="naissance" value="{{ valform.naissance }}"></li> 34<li><label>Date de naissance&nbsp;: </label> <input type="date" name="naissance" value="{{ valform.naissance }}"></li>
35</ul> 35</ul>
36 36
@@ -65,29 +65,29 @@
65<div class="bouton" onclick="affiche_cache('pref_graphique',this)">Afficher</div> 65<div class="bouton" onclick="affiche_cache('pref_graphique',this)">Afficher</div>
66 66
67<ul id="pref_graphique"> 67<ul id="pref_graphique">
68 <li><label>Type de courbe&nbsp;:</label> <input type="radio" name="typecourbe" value="P" 68 <li><label>Type de courbe&nbsp;:</label> <label><input type="radio" name="typecourbe" value="P"
69 {% if valform.typecourbe == "P" or valform.typecourbe is not defined %} checked {% endif %}> Percentiles | <input type="radio" name="typecourbe" value="Z" 69 {% if valform.typecourbe == "P" or valform.typecourbe is not defined %} checked {% endif %}> Percentiles</label> | <label><input type="radio" name="typecourbe" value="Z"
70 {% if valform.typecourbe == "Z" %} checked {% endif %}> Moyenne et écarts-type</li> 70 {% if valform.typecourbe == "Z" %} checked {% endif %}> Moyenne et écarts-type</label></li>
71 <li><label>Grille&nbsp;: </label><input type="checkbox" name="grille" {%if valform.grille == "oui" or valform.grille is not defined %} checked {% endif %}></li> 71 <li><label>Grille&nbsp;: <input type="checkbox" name="grille" {%if valform.grille == "oui" or valform.grille is not defined %} checked {% endif %}></label></li>
72 <li><label>Unité&nbsp;: </label> 72 <li><label>Unité&nbsp;:
73 <select name="unite"> 73 <select name="unite">
74 <option value="" {% if valform.typecourbe == "" or valform is not defined %} selected {%endif %}>Par défaut</option> 74 <option value="" {% if valform.typecourbe == "" or valform is not defined %} selected {%endif %}>Par défaut</option>
75 {% for unite in ['jours','semaines','mois','années'] %} 75 {% for unite in ['jours','semaines','mois','années'] %}
76 <option value="{{ unite }}"{% if valform.unite == unite %} selected {% endif %} >{{ unite }}</option> 76 <option value="{{ unite }}"{% if valform.unite == unite %} selected {% endif %} >{{ unite }}</option>
77 {% endfor %} 77 {% endfor %}
78 </select></li> 78 </select></label></li>
79 <li><label>valeur maximum du graphique (facultatif, syntaxe similaire à l'âge) </label><input type="text" name="maxi" value="{{ valform.maxi }}"></li> 79 <li><label>valeur maximum du graphique (facultatif, syntaxe similaire à l'âge) </label><input type="text" name="maxi" value="{{ valform.maxi }}"></li>
80 <li>Dimensions du graphique&nbsp;: <label>largeur&nbsp;: </label><input type="text" name="largeur" value="{{ valform.largeur }}"> 80 <li>Dimensions du graphique&nbsp;: <label>largeur&nbsp;: </label><input type="text" name="largeur" value="{{ valform.largeur }}">
81 <label>hauteur&nbsp;: </label><input type="text" name="hauteur" value="{{ valform.hauteur }}"></li> 81 <label>hauteur&nbsp;: </label><input type="text" name="hauteur" value="{{ valform.hauteur }}"></li>
82 <li><label>Légende&nbsp;: </label><input type="checkbox" name="legende" {% if valform.legende == 'oui' %} checked{% endif %}> 82 <li><label>Légende&nbsp;: <input type="checkbox" name="legende" {% if valform.legende == 'oui' %} checked{% endif %}> </label>
83Position&nbsp;: <select name="positionlegende"> 83<label>Position&nbsp;: <select name="positionlegende">
84{%for (pos,posnom) in [('upper left','Haut gauche'),('upper right','Haut Droite'),('lower left','Bas gauche'),('lower right','Bas droite')] %} 84{%for (pos,posnom) in [('upper left','Haut gauche'),('upper right','Haut Droite'),('lower left','Bas gauche'),('lower right','Bas droite')] %}
85<option value="{{ pos }}">{{ posnom }}</option> 85<option value="{{ pos }}">{{ posnom }}</option>
86{% endfor %} 86{% endfor %}
87</select> 87</select></label>
88 </li> 88 </li>
89 <li>Couleur courbe du bas <input type="color" name="couleur1" value="{{ valform.couleur1 }}"> | Couleur courbe du milieu <input type="color" name="couleur2" value="{{ valform.couleur2 }}"> | Couleur courbe du haut <input type="color" name="couleur3" value="{{ valform.couleur3 }}"> </li> 89 <li>Couleur courbe du bas <input type="color" name="couleur_courbe1" value="{{ valform.couleurs.courbe1 }}"> | Couleur courbe du milieu <input type="color" name="couleur_courbe2" value="{{ valform.couleurs.courbe2 }}"> | Couleur courbe du haut <input type="color" name="couleur_courbe3" value="{{ valform.couleurs.courbe3 }}"> </li>
90 <li>Couleur du fond <input type="color" name="couleur_fond" value="{{ valform.couleur_fond }}"> | Couleur de la grille <input type="color" name="couleur_grille" value="{{ valform.couleur_grille }}"> | Couleur des axes, texte et courbe <input type="color" name="couleur_cadretxt" value="{{ valform.couleur_cadretxt }}"></li> 90 <li>Couleur du fond <input type="color" name="couleur_fond" value="{{ valform.couleurs.fond }}"> | Couleur de la grille <input type="color" name="couleur_grille" value="{{ valform.couleurs.grille }}"> | Couleur des axes, texte et courbe <input type="color" name="couleur_cadretxt" value="{{ valform.couleurs.cadretxt }}"></li>
91</ul> 91</ul>
92 92
93 93
diff --git a/trace_courbe.py b/trace_courbe.py
index c86dbd9..fccb657 100644
--- a/trace_courbe.py
+++ b/trace_courbe.py
@@ -7,7 +7,7 @@ from gestion_unites import *
7import matplotlib.pyplot as plt 7import matplotlib.pyplot as plt
8 8
9def cree_figure(conf,l_jours,l_poids,liste_err): 9def cree_figure(conf,l_jours,l_poids,liste_err):
10 #warning("debut de cree_figure",liste_err) 10 #warning("debut de cree_figure"+str(conf),liste_err)
11 try: 11 try:
12 liste_data_labels_p,liste_data_labels_z = renvoie_liste_labels(conf,liste_data_choisie_p,liste_data_choisie_z,liste_err) 12 liste_data_labels_p,liste_data_labels_z = renvoie_liste_labels(conf,liste_data_choisie_p,liste_data_choisie_z,liste_err)
13 except: 13 except:
@@ -86,13 +86,13 @@ def cree_figure(conf,l_jours,l_poids,liste_err):
86 86
87 87
88 #### La figure 88 #### La figure
89 fig = plt.figure(num=None, figsize=(conf["largeur"], conf["hauteur"]), dpi=100, facecolor=conf["couleur_fond"]) 89 fig = plt.figure(num=None, figsize=(conf["largeur"], conf["hauteur"]), dpi=100, facecolor=conf["couleurs"]["fond"])
90 plt.rcParams['axes.facecolor'] = conf["couleur_fond"] 90 plt.rcParams['axes.facecolor'] = conf["couleurs"]["fond"]
91 plt.rcParams['axes.edgecolor']= conf["couleur_cadretxt"] 91 plt.rcParams['axes.edgecolor']= conf["couleurs"]["cadretxt"]
92 plt.rcParams['xtick.color'] = conf["couleur_cadretxt"] 92 plt.rcParams['xtick.color'] = conf["couleurs"]["cadretxt"]
93 plt.rcParams['ytick.color'] = conf["couleur_cadretxt"] 93 plt.rcParams['ytick.color'] = conf["couleurs"]["cadretxt"]
94 plt.rcParams['grid.color'] = conf["couleur_grille"] 94 plt.rcParams['grid.color'] = conf["couleurs"]["grille"]
95 plt.rcParams['legend.edgecolor'] = conf["couleur_grille"] 95 plt.rcParams['legend.edgecolor'] = conf["couleurs"]["grille"]
96 96
97 #warning("bla"+str(liste_data_labels),liste_err) 97 #warning("bla"+str(liste_data_labels),liste_err)
98 for (i,label,couleur) in liste_data_labels: 98 for (i,label,couleur) in liste_data_labels:
@@ -121,14 +121,14 @@ def cree_figure(conf,l_jours,l_poids,liste_err):
121 if l_jours != []: 121 if l_jours != []:
122 plt.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleur_cadretxt"],marker='o') 122 plt.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleur_cadretxt"],marker='o')
123 123
124 plt.xlabel("Âge en "+conf["unite"],color=conf["couleur_cadretxt"]) 124 plt.xlabel("Âge en "+conf["unite"],color=conf["couleurs"]["cadretxt"])
125 plt.ylabel("Poids en kg",color=conf["couleur_cadretxt"]) 125 plt.ylabel("Poids en kg",color=conf["couleurs"]["cadretxt"])
126 plt.title(titre,color=conf["couleur_cadretxt"]) 126 plt.title(titre,color=conf["couleurs"]["cadretxt"])
127 plt.axis([0,age_maxi,poids_min,poids_max]) 127 plt.axis([0,age_maxi,poids_min,poids_max])
128 128
129 if conf['legende']=="oui": 129 if conf['legende']=="oui":
130 legende = plt.legend(loc=conf['positionlegende']) 130 legende = plt.legend(loc=conf['positionlegende'])
131 plt.setp(legende.get_texts(), color=conf["couleur_cadretxt"]) 131 plt.setp(legende.get_texts(), color=conf["couleurs"]["cadretxt"])
132 plt.grid(conf["grille"]=="oui") 132 plt.grid(conf["grille"]=="oui")
133 133
134 fig.tight_layout() 134 fig.tight_layout()