summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app.py12
-rw-r--r--configuration.py1
-rw-r--r--data/FAQ_data.txt7
-rw-r--r--data/changelog_data.txt6
-rw-r--r--faq.py9
-rw-r--r--gestion_donnees.py18
-rw-r--r--static/requetes.js3
-rw-r--r--templates/contact.html2
-rw-r--r--templates/faq.html6
-rw-r--r--templates/index.html4
-rw-r--r--trace_courbe.py23
11 files changed, 67 insertions, 24 deletions
diff --git a/app.py b/app.py
index 428416e..f60d3e2 100644
--- a/app.py
+++ b/app.py
@@ -71,6 +71,11 @@ def courbe_image(ext):
71 71
72 # noter le nom de l'enfant pour l'export 72 # noter le nom de l'enfant pour l'export
73 nomenfant = donnees.simplifie_nom(config['nom']) 73 nomenfant = donnees.simplifie_nom(config['nom'])
74 # Les noms des autres enfants c'est sympa
75 nomsenfantsplus = ""
76 for dicoenfant in enfants_add:
77 nomsenfantsplus += "_"+donnees.simplifie_nom(dicoenfant["poids"][0]["nom"])
78
74 existe_courbe = False 79 existe_courbe = False
75 # créer les figures 80 # créer les figures
76 try: 81 try:
@@ -101,7 +106,8 @@ def courbe_image(ext):
101 if ext == "b64": 106 if ext == "b64":
102 reponse = { "result":result, 107 reponse = { "result":result,
103 "export_txt": texte, 108 "export_txt": texte,
104 "nomenfant": nomenfant} 109 "nomenfant": nomenfant,
110 "nomsenfantsplus": nomsenfantsplus}
105 if result == "success": 111 if result == "success":
106 reponse["messages"] = liste_err[0]+liste_err[1] 112 reponse["messages"] = liste_err[0]+liste_err[1]
107 reponse["calculextra"] = liste_extracalculs 113 reponse["calculextra"] = liste_extracalculs
@@ -132,9 +138,9 @@ def faq():
132 beta=initialise_mode_beta() 138 beta=initialise_mode_beta()
133 139
134 table_faq = f.lire_fichier_csv_simple(f.fichier_FAQ) 140 table_faq = f.lire_fichier_csv_simple(f.fichier_FAQ)
135 l_categ,table_qr = f.extraire_tables_par_cat(table_faq) 141 l_categ, l_categsimple, table_qr = f.extraire_tables_par_cat(table_faq)
136 142
137 return flask.render_template("faq.html",lcateg=l_categ,tableqr=table_qr,err=[], beta=beta) 143 return flask.render_template("faq.html",lcateg=l_categ,lcategsimple= l_categsimple, tableqr=table_qr,err=[], beta=beta)
138 144
139@app.route("/changelog") 145@app.route("/changelog")
140def changelog(): 146def changelog():
diff --git a/configuration.py b/configuration.py
index 4ad42e6..7b1d7c5 100644
--- a/configuration.py
+++ b/configuration.py
@@ -47,6 +47,7 @@ CONFIG["fichiersOMS"]["taille"] = {
47 "z_mixte": "lhfa_mix_z_exp.txt", 47 "z_mixte": "lhfa_mix_z_exp.txt",
48 } 48 }
49 49
50CONFIG["voyelles"] = ["a", "e", "i", "o", "u", "y"]
50 51
51# ajouter le chemin 52# ajouter le chemin
52for typed in CONFIG["liste_typedonnees"]: 53for typed in CONFIG["liste_typedonnees"]:
diff --git a/data/FAQ_data.txt b/data/FAQ_data.txt
index cbc3a56..605ca7f 100644
--- a/data/FAQ_data.txt
+++ b/data/FAQ_data.txt
@@ -12,12 +12,12 @@ Si vous manquez de lignes, vous pouvez cliquer sur ""Ajouter des lignes"" pour a
12"Utilisation - préférences du graphique","Pourquoi tracer des courbes vides ?","Cela peut servir à tracer une courbe de référence à imprimer pour tracer la courbe à la main. Cette option est désactivée par défaut." 12"Utilisation - préférences du graphique","Pourquoi tracer des courbes vides ?","Cela peut servir à tracer une courbe de référence à imprimer pour tracer la courbe à la main. Cette option est désactivée par défaut."
13 13
14"Utilisation - préférences du graphique","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. ;) 14"Utilisation - préférences du graphique","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. ;)
15<br>Pour les curieuses et les curieux : 15<br>Pour les curieuses et les curieux :</p>
16<ul> 16<ul>
17<li>Médiane et percentiles : si votre enfant est (par exemple) au 30e percentile, cela signifie qu'il est dans la 30e «&nbsp;tranche&nbsp;» 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> 17<li>Médiane et percentiles : si votre enfant est (par exemple) au 30e percentile, cela signifie qu'il est dans la 30e «&nbsp;tranche&nbsp;» 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>
18<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é &sigma;) est une sorte d'«&nbsp;écart moyen&nbsp;» à la moyenne. On regarde donc généralement la moyenne, la moyenne + 1&sigma;, moyenne +2&sigma;, moyenne -1 &sigma;, etc. <a href=""https://fr.wikipedia.org/wiki/%C3%89cart_type"">Plus d'infos (maths)</a></li> 18<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é &sigma;) est une sorte d'«&nbsp;écart moyen&nbsp;» à la moyenne. On regarde donc généralement la moyenne, la moyenne + 1&sigma;, moyenne +2&sigma;, moyenne -1 &sigma;, etc. <a href=""https://fr.wikipedia.org/wiki/%C3%89cart_type"">Plus d'infos (maths)</a></li>
19</ul> 19</ul>
20Si la répartition des données est «&nbsp;bonne&nbsp;» (on parle de gaussienne entre matheuses et matheux), alors la moyenne correspond à la médiane, la moyenne + 1&sigma; correspond environ au 84e percentile, la moyenne -1&sigma; correspond au 16e percentile. Pour ces données, il semble que ce soit assez proche d'une gaussienne." 20<p>Si la répartition des données est «&nbsp;bonne&nbsp;» (on parle de gaussienne entre matheuses et matheux), alors la moyenne correspond à la médiane, la moyenne + 1&sigma; correspond environ au 84e percentile, la moyenne -1&sigma; correspond au 16e percentile. Pour ces données, il semble que ce soit assez proche d'une gaussienne."
21 21
22"Utilisation - préférences du graphique","Que signifie même échelle d'âge sur tous les graphiques&nbsp;?","Si, par exemple, vous avez des données de poids qui vont jusqu'à 2 ans et des données de taille qui vont jusqu'à 6 mois, alors chaque graphique (taille et poids) aura son échelle différente. Mais si vous cochez la case, alors tous seront sur une échelle similaire (c'est-à-dire jusqu'à 2 ans et un peu plus). Si vous saisissez un âge maximum du graphique, c'est cette limite maximum qui sera appliquée sur tous les graphiques." 22"Utilisation - préférences du graphique","Que signifie même échelle d'âge sur tous les graphiques&nbsp;?","Si, par exemple, vous avez des données de poids qui vont jusqu'à 2 ans et des données de taille qui vont jusqu'à 6 mois, alors chaque graphique (taille et poids) aura son échelle différente. Mais si vous cochez la case, alors tous seront sur une échelle similaire (c'est-à-dire jusqu'à 2 ans et un peu plus). Si vous saisissez un âge maximum du graphique, c'est cette limite maximum qui sera appliquée sur tous les graphiques."
23 23
@@ -39,6 +39,7 @@ S'il y a plusieurs données, alors on cherche dans quel intervalle de courbes el
39 39
40"Utilisation - courbes multiples","C'est quoi les courbes multiples&nbsp;?","Vous pouvez souhaiter tracer sur une même courbe de poids (par exemple) l'évolution du poids de deux (ou plus) enfants, du même âge ou d'âges différents. Pour cela, il faut avoir déjà sous forme de fichier les données des enfants additionnels. Seuls le nom de l'enfant et ses données sont extraites, les paramètres du graphiques seront ceux définis plus haut (donc pour l'enfant «&nbsp;principal&nbsp;»). C'est pourquoi vous pouvez choisir un symbole et une couleur pour chacun des graphiques additionnels. Par contre ces paramètres ne sont pas sauvegardés (seuls ceux de l'enfant «&nbsp;principal&nbsp;» le sont)." 40"Utilisation - courbes multiples","C'est quoi les courbes multiples&nbsp;?","Vous pouvez souhaiter tracer sur une même courbe de poids (par exemple) l'évolution du poids de deux (ou plus) enfants, du même âge ou d'âges différents. Pour cela, il faut avoir déjà sous forme de fichier les données des enfants additionnels. Seuls le nom de l'enfant et ses données sont extraites, les paramètres du graphiques seront ceux définis plus haut (donc pour l'enfant «&nbsp;principal&nbsp;»). C'est pourquoi vous pouvez choisir un symbole et une couleur pour chacun des graphiques additionnels. Par contre ces paramètres ne sont pas sauvegardés (seuls ceux de l'enfant «&nbsp;principal&nbsp;» le sont)."
41 41
42"Utilisation - courbes multiples","C'est quoi l'alias&nbsp;?","Vous avez enregistré un fichier de données d'un autre enfant, à son vrai nom, et vous voulez tracer des courbes multiples mais avec un surnom car vous avez l'intention de rendre cette courbe publique&nbsp;: vous pouvez mettre le surnom ici. Si vous laissez ce champ vide, le nom de l'enfant enregistré dans le fichier sera utilisé. Si vous n'avez pas très bien compris, essayez et vous verrez&nbsp;!"
42 43
43"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é." 44"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é."
44 45
@@ -70,6 +71,8 @@ Vous trouverez <a href=""static/courbe_oms_gf_1an.png"">ici</a> et <a href=""sta
70 71
71"Technique","Quelle est la technologie utilisée derrière ?","Il s'agit de <a href=""https://flask.palletsprojects.com/en/1.1.x/"">flask</a>, un petit framework de développement web en <a href=""https://www.python.org/"">python</a>. Il y a une petite dose de <a href=""https://developer.mozilla.org/fr/docs/Web/JavaScript"">JavaScript</a> pour assaisonner le tout, et voilà." 72"Technique","Quelle est la technologie utilisée derrière ?","Il s'agit de <a href=""https://flask.palletsprojects.com/en/1.1.x/"">flask</a>, un petit framework de développement web en <a href=""https://www.python.org/"">python</a>. Il y a une petite dose de <a href=""https://developer.mozilla.org/fr/docs/Web/JavaScript"">JavaScript</a> pour assaisonner le tout, et voilà."
72 73
74"Technique","Quand je clique sur ""Je veux les courbes"" je reste sur le message ""Calcul en cours"" mais rien ne se passe...","C'est un vilain bug, voir ci-dessous pour la marche à suivre !"
75
73"Technique","J'ai trouvé un affreux bug !","N'hésitez pas à me contacter avec le plus de détails possibles à ce sujet. Par exemple quelles données, quelles manipulations vous ont amené.e à ce bug. Vous pouvez aussi préciser votre navigateur. Plus vous me fournissez d'informations, plus j'ai de chances de résoudre le bug !" 76"Technique","J'ai trouvé un affreux bug !","N'hésitez pas à me contacter avec le plus de détails possibles à ce sujet. Par exemple quelles données, quelles manipulations vous ont amené.e à ce bug. Vous pouvez aussi préciser votre navigateur. Plus vous me fournissez d'informations, plus j'ai de chances de résoudre le bug !"
74 77
75"Technique","J'ai envie d'aider à trouver les bugs !","Il y a la version bêta du site <a href=""https://beta.oms.syanni.eu"">ici</a>. Si la bêta est en avance sur le site de production, c'est qu'il y a des choses à tester et des bugs à chasser (vérifier le changelog pour comparer les versions)." 78"Technique","J'ai envie d'aider à trouver les bugs !","Il y a la version bêta du site <a href=""https://beta.oms.syanni.eu"">ici</a>. Si la bêta est en avance sur le site de production, c'est qu'il y a des choses à tester et des bugs à chasser (vérifier le changelog pour comparer les versions)."
diff --git a/data/changelog_data.txt b/data/changelog_data.txt
index 4fa79d6..229bdb2 100644
--- a/data/changelog_data.txt
+++ b/data/changelog_data.txt
@@ -1,9 +1,13 @@
1"Version 2.6","28/05/2022","<p>Des petites nouveautés :</p> 1"Version 2.6","19/07/2022","<p>Des petites nouveautés :</p>
2<ul> 2<ul>
3 <li>Les dates sont désormais prioritaires sur les âges pour éviter les soucis d'arrondis.</li> 3 <li>Les dates sont désormais prioritaires sur les âges pour éviter les soucis d'arrondis.</li>
4 <li>Il est également possible de mettre une date sur un repère (et de repérer une date précise).</li> 4 <li>Il est également possible de mettre une date sur un repère (et de repérer une date précise).</li>
5 <li>On peut également utiliser les dates pour les extrapolations (telle date l'enfant pèsera tant...)</li> 5 <li>On peut également utiliser les dates pour les extrapolations (telle date l'enfant pèsera tant...)</li>
6 <li>Un bug corrigé : si on demande une taille de graphique supérieure à l'âge max des données OMS (5 ans), ça ne fait pas planter l'extrapolation (le tracé d'extrapolation s'arrêtera juste à 5 ans).</li> 6 <li>Un bug corrigé : si on demande une taille de graphique supérieure à l'âge max des données OMS (5 ans), ça ne fait pas planter l'extrapolation (le tracé d'extrapolation s'arrêtera juste à 5 ans).</li>
7
8 <li>On peut choisir un ""alias"" pour les noms des enfants pour les courbes d'autres enfants. Pratique quand on a le fichier enregistré à un nom et qu'on veut poster la courbe sur un forum public (sans le nom).</li>
9 <li>Petite amélioration sur le titre des courbes et des fichiers quand on a plusieurs enfants.</li>
10 <li>Un peu de ménage par-ci, par-là...</li>
7</ul>" 11</ul>"
8 12
9"Version 2.501","14/05/2022","<p>Petit bug mineur corrigé : si on met une donnée avec une date inférieure à la date de naissance, elle est ignorée et un petit message s'affiche.</p>" 13"Version 2.501","14/05/2022","<p>Petit bug mineur corrigé : si on met une donnée avec une date inférieure à la date de naissance, elle est ignorée et un petit message s'affiche.</p>"
diff --git a/faq.py b/faq.py
index 09cd9f3..45f28d6 100644
--- a/faq.py
+++ b/faq.py
@@ -8,7 +8,7 @@ chemin_data = "data/"
8 8
9fichier_FAQ = chemin_data+"FAQ_data.txt" 9fichier_FAQ = chemin_data+"FAQ_data.txt"
10fichier_changelog = chemin_data+"changelog_data.txt" 10fichier_changelog = chemin_data+"changelog_data.txt"
11 11from gestion_donnees import simplifie_nom
12 12
13 13
14def lire_fichier_csv_simple(fichier): 14def lire_fichier_csv_simple(fichier):
@@ -31,9 +31,10 @@ def extraire_categories(table):
31 return liste_cat 31 return liste_cat
32 32
33def extraire_tables_par_cat(table): 33def extraire_tables_par_cat(table):
34 """ construit deux tables : une de catégories, une de tables de (q,r) 34 """ construit trois tables : une de catégories, une de tables de (q,r), une de catégories simplifées
35 categ[i] va correspondre à tableqr[i] en terme de catégorie""" 35 categ[i] et categsimple[i] vont correspondre à tableqr[i] en terme de catégorie"""
36 categ = extraire_categories(table) 36 categ = extraire_categories(table)
37 categsimple = [ simplifie_nom(cat) for cat in categ ]
37 tableqr = [ [] for i in range(len(categ)) ] 38 tableqr = [ [] for i in range(len(categ)) ]
38 39
39 for ligne in table: 40 for ligne in table:
@@ -45,4 +46,4 @@ def extraire_tables_par_cat(table):
45 except: 46 except:
46 print("Impossible de lire la ligne : "+str(ligne)) 47 print("Impossible de lire la ligne : "+str(ligne))
47 48
48 return (categ,tableqr) 49 return (categ, categsimple, tableqr)
diff --git a/gestion_donnees.py b/gestion_donnees.py
index eab75e9..b508706 100644
--- a/gestion_donnees.py
+++ b/gestion_donnees.py
@@ -90,7 +90,7 @@ def calcule_max_graphique(l_jours):
90 90
91def simplifie_nom(chaine): 91def simplifie_nom(chaine):
92 """ simplifie le nom chaine afin d'en faire une extension 92 """ simplifie le nom chaine afin d'en faire une extension
93 pour le nom du fichier. Met tout en minuscules et vire les caractères spéciaux 93 pour le nom du fichier. Vire les caractères spéciaux
94 et max 15 caractères""" 94 et max 15 caractères"""
95 chaine2 = "" 95 chaine2 = ""
96 for l in chaine: 96 for l in chaine:
@@ -141,12 +141,14 @@ def convertit_date_vers_python(chaine,liste_err):
141 warning("La date : "+chaine+" est invalide !",liste_err) 141 warning("La date : "+chaine+" est invalide !",liste_err)
142 return "" 142 return ""
143 else: 143 else:
144 print(liste_err)
145
144 debug("Conversion de la date "+chaine+". Découpage : "+str(liste),liste_err) 146 debug("Conversion de la date "+chaine+". Découpage : "+str(liste),liste_err)
145 try: 147 try:
146 date = datetime.date(int(liste[0]),int(liste[1]),int(liste[2])) 148 date = datetime.date(int(liste[0]),int(liste[1]),int(liste[2]))
147 except: 149 except:
148 date = "" 150 date = ""
149 warning("Impossible de lire la date "+chaine+". Format accepté : aaaa-mm-jj",liste_err) 151 warning("Impossible de lire la date "+chaine+". Format accepté : aaaa-mm-jj ou aaaa/mm/jj",liste_err)
150 return date 152 return date
151 153
152# python -> json 154# python -> json
@@ -356,7 +358,7 @@ def gere_configuration(data,liste_err, court=False):
356 358
357 configuration["non_sauve"]["calculextradata_type"] = data.get("calculextradata_type","") 359 configuration["non_sauve"]["calculextradata_type"] = data.get("calculextradata_type","")
358 age = convertit_jours_vers_python(data.get("calculextradata_age","0j"),liste_err) 360 age = convertit_jours_vers_python(data.get("calculextradata_age","0j"),liste_err)
359 date = convertit_date_vers_python(data.get("calculextradata_date", ""), [[],[]]) 361 date = convertit_date_vers_python(data.get("calculextradata_date", ""), liste_err)
360 agecalcule = delta_date(date, configuration["naissance"], liste_err) 362 agecalcule = delta_date(date, configuration["naissance"], liste_err)
361 if configuration["naissance"] != "" and agecalcule != -1: # On garde plutôt la date 363 if configuration["naissance"] != "" and agecalcule != -1: # On garde plutôt la date
362 configuration["non_sauve"]["calculextradata_age"] = agecalcule 364 configuration["non_sauve"]["calculextradata_age"] = agecalcule
@@ -437,7 +439,10 @@ def gere_donnees(data,naissance,typedonnee,liste_err):
437 439
438 ## Si une date est saisie, on la prend en priorité car c'est des entiers et les entiers c'est BIEN 440 ## Si une date est saisie, on la prend en priorité car c'est des entiers et les entiers c'est BIEN
439 date = data.get("date_"+str(i),"") 441 date = data.get("date_"+str(i),"")
440 datep = convertit_date_vers_python(date,liste_err) 442 if date != "":
443 datep = convertit_date_vers_python(date,liste_err)
444 else:
445 datep = ""
441 446
442 if naissance != "" and datep != "": # On ne peut pas calculer l'âge si on n'a pas ces deux données 447 if naissance != "" and datep != "": # On ne peut pas calculer l'âge si on n'a pas ces deux données
443 age = delta_date(datep,naissance, liste_err) 448 age = delta_date(datep,naissance, liste_err)
@@ -490,6 +495,11 @@ def gere_enfants_additionnels(data, files, liste_err):
490 # Le symbole et la couleur 495 # Le symbole et la couleur
491 symb2 = gere_symbole(data.get("symbole_donnees_"+str(i))) 496 symb2 = gere_symbole(data.get("symbole_donnees_"+str(i)))
492 coul2 = rgb_vers_tuple(data.get("couleur_donnees_"+str(i),""),CONFIG["couleurs"]["cadretxt"],liste_err) 497 coul2 = rgb_vers_tuple(data.get("couleur_donnees_"+str(i),""),CONFIG["couleurs"]["cadretxt"],liste_err)
498 alias = data.get("alias_"+str(i), "")
499 if alias != "": # Si l'alias n'est pas vide, il remplace le prénom
500 print(conf2)
501 conf2["nom"] = alias
502
493 enfant2 = eclate_donnees_additionnelles(conf2, ljours2, listes_donnees2, symb2, coul2) 503 enfant2 = eclate_donnees_additionnelles(conf2, ljours2, listes_donnees2, symb2, coul2)
494 enfants_add.append(enfant2) 504 enfants_add.append(enfant2)
495 i+=1 505 i+=1
diff --git a/static/requetes.js b/static/requetes.js
index d374213..faa8706 100644
--- a/static/requetes.js
+++ b/static/requetes.js
@@ -21,6 +21,7 @@ function appelle_image()
21 var liste_warnings = this.response.messages 21 var liste_warnings = this.response.messages
22 var texte = this.response.export_txt; 22 var texte = this.response.export_txt;
23 var nomenfant = this.response.nomenfant ; 23 var nomenfant = this.response.nomenfant ;
24 var nomsenfantsplus = this.response.nomsenfantsplus ;
24 var calculextra = this.response.calculextra ; 25 var calculextra = this.response.calculextra ;
25 26
26 // on affiche l'export des données 27 // on affiche l'export des données
@@ -41,7 +42,7 @@ function appelle_image()
41 document.getElementById('courbe_poids').src = 'data:image/png;base64,'+(image_poids); 42 document.getElementById('courbe_poids').src = 'data:image/png;base64,'+(image_poids);
42 document.getElementById('courbe_poids').alt = 'Courbe de poids de '+nomenfant ; 43 document.getElementById('courbe_poids').alt = 'Courbe de poids de '+nomenfant ;
43 boutondl = document.getElementById("courbe_dl_poids") ; 44 boutondl = document.getElementById("courbe_dl_poids") ;
44 boutondl.setAttribute('onclick',"download_file('courbe_poids_"+nomenfant+".png', 'image/png;base64','"+image_poids +"')") 45 boutondl.setAttribute('onclick',"download_file('courbe_poids_"+nomenfant+nomsenfantsplus+".png', 'image/png;base64','"+image_poids +"')")
45 } 46 }
46 else { 47 else {
47 document.getElementById('section_courbe_poids').style.display = "none" ; 48 document.getElementById('section_courbe_poids').style.display = "none" ;
diff --git a/templates/contact.html b/templates/contact.html
index 6da2e96..0ed2f1c 100644
--- a/templates/contact.html
+++ b/templates/contact.html
@@ -8,7 +8,7 @@
8 <li>immae pour l'hébergement et l'aide technique,</li> 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> 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> 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> 11 <li>les bêta-testeuses enthousiastes du forum LLL, entre autres MmeMarguerite, Maman-chat, bloom, Nerialka, ...</li>
12</ul></p> 12</ul></p>
13 13
14{% endblock %} 14{% endblock %}
diff --git a/templates/faq.html b/templates/faq.html
index 162f68d..b382dd4 100644
--- a/templates/faq.html
+++ b/templates/faq.html
@@ -3,8 +3,8 @@
3<h2>Foire Aux Questions (FAQ)</h2> 3<h2>Foire Aux Questions (FAQ)</h2>
4 4
5<div id="sommaire"> 5<div id="sommaire">
6<ul>{% for cat in lcateg %} 6<ul>{% for i in range(lcateg|length) %}
7<li><a href="#{{ cat }}">{{ cat }}</a></li> 7<li><a href="#{{ lcategsimple[i] }}">{{ lcateg[i] }}</a></li>
8{% endfor %} 8{% endfor %}
9</ul> 9</ul>
10</div> 10</div>
@@ -13,7 +13,7 @@
13{% for i in range(lcateg|length) %} 13{% for i in range(lcateg|length) %}
14{% set qr = tableqr[i] %} 14{% set qr = tableqr[i] %}
15 15
16<h3 id="{{ lcateg[i] }}">{{ lcateg[i] }}</h3> 16<h3 id="{{ lcategsimple[i] }}">{{ lcateg[i] }}</h3>
17<ul> 17<ul>
18 {% for (q,r) in qr %} 18 {% for (q,r) in qr %}
19 <li><p><strong>Q : </strong>{{ q|safe }}</p> 19 <li><p><strong>Q : </strong>{{ q|safe }}</p>
diff --git a/templates/index.html b/templates/index.html
index c23cfc1..ace0982 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -198,9 +198,11 @@
198 <option value="{{ symb }}" {% if numero_enfant == loop.index %} selected{% endif %}>{{ CONFIG.liste_symboles[symb] | safe}}</option> 198 <option value="{{ symb }}" {% if numero_enfant == loop.index %} selected{% endif %}>{{ CONFIG.liste_symboles[symb] | safe}}</option>
199 {% endfor %} 199 {% endfor %}
200 </select> | 200 </select> |
201 Couleur&nbsp;: <input type="color" name="couleur_donnees_{{ numero_enfant }}" value="{{ valform.couleurs.cadretxt }}"></li>{% endfor %} 201 Couleur&nbsp;: <input type="color" name="couleur_donnees_{{ numero_enfant }}" value="{{ valform.couleurs.cadretxt }}"> |
202 Alias <span class="petit">(remplace le prénom)</span>&nbsp;: <input type="text" name="alias_{{ numero_enfant }}"></li>{% endfor %}
202 </ul> 203 </ul>
203 <p class="bouton" onclick="ajoute_enfants()" id="reveleenfants">Plus d'enfants O_o</p> 204 <p class="bouton" onclick="ajoute_enfants()" id="reveleenfants">Plus d'enfants O_o</p>
205
204</div> 206</div>
205 207
206 208
diff --git a/trace_courbe.py b/trace_courbe.py
index e29359f..570a08c 100644
--- a/trace_courbe.py
+++ b/trace_courbe.py
@@ -3,7 +3,7 @@
3from configuration import CONFIG 3from configuration import CONFIG
4import gestionOMS as oms 4import gestionOMS as oms
5import gestion_unites as u 5import gestion_unites as u
6from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python 6from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python, simplifie_nom
7from gestion_erreurs import debug, erreur, warning 7from gestion_erreurs import debug, erreur, warning
8from calculs_extrapole import calcule_donnee_extrapolee, calcule_age_extrapole, interpole_lineaire, interpole_lineaire_ordonnee, formate_resultat_donnee, formate_resultat_age, formate_interpole, formate_extrapole 8from calculs_extrapole import calcule_donnee_extrapolee, calcule_age_extrapole, interpole_lineaire, interpole_lineaire_ordonnee, formate_resultat_donnee, formate_resultat_age, formate_interpole, formate_extrapole
9import datetime 9import datetime
@@ -174,6 +174,8 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e
174 if lj != []: # pas la peine de tracer si y'a rien à tracer 174 if lj != []: # pas la peine de tracer si y'a rien à tracer
175 # Ajouter le nom de cet enfant-là 175 # Ajouter le nom de cet enfant-là
176 listenoms.append(conf_add["nom"]) 176 listenoms.append(conf_add["nom"])
177 # Le mot "courbe" doit être au pluriel du coup !
178 titre = titre.replace("Courbe ", "Courbes ")
177 lj_conv = u.convertit_tableau(lj,unite,liste_err) 179 lj_conv = u.convertit_tableau(lj,unite,liste_err)
178 debug("Tracé de la courbe additionnelle de "+conf_add["nom"]+" config : "+str(conf_add), liste_err) 180 debug("Tracé de la courbe additionnelle de "+conf_add["nom"]+" config : "+str(conf_add), liste_err)
179 ax.plot(lj_conv, ld, label=conf_add["nom"], color=conf_add["couleurcourbe"],marker=conf_add["symbole"]) 181 ax.plot(lj_conv, ld, label=conf_add["nom"], color=conf_add["couleurcourbe"],marker=conf_add["symbole"])
@@ -182,9 +184,22 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e
182 warning("Attention, tous les enfants n'ont pas le même sexe. La courbe de référence est celle de "+conf["nom"]+" et ne sera pas forcément pertinente pour les autres. Vous pouvez éventuellement essayer la courbe neutre. Remarque : cette alerte s'affichera quand même.", liste_err) 184 warning("Attention, tous les enfants n'ont pas le même sexe. La courbe de référence est celle de "+conf["nom"]+" et ne sera pas forcément pertinente pour les autres. Vous pouvez éventuellement essayer la courbe neutre. Remarque : cette alerte s'affichera quand même.", liste_err)
183 185
184 186
185 # Si y'a un nom on met "courbe de machin" 187 # Si y'a un nom on met "courbe de machin, de bidule, d'alala, de truc"
186 if listenoms != []: 188 for i in range(len(listenoms)):
187 titre += " de " +", ".join(listenoms) 189 # Mot de liaison : , ou et ?
190 if i>0 and i!=len(listenoms)-1:
191 titre += ", "
192 elif i>0 and i == len(listenoms) -1:
193 titre+= " et "
194 else:
195 titre += " "
196 # Est-ce que la première lettre est une voyelle ?
197 lettre = simplifie_nom(listenoms[i]).lower()[0]
198 if lettre in CONFIG["voyelles"]:
199 titre += "d'"
200 else:
201 titre += "de "
202 titre += listenoms[i]
188 203
189 if prema>0: 204 if prema>0:
190 titre+= ", préma de "+conf["prematurite"] 205 titre+= ", préma de "+conf["prematurite"]