diff options
-rw-r--r-- | app.py | 2 | ||||
-rw-r--r-- | configuration.py | 5 | ||||
-rw-r--r-- | data/changelog_data.txt | 10 | ||||
-rw-r--r-- | gestion_donnees.py | 37 | ||||
-rw-r--r-- | templates/index.html | 9 |
5 files changed, 49 insertions, 14 deletions
@@ -27,8 +27,6 @@ def initialise_mode_beta(): | |||
27 | 27 | ||
28 | app = flask.Flask(__name__) | 28 | app = flask.Flask(__name__) |
29 | 29 | ||
30 | |||
31 | |||
32 | @app.route('/',methods=['POST','GET']) | 30 | @app.route('/',methods=['POST','GET']) |
33 | def index(): | 31 | def 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 |
5 | CONFIG = {} | 5 | CONFIG = {} |
6 | 6 | ||
7 | ### La version de l'app | ||
8 | CONFIG["version"] = 2.4 | ||
9 | |||
7 | # les unités acceptées | 10 | # les unités acceptées |
8 | CONFIG["liste_unites"] = ["jours", "semaines", "mois", "années"] | 11 | CONFIG["liste_unites"] = ["jours", "semaines", "mois", "années"] |
9 | CONFIG["liste_typedonnees"] = ["poids","taille"] | 12 | CONFIG["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" |
19 | CONFIG["liste_symboles"] = {"o": "●", "^": "▲", "v": "▼", "<": "◀", ">": "▶", "s": "■", "p": "⬟", "P": "➕", "x": "×", "D": "◆", '$\u2665$':"♥" } | 22 | CONFIG["liste_symboles"] = {"o": "●", "^": "▲", "v": "▼", "<": "◀", ">": "▶", "s": "■", "p": "⬟", "P": "➕", "x": "×", "D": "◆", '$\u2665$':"♥", '$\u2217$':"∗" } |
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 | ||
156 | def delta_date(date1,datenaissance): | 156 | def 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 | ||
169 | def web_vers_python(data,liste_err, court=False): | 170 | def web_vers_python(data,liste_err, court=False): |
@@ -417,6 +418,7 @@ def gere_donnees(data,naissance,typedonnee,liste_err): | |||
417 | def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config): | 418 | def 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 | ||
441 | def fusionne_donnees(listes_jours,listes_donnees): | 450 | def 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 | ||