diff options
author | Denise sur ardoise <denise@ardoise> | 2022-05-28 19:22:58 +0200 |
---|---|---|
committer | Denise sur ardoise <denise@ardoise> | 2022-05-28 19:22:58 +0200 |
commit | 32b3d06150018ed96d071cc0c6281469a880f9e0 (patch) | |
tree | 3efb0ab0550878489a00c278bc1440cb6e513546 | |
parent | d4daf461c8317e3f9e89df00d5f65bb59e40911d (diff) | |
download | oms-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.py | 2 | ||||
-rw-r--r-- | calculs_extrapole.py | 14 | ||||
-rw-r--r-- | configuration.py | 2 | ||||
-rw-r--r-- | data/changelog_data.txt | 8 | ||||
-rw-r--r-- | gestion_donnees.py | 46 | ||||
-rw-r--r-- | static/outilspage.js | 6 | ||||
-rw-r--r-- | static/requetes.js | 2 | ||||
-rw-r--r-- | templates/index.html | 31 | ||||
-rw-r--r-- | trace_courbe.py | 31 |
9 files changed, 107 insertions, 35 deletions
@@ -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 | ||
133 | def formate_resultat_donnee(age, donnee, typedonnee, extra, liste_err): | 133 | def 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 | ||
157 | def formate_resultat_age(age, donnee, typedonnee, extra, liste_err): | 160 | def 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 @@ | |||
5 | CONFIG = {} | 5 | CONFIG = {} |
6 | 6 | ||
7 | ### La version de l'app | 7 | ### La version de l'app |
8 | CONFIG["version"] = 2.5 | 8 | CONFIG["version"] = 2.6 |
9 | # Nombre de versions anciennes dans le changelog | 9 | # Nombre de versions anciennes dans le changelog |
10 | CONFIG["nb_lignes_changelog"] = 4 | 10 | CONFIG["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): | |||
160 | def delta_date(date1,datenaissance, liste_err): | 161 | def 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 : <input class="data" type="text" name="repere_age_'+i+'" value=""> Texte associé : <input class="texte" type="text" name="repere_texte_'+i+'" value=""> Tracer : <input type="checkbox" name="repere_trace_'+i+'">' ; | 208 | elt.innerHTML = 'Âge : <input class="data" type="text" name="repere_age_'+i+'" value=""> \ |
209 | ou date : <input type="date" name="repere_date_{{ i }}" value=""> \ | ||
210 | Texte associé : <input class="texte" type="text" name="repere_texte_'+i+'" value=""> \ | ||
211 | Tracer : <input type="checkbox" name="repere_trace_'+i+'">\ | ||
212 | Afficher la date : <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 : <input class="data" type="text" name="repere_age_{{ i }}" value="{{ valform.liste_reperes[i].donnee }}"> | 133 | <li>Âge : <input class="data" type="text" name="repere_age_{{ i }}" value="{{ valform.liste_reperes[i].donnee }}"> |
134 | ou date : <input type="date" name="repere_date_{{ i }}" value="{{ valform.liste_reperes[i].date }}"> | ||
134 | Texte associé : <input class="texte" type="text" name="repere_texte_{{ i }}" value="{{ valform.liste_reperes[i].texte }}"> | 135 | Texte associé : <input class="texte" type="text" name="repere_texte_{{ i }}" value="{{ valform.liste_reperes[i].texte }}"> |
135 | Tracer : <input type="checkbox" name="repere_trace_{{ i }}" {% if valform.liste_reperes[i].trace %} checked {% endif %}></li> | 136 | Tracer : <input type="checkbox" name="repere_trace_{{ i }}" {% if valform.liste_reperes[i].trace %} checked {% endif %}> |
137 | Afficher la date : <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 : <input class="data" type="text" name="repere_age_{{ j }}" value=""> | 141 | <li>Âge : <input class="data" type="text" name="repere_age_{{ j }}" value=""> |
142 | ou date : <input type="date" name="repere_date_{{ i }}" value=""> | ||
139 | Texte associé : <input class="texte" type="text" name="repere_texte_{{ j }}" value=""> | 143 | Texte associé : <input class="texte" type="text" name="repere_texte_{{ j }}" value=""> |
140 | Tracer : <input type="checkbox" name="repere_trace_{{ j }}"></li> | 144 | Tracer : <input type="checkbox" name="repere_trace_{{ j }}"> |
145 | Afficher la date : <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 : 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 : 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 | |||
6 | from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python | 6 | from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python |
7 | from gestion_erreurs import debug, erreur, warning | 7 | from gestion_erreurs import debug, erreur, warning |
8 | from calculs_extrapole import calcule_donnee_extrapolee, calcule_age_extrapole, interpole_lineaire, interpole_lineaire_ordonnee, formate_resultat_donnee, formate_resultat_age, formate_interpole, formate_extrapole | 8 | from calculs_extrapole import calcule_donnee_extrapolee, calcule_age_extrapole, interpole_lineaire, interpole_lineaire_ordonnee, formate_resultat_donnee, formate_resultat_age, formate_interpole, formate_extrapole |
9 | import datetime | ||
9 | 10 | ||
10 | from numpy import arange | 11 | from 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 | ||