diff options
Diffstat (limited to 'gestion_donnees.py')
-rw-r--r-- | gestion_donnees.py | 177 |
1 files changed, 115 insertions, 62 deletions
diff --git a/gestion_donnees.py b/gestion_donnees.py index 71c9623..a2d0a1e 100644 --- a/gestion_donnees.py +++ b/gestion_donnees.py | |||
@@ -4,13 +4,15 @@ | |||
4 | from configuration import * | 4 | from configuration import * |
5 | from gestion_erreurs import * | 5 | from gestion_erreurs import * |
6 | import datetime | 6 | import datetime |
7 | import json | ||
8 | import unidecode | ||
7 | 9 | ||
8 | 10 | ||
9 | ############ Fonctions de conversion | 11 | ############ Fonctions de conversion |
10 | 12 | ||
11 | def convertit_jours_vers_python(chaine,liste_err): | 13 | def convertit_jours_vers_python(chaine,liste_err): |
12 | """ convertit une chaine de type 1a 3m 1s 10j en jours | 14 | """ convertit une chaine de type 1a 3m 1s 10j en jours |
13 | Renvoie un nombre de jours en entiers. | 15 | Renvoie un nombre de jours en float |
14 | Si un des caractères n'est ni un nombre, ni une lettre "autorisée" ni une espace, | 16 | Si un des caractères n'est ni un nombre, ni une lettre "autorisée" ni une espace, |
15 | on affiche un warning et on ignore ce caractère | 17 | on affiche un warning et on ignore ce caractère |
16 | """ | 18 | """ |
@@ -41,19 +43,19 @@ def convertit_jours_vers_python(chaine,liste_err): | |||
41 | warning("convertit_jour_vers_python : caractère invalide : "+lettre,liste_err) | 43 | warning("convertit_jour_vers_python : caractère invalide : "+lettre,liste_err) |
42 | # à la fin s'il reste qqch on le garde dans les jours | 44 | # à la fin s'il reste qqch on le garde dans les jours |
43 | if chainenombre != "": | 45 | if chainenombre != "": |
44 | agejour += int(chainenombre) | 46 | agejours += int(chainenombre) |
45 | if agejours<0: | 47 | if agejours<0: |
46 | warning("L'âge est négatif !",liste_err) | 48 | warning("L'âge est négatif !",liste_err) |
47 | agejours = 0 | 49 | agejours = 0 |
48 | return round(agejours) | 50 | return agejours |
49 | 51 | ||
50 | def convertit_age_vers_texte(nombre): | 52 | def convertit_age_vers_texte(nombre): |
51 | """ convertit un nombre de jours en un truc plus lisible en mois, années, jours | 53 | """ convertit un nombre de jours en un truc plus lisible en mois, années, jours |
52 | et renvoie une chaîne sous la forme 3a2m1j par exemple""" | 54 | et renvoie une chaîne sous la forme 3a2m1j par exemple""" |
53 | annees = int(nombre / jours_dans_annee) | 55 | annees = int(nombre / jours_dans_annee) |
54 | restant = nombre - round(annees*jours_dans_annee) | 56 | restant = nombre - annees*jours_dans_annee |
55 | mois = int(restant/jours_dans_mois) | 57 | mois = int(restant/jours_dans_mois) |
56 | jours= nombre - round(mois*jours_dans_mois + annees*jours_dans_annee) | 58 | jours= round(nombre - mois*jours_dans_mois - annees*jours_dans_annee) |
57 | 59 | ||
58 | chaine = "" | 60 | chaine = "" |
59 | if annees >0: | 61 | if annees >0: |
@@ -64,6 +66,18 @@ def convertit_age_vers_texte(nombre): | |||
64 | chaine += str(jours)+"j" | 66 | chaine += str(jours)+"j" |
65 | return chaine | 67 | return chaine |
66 | ########################## | 68 | ########################## |
69 | |||
70 | |||
71 | def simplifie_nom(chaine): | ||
72 | """ simplifie le nom chaine afin d'en faire une extension | ||
73 | pour le nom du fichier. Met tout en minuscules et vire les caractères spéciaux | ||
74 | et max 15 caractères""" | ||
75 | chaine2 = "" | ||
76 | for l in chaine: | ||
77 | if l.isalpha(): | ||
78 | chaine2+=l | ||
79 | chaine2 = unidecode.unidecode(chaine2) | ||
80 | return chaine2[:15] | ||
67 | 81 | ||
68 | def convertit_poids_vers_python(chaine,liste_err): | 82 | def convertit_poids_vers_python(chaine,liste_err): |
69 | """ convertit une chaine vers un float qui est le poids. | 83 | """ convertit une chaine vers un float qui est le poids. |
@@ -82,9 +96,9 @@ def convertit_poids_vers_python(chaine,liste_err): | |||
82 | poids = 0 | 96 | poids = 0 |
83 | return poids | 97 | return poids |
84 | 98 | ||
85 | def convertit_poids_vers_texte(poids): | 99 | #def convertit_poids_vers_texte(poids): |
86 | """ convertit un poids vers du texte. Rien à dire là pour l'instant """ | 100 | # """ convertit un poids vers du texte. Rien à dire là pour l'instant """ |
87 | return str(poids) | 101 | # return str(poids) |
88 | 102 | ||
89 | ######################### | 103 | ######################### |
90 | 104 | ||
@@ -101,7 +115,7 @@ def convertit_date_vers_python(chaine,liste_err): | |||
101 | date = datetime.date(int(liste[0]),int(liste[1]),int(liste[2])) | 115 | date = datetime.date(int(liste[0]),int(liste[1]),int(liste[2])) |
102 | except: | 116 | except: |
103 | date = "" | 117 | date = "" |
104 | warning("Impossible de lire la date "+chaine) | 118 | warning("Impossible de lire la date "+chaine,liste_err) |
105 | return date | 119 | return date |
106 | 120 | ||
107 | def convertit_date_vers_texte(date): | 121 | def convertit_date_vers_texte(date): |
@@ -127,7 +141,7 @@ def delta_date(date1,datenaissance): | |||
127 | 141 | ||
128 | 142 | ||
129 | def gere_configuration(data,liste_err): | 143 | def gere_configuration(data,liste_err): |
130 | """ prend en argument le dictionnaire de requête (configuratio imparfaite), et | 144 | """ prend en argument le dictionnaire de requête (configuration imparfaite), et |
131 | construit le dictionnaire de configuration qui va bien. | 145 | construit le dictionnaire de configuration qui va bien. |
132 | Vérifie que chaque entrée est cohérente évidemment.""" | 146 | Vérifie que chaque entrée est cohérente évidemment.""" |
133 | configuration = {} | 147 | configuration = {} |
@@ -176,7 +190,7 @@ def gere_configuration(data,liste_err): | |||
176 | configuration["maxi"] = convertit_jours_vers_python(maxi,liste_err) | 190 | configuration["maxi"] = convertit_jours_vers_python(maxi,liste_err) |
177 | 191 | ||
178 | # dimensions du graphique | 192 | # dimensions du graphique |
179 | largeur = data.get("largeur") | 193 | largeur = data.get("largeur","") |
180 | if largeur == "": | 194 | if largeur == "": |
181 | largeur = largeur_graphique | 195 | largeur = largeur_graphique |
182 | else: | 196 | else: |
@@ -193,7 +207,7 @@ def gere_configuration(data,liste_err): | |||
193 | warning("Largeur trop petite !",liste_err) | 207 | warning("Largeur trop petite !",liste_err) |
194 | configuration["largeur"] = largeur | 208 | configuration["largeur"] = largeur |
195 | 209 | ||
196 | hauteur = data.get("hauteur") | 210 | hauteur = data.get("hauteur","") |
197 | if hauteur == "": | 211 | if hauteur == "": |
198 | hauteur = hauteur_graphique | 212 | hauteur = hauteur_graphique |
199 | else: | 213 | else: |
@@ -225,21 +239,19 @@ def gere_configuration(data,liste_err): | |||
225 | positionlegende = "upper left" | 239 | positionlegende = "upper left" |
226 | configuration["positionlegende"] = positionlegende | 240 | configuration["positionlegende"] = positionlegende |
227 | 241 | ||
228 | |||
229 | |||
230 | return configuration | 242 | return configuration |
231 | 243 | ||
232 | def configuration_vers_texte(config): | 244 | #def configuration_vers_texte(config): |
233 | """ exporte le texte associé à une configuration | 245 | # """ exporte le texte associé à une configuration |
234 | on dumpe simplement sauf pour maxi """ | 246 | # on dumpe simplement sauf pour maxi """ |
235 | texte = "# Section configuration\n" | 247 | # texte = "# Section configuration\n" |
236 | for (cle,val) in config.items(): | 248 | # for (cle,val) in config.items(): |
237 | if cle != "maxi": | 249 | # if cle != "maxi": |
238 | texte+= cle + "=" + str(val) + "\n" | 250 | # texte+= cle + "=" + str(val) + "\n" |
239 | else: | 251 | # else: |
240 | texte+= cle + "=" + convertit_age_vers_texte(val)+"\n" | 252 | # texte+= cle + "=" + convertit_age_vers_texte(val)+"\n" |
241 | texte +="\n" | 253 | # texte +="\n" |
242 | return texte | 254 | # return texte |
243 | 255 | ||
244 | 256 | ||
245 | def gere_donneespoids(data,naissance,liste_err): | 257 | def gere_donneespoids(data,naissance,liste_err): |
@@ -279,46 +291,87 @@ def gere_donneespoids(data,naissance,liste_err): | |||
279 | return (l_jours,l_poids) | 291 | return (l_jours,l_poids) |
280 | 292 | ||
281 | 293 | ||
282 | def donnees_poids_vers_texte(l_jours,l_poids): | 294 | #def donnees_poids_vers_texte(l_jours,l_poids): |
283 | """ retourne le texte correspondant aux données de poids """ | 295 | # """ retourne le texte correspondant aux données de poids """ |
284 | texte = "# Section données\n" | 296 | # texte = "# Section données\n" |
285 | 297 | # | |
286 | for i in range(len(l_poids)): | 298 | # for i in range(len(l_poids)): |
287 | texte +=convertit_age_vers_texte(l_jours[i])+","+convertit_poids_vers_texte(l_poids[i])+"\n" | 299 | # texte +=convertit_age_vers_texte(l_jours[i])+","+convertit_poids_vers_texte(l_poids[i])+"\n" |
300 | # | ||
301 | # texte+="\n" | ||
302 | # return texte | ||
303 | |||
304 | |||
305 | |||
306 | |||
307 | |||
308 | def donnees_vers_json(l_jours,l_poids,config): | ||
309 | """ retourne le json à renvoyer""" | ||
310 | gros_dico = config.copy() | ||
311 | l_jours2 = [convertit_age_vers_texte(d) for d in l_jours] | ||
312 | gros_dico["data_j"] = l_jours2 | ||
313 | gros_dico["data_p"] = l_poids | ||
314 | # gérer la date de naissance | ||
315 | if gros_dico.get("naissance","") != "": | ||
316 | gros_dico["naissance"] = convertit_date_vers_texte(gros_dico["naissance"]) | ||
317 | # gérer l'age maxi | ||
318 | gros_dico["maxi"] = convertit_age_vers_texte(gros_dico["maxi"]) | ||
288 | 319 | ||
289 | texte+="\n" | 320 | return json.dumps(gros_dico, indent=2,ensure_ascii=False ) |
290 | return texte | ||
291 | 321 | ||
322 | #def fichier_texte_vers_configdonnees(fichier,liste_err): | ||
323 | # """ prend le texte importé et l'exporte vers configuration et données | ||
324 | # sous forme de valeurs du formulaire """ | ||
325 | # | ||
326 | # valform = {} | ||
327 | # indice_formulaire = 0 # l'indice du formulaire pour les données : age_1, date_1, poids_1 etc | ||
328 | # num_ligne = 0 | ||
329 | # lignes = fichier.readlines() | ||
330 | # for ligne in lignes: | ||
331 | # num_ligne +=1 | ||
332 | # ligne = str(ligne,"utf8") | ||
333 | # ligne = ligne.rstrip("\n") | ||
334 | # if ligne != "" and ligne[0] != "#" and not(ligne.isspace()): # les lignes commençant par # sont des commentaires | ||
335 | # # On essaie de partitionner pour voir | ||
336 | # (var,egal,val) = ligne.partition("=") | ||
337 | # if egal == "=": # c'est une ligne de config | ||
338 | # valform[var] = val | ||
339 | # else: | ||
340 | # (age,virgule,poids) = ligne.partition(",") # On partitionne avec , | ||
341 | # if virgule == ",": | ||
342 | # # c'est une ligne de data | ||
343 | # valform["age_"+str(indice_formulaire)] = age | ||
344 | # valform["poids_"+str(indice_formulaire)] = poids | ||
345 | # indice_formulaire +=1 | ||
346 | # | ||
347 | # else: | ||
348 | # warning("La ligne "+str(num_ligne)+" n'est pas reconnue et sera ignorée : <"+ligne+">",liste_err) | ||
349 | # | ||
350 | # #le nb max du formulaire | ||
351 | # valform["nb_data"] = max(indice_formulaire +2,nombre_lignes_form) | ||
352 | # | ||
353 | # return valform | ||
292 | 354 | ||
293 | def fichier_texte_vers_configdonnees(fichier,liste_err): | 355 | def fichier_json_vers_configdonnees(fichier,liste_err): |
294 | """ prend le texte importé et l'exporte vers configuration et données | 356 | """ prend le json importé et l'exporte vers les valeurs du formulaire """ |
295 | sous forme de valeurs du formulaire """ | 357 | chaine = fichier.read() |
358 | valform = json.loads(chaine) | ||
359 | # Il faut maintenant récupérer les l_jours et l_poids puis les remettre | ||
360 | # sous forme de age_i et poids_i | ||
361 | l_jours= valform.get("data_j",[]) | ||
362 | l_poids=valform.get("data_p",[]) | ||
363 | if len(l_poids) != len(l_jours): | ||
364 | warning("Lecture du json : les données sont incohérentes (listes de taille différentes et/ou pb de lecture") | ||
365 | long = min(len(l_jours),len(l_poids)) | ||
366 | else: | ||
367 | long = len(l_jours) | ||
368 | for i in range(long): | ||
369 | valform["age_"+str(i)] = l_jours[i] | ||
370 | valform["poids_"+str(i)] = l_poids[i] | ||
371 | |||
372 | valform["nb_data"] = max(long +2,nombre_lignes_form) | ||
296 | 373 | ||
297 | valform = {} | 374 | return valform |
298 | indice_formulaire = 0 # l'indice du formulaire pour les données : age_1, date_1, poids_1 etc | ||
299 | num_ligne = 0 | ||
300 | lignes = fichier.readlines() | ||
301 | for ligne in lignes: | ||
302 | num_ligne +=1 | ||
303 | ligne = str(ligne,"utf8") | ||
304 | ligne = ligne.rstrip("\n") | ||
305 | if ligne != "" and ligne[0] != "#" and not(ligne.isspace()): # les lignes commençant par # sont des commentaires | ||
306 | # On essaie de partitionner pour voir | ||
307 | (var,egal,val) = ligne.partition("=") | ||
308 | if egal == "=": # c'est une ligne de config | ||
309 | valform[var] = val | ||
310 | else: | ||
311 | (age,virgule,poids) = ligne.partition(",") # On partitionne avec , | ||
312 | if virgule == ",": | ||
313 | # c'est une ligne de data | ||
314 | valform["age_"+str(indice_formulaire)] = age | ||
315 | valform["poids_"+str(indice_formulaire)] = poids | ||
316 | indice_formulaire +=1 | ||
317 | |||
318 | else: | ||
319 | warning("La ligne "+str(num_ligne)+" n'est pas reconnue et sera ignorée : <"+ligne+">",liste_err) | ||
320 | 375 | ||
321 | #le nb max du formulaire | ||
322 | valform["nb_data"] = indice_formulaire +2 | ||
323 | 376 | ||
324 | return valform | 377 | \ No newline at end of file |