From 915e90bbf0bee1d69c51a749a4f2be85b9fda091 Mon Sep 17 00:00:00 2001 From: Denise sur Lya Date: Fri, 19 Jun 2020 13:38:05 +0200 Subject: [PATCH] =?utf8?q?am=C3=A9lioration=20du=20code=20+=20page=20conta?= =?utf8?q?ct=20en=20cours=20+=20licences?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- COPYING | 10 +++-- LICENSE | 12 +++++ app.py | 30 +++++-------- configuration.py | 84 ++++++++++++++++++++++------------- data_OMS/{licence => LICENSE} | 0 gestionOMS.py | 6 +-- gestion_donnees.py | 61 ++++++++++++++----------- licence | 20 --------- templates/apropos.html | 2 +- templates/base.html | 4 +- templates/contact.html | 14 ++++++ templates/index.html | 26 +++++------ trace_courbe.py | 24 +++++----- 13 files changed, 164 insertions(+), 129 deletions(-) create mode 100644 LICENSE rename data_OMS/{licence => LICENSE} (100%) delete mode 100644 licence create mode 100644 templates/contact.html diff --git a/COPYING b/COPYING index d50c38d..13542f7 100644 --- a/COPYING +++ b/COPYING @@ -1,5 +1,9 @@ -------------- -Attention : application de licences : +Attention : application des licences : + +Le dossier data_OMS est sous licence CC BY-NC-SA 3.0 IGO +https://creativecommons.org/licenses/by-nc-sa/3.0/igo/ + +Le reste du projet est sous licence MIT "X11" +https://fr.wikipedia.org/wiki/Licence_MIT -Le dossier data_OMS est sous licence CC BY-NC-SA 3.0 IGO -Le reste du projet est sous licence diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..404d44c --- /dev/null +++ b/LICENSE @@ -0,0 +1,12 @@ +Ce projet, à l'exception du dossier data_OMS (voir fichier COPYING), est sous licence MIT "X11" +(plus d'informations en français https://fr.wikipedia.org/wiki/Licence_MIT ) + +---------------- +Copyright © 2020, Denise Maurice + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders X be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software. +Except as contained in this notice, the name of Denise Maurice shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Denise Maurice. diff --git a/app.py b/app.py index 3deb7f6..93c5b30 100644 --- a/app.py +++ b/app.py @@ -27,7 +27,8 @@ def index(): ## charger les donneés dans le formulaire fichier = flask.request.files['fichier_donnees'] - val_form = fichier_json_vers_configdonnees(fichier,liste_err) + val_form2 = fichier_json_vers_configdonnees(fichier,liste_err) + val_form.update(val_form2) #return str(val_form['nb_data']) return flask.render_template("index.html",err=liste_err[1],valform=val_form) @@ -46,13 +47,15 @@ def courbe_image(ext): config = gere_configuration(data,liste_err) l_jours,l_poids = gere_donneespoids(data,config["naissance"],liste_err) - #print(config) + texte = donnees_vers_json(l_jours,l_poids,config) # noter le nom de l'enfant pour l'export nomenfant = simplifie_nom(config['nom']) + #warning(str(config),liste_err) + # créer la figure try: fig = cree_figure(config,l_jours,l_poids,liste_err) @@ -63,7 +66,7 @@ def courbe_image(ext): plt.close(fig) except: result = "fail" - liste_err[0].append("Impossible de générer la courbe !") + liste_err[0].append("Impossible de générer la courbe ! Config : "+str(config)) if ext == "b64": @@ -88,23 +91,10 @@ def courbe_image(ext): else: return flask.render_template("erreur_fatale.html",erreur="Le type d'image demandé n'est pas reconnu") - #return flask.Response(base64.b64encode(output.getvalue()), mimetype='text/plain') - -#@app.route("/export_donnees",methods=['POST']) -#def export_donnees(): -# # exporte les données au format texte -# liste_err = initialise_erreurs() -# data = flask.request.form -# -# config = gere_configuration(data,liste_err) -# l_jours,l_poids = gere_donneespoids(data,config["naissance"],liste_err) -# -# texte = configuration_vers_texte(config) -# texte += donnees_poids_vers_texte(l_jours,l_poids) -# -# #texte = donnees_vers_json(l_jours,l_poids,config) -# #return flask.Response(texte,mimetype="application/json") -# return flask.Response(texte,mimetype="text/plain") + +@app.route("/contact") +def contact(): + return flask.render_template("contact.html",err=[]) @app.route("/faq") def faq(): diff --git a/configuration.py b/configuration.py index e173ad9..3e65255 100644 --- a/configuration.py +++ b/configuration.py @@ -23,6 +23,9 @@ liste_data_choisie_p.sort(reverse=True) liste_data_choisie_z = [(2,-3),(3,-2),(4,-1),(5,0),(6,1),(7,2),(8,3)] liste_data_choisie_z.sort(reverse=True) + +CONFIG = {} + liste_unites_valides = ["jours", "semaines", "mois", "années"] # nombre de jours dans autre chose @@ -30,63 +33,82 @@ jours_dans_mois = 30.4375 jours_dans_annee = 365.25 jours_dans_semaine = 7 - ## Maxi et mini de "sécurité" # jours maxi -jours_maxi_courbe = 6.2*jours_dans_annee +jours_maxi_courbe = 5.5*jours_dans_annee # poids max (protection) poids_maxi = 80 # taille max du nom longueur_max_nom_bebe = 100 - -### Taille du graphique par défaut (pouces, en 80 points par pouce) -largeur_graphique = 10 -hauteur_graphique = 7 - #largeurs et hauteurs min et max largeur_graphique_max = 40 -largeur_graphique_min = 2 +largeur_graphique_min = 3 hauteur_graphique_max = 40 hauteur_graphique_min = 2 + + +## Configuration "par défaut" du graphique, tel qu'exporté ? +DEFAUT = {} + +### Taille du graphique par défaut (pouces, en 80 points par pouce) +DEFAUT["largeur"] = 10 +DEFAUT["hauteur"] = 7 + # Nombre de lignes par défaut dans le formulaire -nombre_lignes_form = 5 +DEFAUT["nb_data"] = 6 # couleurs par défaut -couleur_defaut_1 = "#0000FF" # bleu -couleur_defaut_2 = "#00FF00" # vert -couleur_defaut_3 = "#FF0000" # rouge -couleur_defaut_1_tuple = (0,0,1) -couleur_defaut_2_tuple = (0,1,0) -couleur_defaut_3_tuple = (1,0,0) +DEFAUT["couleurs"] = {} +DEFAUT["couleurs"]["courbe1"] = "#0000FF" # bleu +DEFAUT["couleurs"]["courbe2"] = "#00FF00" # vert +DEFAUT["couleurs"]["courbe3"] = "#FF0000" # rouge +DEFAUT["couleurs"]["fond"]= "#FFFFFF" # blanc +DEFAUT["couleurs"]["cadretxt"] = "#000000" # noir +DEFAUT["couleurs"]["grille"] = "#7f7f7f" # gris +#couleur_defaut_1 = "#0000FF" # bleu +#couleur_defaut_2 = "#00FF00" # vert +#couleur_defaut_3 = "#FF0000" # rouge +CONFIG["couleurs"] = { + "courbe1" : (0,0,1), + "courbe2" : (0,1,0), + "courbe3" : (1,0,0), + "fond": (1,1,1), + "cadretxt": (0,0,0), + "grille": (0.5,0.5,0.5) + } +#couleur_defaut_1_tuple = (0,0,1) +#couleur_defaut_2_tuple = (0,1,0) +#couleur_defaut_3_tuple = (1,0,0) # couleurs par défaut fond -couleur_defaut_fond = "#FFFFFF" -couleur_defaut_fond_tuple = (1,1,1) -couleur_defaut_cadretxt = "#000000" -couleur_defaut_cadretxt_tuple = (0,0,0) -couleur_defaut_grille = "#7f7f7f" -couleur_defaut_grille_tuple = (0.5,0.5,0.5) +#couleur_defaut_fond = "#FFFFFF" +#couleur_defaut_fond_tuple = (1,1,1) +#couleur_defaut_cadretxt = "#000000" +#couleur_defaut_cadretxt_tuple = (0,0,0) +#couleur_defaut_grille = "#7f7f7f" +#couleur_defaut_grille_tuple = (0.5,0.5,0.5) #couleur_defaut_erreur = (0,0,0) # noir # initialiser la config def config_init(): - return {"largeur": largeur_graphique, - "hauteur": hauteur_graphique, - "nb_data":nombre_lignes_form, + c = DEFAUT.copy() + c.update({ "age_0": "0j", "legende": "oui", "positionlegende": "hg", - "couleur1": couleur_defaut_1, - "couleur2": couleur_defaut_2, - "couleur3": couleur_defaut_3, - "couleur_fond": couleur_defaut_fond, - "couleur_grille": couleur_defaut_grille, - "couleur_cadretxt": couleur_defaut_cadretxt - } +# "couleur1": couleur_defaut_1, +# "couleur2": couleur_defaut_2, +# "couleur3": couleur_defaut_3, +# "couleur_fond": couleur_defaut_fond, +# "couleur_grille": couleur_defaut_grille, +# "couleur_cadretxt": couleur_defaut_cadretxt + }) + + return c diff --git a/data_OMS/licence b/data_OMS/LICENSE similarity index 100% rename from data_OMS/licence rename to data_OMS/LICENSE diff --git a/gestionOMS.py b/gestionOMS.py index 5b773d9..cc63432 100644 --- a/gestionOMS.py +++ b/gestionOMS.py @@ -46,9 +46,9 @@ def afficheecarttype(z): def renvoie_liste_labels(conf,liste_data_choisie_p,liste_data_choisie_z,liste_err): """ fabrique les deux listes de labels OMS""" - #warning(str(liste_data_choisie_p),liste_err) - liste_data_labels_p = [(nocol,affichepercentile(pc),degrade_choix(conf["couleur1"],conf["couleur2"],conf["couleur3"],pc)) for (nocol,pc) in liste_data_choisie_p] - liste_data_labels_z = [(nocol,afficheecarttype(z),degrade_choix(conf["couleur1"],conf["couleur2"],conf["couleur3"],(z+3)/3*50) ) for (nocol,z) in liste_data_choisie_z] + #warning(str(conf),liste_err) + liste_data_labels_p = [(nocol,affichepercentile(pc),degrade_choix(conf["couleurs"]["courbe1"],conf["couleurs"]["courbe2"],conf["couleurs"]["courbe3"],pc)) for (nocol,pc) in liste_data_choisie_p] + liste_data_labels_z = [(nocol,afficheecarttype(z),degrade_choix(conf["couleurs"]["courbe1"],conf["couleurs"]["courbe2"],conf["couleurs"]["courbe3"],(z+3)/3*50) ) for (nocol,z) in liste_data_choisie_z] return liste_data_labels_p,liste_data_labels_z #liste_data_labels= liste_data_labels_z diff --git a/gestion_donnees.py b/gestion_donnees.py index caacaf0..12afd5a 100644 --- a/gestion_donnees.py +++ b/gestion_donnees.py @@ -7,6 +7,7 @@ from gestion_couleurs import * import datetime import json import unidecode +import copy ############ Fonctions de conversion @@ -193,13 +194,13 @@ def gere_configuration(data,liste_err): # dimensions du graphique largeur = data.get("largeur","") if largeur == "": - largeur = largeur_graphique + largeur = DEFAUT["largeur_graphique"] else: try: largeur = int(largeur) except: warning("La largeur "+largeur+"est invalide !",liste_err) - largeur = largeur_graphique + largeur = DEFAUT["largeur_graphique"] if largeur > largeur_graphique_max: largeur = largeur_graphique_max warning("Largeur trop grande !",liste_err) @@ -210,13 +211,13 @@ def gere_configuration(data,liste_err): hauteur = data.get("hauteur","") if hauteur == "": - hauteur = hauteur_graphique + hauteur = DEFAUT["hauteur_graphique"] else: try: hauteur = int(hauteur) except: warning("La hauteur "+hauteur+"est invalide !",liste_err) - hauteur = hauteur_graphique + hauteur = DEFAUT["hauteur_graphique"] if hauteur > hauteur_graphique_max: hauteur = hauteur_graphique_max warning("Hauteur trop grande !",liste_err) @@ -241,25 +242,33 @@ def gere_configuration(data,liste_err): configuration["positionlegende"] = positionlegende #warning("bla"+data["couleur1"],liste_err) - coul1 = rgb_vers_tuple(data.get("couleur1",""),couleur_defaut_1_tuple,liste_err) - coul2 = rgb_vers_tuple(data.get("couleur2",""),couleur_defaut_2_tuple,liste_err) - coul3 = rgb_vers_tuple(data.get("couleur3",""),couleur_defaut_3_tuple,liste_err) - #warning("bla2"+str(coul1),liste_err) - configuration["couleur1"] = coul1 - configuration["couleur2"] = coul2 - configuration["couleur3"] = coul3 +# coul1 = rgb_vers_tuple(data.get("couleur1",""),couleur_defaut_1_tuple,liste_err) +# coul2 = rgb_vers_tuple(data.get("couleur2",""),couleur_defaut_2_tuple,liste_err) +# coul3 = rgb_vers_tuple(data.get("couleur3",""),couleur_defaut_3_tuple,liste_err) +# #warning("bla2"+str(coul1),liste_err) +# configuration["couleur1"] = coul1 +# configuration["couleur2"] = coul2 +# configuration["couleur3"] = coul3 - # couleur de fond - coul_fond = rgb_vers_tuple(data.get("couleur_fond",""),couleur_defaut_fond_tuple,liste_err) - configuration["couleur_fond"] = coul_fond - - # couleur d'axes et de texte - coul_cadretxt = rgb_vers_tuple(data.get("couleur_cadretxt",""),couleur_defaut_cadretxt_tuple,liste_err) - configuration["couleur_cadretxt"] = coul_cadretxt + configuration["couleurs"] = {} + # gérer les couleurs + #warning("data : "+str(data),liste_err) + for clecouleur in DEFAUT["couleurs"]: + coul = rgb_vers_tuple(data.get("couleur_"+clecouleur,""),CONFIG["couleurs"][clecouleur],liste_err) + configuration["couleurs"][clecouleur] = coul - # couleur de la grille - coul_grille = rgb_vers_tuple(data.get("couleur_grille",""),couleur_defaut_grille_tuple,liste_err) - configuration["couleur_grille"] = coul_grille + #warning("config : "+str(configuration["couleurs"]),liste_err) + # couleur de fond +# coul_fond = rgb_vers_tuple(data.get("couleur_fond",""),couleur_defaut_fond_tuple,liste_err) +# configuration["couleur_fond"] = coul_fond +# +# # couleur d'axes et de texte +# coul_cadretxt = rgb_vers_tuple(data.get("couleur_cadretxt",""),couleur_defaut_cadretxt_tuple,liste_err) +# configuration["couleur_cadretxt"] = coul_cadretxt +# +# # couleur de la grille +# coul_grille = rgb_vers_tuple(data.get("couleur_grille",""),couleur_defaut_grille_tuple,liste_err) +# configuration["couleur_grille"] = coul_grille #warning(str(configuration["couleur1"]),liste_err) return configuration @@ -306,7 +315,7 @@ def gere_donneespoids(data,naissance,liste_err): def donnees_vers_json(l_jours,l_poids,config): """ retourne le json à renvoyer""" - gros_dico = config.copy() + gros_dico = copy.deepcopy(config) l_jours2 = [convertit_age_vers_texte(d) for d in l_jours] gros_dico["data_j"] = l_jours2 gros_dico["data_p"] = l_poids @@ -316,8 +325,10 @@ def donnees_vers_json(l_jours,l_poids,config): # gérer l'age maxi gros_dico["maxi"] = convertit_age_vers_texte(gros_dico["maxi"]) # gérer les couleurs - for cle in ["couleur1", "couleur2", "couleur3", "couleur_fond","couleur_grille","couleur_cadretxt"]: - gros_dico[cle] = tuple_vers_rgb(gros_dico[cle]) +# for cle in ["couleur1", "couleur2", "couleur3", "couleur_fond","couleur_grille","couleur_cadretxt"]: +# gros_dico[cle] = tuple_vers_rgb(gros_dico[cle]) + for clecouleur in DEFAUT["couleurs"]: + gros_dico["couleurs"][clecouleur] = tuple_vers_rgb(gros_dico["couleurs"][clecouleur]) @@ -341,7 +352,7 @@ def fichier_json_vers_configdonnees(fichier,liste_err): valform["age_"+str(i)] = l_jours[i] valform["poids_"+str(i)] = l_poids[i] - valform["nb_data"] = max(long +2,nombre_lignes_form) + valform["nb_data"] = max(long +2,DEFAUT["nb_data"]) return valform diff --git a/licence b/licence deleted file mode 100644 index f9241d4..0000000 --- a/licence +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2020 Denise Maurice - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/templates/apropos.html b/templates/apropos.html index 9f2b076..b3c5199 100644 --- a/templates/apropos.html +++ b/templates/apropos.html @@ -5,6 +5,6 @@

Ces données, ainsi que ce site web, sont sous licence CC BY-NC-SA 3.0 IGO

-

Le code source (licence MIT sauf en ce qui concerne les données) est disponible là.

+

Le code source (licence MIT (licence X11) sauf en ce qui concerne les données de l'OMS) est disponible là.

{% endblock %} diff --git a/templates/base.html b/templates/base.html index 694266c..8b96c17 100644 --- a/templates/base.html +++ b/templates/base.html @@ -32,9 +32,11 @@
diff --git a/templates/contact.html b/templates/contact.html new file mode 100644 index 0000000..c4a54e8 --- /dev/null +++ b/templates/contact.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% block contenu %} +

Si vous avez une question, un commentaire, une idée, vous pouvez me contacter à l'adresse suivante :

+

Vous pouvez également me retrouver sur le forum LLL, sous le nom de Sekhmet.

+ +

Merci à celles et ceux qui m'ont aidée à mettre en place cet outil : +

+ +{% endblock %} diff --git a/templates/index.html b/templates/index.html index 2b1b82b..3404f22 100644 --- a/templates/index.html +++ b/templates/index.html @@ -29,8 +29,8 @@

Informations sur l'enfant

@@ -65,29 +65,29 @@
Afficher
diff --git a/trace_courbe.py b/trace_courbe.py index c86dbd9..fccb657 100644 --- a/trace_courbe.py +++ b/trace_courbe.py @@ -7,7 +7,7 @@ from gestion_unites import * import matplotlib.pyplot as plt def cree_figure(conf,l_jours,l_poids,liste_err): - #warning("debut de cree_figure",liste_err) + #warning("debut de cree_figure"+str(conf),liste_err) try: liste_data_labels_p,liste_data_labels_z = renvoie_liste_labels(conf,liste_data_choisie_p,liste_data_choisie_z,liste_err) except: @@ -86,13 +86,13 @@ def cree_figure(conf,l_jours,l_poids,liste_err): #### La figure - fig = plt.figure(num=None, figsize=(conf["largeur"], conf["hauteur"]), dpi=100, facecolor=conf["couleur_fond"]) - plt.rcParams['axes.facecolor'] = conf["couleur_fond"] - plt.rcParams['axes.edgecolor']= conf["couleur_cadretxt"] - plt.rcParams['xtick.color'] = conf["couleur_cadretxt"] - plt.rcParams['ytick.color'] = conf["couleur_cadretxt"] - plt.rcParams['grid.color'] = conf["couleur_grille"] - plt.rcParams['legend.edgecolor'] = conf["couleur_grille"] + fig = plt.figure(num=None, figsize=(conf["largeur"], conf["hauteur"]), dpi=100, facecolor=conf["couleurs"]["fond"]) + plt.rcParams['axes.facecolor'] = conf["couleurs"]["fond"] + plt.rcParams['axes.edgecolor']= conf["couleurs"]["cadretxt"] + plt.rcParams['xtick.color'] = conf["couleurs"]["cadretxt"] + plt.rcParams['ytick.color'] = conf["couleurs"]["cadretxt"] + plt.rcParams['grid.color'] = conf["couleurs"]["grille"] + plt.rcParams['legend.edgecolor'] = conf["couleurs"]["grille"] #warning("bla"+str(liste_data_labels),liste_err) for (i,label,couleur) in liste_data_labels: @@ -121,14 +121,14 @@ def cree_figure(conf,l_jours,l_poids,liste_err): if l_jours != []: plt.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleur_cadretxt"],marker='o') - plt.xlabel("Âge en "+conf["unite"],color=conf["couleur_cadretxt"]) - plt.ylabel("Poids en kg",color=conf["couleur_cadretxt"]) - plt.title(titre,color=conf["couleur_cadretxt"]) + plt.xlabel("Âge en "+conf["unite"],color=conf["couleurs"]["cadretxt"]) + plt.ylabel("Poids en kg",color=conf["couleurs"]["cadretxt"]) + plt.title(titre,color=conf["couleurs"]["cadretxt"]) plt.axis([0,age_maxi,poids_min,poids_max]) if conf['legende']=="oui": legende = plt.legend(loc=conf['positionlegende']) - plt.setp(legende.get_texts(), color=conf["couleur_cadretxt"]) + plt.setp(legende.get_texts(), color=conf["couleurs"]["cadretxt"]) plt.grid(conf["grille"]=="oui") fig.tight_layout() -- 2.41.0