]> git.immae.eu Git - perso/Denise/oms.git/commitdiff
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 = flask.Flask(__name__)
 
-
-
 @app.route('/',methods=['POST','GET'])
 def index():
     beta=initialise_mode_beta()
 @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 = {}
 
 ### 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"]
 # 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"
 
 # 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
 
 
 # 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>
 <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>
 <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>"
 
 </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 ?
                 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)
     # à 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:
     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"
 
 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
 
 
     return jours
 
 
+
 ################### On regroupe tout ce qui gère les données en une fonction
     
 def web_vers_python(data,liste_err, court=False):
 ################### 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)
 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
     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"])
     # 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
     # 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 )
 
         
     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
     """ 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 """
 
     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)
         # 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})
         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
         
         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
     
 
     return liste_f
     
 
@@ -492,16 +509,20 @@ def fichier_json_vers_configdonnees(chaine,liste_err):
     
     listes_jours = {}
     listes_donnees = {}
     
     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",[])
     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,[])
         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)
     
     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():
     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> 
   </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">
 </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] }}">
 {% 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>
 
                <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>