summaryrefslogtreecommitdiff
path: root/gere_grille.py
diff options
context:
space:
mode:
Diffstat (limited to 'gere_grille.py')
-rw-r--r--gere_grille.py101
1 files changed, 101 insertions, 0 deletions
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 @@
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3"""
4Created on Mon Jul 26 22:58:28 2021
5
6@author: sekhmet
7"""
8import random
9import zlib, base64, json
10import gere_erreurs as e
11from config import DEFAUT, CONFIG
12
13def genere_grille(config, textes):
14 """ 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.
15 config contient tout ce qu'on veut pour la grille"""
16
17 nblignes, nbcol = config["nblignes"], config["nbcolonnes"]
18
19 # Créer la grille
20 grille = [ [""]*nbcol for i in range(nblignes)]
21
22 nbdata = nbcol*nblignes - config["nbcasesvides"] # Nombre d'entrées
23
24 # Créer le sous-tableau
25 if len(textes)>= nbdata: # Si y'a assez de textes
26 soustab = random.sample(textes, nbdata) + ["0"]*config["nbcasesvides"]
27 else:
28 # On met tous les textes + complète avec des "0"
29 soustab = textes + ["0"]*(nbcol*nblignes - len(textes))
30 random.shuffle(soustab)
31 #print(soustab)
32
33 # On met tout ça dans la grille
34 for i in range(nblignes):
35 for j in range(nbcol):
36 grille[i][j] = soustab[i*nbcol+j]
37
38 return grille
39
40def encode_grille(config, grille, liste_err):
41 """ grille est un tableau double qu'on veut sauvegarder.
42 config est la configuration (on va garder le titre avec)
43 Renvoie une chaîne de caractères qui encode cette grille
44 de manière condensée. Renvoie une chaîne cheloue"""
45 # Chaîne de caractère
46 data = {"titre": config["titre"], "grille": grille}
47 chaine = json.dumps(data)
48 code = zlib.compress(chaine.encode())
49 chaineencodee = str(base64.urlsafe_b64encode(code))
50 e.debug(chaineencodee, liste_err)
51 return chaineencodee[2:-1] # Enlever le b' devant et le ' à la fin
52
53def decode_grille(chaineencodee, liste_err):
54 """ l'inverse de la fonction précédente : renvoie le dictionnaire
55 avec les params et la grille reconstituée
56 """
57 e.debug(chaineencodee, liste_err)
58 b2 = base64.urlsafe_b64decode(chaineencodee)
59 try:
60 decodee = zlib.decompress(b2)
61 except:
62 e.erreur("Impossible de décoder la chaîne : "+chaineencodee, liste_err)
63 return {}
64 # Remettre ça en python
65 data = json.loads(decodee)
66 return data
67
68###########################
69
70def gere_donnees_custom(data, liste_err):
71 """ data est le dictionnaire de requête. Gère les données reçues
72 et en fait un dictionnaire propre, en mettant les défauts là où
73 c'est pas bon"""
74
75 conf =DEFAUT.copy()
76
77 ## Le titre
78 t = data.get("titre", "")
79 if len(t) > 0:
80 conf["titre"] = t[0:CONFIG["lmax_titre"]]
81
82 # Les dimensions
83 conf["nblignes"] = minimaxi(data.get("nblignes",""), CONFIG["minlignes"], CONFIG["maxlignes"], DEFAUT["nblignes"], liste_err)
84 conf["nbcolonnes"] = minimaxi(data.get("nbcolonnes",""), CONFIG["mincolonnes"], CONFIG["maxcolonnes"], DEFAUT["nbcolonnes"], liste_err)
85
86 # Les cases vides
87 conf["nbcasesvides"] = minimaxi(data.get("nbcasesvides",""), 0, CONFIG["maxlignes"]*CONFIG["maxcolonnes"], DEFAUT["nbcasesvides"], liste_err)
88
89 return conf
90###
91def minimaxi(donnee, mini, maxi, defaut, liste_err):
92 """ donnee est une chaine qui est censée être un nombre entier.
93 On vérifie que la donnée est valide, qu'elle est bien dans l'inter
94 valle mini, maxi et si ça foire on met le défaut"""
95 try:
96 x = int(donnee)
97 except:
98 e.warning("La donnée "+donnee+ "est invalide !", liste_err)
99 x = defaut
100 x = max(mini, min(x, maxi))
101 return x \ No newline at end of file