summaryrefslogtreecommitdiff
path: root/app.py
blob: 58754356da684ac8d44af7e01df979d6b0df74fe (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import flask
import io
import matplotlib.pyplot as plt
import base64
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas

from configuration import config_init,CONFIG
from gestion_erreurs import initialise_erreurs, debug, niveau_debug, warning
import gestion_donnees as donnees
import gestion_couleurs as couleurs
from trace_courbe import cree_figure
import faq as f


def initialise_mode_beta():
    global beta
    hote = flask.request.host
    if hote[:4] == "beta":
        print("** Mode bêta !**")
        return True
    else:
        return False


app = flask.Flask(__name__)

@app.route('/',methods=['POST','GET'])
def index():
    beta=initialise_mode_beta()
    liste_err = initialise_erreurs()    
    val_form = config_init()
    if flask.request.method=="POST":
        if 'fichier_donnees' in flask.request.files:
            ## charger les données dans le formulaire
            fichier = flask.request.files['fichier_donnees']
            chaine = fichier.read()
            val_form2 = donnees.fichier_json_vers_configdonnees(chaine,liste_err)
            if val_form2 == {}:
                return flask.render_template("index.html",err=liste_err[2]+liste_err[1]+liste_err[0],valform=val_form, CONFIG=CONFIG, beta=beta)
            val_form.update(val_form2)
            val_form["fichier_importe"] = 1 # Pour noter qu'on a importé un fichier

    return flask.render_template("index.html",err=liste_err[1],valform=val_form, CONFIG=CONFIG, beta=beta)

@app.route('/apropos')
def apropos():
    beta=initialise_mode_beta()
    return flask.render_template("apropos.html",err=[], beta=beta)
 

@app.route("/courbe/<ext>", methods=['POST'])
def courbe_image(ext):
    liste_err = initialise_erreurs()
    data = flask.request.form
    enfants_add = [] # Enfants additionnels
    i=2
    while "couleur_donnees_"+str(i) in data: # Tant qu'il y a des données de ce type
        if 'fichier_donnees_'+str(i) in flask.request.files: # Un enfant à ajouter
            fichier = flask.request.files["fichier_donnees_"+str(i)]
            chaine = fichier.read() # On récupère la chaîne
            if len(chaine)>=5: # Si elle a une longueur à peu près raisonnable
                debug("Un fichier de données additionnel trouvé", liste_err)
                formulaire_2 = donnees.fichier_json_vers_configdonnees(chaine, liste_err)
                if formulaire_2 =={}:
                    warning("Le fichier de données additionnel est vide ou mal formaté", liste_err)
                else:
                    debug("Form 2 : "+str(formulaire_2), liste_err)
                    # Récupérer sous forme python
                    conf2, ljours2, listes_donnees2 = donnees.web_vers_python(formulaire_2,liste_err, court=True)
                    debug("Form 2 données travaillées "+str(ljours2)+str(listes_donnees2), liste_err)
                    # Le symbole et la couleur
                    symb2 = donnees.gere_symbole(data.get("symbole_donnees_"+str(i)))
                    coul2 = couleurs.rgb_vers_tuple(data.get("couleur_donnees_"+str(i),""),CONFIG["couleurs"]["cadretxt"],liste_err)
                    enfant2 = donnees.eclate_donnees_additionnelles(conf2, ljours2, listes_donnees2, symb2, coul2)
                    enfants_add.append(enfant2)
        i+=1

    # récupérer les données du formulaire proprement
    config,listes_jours,listes_donnees = donnees.web_vers_python(data,liste_err)
    debug(" * On a récupéré et traité les données du formulaire web",liste_err)

    texte = donnees.donnees_vers_json(listes_jours["poids"],listes_donnees["poids"],listes_jours["taille"],listes_donnees["taille"], config)
    
    debug("texte prêt à être exporté : "+texte,liste_err)
    
    # noter le nom de l'enfant pour l'export
    nomenfant = donnees.simplifie_nom(config['nom'])

    # créer les figures
    try:
        debug("création des figures...",liste_err)
        textes_images = {}
        liste_extracalculs = []
        for typed in CONFIG["liste_typedonnees"]:
            if config["tracevide"] == "oui" or listes_jours[typed] != []:
                debug("On trace la courbe de "+typed,liste_err)
                fig = cree_figure(config,listes_jours[typed],listes_donnees[typed],typed,liste_extracalculs, liste_err, enfants_add)
                output = io.BytesIO()
                FigureCanvas(fig).print_png(output)
                plt.close(fig)
                textes_images[typed] = base64.b64encode(output.getvalue()).decode("ascii")
            else:
                textes_images[typed] = ""
                
        result = "success"
    except:
        result = "fail"
        liste_err[0].append("Impossible de générer les courbes ! Config : "+str(config))
    
    
    if ext == "b64":
        reponse = { "result":result, 
            "export_txt": texte,
            "nomenfant": nomenfant}
        if result == "success":
            reponse["messages"] = liste_err[0]+liste_err[1]
            reponse["calculextra"] = liste_extracalculs
        else:
            reponse["messages"] = liste_err[2]+liste_err[1]+liste_err[0]

        for typed in CONFIG["liste_typedonnees"]:
            reponse["image_"+typed] = textes_images.get(typed,"")
        

        
        return flask.jsonify(reponse)
    elif ext == "png" and result == "success": # à voir cette partie car il faudrait voir ce qu'on y renvoie... vu 
        # qu'il n'y a plus une courbe mais plusieurs. Là ça renverra la dernière générée.
        return flask.Response(output.getvalue(), mimetype='image/png')
    elif ext == "png":
        return flask.render_template("erreur_fatale.html",erreur="Impossible de générer la courbe")
    else:
        return flask.render_template("erreur_fatale.html",erreur="Le type d'image demandé n'est pas reconnu")
    
    
@app.route("/contact")
def contact():
    beta=initialise_mode_beta()
    return flask.render_template("contact.html",err=[], beta=beta)

@app.route("/faq")
def faq():
    beta=initialise_mode_beta()
    
    table_faq = f.lire_fichier_csv_simple(f.fichier_FAQ)
    l_categ,table_qr = f.extraire_tables_par_cat(table_faq)

    return flask.render_template("faq.html",lcateg=l_categ,tableqr=table_qr,err=[], beta=beta)

@app.route("/changelog")
def changelog():
    beta=initialise_mode_beta()
    
    table_version = f.lire_fichier_csv_simple(f.fichier_changelog)
    
    return flask.render_template("changelog.html",table = table_version,err=[], beta=beta)

if __name__ == "__main__":
    print("Mode debug maison : "+str(niveau_debug))
    app.run(host='0.0.0.0',debug=True)