possibilité de tracer les repères
authorDenise sur Lya <sekhmet@lya>
Sun, 11 Jul 2021 19:45:36 +0000 (21:45 +0200)
committerDenise sur Lya <sekhmet@lya>
Sun, 11 Jul 2021 19:45:36 +0000 (21:45 +0200)
configuration.py
data/changelog_data.txt
gestion_donnees.py
static/outilspage.js
static/style.css
templates/index.html
trace_courbe.py

index 80a954529f41cdfa210716d48a1096042855c0a6..f7dc1f3811d574ff7b35599b1a0d10e5ed5c69b2 100644 (file)
@@ -135,6 +135,9 @@ DEFAUT["grilleamelio"] = "oui"
 
 DEFAUT["prematurite"] = "0j"
 DEFAUT["agecorrige"] = "oui"
+#repere = {"typed": "age", "donnee": "", "texte": ""}
+DEFAUT["liste_reperes"] = []
+DEFAUT["nb_reperes_mini"] = 3 # Nombre minimum de lignes de repères 
 
 # initialiser la config
 def config_init():
index a7c959e2ee28db770d2714a677eb4124b78a6349..2529da7c0658b4bfd0dacefc65782e1e10d72954 100644 (file)
@@ -1,9 +1,10 @@
-"Version 2.4","29/06/2021","<p>Plus de courbes ! Et autres...
+"Version 2.45","29/06/2021","<p>Plus de courbes ! Et autres...
 <ul>
 <li>On peut désormais personnaliser la couleur et le symbol de la courbe (principale).</li>
 <li>Les dates sont maintenant exportées et importées. C'est plus sympa pour la lecture (pour le calcul, la donnée en âge l'emporte).</li>
 <li>Une version de l'appli est incluse dans le fichier de sauvegarde. On affiche un petit message si la version du fichier importé est inférieure à celle du site, mais normalement tout reste compatible. Si vous voulez la toute dernière version, il suffit de ré-enregistrer vos données, tout simplement.</li>
-<li>Normalement on peut saisir les dates au format aaaa/mm/dd si on est en mode "texte" pour plus de cohérence avec l'affichage "confortable".</li>
+<li>Il est possible de tracer des repères sur les courbes (lignes verticales à un âge donné). Ces repères sont sauvegardés (et vous pouvez décocher le ""tracer"" afin de les sauvegarder sans les tracer).</li>
+<li>Normalement on peut saisir les dates au format aaaa/mm/dd si on est en mode ""texte"" pour plus de cohérence avec l'affichage ""confortable"".</li>
 <li>Courbes de plusieurs enfants :
 <ul>
 <li>Les données et la configuration sont celles de l'enfant qu'on a saisi en ""principal""</li>
index 137849d7e6701725c94efedcbcf8ecb57cc22345..8e19d8b805aec12268303f825e5a291ebae78b7c 100644 (file)
@@ -368,6 +368,19 @@ def gere_configuration(data,liste_err, court=False):
         configuration["non_sauve"]["calculextratemps_trace"] = gere_checkbox(data.get("calculextratemps_trace"))
 
     
+        ### Gestion des repères additionnels
+        configuration["liste_reperes"] = []
+        i=0
+        while "repere_texte_"+str(i) in data: # Tant qu'il y a des trucs définis
+            debug("Repère trouvé", liste_err)
+            age=data.get("repere_age_"+str(i), "")
+            trace=gere_checkbox(data.get("repere_trace_"+str(i), ""))
+            if age !="":
+                agec=convertit_jours_vers_python(age, liste_err)
+                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})
+            i+=1
+    
     return configuration   
  
     
@@ -441,6 +454,9 @@ def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config):
         
     # gérer l'age maxi
     gros_dico["maxi"] = convertit_age_vers_texte(gros_dico["maxi"])
+    # Gérer les repères
+    for i in range(len(gros_dico["liste_reperes"])):
+        gros_dico["liste_reperes"][i]["donnee"] = convertit_age_vers_texte(gros_dico["liste_reperes"][i]["donnee"])
     # gérer les couleurs
     for clecouleur in DEFAUT["couleurs"]:
         gros_dico["couleurs"][clecouleur] = tuple_vers_rgb(gros_dico["couleurs"][clecouleur])
index e3502744f6fea2ea07990d6ad02ec757c36a3246..5d1fc4165d75b61b627ebdfe819fdfad94531e10 100644 (file)
@@ -26,7 +26,7 @@ function ajoutelignes()
                var cellpoids = ligne.insertCell(2);
                var celltaille = ligne.insertCell(3);
                
-               cellage.innerHTML = '<input type="text" name="age_'+i+'">' ;
+               cellage.innerHTML = '<input type="text" class="data" name="age_'+i+'">' ;
                celldate.innerHTML = '<input name="date_'+i+'">' ;
                celldate.firstChild.type = mode ;
                if(mode == "text") // si on a déjà affiché les cases en mode texte, on continue en mode texte
@@ -35,8 +35,8 @@ function ajoutelignes()
                        celldate.firstChild.maxlength = taillemaxdate ;
                        celldate.firstChild.placeholder = placeholder_date ;
                }
-               cellpoids.innerHTML = '<input type="text" name="poids_'+i+'">' ;        
-               celltaille.innerHTML = '<input type="text" name="taille_'+i+'">' ;
+               cellpoids.innerHTML = '<input type="text" class="data" name="poids_'+i+'">' ;   
+               celltaille.innerHTML = '<input type="text" class="data" name="taille_'+i+'">' ;
                celltaille.classList.add("donneesplus") ;
                if(deuxiemeligne.children[3].style.display == "block")
                        celltaille.style.display = "block" ;
@@ -163,3 +163,18 @@ function vide_champ(nom)
        var elt = document.getElementById(nom) ;
        elt.value = "" ;
 }
+
+function ajoute_reperes()
+{ // ajoute des repères
+       var eltul = document.getElementById("ajoutereperecourbe") ;
+       var nblignes = eltul.childElementCount ;
+//     alert(nblignes) ;
+       var nb_additionnel = 2;
+       for(var i=nblignes; i<nblignes+nb_additionnel ; i++) 
+       {
+               var elt = document.createElement("li") ;
+               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="">' ;
+               eltul.appendChild(elt) ;
+       }
+       
+}
index b048f11cf2984b89cd7baac7523a2778c6340dc9..95cd55e51352600c46ed511a7319dfc72c6cb71e 100644 (file)
@@ -116,3 +116,12 @@ nav {
 #content {
        padding-bottom: 70px;
 }
+
+/* Taille des champs */
+.texte {
+       width:20em
+}
+
+.data {
+       width:7em
+}
index e9656dac22b106a19db35f59b4a2fb7fa34bb305..abd1a1305eedac5170592061607bdcd6e2f5c76b 100644 (file)
@@ -24,7 +24,7 @@
 {% if "version" not in valform or valform.version < CONFIG.version %}
 <p class="petit">Note : La version du fichier de sauvegarde est inférieure à la version du site ({{ CONFIG.version}}), mais cela ne devrait pas générer de bug (normalement).
 </p>{% elif valform.version > CONFIG.version %}
-<p class="petit">Note : la version du fichier de sauvegarde ({{ valform.version }}) est <b>supérieure</b> à la version du site ({{ CONFIG.version}}). Soit vous avez voyagé dans le futur, soit vous avez testé un fichier de sauvegarde de la version bêta sur la version normale du site, soit vous avez trifouillé le fichier de sauvegarde, soit... je ne sais pas. Il se peut qu'il y ait des bugs. Ou pas.</p>
+<p class="petit">Note : la version du fichier de sauvegarde ({{ valform.version }}) est <b>supérieure</b> à la version du site ({{ CONFIG.version}}). Vous avez probablement avez testé un fichier de sauvegarde de la version bêta sur la version normale du site. Sinon c'est que vous avez voyagé dans le temps, trifouillé le fichier de sauvegarde, ou... je ne sais pas. Il se peut qu'il y ait des bugs. Ou pas.</p>
 {% endif %}
 {% endif %}
 
        <input type="reset" id="reset_donnees" value="Effacer les données du formulaire">      
 </div>
 <ul>
-<li><label>Nom de l'enfant&nbsp;:</label> <input type="text" name="nom" value="{{ valform.nom }}"></li>
+<li><label>Nom de l'enfant&nbsp;:</label> <input type="text" class="texte" name="nom" value="{{ valform.nom }}"></li>
 <li><label>Sexe&nbsp;:</label> <label><input type="radio" name="sexe" value="F" {%if valform.sexe == "F" %}checked{% endif %}> féminin </label>
 | <label><input type="radio" name="sexe" value="M" {%if valform.sexe == "M"%} checked {% endif %}> masculin</label> | <label><input type="radio" name="sexe" value="N" {%if valform.sexe == "N"%} checked {% endif %}> neutre (expérimental)</label></li>
 <li><label>Date de naissance&nbsp;: </label> <input type="date" name="naissance" value="{{ valform.naissance }}">
        <p id="changemode" class="petit"><span onclick="change_mode_dates('text')" class="bouton">Cliquer ici</span> pour saisir les dates comme du texte.</p> </li>
 <li>Prématuré ? <span class="petit">(expérimental)</span> <span class="bouton" onclick="affiche_cache('prema',this)">Afficher</span>
 <div id="prema"><p class="petit">Si l'enfant est né prématuré (avant 37 semaines d'aménorrhée), indiquer de « combien » en durée (même syntaxe que pour les âges, voir plus bas). Sinon, laisser 0j.</p>
-<label>Prématurité</label> <input type="text" name="prematurite" value="{{ valform.prematurite }}"> <input type="checkbox" name="agecorrige"{% if valform.agecorrige == "oui"%} checked{%endif%}> Afficher l'âge corrigé sur la courbe (plutôt que l'âge réel).
+<label>Prématurité</label> <input type="text" class="data" name="prematurite" value="{{ valform.prematurite }}"> <input type="checkbox" name="agecorrige"{% if valform.agecorrige == "oui"%} checked{%endif%}> Afficher l'âge corrigé sur la courbe (plutôt que l'âge réel).
 </div></li>
 
 </ul>
 <p class="donneesplus">Si vous ne saisissez que des données de poids par exemple, la courbe de taille ne sera pas tracée (par défaut, voir préférences du graphique).</p>
 
 <table id="donneespoids">
-       <tr><th>Âge</th><th>Date</th><th>Poids (kg ou g)</th><th class="donneesplus">Taille (cm) </th></tr>
+       <tr><th>Âge</th><th>Date</th><th>Poids</th><th class="donneesplus">Taille (cm) </th></tr>
        
 {% for i in range(valform.nb_data) %}
 <tr><td>
-       <input type="text" name="age_{{ i }}" value="{{ valform['age_'~i] }}">
+       <input type="text" class="data" name="age_{{ i }}" value="{{ valform['age_'~i] }}">
 </td><td><input type="date" name="date_{{ i }}" value="{{ valform['date_'~i] }}"></td>
-               <td><input type="text" name="poids_{{ i }}" value="{{ valform['poids_'~i] }}"></td>
-               <td  class="donneesplus"><input type="text" name="taille_{{ i }}" value="{{ valform['taille_'~i] }}"></td>
+               <td><input type="text" class="data" name="poids_{{ i }}" value="{{ valform['poids_'~i] }}"></td>
+               <td  class="donneesplus"><input class="data" type="text" name="taille_{{ i }}" value="{{ valform['taille_'~i] }}"></td>
 
 </tr>
 {% endfor %}
                        <option value="{{ unite }}"{% if valform.unite == unite %} selected {% endif %} >{{ unite }}</option>
        {% endfor %}
                </select></label></li>
-       <li><label>valeur maximum du graphique (facultatif, syntaxe similaire à l'âge) </label><input type="text" name="maxi" value="{{ valform.maxi }}"></li>
+       <li><label>valeur maximum du graphique (facultatif, syntaxe similaire à l'âge) </label><input type="text" class="data" name="maxi" value="{{ valform.maxi }}"></li>
        
        <li><label>Même échelle sur tous les graphiques&nbsp;: </label><input type="checkbox" name="memechelle" {% if valform.memechelle == 'oui' %} checked{% endif %}></li>
        <li><label>Grille améliorée&nbsp;:</label><input type="checkbox" name="grilleamelio" {% if valform.grilleamelio == 'oui' %} checked{% endif %}></li>
        
-       <li>Dimensions du graphique&nbsp;: <label>largeur&nbsp;: </label><input type="text" name="largeur" value="{{ valform.largeur }}"> 
-       <label>hauteur&nbsp;: </label><input type="text" name="hauteur" value="{{ valform.hauteur }}"></li>
+       <li>Dimensions du graphique&nbsp;: <label>largeur&nbsp;: </label><input type="text" class="data" name="largeur" value="{{ valform.largeur }}"> 
+       <label>hauteur&nbsp;: </label><input type="text" class="data" name="hauteur" value="{{ valform.hauteur }}"></li>
        <li><label>Légende&nbsp;: <input type="checkbox" name="legende" {% if valform.legende == 'oui' %} checked{% endif %}> </label>
 <label>Position&nbsp;: <select name="positionlegende">
 {%for (pos,posnom) in [('upper left','Haut gauche'),('upper right','Haut Droite'),('lower left','Bas gauche'),('lower right','Bas droite')] %}
                {% endfor %}
        </select>
        </li>
+       
+       <li>Ajouter des repères sur les courbes. <span class="bouton petit" onclick="ajoute_reperes()">Plus de repères</span>
+               <ul id="ajoutereperecourbe">
+                       {% for i in range(valform.liste_reperes | length) %}
+                       <li>Âge&nbsp;: <input class="data" type="text" name="repere_age_{{ i }}" value="{{ valform.liste_reperes[i].donnee }}"> 
+                        Texte associé&nbsp;: <input class="texte" type="text" name="repere_texte_{{ i }}" value="{{ valform.liste_reperes[i].texte }}">
+                        Tracer&nbsp;: <input type="checkbox" name="repere_trace_{{ i }}" {% if valform.liste_reperes[i].trace %} checked {% endif %}></li>
+                       {% endfor %}
+                       {% for j in range(valform.liste_reperes | length, valform.nb_reperes_mini) %}
+                       <li>Âge&nbsp;: <input class="data" type="text" name="repere_age_{{ j }}" value=""> 
+                        Texte associé&nbsp;: <input class="texte" type="text" name="repere_texte_{{ j }}" value="">
+                        Tracer&nbsp;: <input type="checkbox" name="repere_trace_{{ j }}"></li>
+                       {% endfor %}
+               </ul>
+               
+       </li>
 </ul>
 
 
 
 <div id="extra">
 <ul>
-       <li>Calculer le prolongement de la courbe à partir des <input type="text" name="nbextradata" size="4" value="1"> dernières données (mettre 0 pour "toutes").</li>
+       <li>Calculer le prolongement de la courbe à partir des <input type="text" class="data" name="nbextradata" size="4" value="1"> dernières données (mettre 0 pour "toutes").</li>
        <li><input type="checkbox" name="prolongercourbes">Tracer l'extrapolation sur le graphique.</li>
        
        <li>Calculer <select name="calculextradata_type">
        {% for val in CONFIG.liste_typedonnees %}
        <option value="{{val}}">{{val}}</option>
        {% endfor %}
-       </select> à l'âge <input type="text" name="calculextradata_age" value="6m">
+       </select> à l'âge <input type="text" class="data" name="calculextradata_age" value="6m">
        <input type="checkbox" name="calculextradata_trace"> ... et le voir sur le graphique.</li>
        
-       <li>Calculer l'âge auquel l'enfant aura <input type="text" name="calculextratemps_val">
+       <li>Calculer l'âge auquel l'enfant aura <input type="text" class="data" name="calculextratemps_val">
        <select name="calculextratemps_type">
        <option value="">Choisir la donnée</option>
        {% for val in CONFIG.liste_typedonnees %}
index 968ca7ba2f770681dcedc53347540fa206e3582c..39ade0e4002618a138f6bf4eafb644f191db4b01 100644 (file)
@@ -25,7 +25,9 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e
     liste_extracalculs
     
     Les enfants en plus sont dans la liste enfants_add. Pour chaque item de la liste, il faut prendre
-    item[typed] pour avoir accès au nom, ljours, et ldonnees"""
+    item[typed] pour avoir accès au nom, ljours, et ldonnees
+    
+    """
     debug("debut de cree_figure. Config : "+str(conf)+". Nombre d'enfants additionnels : "+str(len(enfants_add)),liste_err)
     try:
         liste_data_labels_p,liste_data_labels_z = oms.renvoie_liste_labels(conf,CONFIG["liste_data_choisie_p"],CONFIG["liste_data_choisie_z"],liste_err)
@@ -190,7 +192,6 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e
             else:
                 titre+=" (courbe en âge réel, données OMS décalées)"
         
-        print("coucou")
         #### extrapolatios éventuelles
         # a-t-on demndé des calculs ?
         jextrapole =  conf["non_sauve"]["prolongercourbes"] == "oui"
@@ -312,6 +313,23 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e
     poids_max = poids_max * 1.05
        
 
+    ### Repères additionnels éventuels.
+    #reperes est une liste qui contient des dictionnaires avec "typed" (type de donnée : âge, etc), "donnee" :
+    #la donnée (en jours pour l'âge), et "texte": le texte à mettre sur le repère en question.
+    #Pour tracer des repères verticaux (horizontaux plus tard) sur la courbe.
+    for rep in conf["liste_reperes"]:
+        if rep.get("trace", "") == "oui": # SI on veut tracer
+            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
+            if rep["texte"] != "":
+                ax.text(agec, poids_min, " "+rep["texte"], rotation=90, verticalalignment='bottom', horizontalalignment='right', color=conf["couleurs"]["cadretxt"])
+
+
+
+
+
     # Grille custom ?
     if conf["non_sauve"]["grilleamelio"] == "oui":
         debug("On a choisi la grille plus jolie", liste_err)