From 32b3d06150018ed96d071cc0c6281469a880f9e0 Mon Sep 17 00:00:00 2001 From: Denise sur ardoise Date: Sat, 28 May 2022 19:22:58 +0200 Subject: =?UTF-8?q?V2.6=20:=20bugs=20d'extrapolation=20corrig=C3=A9,=20pri?= =?UTF-8?q?se=20en=20compte=20des=20dates=20dans=20les=20donn=C3=A9es,=20r?= =?UTF-8?q?ep=C3=A8res,=20et=20extra.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 2 +- calculs_extrapole.py | 14 ++++++++++---- configuration.py | 2 +- data/changelog_data.txt | 8 +++++++- gestion_donnees.py | 46 ++++++++++++++++++++++++++++++++++++++-------- static/outilspage.js | 6 +++++- static/requetes.js | 2 ++ templates/index.html | 31 +++++++++++++++++++------------ trace_courbe.py | 31 ++++++++++++++++++++++++------- 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): # récupérer les données du formulaire proprement config,listes_jours,listes_donnees = donnees.web_vers_python(data,liste_err) - debug(" * On a récupéré et traité les données du formulaire web",liste_err) + debug(" * On a récupéré et traité les données du formulaire web, "+str(listes_jours)+str(listes_donnees),liste_err) # Gérer les enfants additionnels 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): #print(retour) return retour[:-2] -def formate_resultat_donnee(age, donnee, typedonnee, extra, liste_err): +def formate_resultat_donnee(age, date, donnee, typedonnee, extra, liste_err): """ Formate le tout en une zolie phrase - age et donnee sont les données, + age date et donnee sont les données. date peut être None (sinon donnée de date) typedonnee est le type de donnée (poids, etc) extra est un truc additionnel à mettre entre parenthèses""" donnee_arrondie = u.arrondit_donnee(donnee, typedonnee) chaine = "À "+joliechaine_age(convertit_age_vers_texte(age)) + if date != None: + chaine += ", le "+date.strftime("%d/%m/%Y") + if typedonnee == "poids": chaine+= ", l'enfant pèsera "+str(donnee_arrondie)+" kg" elif typedonnee == "taille": @@ -154,9 +157,9 @@ def formate_resultat_donnee(age, donnee, typedonnee, extra, liste_err): chaine+=ajout+"." return chaine -def formate_resultat_age(age, donnee, typedonnee, extra, liste_err): +def formate_resultat_age(age, date, donnee, typedonnee, extra, liste_err): """ formate les données en une zolie phrase - age et donnee sont les données + age, date et donnee sont les données. date est une donnée de date qui peut être vide. typedonnee est le type de donnée (poids, etc) extra est un truc additionnel à mettre entre parenthèses""" age_joli = joliechaine_age(convertit_age_vers_texte(age)) @@ -167,6 +170,9 @@ def formate_resultat_age(age, donnee, typedonnee, extra, liste_err): else:# phrase générique chaine= "L'enfant atteindra la donnée "+typedonnee+" "+str(donnee)+" à l'âge de "+age_joli + if date != None: + chaine += ", le "+date.strftime("%d/%m/%Y") + if extra!="": ajout=" ("+extra+")" else: diff --git a/configuration.py b/configuration.py index b22c6e3..4ad42e6 100644 --- a/configuration.py +++ b/configuration.py @@ -5,7 +5,7 @@ CONFIG = {} ### La version de l'app -CONFIG["version"] = 2.5 +CONFIG["version"] = 2.6 # Nombre de versions anciennes dans le changelog CONFIG["nb_lignes_changelog"] = 4 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 @@ -"Version 2.51","26/25/2022","

Un test à faire : les dates sont prioritaires sur les âges pour éviter les soucis d'arrondis. À tester, et d'autres trucs arrivent.

" +"Version 2.6","28/05/2022","

Des petites nouveautés :

+" "Version 2.501","14/05/2022","

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.

" 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): annees = int(nombre / CONFIG["jours_dans_annee"]) restant = nombre - annees*CONFIG["jours_dans_annee"] mois = int(restant/CONFIG["jours_dans_mois"]) + #print("mois : ",mois, ", restant : ",nombre - mois*CONFIG["jours_dans_mois"]) jours= round(nombre - mois*CONFIG["jours_dans_mois"] - annees*CONFIG["jours_dans_annee"]) chaine = "" @@ -160,6 +161,8 @@ def convertit_date_vers_texte(date): def delta_date(date1,datenaissance, liste_err): """ renvoie le nombre de jours (entier) entre date1 et datenaissance format "datetime" datenaissance est supposée antérieure. Erreur sinon.""" + if type(date1) != datetime.date or type(datenaissance) != datetime.date: + return -1 d = date1 - datenaissance jours = d.days if jours<0: @@ -349,12 +352,25 @@ def gere_configuration(data,liste_err, court=False): nbextradata = 1 configuration["non_sauve"]["nbextradata"] = nbextradata - if data.get("calculextradata_type","") in CONFIG["liste_typedonnees"]: + if data.get("calculextradata_type","") in CONFIG["liste_typedonnees"]: # Si on a choisi un type de données à calculer + configuration["non_sauve"]["calculextradata_type"] = data.get("calculextradata_type","") - configuration["non_sauve"]["calculextradata_age"] = convertit_jours_vers_python(data.get("calculextradata_age","0j"),liste_err) + age = convertit_jours_vers_python(data.get("calculextradata_age","0j"),liste_err) + date = convertit_date_vers_python(data.get("calculextradata_date", ""), [[],[]]) + agecalcule = delta_date(date, configuration["naissance"], liste_err) + if configuration["naissance"] != "" and agecalcule != -1: # On garde plutôt la date + configuration["non_sauve"]["calculextradata_age"] = agecalcule + configuration["non_sauve"]["calculextradata_date"] = date + else: # On garde l'âge + configuration["non_sauve"]["calculextradata_age"] = age + if type(configuration["naissance"]) == datetime.date: +# print(configuration["naissance"], type(configuration["naissance"])) + configuration["non_sauve"]["calculextradata_date"] = configuration["naissance"] + datetime.timedelta(days=round(age)) + else: + configuration["non_sauve"]["calculextradata_date"] = None else: configuration["non_sauve"]["calculextradata_type"] = "" - # On ne met rien dans l'âge, pas la peine + # On ne met rien dans les autres données, pas la peine ctyped = data.get("calculextratemps_type","") if ctyped in CONFIG["liste_typedonnees"]: @@ -373,12 +389,26 @@ def gere_configuration(data,liste_err, court=False): i=0 while "repere_texte_"+str(i) in data: # Tant qu'il y a des trucs définis debug("Repère trouvé", liste_err) + jegardecerepere = False # On va passer à True uniquementsi tout va bien + age=data.get("repere_age_"+str(i), "") + date=data.get("repere_date_"+str(i), "") trace=gere_checkbox(data.get("repere_trace_"+str(i), "")) - if age !="": - agec=convertit_jours_vers_python(age, liste_err) + affichedate=gere_checkbox(data.get("repere_affichedate_"+str(i), "")) + + if date!="" and configuration['naissance'] != "": # Si on a saisi une date (et qu'il y a la date de naissance) + datepython = convertit_date_vers_python(date,liste_err) + if datepython !="": # Si la conversion s'est bien passée + nbjours = delta_date(datepython, configuration['naissance'], liste_err) + if nbjours != -1: # Si tout va bien jusque là + jegardecerepere=True + elif age !="": + nbjours=convertit_jours_vers_python(age, liste_err) + jegardecerepere=True + + if jegardecerepere: texte = data.get("repere_texte_"+str(i), "") # Même si le texte est vide, osef - configuration["liste_reperes"].append({"typed": "age", "donnee": agec, "texte": texte, "trace": trace}) + configuration["liste_reperes"].append({"typed": "age", "donnee": nbjours, "date": date, "texte": texte, "trace": trace, "affichedate":affichedate}) i+=1 return configuration @@ -487,8 +517,8 @@ def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config): if gros_dico.get("naissance","") != "": gros_dico["naissance"] = convertit_date_vers_texte(gros_dico["naissance"]) # Calcul de toutes les dates de données - l_dates_poids = [convertit_date_vers_texte( config["naissance"] + datetime.timedelta(days=jours) ) for jours in l_jours] - l_dates_taille = [convertit_date_vers_texte( config["naissance"] + datetime.timedelta(days=jours) ) for jours in l_jourst] + l_dates_poids = [convertit_date_vers_texte( config["naissance"] + datetime.timedelta(days=round(jours)) ) for jours in l_jours] + l_dates_taille = [convertit_date_vers_texte( config["naissance"] + datetime.timedelta(days=round(jours)) ) for jours in l_jourst] gros_dico["data_dates_poids"]= l_dates_poids gros_dico["data_dates_taille"] = l_dates_taille 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() for(var i=nblignes; i Texte associé : Tracer : ' ; + elt.innerHTML = 'Âge : \ + ou date : \ + Texte associé : \ + Tracer : \ + Afficher la date : ' ; eltul.appendChild(elt) ; } 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() document.getElementById('sectioncourbe').style.display = "block"; document.getElementById('section_courbe_poids').style.display = "block" ; document.getElementById('courbe_poids').src = 'data:image/png;base64,'+(image_poids); + document.getElementById('courbe_poids').alt = 'Courbe de poids de '+nomenfant ; boutondl = document.getElementById("courbe_dl_poids") ; boutondl.setAttribute('onclick',"download_file('courbe_poids_"+nomenfant+".png', 'image/png;base64','"+image_poids +"')") } @@ -50,6 +51,7 @@ function appelle_image() document.getElementById('sectioncourbe').style.display = "block"; document.getElementById('section_courbe_taille').style.display = "block" ; document.getElementById('courbe_taille').src = 'data:image/png;base64,'+(image_taille); + document.getElementById('courbe_taille').alt = 'Courbe de taille de '+nomenfant ; boutondl = document.getElementById("courbe_dl_taille") ; boutondl.setAttribute('onclick',"download_file('courbe_taille_"+nomenfant+".png', 'image/png;base64','"+image_taille +"')") } 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 @@ @@ -37,7 +37,7 @@

Informations sur l'enfant

@@ -131,13 +131,19 @@
    {% for i in range(valform.liste_reperes | length) %}
  • Âge : + ou date : Texte associé : - Tracer :
  • + Tracer : + Afficher la date : + {% endfor %} {% for j in range(valform.liste_reperes | length, valform.nb_reperes_mini) %}
  • Âge : + ou date : Texte associé : - Tracer :
  • + Tracer : + Afficher la date : + {% endfor %}
@@ -160,7 +166,8 @@ {% for val in CONFIG.liste_typedonnees %} {% endfor %} - à l'âge + à l'âge + ou à la date ... et le voir sur le graphique.
  • Calculer l'âge auquel l'enfant aura @@ -205,7 +212,7 @@
    - + Tracer les courbes Je veux les courbes !
    @@ -226,19 +233,19 @@

    Courbes

    - +
    - + Exporter la courbe de poids Télécharger la courbe de poids
    - +
    - + Exporter la courbe de taille Télécharger la courbe de taille
    @@ -259,10 +266,10 @@

    Vous pouvez télécharger les données afin de ne pas avoir à les re-saisir la prochaine fois.

    - + Exporter les données Télécharger les données
    -

    Si vous n'arrivez pas à télécharger les données, cliquez ici pour les voir en texte clair : il vous suffira de les copier/coller dans un fichier texte.

    +

    Si vous n'arrivez pas à télécharger les données, cliquez ici pour les voir en texte clair : il vous suffira de les copier/coller dans un fichier texte.

    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 from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python from gestion_erreurs import debug, erreur, warning 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 +import datetime from numpy import arange @@ -227,7 +228,11 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e # On va prendre les extrapolations de la dernière donnée jusqu'à l fin du graphe debut_extr = int(l_jours[-conf["non_sauve"]["nbextradata"]]) i_debut_extr = dates_extrapole.index(debut_extr) - i_fin_extr = dates_extrapole.index(jour_maxi) + if jour_maxi >= dates_extrapole[-1]: + i_fin_extr = len(dates_extrapole) -1 + else: + i_fin_extr = dates_extrapole.index(jour_maxi) + print("bla", i_debut_extr, i_fin_extr) # Voilà ce qu'on veut tracer dates_extrapole_trace = dates_extrapole[i_debut_extr:i_fin_extr+1] 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 else: message=formate_interpole() - texte = formate_resultat_donnee(conf["non_sauve"]["calculextradata_age"], r, typedonnee, message, liste_err) + texte = formate_resultat_donnee(conf["non_sauve"]["calculextradata_age"], conf["non_sauve"]["calculextradata_date"], r, typedonnee, message, liste_err) debug("calcul de la donnée extrapolée : "+texte, liste_err) if texte!="": liste_extracalculs.append(texte) - print(liste_extracalculs) + #print(liste_extracalculs) # Ajouter le trait ? if conf["non_sauve"]["calculextradata_trace"] == "oui": 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 if conf["non_sauve"]["calculextratemps_type"] == typedonnee: # interpolation r = interpole_lineaire_ordonnee(l_jours,l_poids,conf["non_sauve"]["calculextratemps_val"], liste_err) + if type(conf["naissance"]) == datetime.date: + rdate = conf["naissance"] + datetime.timedelta(days=r) + else: + rdate = None + if r==-1: # ça sera donc une extrapolation - r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], liste_err) + r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], liste_err) + if type(conf["naissance"]) == datetime.date: + rdate = conf["naissance"] + datetime.timedelta(days=round(r)) + else: + rdate = None message=formate_extrapole(conf["non_sauve"]["nbextradata"]) else: message=formate_interpole() - - texte = formate_resultat_age(r, conf["non_sauve"]["calculextratemps_val"], typedonnee, message, liste_err) + print(r, rdate) + texte = formate_resultat_age(r, rdate, conf["non_sauve"]["calculextratemps_val"], typedonnee, message, liste_err) #r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], typedonnee, liste_err) if texte!="": @@ -318,7 +332,10 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e agec = u.convertitunite(rep["donnee"], unite, liste_err) # Tracé de la ligne verticale ax.vlines(agec, poids_min, poids_max, linestyles="dashed", color=conf["couleurs"]["cadretxt"]) - # Tracé éventuel du texte + # date à afficher ? + if rep["affichedate"] == "oui" and rep["date"] != "": + ax.text(agec, poids_min,rep["date"]+" ", rotation=90, verticalalignment='top', horizontalalignment='center', color=conf["couleurs"]["cadretxt"], fontstyle="italic") + # Si y'a un texte à afficher if rep["texte"] != "": ax.text(agec, poids_min, " "+rep["texte"], rotation=90, verticalalignment='bottom', horizontalalignment='right', color=conf["couleurs"]["cadretxt"]) -- cgit v1.2.3