From ea3e2d07911b2f4d3ff044c4a7bfd4e8c77be937 Mon Sep 17 00:00:00 2001 From: Denise sur Lya Date: Tue, 27 Jul 2021 14:37:33 +0200 Subject: [PATCH 1/1] =?utf8?q?cr=C3=A9ation=20du=20projet...?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- app.py | 64 ++++++++++++++++++ config.py | 24 +++++++ data_textes.py | 22 ++++++ gere_erreurs.py | 37 ++++++++++ gere_grille.py | 101 ++++++++++++++++++++++++++++ static/outilspage.js | 153 ++++++++++++++++++++++++++++++++++++++++++ static/style.css | 38 +++++++++++ templates/base.html | 31 +++++++++ templates/custom.html | 35 ++++++++++ templates/faq.html | 30 +++++++++ templates/index.html | 42 ++++++++++++ 11 files changed, 577 insertions(+) create mode 100644 app.py create mode 100644 config.py create mode 100644 data_textes.py create mode 100644 gere_erreurs.py create mode 100644 gere_grille.py create mode 100644 static/outilspage.js create mode 100644 static/style.css create mode 100644 templates/base.html create mode 100644 templates/custom.html create mode 100644 templates/faq.html create mode 100644 templates/index.html diff --git a/app.py b/app.py new file mode 100644 index 0000000..8b558ea --- /dev/null +++ b/app.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Mon Jul 26 17:31:48 2021 + +@author: sekhmet +""" + +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import flask +from data_textes import liste_textes +import gere_grille as g +import gere_erreurs as e +from config import DEFAUT, CONFIG + + +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=["GET", "POST"]) +def index(): + liste_err = e.initialise_erreurs() + idg = flask.request.args.get("grille", "") # Id de grille passée en param (ou pas) + if idg != "": # Si on a mis un url de grille + conf = g.decode_grille(idg, liste_err) + if conf == {}: # Erreur à la génération + bingo = g.genere_grille(DEFAUT, liste_textes) + conf = DEFAUT.copy() + e.erreur("L'url de la grille n'est pas valide...", liste_err) + else: + bingo=conf["grille"] + else: + # On récupère les données post (et ça sera défaut si y'a rien) + if flask.request.method == "POST": + conf = g.gere_donnees_custom(flask.request.form, liste_err) + else: + conf= DEFAUT.copy() + bingo = g.genere_grille(conf, liste_textes) # aléatoire + + chainecode = g.encode_grille(conf, bingo, liste_err) + + return flask.render_template("index.html", bingo=bingo, chainecode=chainecode, conf=conf, e=liste_err[0]+liste_err[1]+liste_err[2]) + + +@app.route('/custom') +def custom(): + liste_err = e.initialise_erreurs() + return flask.render_template("custom.html", DEFAUT=DEFAUT,CONFIG=CONFIG, e=liste_err[0]+liste_err[1]+liste_err[2]) + +if __name__ == "__main__": + # print("Mode debug maison : "+str(niveau_debug)) + app.run(host='0.0.0.0',debug=True) \ No newline at end of file diff --git a/config.py b/config.py new file mode 100644 index 0000000..deb461a --- /dev/null +++ b/config.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Configuration générale +""" + +# Configuration par défaut +DEFAUT = {} + +DEFAUT["titre"] = "Le bingo de l'allaitement" + +DEFAUT["nblignes"] = 4 +DEFAUT["nbcolonnes"] = 3 +DEFAUT["nbcasesvides"] = 0 + + +# Configuration + +CONFIG = {} +CONFIG["lmax_titre"] = 50 +CONFIG["maxlignes"] = 20 +CONFIG["minlignes"] = 1 +CONFIG["maxcolonnes"] = 20 +CONFIG["mincolonnes"] = 1 \ No newline at end of file diff --git a/data_textes.py b/data_textes.py new file mode 100644 index 0000000..8082ecf --- /dev/null +++ b/data_textes.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Mon Jul 26 22:50:08 2021 + +@author: sekhmet +""" + +liste_textes = [ + "Tu vas pas l'allaiter jusqu'à [âge quelconque] !", + "Tu es sûre que tu as assez de lait ?", + "Quand est-ce que tu vas lui donner du lait normal ?", + "Il/elle fait ses nuits ?", + "Il/elle dort encore avec vous ?", + "Laisse le/la pleurer il/elle finira bien par dormir (et/ou ça lui fera les poumons).", + "Ton lait n'est pas/plus assez nourrissant.", + "Il/elle doit apprendre à se détacher de maman.", + "Tu as pris combien de kilos ?", + "Donne lui un biberon, il/elle fera ses nuits.", + "Tu arrêteras quand il/elle aura des dents, puisqu'il/elle va te mordre", + + ] \ No newline at end of file diff --git a/gere_erreurs.py b/gere_erreurs.py new file mode 100644 index 0000000..0a12018 --- /dev/null +++ b/gere_erreurs.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue Jul 27 11:16:54 2021 + +@author: sekhmet +""" + +## Gestion des erreurs en flask +import sys + +niveau_debug = ("debug" in sys.argv) + +def initialise_erreurs(): + """ retourne trois listes vides, erreurs fatales (0), warnings(1), debug(2):""" + return ([],[],[]) + + +def erreur(message,listeerreurs): + """ en cas d'erreur où on ne peut pas continuer + message est une chaîne""" + print("** Erreur fatale : "+message) + listeerreurs[0].append("** Erreur : "+message) + +def warning(message,listeerreurs): + """ En cas d'avertissement mais on peut quand même continuer """ + print("** Warning : "+message) + message = "Alerte : "+message + if message not in listeerreurs[1]: + listeerreurs[1].append(message) + +def debug(message,listeerreurs): + global niveau_debug + if niveau_debug: + print("##Debug : "+message) + listeerreurs[2].append("# Debug : "+message) + \ No newline at end of file diff --git a/gere_grille.py b/gere_grille.py new file mode 100644 index 0000000..9a472ed --- /dev/null +++ b/gere_grille.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Mon Jul 26 22:58:28 2021 + +@author: sekhmet +""" +import random +import zlib, base64, json +import gere_erreurs as e +from config import DEFAUT, CONFIG + +def genere_grille(config, textes): + """ génère une grille avec des éléments aléatoires du tableau textes. Si y'a pas assez, on complète aléatoirement avec des 0. + config contient tout ce qu'on veut pour la grille""" + + nblignes, nbcol = config["nblignes"], config["nbcolonnes"] + + # Créer la grille + grille = [ [""]*nbcol for i in range(nblignes)] + + nbdata = nbcol*nblignes - config["nbcasesvides"] # Nombre d'entrées + + # Créer le sous-tableau + if len(textes)>= nbdata: # Si y'a assez de textes + soustab = random.sample(textes, nbdata) + ["0"]*config["nbcasesvides"] + else: + # On met tous les textes + complète avec des "0" + soustab = textes + ["0"]*(nbcol*nblignes - len(textes)) + random.shuffle(soustab) + #print(soustab) + + # On met tout ça dans la grille + for i in range(nblignes): + for j in range(nbcol): + grille[i][j] = soustab[i*nbcol+j] + + return grille + +def encode_grille(config, grille, liste_err): + """ grille est un tableau double qu'on veut sauvegarder. + config est la configuration (on va garder le titre avec) + Renvoie une chaîne de caractères qui encode cette grille + de manière condensée. Renvoie une chaîne cheloue""" + # Chaîne de caractère + data = {"titre": config["titre"], "grille": grille} + chaine = json.dumps(data) + code = zlib.compress(chaine.encode()) + chaineencodee = str(base64.urlsafe_b64encode(code)) + e.debug(chaineencodee, liste_err) + return chaineencodee[2:-1] # Enlever le b' devant et le ' à la fin + +def decode_grille(chaineencodee, liste_err): + """ l'inverse de la fonction précédente : renvoie le dictionnaire + avec les params et la grille reconstituée + """ + e.debug(chaineencodee, liste_err) + b2 = base64.urlsafe_b64decode(chaineencodee) + try: + decodee = zlib.decompress(b2) + except: + e.erreur("Impossible de décoder la chaîne : "+chaineencodee, liste_err) + return {} + # Remettre ça en python + data = json.loads(decodee) + return data + +########################### + +def gere_donnees_custom(data, liste_err): + """ data est le dictionnaire de requête. Gère les données reçues + et en fait un dictionnaire propre, en mettant les défauts là où + c'est pas bon""" + + conf =DEFAUT.copy() + + ## Le titre + t = data.get("titre", "") + if len(t) > 0: + conf["titre"] = t[0:CONFIG["lmax_titre"]] + + # Les dimensions + conf["nblignes"] = minimaxi(data.get("nblignes",""), CONFIG["minlignes"], CONFIG["maxlignes"], DEFAUT["nblignes"], liste_err) + conf["nbcolonnes"] = minimaxi(data.get("nbcolonnes",""), CONFIG["mincolonnes"], CONFIG["maxcolonnes"], DEFAUT["nbcolonnes"], liste_err) + + # Les cases vides + conf["nbcasesvides"] = minimaxi(data.get("nbcasesvides",""), 0, CONFIG["maxlignes"]*CONFIG["maxcolonnes"], DEFAUT["nbcasesvides"], liste_err) + + return conf +### +def minimaxi(donnee, mini, maxi, defaut, liste_err): + """ donnee est une chaine qui est censée être un nombre entier. + On vérifie que la donnée est valide, qu'elle est bien dans l'inter + valle mini, maxi et si ça foire on met le défaut""" + try: + x = int(donnee) + except: + e.warning("La donnée "+donnee+ "est invalide !", liste_err) + x = defaut + x = max(mini, min(x, maxi)) + return x \ No newline at end of file diff --git a/static/outilspage.js b/static/outilspage.js new file mode 100644 index 0000000..b8db8b3 --- /dev/null +++ b/static/outilspage.js @@ -0,0 +1,153 @@ +/* Calcul des scores */ +var points_par_case = 1 ; +var points_par_ligne = 10 ; + + + +// Couleurs des cases +var couleur_base = "rgb(238, 238, 238)" ; +var couleur_valide = 'rgb(255, 136, 136)' ; + + +// Valide la case et la colore en rouge +function validecase(elem) { + elem.style.backgroundColor = couleur_valide ; + + detectelignes() ; +} + +// efface la grille +function effacegrille() { + var table=document.getElementById("grille") ; + var listetd = table.getElementsByTagName("td") ; + for (var i=0; i< listetd.length; i++){ + listetd[i].style.backgroundColor = couleur_base ; + } + metscore(0) ; +} + +// mettre à jour le score si on veut +function metscore(score) { + document.getElementById("score").innerHTML = score ; +} + +// Compte les lignes, colonnes et diagonales de la grille et met à jour le score +function detectelignes(elem) { + var table=document.getElementById("grille") ; + var listelignes = table.getElementsByTagName("tr") ; + var nblignes = listelignes.length ; + var nbcolonnes = listelignes[0].children.length ; + var i, j ; + + // lignes + var nb_lignes_completes = 0 ; + var remplie ; + for(i=0; i + + + + + Le bingo de l'allaitement + + + + + + + + + + + {% block contenu %}{% endblock %} + +
+ + + + + diff --git a/templates/custom.html b/templates/custom.html new file mode 100644 index 0000000..cc5521c --- /dev/null +++ b/templates/custom.html @@ -0,0 +1,35 @@ +{% extends "base.html" %} +{% block contenu %} +

Créer une grille personnalisée

+ +{% if e | length >0 %} +
+

Log d'erreurs

+
    + {% for err in e %} +
  • {{ err }}
  • + {% endfor %} +
+
+{% endif %} + +
+ +
+ +
    +
  • Titre de la page :
  • +
  • Nombre de lignes :
  • +
  • Nombre de colonnes :
  • +
  • Nombre de cases vides : Remarque : s'il n'y a pas assez de données, la grille sera automatiquement complétée par des cass vides.
  • + + +
+ + +
+ +
+ + +{% endblock %} diff --git a/templates/faq.html b/templates/faq.html new file mode 100644 index 0000000..162f68d --- /dev/null +++ b/templates/faq.html @@ -0,0 +1,30 @@ +{% extends "base.html" %} +{% block contenu %} +

Foire Aux Questions (FAQ)

+ +
+
    {% for cat in lcateg %} +
  • {{ cat }}
  • +{% endfor %} +
+
+ +
+{% for i in range(lcateg|length) %} +{% set qr = tableqr[i] %} + +

{{ lcateg[i] }}

+
    + {% for (q,r) in qr %} +
  • Q : {{ q|safe }}

    +

    R : {{ r|safe }}

    +
  • + {% endfor %} +
+ + +{% endfor %} +
+ + +{% endblock %} diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..852fdd7 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,42 @@ +{% extends "base.html" %} +{% block contenu %} +

{{ conf.titre }}

+ +{% if e | length >0 %} +
+

Log d'erreurs

+
    + {% for err in e %} +
  • {{ err }}
  • + {% endfor %} +
+
+{% endif %} + +
+ +

Cochez la case dès que vous entendez une réplique idiote !

+ +{% for ligne in bingo %} +{% for elt in ligne %} + {% if elt == "0" %} + + {% else %} + + {% endif %} + {% endfor %} + +{% endfor %} +
{{ elt }}
+ +

Score : 0

+ +

Effacer la grille

+ +
+Lien permanent vers cette grille + +
+ + +{% endblock %} -- 2.41.0