summaryrefslogtreecommitdiff
path: root/gestion_donnees.py
diff options
context:
space:
mode:
Diffstat (limited to 'gestion_donnees.py')
-rw-r--r--gestion_donnees.py177
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 @@
4from configuration import * 4from configuration import *
5from gestion_erreurs import * 5from gestion_erreurs import *
6import datetime 6import datetime
7import json
8import unidecode
7 9
8 10
9############ Fonctions de conversion 11############ Fonctions de conversion
10 12
11def convertit_jours_vers_python(chaine,liste_err): 13def 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
50def convertit_age_vers_texte(nombre): 52def 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
71def 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
68def convertit_poids_vers_python(chaine,liste_err): 82def 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
85def 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
107def convertit_date_vers_texte(date): 121def convertit_date_vers_texte(date):
@@ -127,7 +141,7 @@ def delta_date(date1,datenaissance):
127 141
128 142
129def gere_configuration(data,liste_err): 143def 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
232def 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
245def gere_donneespoids(data,naissance,liste_err): 257def 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
282def 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
308def 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
293def fichier_texte_vers_configdonnees(fichier,liste_err): 355def 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