petites améliorations graphiques, icône, etc
authorDenise sur Lya <sekhmet@lya>
Thu, 22 Jul 2021 12:02:16 +0000 (14:02 +0200)
committerDenise sur Lya <sekhmet@lya>
Thu, 22 Jul 2021 12:02:16 +0000 (14:02 +0200)
12 files changed:
app.py
configuration.py
data/changelog_data.txt
gestion_donnees.py
static/favicon.ico [new file with mode: 0644]
static/outilspage.js
static/requetes.js
static/style.css
templates/base.html
templates/changelog.html
templates/index.html
trace_courbe.py

diff --git a/app.py b/app.py
index 58754356da684ac8d44af7e01df979d6b0df74fe..c11eb8b6ddd2e10e6d2ebe0dee0b827c7b991e17 100644 (file)
--- a/app.py
+++ b/app.py
@@ -8,9 +8,8 @@ import base64
 from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
 
 from configuration import config_init,CONFIG
-from gestion_erreurs import initialise_erreurs, debug, niveau_debug, warning
+from gestion_erreurs import initialise_erreurs, debug, niveau_debug
 import gestion_donnees as donnees
-import gestion_couleurs as couleurs
 from trace_courbe import cree_figure
 import faq as f
 
@@ -32,12 +31,14 @@ def index():
     beta=initialise_mode_beta()
     liste_err = initialise_erreurs()    
     val_form = config_init()
+    ## Si on a chargé un fichier de données
     if flask.request.method=="POST":
         if 'fichier_donnees' in flask.request.files:
             ## charger les données dans le formulaire
             fichier = flask.request.files['fichier_donnees']
             chaine = fichier.read()
             val_form2 = donnees.fichier_json_vers_configdonnees(chaine,liste_err)
+            # Si jamais le formulaire est vide, c'est qu'il y a eu une erreur !
             if val_form2 == {}:
                 return flask.render_template("index.html",err=liste_err[2]+liste_err[1]+liste_err[0],valform=val_form, CONFIG=CONFIG, beta=beta)
             val_form.update(val_form2)
@@ -55,35 +56,17 @@ def apropos():
 def courbe_image(ext):
     liste_err = initialise_erreurs()
     data = flask.request.form
-    enfants_add = [] # Enfants additionnels
-    i=2
-    while "couleur_donnees_"+str(i) in data: # Tant qu'il y a des données de ce type
-        if 'fichier_donnees_'+str(i) in flask.request.files: # Un enfant à ajouter
-            fichier = flask.request.files["fichier_donnees_"+str(i)]
-            chaine = fichier.read() # On récupère la chaîne
-            if len(chaine)>=5: # Si elle a une longueur à peu près raisonnable
-                debug("Un fichier de données additionnel trouvé", liste_err)
-                formulaire_2 = donnees.fichier_json_vers_configdonnees(chaine, liste_err)
-                if formulaire_2 =={}:
-                    warning("Le fichier de données additionnel est vide ou mal formaté", liste_err)
-                else:
-                    debug("Form 2 : "+str(formulaire_2), liste_err)
-                    # Récupérer sous forme python
-                    conf2, ljours2, listes_donnees2 = donnees.web_vers_python(formulaire_2,liste_err, court=True)
-                    debug("Form 2 données travaillées "+str(ljours2)+str(listes_donnees2), liste_err)
-                    # Le symbole et la couleur
-                    symb2 = donnees.gere_symbole(data.get("symbole_donnees_"+str(i)))
-                    coul2 = couleurs.rgb_vers_tuple(data.get("couleur_donnees_"+str(i),""),CONFIG["couleurs"]["cadretxt"],liste_err)
-                    enfant2 = donnees.eclate_donnees_additionnelles(conf2, ljours2, listes_donnees2, symb2, coul2)
-                    enfants_add.append(enfant2)
-        i+=1
 
     # 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)
 
+    # Gérer les enfants additionnels
+    enfants_add = donnees.gere_enfants_additionnels(data, flask.request.files, liste_err)
+    debug("Enfants additionnels récupérés : "+str(enfants_add), liste_err)
+
+    # Récupérer le texte à exporter
     texte = donnees.donnees_vers_json(listes_jours["poids"],listes_donnees["poids"],listes_jours["taille"],listes_donnees["taille"], config)
-    
     debug("texte prêt à être exporté : "+texte,liste_err)
     
     # noter le nom de l'enfant pour l'export
@@ -156,7 +139,7 @@ def changelog():
     
     table_version = f.lire_fichier_csv_simple(f.fichier_changelog)
     
-    return flask.render_template("changelog.html",table = table_version,err=[], beta=beta)
+    return flask.render_template("changelog.html",table = table_version, nblignes=CONFIG["nb_lignes_changelog"], err=[], beta=beta)
 
 if __name__ == "__main__":
     print("Mode debug maison : "+str(niveau_debug))
index 0fc8f20bd15f898e228a03445f8df5b53803ce97..b22c6e3fbd788141534217d62fbd113ec1387316 100644 (file)
@@ -5,7 +5,9 @@
 CONFIG = {}
 
 ### La version de l'app
-CONFIG["version"] = 2.4
+CONFIG["version"] = 2.5
+# Nombre de versions anciennes dans le changelog
+CONFIG["nb_lignes_changelog"] = 4
 
 # les unités acceptées
 CONFIG["liste_unites"] = ["jours", "semaines", "mois", "années"]
index cbe87efd16a0d3fa2a07b1ef4d03f53b124efb84..ba601e36520ff4f0fcd0aefb4257dc03d774fb01 100644 (file)
@@ -1,6 +1,8 @@
-"Version 2.45","29/06/2021","<p>Plus de courbes ! Et d'autres choses...
+"Version 2.5","29/06/2021","<p>Plus de courbes ! Et d'autres choses...</p>
 <ul>
-<li>Un petit coup de peinture général.</li>
+<li>Un petit coup de peinture général à divers endroits.</li>
+<li>Une icône, enfin (il était temps...)</li>
+<li>La page du suivi des versions (celle-ci) a été raccourcie (sauf si on veut tout voir).</li>
 <li>On peut désormais personnaliser la couleur et le symbole 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>Courbes de plusieurs enfants :
 <ul>
 <li>Les données et la configuration sont celles de l'enfant qu'on a saisi en ""principal""</li>
-<li>Pour les enfants en plus, il faut déjà avoir le fichier de données déjà généré.</li>
-<li>On choisit alors une couleur et un symbole pour ces courbes additionnels</li>
+<li>Pour les enfants en plus, il faut déjà avoir le fichier de données (généré par l'outil).</li>
+<li>On choisit alors une couleur et un symbole pour ces courbes additionnelles.</li>
 </ul></li>
 
-</ul>
-</p>"
+</ul>"
 
-"Version 2.31","28/04/2021","<p>Les calculs de données sont améliorés :
+"Version 2.31","28/04/2021","<p>Les calculs de données sont améliorés&nbsp;:</p>
 <ul>
 <li>Si l'âge demandé (ou la donnée) est entre les données saisies, c'est une simple interpolation linéaire entre les données existantes,</li>
 <li>Si c'est en dehors, alors on fait un calcul d'extrapolation comme avant</li>
 </ul>
-En plus, on peut décider de marquer sur le graphique, ou pas, le point qu'on cherche.
-</p>"
+<p>En plus, on peut décider de marquer sur le graphique, ou pas, le point qu'on cherche.</p>"
 
 "Version 2.3001","13/03/2021","<p>Petit changement : on peut maintenant mettre le poids en grammes. Si le poids saisi est supérieur à 500 il sera automatiquement converti.</p>"
 
@@ -36,36 +36,33 @@ En plus, on peut décider de marquer sur le graphique, ou pas, le point qu'on ch
 
 "Version 2.2001","13/11/2020","<p>Amélioration de l'affichage pour les prémas (masqués par défaut). Précision dans le texte + FAQ.</p>"
 
-"Version 2.2","12/11/2020","<p>Ajout de la possibilité d'avoir la courbe ajustée pour les prématurés. Attention c'est encore en bêta ! Le principe c'est simplement les courbes OMS décalées de la durée de prématurité, ce qui convient plus ou moins bien aux enfants nés prématurés une fois qu'ils ont atteint l'âge du terme en âge corrigé.
+"Version 2.2","12/11/2020","<p>Ajout de la possibilité d'avoir la courbe ajustée pour les prématurés. Attention c'est encore en bêta ! Le principe c'est simplement les courbes OMS décalées de la durée de prématurité, ce qui convient plus ou moins bien aux enfants nés prématurés une fois qu'ils ont atteint l'âge du terme en âge corrigé.</p>
 <ul>
 <li>Si vous n'êtes pas concerné(e), laisser ""0j"" (0 jours) en prématurité (logique non ?)</li>
 <li>Si vous préférez l'âge corrigé, cocher la case. L'âge de l'enfant sera alors potentiellement négatif.</li>
 <li>Si vous préférez l'âge réel, c'est la courbe OMS qui sera alors décalée</li>
 </ul>
-Tout retour sur cette fonctionnalité est le bienvenu !
-</p>"
+Tout retour sur cette fonctionnalité est le bienvenu !"
 
-"Version 2.1","28/07/2020","<p>Petites améliorations :
+"Version 2.1","28/07/2020","<p>Petites améliorations :</p>
 <ul>
 <li>Bug corrigé : quand on ajoute des lignes, maintenant ça ajoute aussi des saisies de taille ! ^^</li>
 <li>Par défaut, les saisies de taille sont masquées (car la plupart du temps on regarde le poids). On peut cliquer pour afficher les tailles.</li>
-</ul></p>"
+</ul>"
 
-"Version 2.0","28/07/2020","<p>Nouveauté : courbes de taille disponible !
+"Version 2.0","28/07/2020","<p>Nouveauté : courbes de taille disponible !</p>
 <ul>
 <li>Il n'est pas nécessaire de saisir des tailles, l'appli trace ce qu'elle a en fonction de ce qu'on lui donne</li>
 <li>Par défaut, les courbes vides (sans donnée) ne sont pas tracées. Si vous les voulez quand même (une courbe vide de référence), il suffit de cocher une case dans les préférences du graphique</li>
 <li>Le format d'export de données est normalement compatible avec les fichiers exportés avant. Signalez moi tout bug à ce sujet !</li>
 <li>On peut cocher ""même échelle sur tous les graphiques"" quand les graphiques différents n'ont pas les mêmes données (de temps) et qu'on veut quand même qu'ils soient ""alignés"", mais qu'on laisse l'appli choisir l'échelle.</li>
-</ul>
-</p>"
+</ul>"
 
-"Version 1.1","26/06/2020","<p>Petites améliorations :
+"Version 1.1","26/06/2020","<p>Petites améliorations :</p>
 <ul>
 <li>Possibilité de saisir la date brute en texte. Pour certains navigateurs (sur smartphone ?) où il n'y avait pas cette possibilité et où il fallait parfois cliquer 15 fois pour saisir une date 15 mois plus tôt, ça va peut être être mieux. N'hésitez pas à faire plein de tests à ce sujet !</li>
 <li>L'export des données est maintenant avec l'extension «&nbsp;.txt&nbsp;». C'est exactement la même chose qu'avant (du json), et tout est compatible, car fondamentalement, l'extension c'est pour faire joli, hein, entre nous. Mais ça vous permettra de l'ouvrir sans avoir trop peur d'une part, et surtout c'est un format qui est «&nbsp;accepté&nbsp;» sur le forum LLL ;). Vous allez donc pouvoir plus facilement y poster votre fichier de données !</li>
-</ul>
-</p>"
+</ul>"
 
 "Version 1.0001","24/06/2020","<p>Petit bug corrigé (lors du choix de l'âge maxi sur la courbe)</p>"
 
index 8e19d8b805aec12268303f825e5a291ebae78b7c..c24192ef1caeb01698102fbaa51f68e626ff4253 100644 (file)
@@ -428,6 +428,44 @@ def gere_donnees(data,naissance,typedonnee,liste_err):
     
     return (l_jours,l_donnee)    
 
+# web vers python : enfants additionnels
+def gere_enfants_additionnels(data, files, liste_err):
+    """ data est le dictionnaire de requête.
+    files est le dictionnaire des fichiers (flask.request.files).
+    Renvoie les enfants additionnels sous forme de liste de dictionnaires :
+    {typed: (conf, lj, ldonnees)}
+    Dans conf y'a les infos qu'il faut pour tracer la courbe additionnelle voulue.
+    """
+
+    enfants_add = [] # Enfants additionnels
+    # Les enfants additionnels commencent à 2 (puis 3, 4, etc)
+    i=2
+    while "couleur_donnees_"+str(i) in data: # Tant qu'il y a des données de ce type
+        if 'fichier_donnees_'+str(i) in files: # Un enfant à ajouter
+            fichier = files["fichier_donnees_"+str(i)]
+            chaine = fichier.read() # On récupère la chaîne
+            if len(chaine)>=5: # Si elle a une longueur à peu près raisonnable
+                debug("Un fichier de données additionnel trouvé", liste_err)
+                formulaire_2 = fichier_json_vers_configdonnees(chaine, liste_err)
+                if formulaire_2 =={}:
+                    warning("Le fichier de données additionnel est vide ou mal formaté", liste_err)
+                else:
+                    debug("Form 2 : "+str(formulaire_2), liste_err)
+                    # Récupérer sous forme python
+                    conf2, ljours2, listes_donnees2 = web_vers_python(formulaire_2,liste_err, court=True)
+                    debug("Form 2 données travaillées "+str(ljours2)+str(listes_donnees2), liste_err)
+                    # Le symbole et la couleur
+                    symb2 = gere_symbole(data.get("symbole_donnees_"+str(i)))
+                    coul2 = rgb_vers_tuple(data.get("couleur_donnees_"+str(i),""),CONFIG["couleurs"]["cadretxt"],liste_err)
+                    enfant2 = eclate_donnees_additionnelles(conf2, ljours2, listes_donnees2, symb2, coul2)
+                    enfants_add.append(enfant2)
+        i+=1
+
+    return enfants_add
+
+
+
+
 
 # python vers Json
 #### export vers json
@@ -559,9 +597,9 @@ def eclate_donnees_additionnelles(conf, ljours, ldonnees, symb, couleur):
     """ conf est la config (on ne garde que le nom) pour un enfant additionnel,
     ljours et ldonnees les dictionnaires de listes contenant les données.
     symb est le symbole choisi pour cette courbe additionnelle (déjà vérifié)
-    On fabrique un joli dictionnaire typed -> (conf lj, ldonnee) avec le nom de l'enfant,
+    On fabrique un joli dictionnaire typed -> (conf, lj, ldonnee) avec le nom de l'enfant,
     et les données pour chaque typed"""
-    print("test conf avant "+str(ldonnees)+str(ljours))
+     #print("test conf avant "+str(ldonnees)+str(ljours))
     
     retour = {}
     conf["symbole"] = symb # On ajoute le symbole additionnel
@@ -569,5 +607,5 @@ def eclate_donnees_additionnelles(conf, ljours, ldonnees, symb, couleur):
     for typed in CONFIG["liste_typedonnees"]:
         retour[typed] = (conf, ljours[typed], ldonnees[typed])
         
-    print("test "+str(retour))
+    #print("test "+str(retour))
     return retour
\ No newline at end of file
diff --git a/static/favicon.ico b/static/favicon.ico
new file mode 100644 (file)
index 0000000..1392469
Binary files /dev/null and b/static/favicon.ico differ
index 72a9b91150ebd94a9c53bca9639687576b5348ea..dac70bff4ec7867ceb2f2f83fceb57f3ac652863 100644 (file)
@@ -44,11 +44,23 @@ function ajoutelignes()
        
 }
 
-// Affichage de la textarea "export"
+// Affichage de la section "export"
 function affiche_export()
 {
        document.getElementById("export").style.display = "block" ;
-       
+}
+// Copier vers le presse-papiers
+function copietexte()
+{
+  var elt = document.getElementById("export_texte");
+
+  /* Select the text field */
+  elt.select();
+  elt.setSelectionRange(0, 99999); /* For mobile devices */
+
+  /* Copy the text inside the text field */
+  document.execCommand("copy");
+
 }
 
 function affiche_cache(id,elemcourant)
index 5644469ac01ba224717975bc530cca3753037967..ba2a81e3a1aa3344efa8e4b8fbe39557a3ecf5fe 100644 (file)
@@ -23,7 +23,7 @@ function appelle_image()
                        var calculextra = this.response.calculextra ;
 
                        // on affiche l'export des données
-                       document.getElementById('export').innerHTML = texte;
+                       document.getElementById('export_texte').innerHTML = texte;
                        document.getElementById('sectionexport').style.display = "block";
                
                        
index 95cd55e51352600c46ed511a7319dfc72c6cb71e..4b82077d77432eef27e439eb63b6c185e4340843 100644 (file)
@@ -37,12 +37,14 @@ img#courbe {
        display: none;
 }
 
-#export {
+#export_texte {
        width: 25em;
        height: 20em;
-       display:none;
        max-width: 100%
 }
+#export {
+       display: none;
+}
 
 #courbe_warnings {
        display: none;
@@ -125,3 +127,8 @@ nav {
 .data {
        width:7em
 }
+
+/* Page changelog */
+#suite_changelog {
+       display: none;
+}
index b84df6f4f50d51a050b17e0b07655a75b6fd64cf..58e094df6a152f29cf7e73c48ee9aa0715b175e5 100644 (file)
@@ -4,7 +4,8 @@
     <head>
         <meta charset="UTF-8" >
         <title>Courbes de croissance OMS de l'enfant</title>
-        <link rel="stylesheet" href="static/style.css" type="text/css">
+               <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}"  type="text/css">
+        <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
         <script src="static/requetes.js"></script>
         <script src="static/outilspage.js"></script>
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
index 7ba96cd7a53767ae5357ba55f5dcc1c2609e9885..ed47f99ffb44f46012a7ced066cb87e3d69a2347 100644 (file)
@@ -1,17 +1,28 @@
 {% extends "base.html" %}
 {% block contenu %}
+
 <h2>Suivi des versions</h2>
 
 {% for ligne in table %}
-<div class="version">
-<h3>{{ ligne[0] }}</h3>
-<div class="date">Le {{ ligne[1] }}</div>
+       <div class="version">
+       <h3>{{ ligne[0] }}</h3>
+       <div class="date">Le {{ ligne[1] }}</div>
 
-<div class="contenu_changelog">
-{{ ligne[2]|safe }}
-</div>
+       <div class="contenu_changelog">
+       {{ ligne[2]|safe }}
+       </div>
+       
+       </div>
+       {% if loop.index == nblignes and table | length > nblignes %}
+       <hr>
+       <p><span class="bouton" onclick="affiche_cache('suite_changelog', this)">Afficher</span> le log des versions plus anciennes.</p>
+       <div id="suite_changelog">
+       {% endif %}
+       
 {% endfor %}
-
+{% if table |length > nblignes %}
+</div>
+{% endif %}
 
 
 
index 0ec6e9b621bb012c6f430a44f48409189a7c52d9..f25df0ee687eafae0a9ff6833bb5d03a36409db1 100644 (file)
        <input type="checkbox" name="calculextratemps_trace"> ... et le voir sur le graphique.</li>
        
 </ul>
-<p>Les résultats de calculs seront affichés en-dessous des courbes.</p>
+<p>Les résultats de calculs seront affichés en-dessous des courbes. Ils ne seront pas sauvegardés.</p>
 </div>
 
+<!-- Section courbes multiples -->
 <h3>Courbes multiples</h3>
 <div class="bouton" onclick="affiche_cache('multi',this)">Afficher</div>
 
 <div id="multi">
-       <p>Si vous souhaitez tracer sur le même graphique les courbes de différents enfants, c'est ici. Il faut importer le fichier de données additionnel de l'autre enfant (ou des autres enfants). Seul le nom de l'enfant et ses données seront utilisés, les autres paramètres (courbe de référence suivant le sexe, maximum du graphique, ...) seront ceux de l'enfant «&nbsp;principal&nbsp;».</p>
+       <p>Si vous souhaitez tracer sur le même graphique les courbes de différents enfants, c'est ici.</p>
+       <p> Il faut importer le fichier de données additionnel de l'autre enfant (ou des autres enfants). Seul le nom de l'enfant et ses données seront utilisés, les autres paramètres (courbe de référence suivant le sexe, maximum du graphique, ...) seront ceux de l'enfant «&nbsp;principal&nbsp;».</p>
+       <p>Remarque&nbsp;: lors de l'export, seul l'enfant «&nbsp;principal&nbsp;» est sauvegardé.</p>
   <ul id="liste_enfants_add">{% for numero_enfant in range(2, CONFIG.nb_fichiers_enfants_add+2) %}
          <li><input type="file" name="fichier_donnees_{{ numero_enfant }}" id="fichier_donnees_{{ numero_enfant }}"> <span class="bouton petit" onclick="vide_champ('fichier_donnees_{{ numero_enfant }}')">Enlever ce fichier</span> | 
   Symbole&nbsp;: <select name="symbole_donnees_{{ numero_enfant }}"> 
        </ul>
 </div>
 
+<!-- Section export des courbes -->
 
 <div id="sectionexport">
        <h2>Export des données</h2>
                <img src="static/icons/export.png">
                <span class="icon_legend">Télécharger les données</span>
        </div>
-       <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>
-       <textarea readonly id="export">
+       <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>
+       <div id="export">
+       <textarea readonly id="export_texte">
        </textarea>
+       <p><span class="bouton" onclick="copietexte()">Sélectionner et copier</span> le texte dans le presse-papier.</p>
+       </div>
 
 </div>
 
index 39ade0e4002618a138f6bf4eafb644f191db4b01..c39f2657b9c15217cd5cc167407b4639ca7e3ca0 100644 (file)
@@ -176,7 +176,7 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e
                 lj_conv = u.convertit_tableau(lj,unite,liste_err)
                 debug("Tracé de la courbe additionnelle de "+conf_add["nom"]+" config : "+str(conf_add), liste_err)
                 ax.plot(lj_conv, ld, label=conf_add["nom"], color=conf_add["couleurcourbe"],marker=conf_add["symbole"])
-                print("bla")
+
                 if conf["sexe"] != conf_add["sexe"]:
                     warning("Attention, tous les enfants n'ont pas le même sexe. La courbe de référence est celle de "+conf["nom"]+" et ne sera pas forcément pertinente pour les autres. Vous pouvez éventuellement essayer la courbe neutre. Remarque : cette alerte s'affichera quand même.", liste_err)
 
@@ -245,10 +245,6 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, e
                         # ça sera donc une extrapolation
                         r = calcule_donnee_extrapolee(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextradata_age"], liste_err)          
                         message=formate_extrapole(conf["non_sauve"]["nbextradata"])
-#                        if  == 0:
-#                            message+="l'ensemble des données"
-#                        else:
-#                            message+="les "+str(conf["non_sauve"]["nbextradata"])+" dernière"+met_s(conf["non_sauve"]["nbextradata"])+" données"
                     else:
                         message=formate_interpole()