diff options
Diffstat (limited to 'gere_grille.py')
-rw-r--r-- | gere_grille.py | 101 |
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 | """ | ||
4 | Created on Mon Jul 26 22:58:28 2021 | ||
5 | |||
6 | @author: sekhmet | ||
7 | """ | ||
8 | import random | ||
9 | import zlib, base64, json | ||
10 | import gere_erreurs as e | ||
11 | from config import DEFAUT, CONFIG | ||
12 | |||
13 | def 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 | |||
40 | def 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 | |||
53 | def 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 | |||
70 | def 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 | ### | ||
91 | def 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 | ||