summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenise sur Lya <sekhmet@lya>2021-06-30 15:13:47 +0200
committerDenise sur Lya <sekhmet@lya>2021-06-30 15:13:47 +0200
commit2dc9eb43142b4f96cee63ff191e429ad68efacae (patch)
tree1504848f93ba947e19dfa6fc9e5006eb5669f217
parent38b5e10ae817f79fb10b6c4b8655e6d95b2885b8 (diff)
downloadoms-2dc9eb43142b4f96cee63ff191e429ad68efacae.tar.gz
oms-2dc9eb43142b4f96cee63ff191e429ad68efacae.tar.zst
oms-2dc9eb43142b4f96cee63ff191e429ad68efacae.zip
sauvegarde des dates + version de l'app dans le fichier de sauvegarde
-rw-r--r--app.py2
-rw-r--r--configuration.py5
-rw-r--r--data/changelog_data.txt10
-rw-r--r--gestion_donnees.py37
-rw-r--r--templates/index.html9
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():
27 27
28app = flask.Flask(__name__) 28app = flask.Flask(__name__)
29 29
30
31
32@app.route('/',methods=['POST','GET']) 30@app.route('/',methods=['POST','GET'])
33def index(): 31def index():
34 beta=initialise_mode_beta() 32 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 @@
4### Toutes les "constantes" de config importés pour ce qui concerne les courbes 4### Toutes les "constantes" de config importés pour ce qui concerne les courbes
5CONFIG = {} 5CONFIG = {}
6 6
7### La version de l'app
8CONFIG["version"] = 2.4
9
7# les unités acceptées 10# les unités acceptées
8CONFIG["liste_unites"] = ["jours", "semaines", "mois", "années"] 11CONFIG["liste_unites"] = ["jours", "semaines", "mois", "années"]
9CONFIG["liste_typedonnees"] = ["poids","taille"] 12CONFIG["liste_typedonnees"] = ["poids","taille"]
@@ -16,7 +19,7 @@ CONFIG["extradata"] = ["calculextradata", "calculextratemps"]
16 19
17# Liste des symboles autorisés pour les enfants (matplotlib). 20# Liste des symboles autorisés pour les enfants (matplotlib).
18# Sous forme "item: description" 21# Sous forme "item: description"
19CONFIG["liste_symboles"] = {"o": "&#x25CF;", "^": "&#x25B2;", "v": "&#x25BC;", "<": "&#x25C0;", ">": "&#x25B6;", "s": "&#x25A0;", "p": "&#11039;", "P": "&#x2795;", "x": "&times;", "D": "&#x25C6;", '$\u2665$':"&#x2665;" } 22CONFIG["liste_symboles"] = {"o": "&#x25CF;", "^": "&#x25B2;", "v": "&#x25BC;", "<": "&#x25C0;", ">": "&#x25B6;", "s": "&#x25A0;", "p": "&#11039;", "P": "&#x2795;", "x": "&times;", "D": "&#x25C6;", '$\u2665$':"&#x2665;", '$\u2217$':"&#x2217;" }
20 23
21 24
22# fichiers 25# 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 @@
1"Version 2.4","29/06/2021","<p>Plus de courbes ! 1"Version 2.4","29/06/2021","<p>Plus de courbes ! Et autres...
2<ul>
3<li>On peut désormais personnaliser la couleur et le symbol de la courbe (principale).</li>
4<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>
5<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>
6<li>Courbes de plusieurs enfants :
2<ul> 7<ul>
3<li>Pour la courbe, on peut choisir sa couleur et son symbole (demandez-moi des symboles !)</li>
4<li>Les données et la configuration sont celles de l'enfant qu'on a saisi en ""principal""</li> 8<li>Les données et la configuration sont celles de l'enfant qu'on a saisi en ""principal""</li>
5<li>Pour les enfants en plus, il faut déjà avoir le fichier de données déjà généré.</li> 9<li>Pour les enfants en plus, il faut déjà avoir le fichier de données déjà généré.</li>
6<li>On choisit alors une couleur et un symbole pour ces courbes additionnels</li> 10<li>On choisit alors une couleur et un symbole pour ces courbes additionnels</li>
11</ul></li>
12
7</ul> 13</ul>
8</p>" 14</p>"
9 15
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):
46 chainenombre = "" 46 chainenombre = ""
47 elif lettre != ' ': 47 elif lettre != ' ':
48 # autre caractère : bizarre ? 48 # autre caractère : bizarre ?
49 warning("convertit_jour_vers_python : caractère invalide : "+lettre,liste_err) 49 warning("problème à la conversion de "+chaine+". Caractère invalide : "+lettre,liste_err)
50 # à la fin s'il reste qqch on le garde dans les jours 50 # à la fin s'il reste qqch on le garde dans les jours
51 if chainenombre != "": 51 if chainenombre != "":
52 agejours += int(chainenombre) 52 agejours += int(chainenombre)
@@ -150,8 +150,8 @@ def convertit_date_vers_texte(date):
150 if date == "": 150 if date == "":
151 return "" 151 return ""
152 else: 152 else:
153 return (str(date.year)+"-"+str(date.month)+"-"+str(date.day)) 153 #return (str(date.year)+"-"+str(date.month)+"-"+str(date.day))
154 154 return str(date)
155 155
156def delta_date(date1,datenaissance): 156def delta_date(date1,datenaissance):
157 """ renvoie le nombre de jours (entier) entre date1 et datenaissance format "datetime" 157 """ renvoie le nombre de jours (entier) entre date1 et datenaissance format "datetime"
@@ -164,6 +164,7 @@ def delta_date(date1,datenaissance):
164 return jours 164 return jours
165 165
166 166
167
167################### On regroupe tout ce qui gère les données en une fonction 168################### On regroupe tout ce qui gère les données en une fonction
168 169
169def web_vers_python(data,liste_err, court=False): 170def web_vers_python(data,liste_err, court=False):
@@ -417,6 +418,7 @@ def gere_donnees(data,naissance,typedonnee,liste_err):
417def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config): 418def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config):
418 """ retourne le json à renvoyer""" 419 """ retourne le json à renvoyer"""
419 gros_dico = copy.deepcopy(config) 420 gros_dico = copy.deepcopy(config)
421 gros_dico["version"] = CONFIG["version"]
420 l_jours2 = [convertit_age_vers_texte(d) for d in l_jours] 422 l_jours2 = [convertit_age_vers_texte(d) for d in l_jours]
421 l_jourst2 = [convertit_age_vers_texte(d) for d in l_jourst] 423 l_jourst2 = [convertit_age_vers_texte(d) for d in l_jourst]
422 gros_dico["data_j"] = l_jours2 424 gros_dico["data_j"] = l_jours2
@@ -426,6 +428,13 @@ def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config):
426 # gérer la date de naissance 428 # gérer la date de naissance
427 if gros_dico.get("naissance","") != "": 429 if gros_dico.get("naissance","") != "":
428 gros_dico["naissance"] = convertit_date_vers_texte(gros_dico["naissance"]) 430 gros_dico["naissance"] = convertit_date_vers_texte(gros_dico["naissance"])
431 # Calcul de toutes les dates de données
432 l_dates_poids = [convertit_date_vers_texte( config["naissance"] + datetime.timedelta(days=jours) ) for jours in l_jours]
433 l_dates_taille = [convertit_date_vers_texte( config["naissance"] + datetime.timedelta(days=jours) ) for jours in l_jourst]
434 gros_dico["data_dates_poids"]= l_dates_poids
435 gros_dico["data_dates_taille"] = l_dates_taille
436
437
429 # gérer l'age maxi 438 # gérer l'age maxi
430 gros_dico["maxi"] = convertit_age_vers_texte(gros_dico["maxi"]) 439 gros_dico["maxi"] = convertit_age_vers_texte(gros_dico["maxi"])
431 # gérer les couleurs 440 # gérer les couleurs
@@ -438,11 +447,12 @@ def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config):
438 447
439 return json.dumps(gros_dico, indent=2,ensure_ascii=False ) 448 return json.dumps(gros_dico, indent=2,ensure_ascii=False )
440 449
441def fusionne_donnees(listes_jours,listes_donnees): 450def fusionne_donnees(listes_jours,listes_donnees, listes_dates):
442 """ prend en argument deux dicos de listes. Chaque liste de jours est associée à une liste 451 """ prend en argument deux dicos de listes. Chaque liste de jours est associée à une liste
443 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 452 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
444 ("age":truc, "donnee1":truc, "donnee2":truc, ...) triée par ordre de jours. Si jamais une des données est vide, 453 {"age":truc, "donnee1":truc, "donnee2":truc, ...} triée par ordre de jours. Si jamais une des données est vide,
445 le champ du dictionnaire n'est pas rempli""" 454 le champ du dictionnaire n'est pas rempli
455 Le troisième paquet de listes (les dates) peut être vide ou bien simiaire : même clés."""
446 456
447 def fini(lj): 457 def fini(lj):
448 """ teste si les listes sont toutes vides """ 458 """ teste si les listes sont toutes vides """
@@ -468,11 +478,18 @@ def fusionne_donnees(listes_jours,listes_donnees):
468 # On extrait les données dans les deux listes (jours et données) 478 # On extrait les données dans les deux listes (jours et données)
469 jour = listes_jours[typedonnee].pop(0) 479 jour = listes_jours[typedonnee].pop(0)
470 donnee = listes_donnees[typedonnee].pop(0) 480 donnee = listes_donnees[typedonnee].pop(0)
481
471 if liste_f == [] or jour != liste_f[-1]["age"]: # Si le jour est un "nouveau" jour 482 if liste_f == [] or jour != liste_f[-1]["age"]: # Si le jour est un "nouveau" jour
472 liste_f.append({"age":jour}) 483 liste_f.append({"age":jour})
473 # On met à jour l'élément 484 # On met à jour l'élément (ou on l'ajoute)
474 liste_f[-1][typedonnee] = donnee 485 liste_f[-1][typedonnee] = donnee
475 486
487 # Si il y a une date associée, on la met !
488 if listes_dates[typedonnee] != []:
489 date = listes_dates[typedonnee].pop(0)
490 liste_f[-1]["date"] = convertit_date_vers_texte(date)
491
492
476 return liste_f 493 return liste_f
477 494
478 495
@@ -492,16 +509,20 @@ def fichier_json_vers_configdonnees(chaine,liste_err):
492 509
493 listes_jours = {} 510 listes_jours = {}
494 listes_donnees = {} 511 listes_donnees = {}
512 listes_dates = {}
495 for typed in CONFIG["liste_typedonnees"]: 513 for typed in CONFIG["liste_typedonnees"]:
496 if typed == "poids": # pour la rétrocompatibilité 514 if typed == "poids": # pour la rétrocompatibilité
497 listes_jours[typed] = valform.get("data_j",[]) 515 listes_jours[typed] = valform.get("data_j",[])
498 listes_donnees[typed] = valform.get("data_p",[]) 516 listes_donnees[typed] = valform.get("data_p",[])
517 listes_dates[typed] = valform.get("data_dates_"+typed,[])
499 else: 518 else:
500 listes_jours[typed] = valform.get("data_jours_"+typed,[]) 519 listes_jours[typed] = valform.get("data_jours_"+typed,[])
501 listes_donnees[typed] = valform.get("data_"+typed,[]) 520 listes_donnees[typed] = valform.get("data_"+typed,[])
521 listes_dates[typed] = valform.get("data_dates_"+typed,[])
522
502 523
503 debug("Avant fusion : listes jours "+str(listes_jours),liste_err) 524 debug("Avant fusion : listes jours "+str(listes_jours),liste_err)
504 liste_donnees = fusionne_donnees(listes_jours,listes_donnees) 525 liste_donnees = fusionne_donnees(listes_jours,listes_donnees, listes_dates)
505 debug("Fusion de listes ok. Liste moche : "+str(liste_donnees),liste_err) 526 debug("Fusion de listes ok. Liste moche : "+str(liste_donnees),liste_err)
506 for i in range(len(liste_donnees)): 527 for i in range(len(liste_donnees)):
507 for (cle,val) in liste_donnees[i].items(): 528 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 @@
17 </label> 17 </label>
18 <input type="file" name="fichier_donnees" id="fichier_donnees" oninput="upload_file('form_import_donnees')"> 18 <input type="file" name="fichier_donnees" id="fichier_donnees" oninput="upload_file('form_import_donnees')">
19</form> 19</form>
20
21{% if "version" in valform %}
22<p>Version du fichier de sauvegarde : {{ valform.version }}.</p>{% endif %}
23{% if "version" not in valform or valform.version < CONFIG.version %}
24<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).
25</p>{% endif %}
26
20</div> 27</div>
21 28
22<form id="donnees_enfant"> 29<form id="donnees_enfant">
@@ -63,7 +70,7 @@
63{% for i in range(valform.nb_data) %} 70{% for i in range(valform.nb_data) %}
64<tr><td> 71<tr><td>
65 <input type="text" name="age_{{ i }}" value="{{ valform['age_'~i] }}"> 72 <input type="text" name="age_{{ i }}" value="{{ valform['age_'~i] }}">
66</td><td><input type="date" name="date_{{ i }}"></td> 73</td><td><input type="date" name="date_{{ i }}" value="{{ valform['date_'~i] }}"></td>
67 <td><input type="text" name="poids_{{ i }}" value="{{ valform['poids_'~i] }}"></td> 74 <td><input type="text" name="poids_{{ i }}" value="{{ valform['poids_'~i] }}"></td>
68 <td class="donneesplus"><input type="text" name="taille_{{ i }}" value="{{ valform['taille_'~i] }}"></td> 75 <td class="donneesplus"><input type="text" name="taille_{{ i }}" value="{{ valform['taille_'~i] }}"></td>
69 76