sauvegarde des dates + version de l'app dans le fichier de sauvegarde
authorDenise sur Lya <sekhmet@lya>
Wed, 30 Jun 2021 13:13:47 +0000 (15:13 +0200)
committerDenise sur Lya <sekhmet@lya>
Wed, 30 Jun 2021 13:13:47 +0000 (15:13 +0200)
app.py
configuration.py
data/changelog_data.txt
gestion_donnees.py
templates/index.html

diff --git a/app.py b/app.py
index 206af476ff5d56c3624dbdaee293f3730e3a1335..3ccabad2f57271ec1b36871da4356acaf6df3aaa 100644 (file)
--- a/app.py
+++ b/app.py
@@ -27,8 +27,6 @@ def initialise_mode_beta():
 
 app = flask.Flask(__name__)
 
-
-
 @app.route('/',methods=['POST','GET'])
 def index():
     beta=initialise_mode_beta()
index fc573ba43dd627bc73aa76d46fb065e2fc9949e1..80a954529f41cdfa210716d48a1096042855c0a6 100644 (file)
@@ -4,6 +4,9 @@
 ### Toutes les "constantes" de config importés pour ce qui concerne les courbes
 CONFIG = {}
 
+### La version de l'app
+CONFIG["version"] = 2.4
+
 # les unités acceptées
 CONFIG["liste_unites"] = ["jours", "semaines", "mois", "années"]
 CONFIG["liste_typedonnees"] = ["poids","taille"]
@@ -16,7 +19,7 @@ CONFIG["extradata"] = ["calculextradata", "calculextratemps"]
 
 # Liste des symboles autorisés pour les enfants (matplotlib).
 # Sous forme "item: description"
-CONFIG["liste_symboles"] = {"o": "&#x25CF;", "^": "&#x25B2;", "v": "&#x25BC;", "<": "&#x25C0;", ">": "&#x25B6;", "s": "&#x25A0;", "p": "&#11039;", "P": "&#x2795;", "x": "&times;", "D": "&#x25C6;", '$\u2665$':"&#x2665;" }
+CONFIG["liste_symboles"] = {"o": "&#x25CF;", "^": "&#x25B2;", "v": "&#x25BC;", "<": "&#x25C0;", ">": "&#x25B6;", "s": "&#x25A0;", "p": "&#11039;", "P": "&#x2795;", "x": "&times;", "D": "&#x25C6;", '$\u2665$':"&#x2665;", '$\u2217$':"&#x2217;" }
 
 
 # fichiers
index 5c50ff7498a16da5be1ef9ad2e711620cc8df889..995437b8857a622339bb44921039736173c1c711 100644 (file)
@@ -1,9 +1,15 @@
-"Version 2.4","29/06/2021","<p>Plus de courbes !
+"Version 2.4","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>Courbes de plusieurs enfants :
 <ul>
-<li>Pour la courbe, on peut choisir sa couleur et son symbole (demandez-moi des symboles !)</li>
 <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>
+</ul></li>
+
 </ul>
 </p>"
 
index 5876c5abac245e32b9a99b0103fdefd17d956523..372d6aa4b8dcdce9e9aa48b70868b0f200c4ab71 100644 (file)
@@ -46,7 +46,7 @@ def convertit_jours_vers_python(chaine,liste_err):
                 chainenombre = ""
             elif lettre != ' ':
                 # autre caractère : bizarre ?
-                warning("convertit_jour_vers_python : caractère invalide : "+lettre,liste_err)
+                warning("problème à la conversion de "+chaine+". Caractère invalide : "+lettre,liste_err)
     # à la fin s'il reste qqch on le garde dans les jours
     if chainenombre != "":
         agejours += int(chainenombre)
@@ -150,8 +150,8 @@ def convertit_date_vers_texte(date):
     if date == "":
         return ""
     else:
-        return (str(date.year)+"-"+str(date.month)+"-"+str(date.day))
-     
+        #return (str(date.year)+"-"+str(date.month)+"-"+str(date.day))
+        return str(date)
 
 def delta_date(date1,datenaissance):
     """ renvoie le nombre de jours (entier) entre date1 et datenaissance format "datetime"
@@ -164,6 +164,7 @@ def delta_date(date1,datenaissance):
     return jours
 
 
+
 ################### On regroupe tout ce qui gère les données en une fonction
     
 def web_vers_python(data,liste_err, court=False):
@@ -417,6 +418,7 @@ def gere_donnees(data,naissance,typedonnee,liste_err):
 def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config):
     """ retourne le json à renvoyer"""
     gros_dico = copy.deepcopy(config)
+    gros_dico["version"] = CONFIG["version"]
     l_jours2 = [convertit_age_vers_texte(d) for d in l_jours]
     l_jourst2 = [convertit_age_vers_texte(d) for d in l_jourst]
     gros_dico["data_j"] = l_jours2
@@ -426,6 +428,13 @@ def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config):
     # gérer la date de naissance
     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]
+        gros_dico["data_dates_poids"]= l_dates_poids
+        gros_dico["data_dates_taille"] = l_dates_taille
+            
+        
     # gérer l'age maxi
     gros_dico["maxi"] = convertit_age_vers_texte(gros_dico["maxi"])
     # gérer les couleurs
@@ -438,11 +447,12 @@ def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config):
         
     return json.dumps(gros_dico, indent=2,ensure_ascii=False )
 
-def fusionne_donnees(listes_jours,listes_donnees):
+def fusionne_donnees(listes_jours,listes_donnees, listes_dates):
     """ prend en argument deux dicos de listes. Chaque liste de jours est associée à une liste 
     de données (par la même clé de type de données). Il faut les fusionner pour avoir une liste de dictionnaires, de type
-    ("age":truc, "donnee1":truc, "donnee2":truc, ...) triée par ordre de jours. Si jamais une des données est vide,
-    le champ du dictionnaire n'est pas rempli"""
+    {"age":truc, "donnee1":truc, "donnee2":truc, ...} triée par ordre de jours. Si jamais une des données est vide,
+    le champ du dictionnaire n'est pas rempli
+    Le troisième paquet de listes (les dates) peut être vide ou bien simiaire : même clés."""
 
     def fini(lj):
         """ teste si les listes sont toutes vides """
@@ -468,11 +478,18 @@ def fusionne_donnees(listes_jours,listes_donnees):
         # On extrait les données dans les deux listes (jours et données)
         jour = listes_jours[typedonnee].pop(0)
         donnee = listes_donnees[typedonnee].pop(0)
+            
         if liste_f == [] or jour != liste_f[-1]["age"]: # Si le jour est un "nouveau" jour
             liste_f.append({"age":jour})
-        # On met à jour l'élément
+        # On met à jour l'élément (ou on l'ajoute)
         liste_f[-1][typedonnee] = donnee
         
+        # Si il y a une date associée, on la met !
+        if listes_dates[typedonnee] != []:
+            date = listes_dates[typedonnee].pop(0)
+            liste_f[-1]["date"] = convertit_date_vers_texte(date)
+
+        
     return liste_f
     
 
@@ -492,16 +509,20 @@ def fichier_json_vers_configdonnees(chaine,liste_err):
     
     listes_jours = {}
     listes_donnees = {}
+    listes_dates = {}
     for typed in CONFIG["liste_typedonnees"]:
         if typed == "poids": # pour la rétrocompatibilité            
             listes_jours[typed] = valform.get("data_j",[])
             listes_donnees[typed] = valform.get("data_p",[])
+            listes_dates[typed] = valform.get("data_dates_"+typed,[])
         else:
             listes_jours[typed] = valform.get("data_jours_"+typed,[])
             listes_donnees[typed] = valform.get("data_"+typed,[])
+            listes_dates[typed] = valform.get("data_dates_"+typed,[])
+            
     
     debug("Avant fusion : listes jours "+str(listes_jours),liste_err)
-    liste_donnees = fusionne_donnees(listes_jours,listes_donnees)
+    liste_donnees = fusionne_donnees(listes_jours,listes_donnees, listes_dates)
     debug("Fusion de listes ok. Liste moche : "+str(liste_donnees),liste_err)
     for i in range(len(liste_donnees)):
         for (cle,val) in liste_donnees[i].items():
index be2ab48f05416674907fefda5ca26305ef668a17..a606667bcc5d55d9106498d25915088a76ab2215 100644 (file)
   </label>
   <input type="file" name="fichier_donnees" id="fichier_donnees" oninput="upload_file('form_import_donnees')">
 </form> 
+
+{% if "version" in valform %}
+<p>Version du fichier de sauvegarde : {{ valform.version }}.</p>{% endif %}
+{% 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>{% endif %}
+
 </div>
 
 <form id="donnees_enfant">
@@ -63,7 +70,7 @@
 {% for i in range(valform.nb_data) %}
 <tr><td>
        <input type="text" name="age_{{ i }}" value="{{ valform['age_'~i] }}">
-</td><td><input type="date" name="date_{{ i }}"></td>
+</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>