summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenise sur ardoise <denise@ardoise>2022-05-28 19:22:58 +0200
committerDenise sur ardoise <denise@ardoise>2022-05-28 19:22:58 +0200
commit32b3d06150018ed96d071cc0c6281469a880f9e0 (patch)
tree3efb0ab0550878489a00c278bc1440cb6e513546
parentd4daf461c8317e3f9e89df00d5f65bb59e40911d (diff)
downloadoms-32b3d06150018ed96d071cc0c6281469a880f9e0.tar.gz
oms-32b3d06150018ed96d071cc0c6281469a880f9e0.tar.zst
oms-32b3d06150018ed96d071cc0c6281469a880f9e0.zip
V2.6 : bugs d'extrapolation corrigé, prise en compte des dates dans les données, repères, et extra.
-rw-r--r--app.py2
-rw-r--r--calculs_extrapole.py14
-rw-r--r--configuration.py2
-rw-r--r--data/changelog_data.txt8
-rw-r--r--gestion_donnees.py46
-rw-r--r--static/outilspage.js6
-rw-r--r--static/requetes.js2
-rw-r--r--templates/index.html31
-rw-r--r--trace_courbe.py31
9 files changed, 107 insertions, 35 deletions
diff --git a/app.py b/app.py
index 84e2ff1..428416e 100644
--- a/app.py
+++ b/app.py
@@ -59,7 +59,7 @@ def courbe_image(ext):
59 59
60 # récupérer les données du formulaire proprement 60 # récupérer les données du formulaire proprement
61 config,listes_jours,listes_donnees = donnees.web_vers_python(data,liste_err) 61 config,listes_jours,listes_donnees = donnees.web_vers_python(data,liste_err)
62 debug(" * On a récupéré et traité les données du formulaire web",liste_err) 62 debug(" * On a récupéré et traité les données du formulaire web, "+str(listes_jours)+str(listes_donnees),liste_err)
63 63
64 # Gérer les enfants additionnels 64 # Gérer les enfants additionnels
65 enfants_add = donnees.gere_enfants_additionnels(data, flask.request.files, liste_err) 65 enfants_add = donnees.gere_enfants_additionnels(data, flask.request.files, liste_err)
diff --git a/calculs_extrapole.py b/calculs_extrapole.py
index fdd4c68..c84960d 100644
--- a/calculs_extrapole.py
+++ b/calculs_extrapole.py
@@ -130,15 +130,18 @@ def joliechaine_age(age):
130 #print(retour) 130 #print(retour)
131 return retour[:-2] 131 return retour[:-2]
132 132
133def formate_resultat_donnee(age, donnee, typedonnee, extra, liste_err): 133def formate_resultat_donnee(age, date, donnee, typedonnee, extra, liste_err):
134 """ Formate le tout en une zolie phrase 134 """ Formate le tout en une zolie phrase
135 age et donnee sont les données, 135 age date et donnee sont les données. date peut être None (sinon donnée de date)
136 typedonnee est le type de donnée (poids, etc) 136 typedonnee est le type de donnée (poids, etc)
137 extra est un truc additionnel à mettre entre parenthèses""" 137 extra est un truc additionnel à mettre entre parenthèses"""
138 138
139 donnee_arrondie = u.arrondit_donnee(donnee, typedonnee) 139 donnee_arrondie = u.arrondit_donnee(donnee, typedonnee)
140 chaine = "À "+joliechaine_age(convertit_age_vers_texte(age)) 140 chaine = "À "+joliechaine_age(convertit_age_vers_texte(age))
141 141
142 if date != None:
143 chaine += ", le "+date.strftime("%d/%m/%Y")
144
142 if typedonnee == "poids": 145 if typedonnee == "poids":
143 chaine+= ", l'enfant pèsera "+str(donnee_arrondie)+" kg" 146 chaine+= ", l'enfant pèsera "+str(donnee_arrondie)+" kg"
144 elif typedonnee == "taille": 147 elif typedonnee == "taille":
@@ -154,9 +157,9 @@ def formate_resultat_donnee(age, donnee, typedonnee, extra, liste_err):
154 chaine+=ajout+"." 157 chaine+=ajout+"."
155 return chaine 158 return chaine
156 159
157def formate_resultat_age(age, donnee, typedonnee, extra, liste_err): 160def formate_resultat_age(age, date, donnee, typedonnee, extra, liste_err):
158 """ formate les données en une zolie phrase 161 """ formate les données en une zolie phrase
159 age et donnee sont les données 162 age, date et donnee sont les données. date est une donnée de date qui peut être vide.
160 typedonnee est le type de donnée (poids, etc) 163 typedonnee est le type de donnée (poids, etc)
161 extra est un truc additionnel à mettre entre parenthèses""" 164 extra est un truc additionnel à mettre entre parenthèses"""
162 age_joli = joliechaine_age(convertit_age_vers_texte(age)) 165 age_joli = joliechaine_age(convertit_age_vers_texte(age))
@@ -167,6 +170,9 @@ def formate_resultat_age(age, donnee, typedonnee, extra, liste_err):
167 else:# phrase générique 170 else:# phrase générique
168 chaine= "L'enfant atteindra la donnée "+typedonnee+" "+str(donnee)+" à l'âge de "+age_joli 171 chaine= "L'enfant atteindra la donnée "+typedonnee+" "+str(donnee)+" à l'âge de "+age_joli
169 172
173 if date != None:
174 chaine += ", le "+date.strftime("%d/%m/%Y")
175
170 if extra!="": 176 if extra!="":
171 ajout=" ("+extra+")" 177 ajout=" ("+extra+")"
172 else: 178 else:
diff --git a/configuration.py b/configuration.py
index b22c6e3..4ad42e6 100644
--- a/configuration.py
+++ b/configuration.py
@@ -5,7 +5,7 @@
5CONFIG = {} 5CONFIG = {}
6 6
7### La version de l'app 7### La version de l'app
8CONFIG["version"] = 2.5 8CONFIG["version"] = 2.6
9# Nombre de versions anciennes dans le changelog 9# Nombre de versions anciennes dans le changelog
10CONFIG["nb_lignes_changelog"] = 4 10CONFIG["nb_lignes_changelog"] = 4
11 11
diff --git a/data/changelog_data.txt b/data/changelog_data.txt
index d9987fb..4fa79d6 100644
--- a/data/changelog_data.txt
+++ b/data/changelog_data.txt
@@ -1,4 +1,10 @@
1"Version 2.51","26/25/2022","<p>Un test à faire : les dates sont prioritaires sur les âges pour éviter les soucis d'arrondis. À tester, et d'autres trucs arrivent.</p>" 1"Version 2.6","28/05/2022","<p>Des petites nouveautés :</p>
2<ul>
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>
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>
7</ul>"
2 8
3"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>" 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>"
4 10
diff --git a/gestion_donnees.py b/gestion_donnees.py
index 7c15486..eab75e9 100644
--- a/gestion_donnees.py
+++ b/gestion_donnees.py
@@ -63,6 +63,7 @@ def convertit_age_vers_texte(nombre):
63 annees = int(nombre / CONFIG["jours_dans_annee"]) 63 annees = int(nombre / CONFIG["jours_dans_annee"])
64 restant = nombre - annees*CONFIG["jours_dans_annee"] 64 restant = nombre - annees*CONFIG["jours_dans_annee"]
65 mois = int(restant/CONFIG["jours_dans_mois"]) 65 mois = int(restant/CONFIG["jours_dans_mois"])
66 #print("mois : ",mois, ", restant : ",nombre - mois*CONFIG["jours_dans_mois"])
66 jours= round(nombre - mois*CONFIG["jours_dans_mois"] - annees*CONFIG["jours_dans_annee"]) 67 jours= round(nombre - mois*CONFIG["jours_dans_mois"] - annees*CONFIG["jours_dans_annee"])
67 68
68 chaine = "" 69 chaine = ""
@@ -160,6 +161,8 @@ def convertit_date_vers_texte(date):
160def delta_date(date1,datenaissance, liste_err): 161def delta_date(date1,datenaissance, liste_err):
161 """ renvoie le nombre de jours (entier) entre date1 et datenaissance format "datetime" 162 """ renvoie le nombre de jours (entier) entre date1 et datenaissance format "datetime"
162 datenaissance est supposée antérieure. Erreur sinon.""" 163 datenaissance est supposée antérieure. Erreur sinon."""
164 if type(date1) != datetime.date or type(datenaissance) != datetime.date:
165 return -1
163 d = date1 - datenaissance 166 d = date1 - datenaissance
164 jours = d.days 167 jours = d.days
165 if jours<0: 168 if jours<0:
@@ -349,12 +352,25 @@ def gere_configuration(data,liste_err, court=False):
349 nbextradata = 1 352 nbextradata = 1
350 configuration["non_sauve"]["nbextradata"] = nbextradata 353 configuration["non_sauve"]["nbextradata"] = nbextradata
351 354
352 if data.get("calculextradata_type","") in CONFIG["liste_typedonnees"]: 355 if data.get("calculextradata_type","") in CONFIG["liste_typedonnees"]: # Si on a choisi un type de données à calculer
356
353 configuration["non_sauve"]["calculextradata_type"] = data.get("calculextradata_type","") 357 configuration["non_sauve"]["calculextradata_type"] = data.get("calculextradata_type","")
354 configuration["non_sauve"]["calculextradata_age"] = convertit_jours_vers_python(data.get("calculextradata_age","0j"),liste_err) 358 age = convertit_jours_vers_python(data.get("calculextradata_age","0j"),liste_err)
359 date = convertit_date_vers_python(data.get("calculextradata_date", ""), [[],[]])
360 agecalcule = delta_date(date, configuration["naissance"], liste_err)
361 if configuration["naissance"] != "" and agecalcule != -1: # On garde plutôt la date
362 configuration["non_sauve"]["calculextradata_age"] = agecalcule
363 configuration["non_sauve"]["calculextradata_date"] = date
364 else: # On garde l'âge
365 configuration["non_sauve"]["calculextradata_age"] = age
366 if type(configuration["naissance"]) == datetime.date:
367# print(configuration["naissance"], type(configuration["naissance"]))
368 configuration["non_sauve"]["calculextradata_date"] = configuration["naissance"] + datetime.timedelta(days=round(age))
369 else:
370 configuration["non_sauve"]["calculextradata_date"] = None
355 else: 371 else:
356 configuration["non_sauve"]["calculextradata_type"] = "" 372 configuration["non_sauve"]["calculextradata_type"] = ""
357 # On ne met rien dans l'âge, pas la peine 373 # On ne met rien dans les autres données, pas la peine
358 374
359 ctyped = data.get("calculextratemps_type","") 375 ctyped = data.get("calculextratemps_type","")
360 if ctyped in CONFIG["liste_typedonnees"]: 376 if ctyped in CONFIG["liste_typedonnees"]:
@@ -373,12 +389,26 @@ def gere_configuration(data,liste_err, court=False):
373 i=0 389 i=0
374 while "repere_texte_"+str(i) in data: # Tant qu'il y a des trucs définis 390 while "repere_texte_"+str(i) in data: # Tant qu'il y a des trucs définis
375 debug("Repère trouvé", liste_err) 391 debug("Repère trouvé", liste_err)
392 jegardecerepere = False # On va passer à True uniquementsi tout va bien
393
376 age=data.get("repere_age_"+str(i), "") 394 age=data.get("repere_age_"+str(i), "")
395 date=data.get("repere_date_"+str(i), "")
377 trace=gere_checkbox(data.get("repere_trace_"+str(i), "")) 396 trace=gere_checkbox(data.get("repere_trace_"+str(i), ""))
378 if age !="": 397 affichedate=gere_checkbox(data.get("repere_affichedate_"+str(i), ""))
379 agec=convertit_jours_vers_python(age, liste_err) 398
399 if date!="" and configuration['naissance'] != "": # Si on a saisi une date (et qu'il y a la date de naissance)
400 datepython = convertit_date_vers_python(date,liste_err)
401 if datepython !="": # Si la conversion s'est bien passée
402 nbjours = delta_date(datepython, configuration['naissance'], liste_err)
403 if nbjours != -1: # Si tout va bien jusque là
404 jegardecerepere=True
405 elif age !="":
406 nbjours=convertit_jours_vers_python(age, liste_err)
407 jegardecerepere=True
408
409 if jegardecerepere:
380 texte = data.get("repere_texte_"+str(i), "") # Même si le texte est vide, osef 410 texte = data.get("repere_texte_"+str(i), "") # Même si le texte est vide, osef
381 configuration["liste_reperes"].append({"typed": "age", "donnee": agec, "texte": texte, "trace": trace}) 411 configuration["liste_reperes"].append({"typed": "age", "donnee": nbjours, "date": date, "texte": texte, "trace": trace, "affichedate":affichedate})
382 i+=1 412 i+=1
383 413
384 return configuration 414 return configuration
@@ -487,8 +517,8 @@ def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config):
487 if gros_dico.get("naissance","") != "": 517 if gros_dico.get("naissance","") != "":
488 gros_dico["naissance"] = convertit_date_vers_texte(gros_dico["naissance"]) 518 gros_dico["naissance"] = convertit_date_vers_texte(gros_dico["naissance"])
489 # Calcul de toutes les dates de données 519 # Calcul de toutes les dates de données
490 l_dates_poids = [convertit_date_vers_texte( config["naissance"] + datetime.timedelta(days=jours) ) for jours in l_jours] 520 l_dates_poids = [convertit_date_vers_texte( config["naissance"] + datetime.timedelta(days=round(jours)) ) for jours in l_jours]
491 l_dates_taille = [convertit_date_vers_texte( config["naissance"] + datetime.timedelta(days=jours) ) for jours in l_jourst] 521 l_dates_taille = [convertit_date_vers_texte( config["naissance"] + datetime.timedelta(days=round(jours)) ) for jours in l_jourst]
492 gros_dico["data_dates_poids"]= l_dates_poids 522 gros_dico["data_dates_poids"]= l_dates_poids
493 gros_dico["data_dates_taille"] = l_dates_taille 523 gros_dico["data_dates_taille"] = l_dates_taille
494 524
diff --git a/static/outilspage.js b/static/outilspage.js
index dac70bf..b0b3a1d 100644
--- a/static/outilspage.js
+++ b/static/outilspage.js
@@ -205,7 +205,11 @@ function ajoute_reperes()
205 for(var i=nblignes; i<nblignes+nb_additionnel ; i++) 205 for(var i=nblignes; i<nblignes+nb_additionnel ; i++)
206 { 206 {
207 var elt = document.createElement("li") ; 207 var elt = document.createElement("li") ;
208 elt.innerHTML = 'Âge&nbsp;: <input class="data" type="text" name="repere_age_'+i+'" value=""> Texte associé&nbsp;: <input class="texte" type="text" name="repere_texte_'+i+'" value=""> Tracer&nbsp;: <input type="checkbox" name="repere_trace_'+i+'">' ; 208 elt.innerHTML = 'Âge&nbsp;: <input class="data" type="text" name="repere_age_'+i+'" value=""> \
209 ou date&nbsp;: <input type="date" name="repere_date_{{ i }}" value=""> \
210 Texte associé&nbsp;: <input class="texte" type="text" name="repere_texte_'+i+'" value=""> \
211 Tracer&nbsp;: <input type="checkbox" name="repere_trace_'+i+'">\
212 Afficher la date&nbsp;: <input type="checkbox" name="repere_affichedate_{{ i }}">' ;
209 eltul.appendChild(elt) ; 213 eltul.appendChild(elt) ;
210 } 214 }
211 215
diff --git a/static/requetes.js b/static/requetes.js
index 465366c..d374213 100644
--- a/static/requetes.js
+++ b/static/requetes.js
@@ -39,6 +39,7 @@ function appelle_image()
39 document.getElementById('sectioncourbe').style.display = "block"; 39 document.getElementById('sectioncourbe').style.display = "block";
40 document.getElementById('section_courbe_poids').style.display = "block" ; 40 document.getElementById('section_courbe_poids').style.display = "block" ;
41 document.getElementById('courbe_poids').src = 'data:image/png;base64,'+(image_poids); 41 document.getElementById('courbe_poids').src = 'data:image/png;base64,'+(image_poids);
42 document.getElementById('courbe_poids').alt = 'Courbe de poids de '+nomenfant ;
42 boutondl = document.getElementById("courbe_dl_poids") ; 43 boutondl = document.getElementById("courbe_dl_poids") ;
43 boutondl.setAttribute('onclick',"download_file('courbe_poids_"+nomenfant+".png', 'image/png;base64','"+image_poids +"')") 44 boutondl.setAttribute('onclick',"download_file('courbe_poids_"+nomenfant+".png', 'image/png;base64','"+image_poids +"')")
44 } 45 }
@@ -50,6 +51,7 @@ function appelle_image()
50 document.getElementById('sectioncourbe').style.display = "block"; 51 document.getElementById('sectioncourbe').style.display = "block";
51 document.getElementById('section_courbe_taille').style.display = "block" ; 52 document.getElementById('section_courbe_taille').style.display = "block" ;
52 document.getElementById('courbe_taille').src = 'data:image/png;base64,'+(image_taille); 53 document.getElementById('courbe_taille').src = 'data:image/png;base64,'+(image_taille);
54 document.getElementById('courbe_taille').alt = 'Courbe de taille de '+nomenfant ;
53 boutondl = document.getElementById("courbe_dl_taille") ; 55 boutondl = document.getElementById("courbe_dl_taille") ;
54 boutondl.setAttribute('onclick',"download_file('courbe_taille_"+nomenfant+".png', 'image/png;base64','"+image_taille +"')") 56 boutondl.setAttribute('onclick',"download_file('courbe_taille_"+nomenfant+".png', 'image/png;base64','"+image_taille +"')")
55 } 57 }
diff --git a/templates/index.html b/templates/index.html
index 066f60e..c23cfc1 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -12,7 +12,7 @@
12 12
13 13
14 <label for="fichier_donnees" class="icon_button"> 14 <label for="fichier_donnees" class="icon_button">
15 <img src="static/icons/import.png"> 15 <img src="static/icons/import.png" alt="Importer">
16 <span class="icon_legend">Importer un fichier</span> 16 <span class="icon_legend">Importer un fichier</span>
17 </label> 17 </label>
18 <input type="file" name="fichier_donnees" id="fichier_donnees" oninput="upload_file('form_import_donnees')"> 18 <input type="file" name="fichier_donnees" id="fichier_donnees" oninput="upload_file('form_import_donnees')">
@@ -37,7 +37,7 @@
37<h3>Informations sur l'enfant</h3> 37<h3>Informations sur l'enfant</h3>
38<div> 38<div>
39 <label for="reset_donnees" class="icon_button"> 39 <label for="reset_donnees" class="icon_button">
40 <img src="static/icons/trash.png"> 40 <img src="static/icons/trash.png" alt="Effacer">
41 <span class="icon_legend">Effacer les données du formulaire</span> 41 <span class="icon_legend">Effacer les données du formulaire</span>
42 </label> 42 </label>
43 <input type="reset" id="reset_donnees" value="Effacer les données du formulaire"> 43 <input type="reset" id="reset_donnees" value="Effacer les données du formulaire">
@@ -131,13 +131,19 @@
131 <ul id="ajoutereperecourbe"> 131 <ul id="ajoutereperecourbe">
132 {% for i in range(valform.liste_reperes | length) %} 132 {% for i in range(valform.liste_reperes | length) %}
133 <li>Âge&nbsp;: <input class="data" type="text" name="repere_age_{{ i }}" value="{{ valform.liste_reperes[i].donnee }}"> 133 <li>Âge&nbsp;: <input class="data" type="text" name="repere_age_{{ i }}" value="{{ valform.liste_reperes[i].donnee }}">
134 ou date&nbsp;: <input type="date" name="repere_date_{{ i }}" value="{{ valform.liste_reperes[i].date }}">
134 Texte associé&nbsp;: <input class="texte" type="text" name="repere_texte_{{ i }}" value="{{ valform.liste_reperes[i].texte }}"> 135 Texte associé&nbsp;: <input class="texte" type="text" name="repere_texte_{{ i }}" value="{{ valform.liste_reperes[i].texte }}">
135 Tracer&nbsp;: <input type="checkbox" name="repere_trace_{{ i }}" {% if valform.liste_reperes[i].trace %} checked {% endif %}></li> 136 Tracer&nbsp;: <input type="checkbox" name="repere_trace_{{ i }}" {% if valform.liste_reperes[i].trace %} checked {% endif %}>
137 Afficher la date&nbsp;: <input type="checkbox" name="repere_affichedate_{{ i }}" {% if valform.liste_reperes[i].affichedate %} checked {% endif %}>
138 </li>
136 {% endfor %} 139 {% endfor %}
137 {% for j in range(valform.liste_reperes | length, valform.nb_reperes_mini) %} 140 {% for j in range(valform.liste_reperes | length, valform.nb_reperes_mini) %}
138 <li>Âge&nbsp;: <input class="data" type="text" name="repere_age_{{ j }}" value=""> 141 <li>Âge&nbsp;: <input class="data" type="text" name="repere_age_{{ j }}" value="">
142 ou date&nbsp;: <input type="date" name="repere_date_{{ i }}" value="">
139 Texte associé&nbsp;: <input class="texte" type="text" name="repere_texte_{{ j }}" value=""> 143 Texte associé&nbsp;: <input class="texte" type="text" name="repere_texte_{{ j }}" value="">
140 Tracer&nbsp;: <input type="checkbox" name="repere_trace_{{ j }}"></li> 144 Tracer&nbsp;: <input type="checkbox" name="repere_trace_{{ j }}">
145 Afficher la date&nbsp;: <input type="checkbox" name="repere_affichedate_{{ i }}"></li>
146
141 {% endfor %} 147 {% endfor %}
142 </ul> 148 </ul>
143 149
@@ -160,7 +166,8 @@
160 {% for val in CONFIG.liste_typedonnees %} 166 {% for val in CONFIG.liste_typedonnees %}
161 <option value="{{val}}">{{val}}</option> 167 <option value="{{val}}">{{val}}</option>
162 {% endfor %} 168 {% endfor %}
163 </select> à l'âge <input type="text" class="data" name="calculextradata_age" value="6m"> 169 </select> à l'âge <input type="text" class="data" name="calculextradata_age">
170 ou à la date <input type="date" name="calculextradata_date">
164 <input type="checkbox" name="calculextradata_trace"> ... et le voir sur le graphique.</li> 171 <input type="checkbox" name="calculextradata_trace"> ... et le voir sur le graphique.</li>
165 172
166 <li>Calculer l'âge auquel l'enfant aura <input type="text" class="data" name="calculextratemps_val"> 173 <li>Calculer l'âge auquel l'enfant aura <input type="text" class="data" name="calculextratemps_val">
@@ -205,7 +212,7 @@
205<!--- Le grobouton --> 212<!--- Le grobouton -->
206<div> 213<div>
207 <span onclick="appelle_image()" class="icon_button"> 214 <span onclick="appelle_image()" class="icon_button">
208 <img src="static/icons/courbe.png"> 215 <img src="static/icons/courbe.png" alt="Tracer les courbes">
209 <span class="icon_legend">Je veux les courbes !</span></span> 216 <span class="icon_legend">Je veux les courbes !</span></span>
210 <span id="statut_courbes"></span> 217 <span id="statut_courbes"></span>
211</div> 218</div>
@@ -226,19 +233,19 @@
226 233
227 <h2>Courbes</h2> 234 <h2>Courbes</h2>
228 <div id="section_courbe_poids"> 235 <div id="section_courbe_poids">
229 <img id="courbe_poids"> 236 <img id="courbe_poids" src="" alt="">
230 237
231 <div id="courbe_dl_poids" class="icon_button"> 238 <div id="courbe_dl_poids" class="icon_button">
232 <img src="static/icons/export.png"> 239 <img src="static/icons/export.png" alt="Exporter la courbe de poids">
233 <span class="icon_legend">Télécharger la courbe de poids</span> 240 <span class="icon_legend">Télécharger la courbe de poids</span>
234 </div> 241 </div>
235 </div> 242 </div>
236 243
237 <div id="section_courbe_taille"> 244 <div id="section_courbe_taille">
238 <img id="courbe_taille"> 245 <img id="courbe_taille" src="" alt="">
239 246
240 <div id="courbe_dl_taille" class="icon_button"> 247 <div id="courbe_dl_taille" class="icon_button">
241 <img src="static/icons/export.png"> 248 <img src="static/icons/export.png" alt="Exporter la courbe de taille">
242 <span class="icon_legend">Télécharger la courbe de taille</span> 249 <span class="icon_legend">Télécharger la courbe de taille</span>
243 </div> 250 </div>
244 </div> 251 </div>
@@ -259,10 +266,10 @@
259 <p>Vous pouvez télécharger les données afin de ne pas avoir à les re-saisir la prochaine fois.</p> 266 <p>Vous pouvez télécharger les données afin de ne pas avoir à les re-saisir la prochaine fois.</p>
260 267
261 <div id="export_dl" class="icon_button"> 268 <div id="export_dl" class="icon_button">
262 <img src="static/icons/export.png"> 269 <img src="static/icons/export.png" alt="Exporter les données">
263 <span class="icon_legend">Télécharger les données</span> 270 <span class="icon_legend">Télécharger les données</span>
264 </div> 271 </div>
265 <p>Si vous n'arrivez pas à télécharger les données, <a href='#export' onclick="affiche_export()">cliquez ici</a> pour les voir en texte clair&nbsp: il vous suffira de les copier/coller dans un fichier texte.</p> 272 <p>Si vous n'arrivez pas à télécharger les données, <a href='#export' onclick="affiche_export()">cliquez ici</a> pour les voir en texte clair&nbsp;: il vous suffira de les copier/coller dans un fichier texte.</p>
266 <div id="export"> 273 <div id="export">
267 <textarea readonly id="export_texte"> 274 <textarea readonly id="export_texte">
268 </textarea> 275 </textarea>
diff --git a/trace_courbe.py b/trace_courbe.py
index c39f265..e29359f 100644
--- a/trace_courbe.py
+++ b/trace_courbe.py
@@ -6,6 +6,7 @@ import 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
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
9 10
10from numpy import arange 11from numpy import arange
11 12
@@ -227,7 +228,11 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e
227 # On va prendre les extrapolations de la dernière donnée jusqu'à l fin du graphe 228 # On va prendre les extrapolations de la dernière donnée jusqu'à l fin du graphe
228 debut_extr = int(l_jours[-conf["non_sauve"]["nbextradata"]]) 229 debut_extr = int(l_jours[-conf["non_sauve"]["nbextradata"]])
229 i_debut_extr = dates_extrapole.index(debut_extr) 230 i_debut_extr = dates_extrapole.index(debut_extr)
230 i_fin_extr = dates_extrapole.index(jour_maxi) 231 if jour_maxi >= dates_extrapole[-1]:
232 i_fin_extr = len(dates_extrapole) -1
233 else:
234 i_fin_extr = dates_extrapole.index(jour_maxi)
235 print("bla", i_debut_extr, i_fin_extr)
231 # Voilà ce qu'on veut tracer 236 # Voilà ce qu'on veut tracer
232 dates_extrapole_trace = dates_extrapole[i_debut_extr:i_fin_extr+1] 237 dates_extrapole_trace = dates_extrapole[i_debut_extr:i_fin_extr+1]
233 donnees_extrapole_trace = donnees_extrapole[i_debut_extr:i_fin_extr+1] 238 donnees_extrapole_trace = donnees_extrapole[i_debut_extr:i_fin_extr+1]
@@ -248,11 +253,11 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e
248 else: 253 else:
249 message=formate_interpole() 254 message=formate_interpole()
250 255
251 texte = formate_resultat_donnee(conf["non_sauve"]["calculextradata_age"], r, typedonnee, message, liste_err) 256 texte = formate_resultat_donnee(conf["non_sauve"]["calculextradata_age"], conf["non_sauve"]["calculextradata_date"], r, typedonnee, message, liste_err)
252 debug("calcul de la donnée extrapolée : "+texte, liste_err) 257 debug("calcul de la donnée extrapolée : "+texte, liste_err)
253 if texte!="": 258 if texte!="":
254 liste_extracalculs.append(texte) 259 liste_extracalculs.append(texte)
255 print(liste_extracalculs) 260 #print(liste_extracalculs)
256 # Ajouter le trait ? 261 # Ajouter le trait ?
257 if conf["non_sauve"]["calculextradata_trace"] == "oui": 262 if conf["non_sauve"]["calculextradata_trace"] == "oui":
258 dessine_guides(conf["non_sauve"]["calculextradata_age"], r, conf["couleurs"]["cadretxt"], unite, ax, liste_err) 263 dessine_guides(conf["non_sauve"]["calculextradata_age"], r, conf["couleurs"]["cadretxt"], unite, ax, liste_err)
@@ -261,14 +266,23 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e
261 if conf["non_sauve"]["calculextratemps_type"] == typedonnee: 266 if conf["non_sauve"]["calculextratemps_type"] == typedonnee:
262 # interpolation 267 # interpolation
263 r = interpole_lineaire_ordonnee(l_jours,l_poids,conf["non_sauve"]["calculextratemps_val"], liste_err) 268 r = interpole_lineaire_ordonnee(l_jours,l_poids,conf["non_sauve"]["calculextratemps_val"], liste_err)
269 if type(conf["naissance"]) == datetime.date:
270 rdate = conf["naissance"] + datetime.timedelta(days=r)
271 else:
272 rdate = None
273
264 if r==-1: 274 if r==-1:
265 # ça sera donc une extrapolation 275 # ça sera donc une extrapolation
266 r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], liste_err) 276 r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], liste_err)
277 if type(conf["naissance"]) == datetime.date:
278 rdate = conf["naissance"] + datetime.timedelta(days=round(r))
279 else:
280 rdate = None
267 message=formate_extrapole(conf["non_sauve"]["nbextradata"]) 281 message=formate_extrapole(conf["non_sauve"]["nbextradata"])
268 else: 282 else:
269 message=formate_interpole() 283 message=formate_interpole()
270 284 print(r, rdate)
271 texte = formate_resultat_age(r, conf["non_sauve"]["calculextratemps_val"], typedonnee, message, liste_err) 285 texte = formate_resultat_age(r, rdate, conf["non_sauve"]["calculextratemps_val"], typedonnee, message, liste_err)
272 286
273 #r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], typedonnee, liste_err) 287 #r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], typedonnee, liste_err)
274 if texte!="": 288 if texte!="":
@@ -318,7 +332,10 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e
318 agec = u.convertitunite(rep["donnee"], unite, liste_err) 332 agec = u.convertitunite(rep["donnee"], unite, liste_err)
319 # Tracé de la ligne verticale 333 # Tracé de la ligne verticale
320 ax.vlines(agec, poids_min, poids_max, linestyles="dashed", color=conf["couleurs"]["cadretxt"]) 334 ax.vlines(agec, poids_min, poids_max, linestyles="dashed", color=conf["couleurs"]["cadretxt"])
321 # Tracé éventuel du texte 335 # date à afficher ?
336 if rep["affichedate"] == "oui" and rep["date"] != "":
337 ax.text(agec, poids_min,rep["date"]+" ", rotation=90, verticalalignment='top', horizontalalignment='center', color=conf["couleurs"]["cadretxt"], fontstyle="italic")
338 # Si y'a un texte à afficher
322 if rep["texte"] != "": 339 if rep["texte"] != "":
323 ax.text(agec, poids_min, " "+rep["texte"], rotation=90, verticalalignment='bottom', horizontalalignment='right', color=conf["couleurs"]["cadretxt"]) 340 ax.text(agec, poids_min, " "+rep["texte"], rotation=90, verticalalignment='bottom', horizontalalignment='right', color=conf["couleurs"]["cadretxt"])
324 341