]>
Commit | Line | Data |
---|---|---|
ea3e2d07 DL |
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 |