From 2dc9eb43142b4f96cee63ff191e429ad68efacae Mon Sep 17 00:00:00 2001
From: Denise sur Lya
Date: Wed, 30 Jun 2021 15:13:47 +0200
Subject: sauvegarde des dates + version de l'app dans le fichier de sauvegarde
---
app.py | 2 --
configuration.py | 5 ++++-
data/changelog_data.txt | 10 ++++++++--
gestion_donnees.py | 37 +++++++++++++++++++++++++++++--------
templates/index.html | 9 ++++++++-
5 files changed, 49 insertions(+), 14 deletions(-)
diff --git a/app.py b/app.py
index 206af47..3ccabad 100644
--- 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()
diff --git a/configuration.py b/configuration.py
index fc573ba..80a9545 100644
--- a/configuration.py
+++ b/configuration.py
@@ -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": "●", "^": "▲", "v": "▼", "<": "◀", ">": "▶", "s": "■", "p": "⬟", "P": "➕", "x": "×", "D": "◆", '$\u2665$':"♥" }
+CONFIG["liste_symboles"] = {"o": "●", "^": "▲", "v": "▼", "<": "◀", ">": "▶", "s": "■", "p": "⬟", "P": "➕", "x": "×", "D": "◆", '$\u2665$':"♥", '$\u2217$':"∗" }
# fichiers
diff --git a/data/changelog_data.txt b/data/changelog_data.txt
index 5c50ff7..995437b 100644
--- a/data/changelog_data.txt
+++ b/data/changelog_data.txt
@@ -1,9 +1,15 @@
-"Version 2.4","29/06/2021","
Plus de courbes !
+"Version 2.4","29/06/2021","
Plus de courbes ! Et autres...
+
+
On peut désormais personnaliser la couleur et le symbol de la courbe (principale).
+
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).
+
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.
+
Courbes de plusieurs enfants :
-
Pour la courbe, on peut choisir sa couleur et son symbole (demandez-moi des symboles !)
Les données et la configuration sont celles de l'enfant qu'on a saisi en ""principal""
Pour les enfants en plus, il faut déjà avoir le fichier de données déjà généré.
On choisit alors une couleur et un symbole pour ces courbes additionnels
+
+
"
diff --git a/gestion_donnees.py b/gestion_donnees.py
index 5876c5a..372d6aa 100644
--- a/gestion_donnees.py
+++ b/gestion_donnees.py
@@ -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():
diff --git a/templates/index.html b/templates/index.html
index be2ab48..a606667 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -17,6 +17,13 @@
+
+{% if "version" in valform %}
+
Version du fichier de sauvegarde : {{ valform.version }}.
{% endif %}
+{% if "version" not in valform or valform.version < CONFIG.version %}
+
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).
+