]>
git.immae.eu Git - perso/Denise/oms.git/blob - gestion_donnees.py
2 # -*- coding: utf-8 -*-
4 from configuration
import *
5 from gestion_erreurs
import *
6 from gestion_couleurs
import *
13 ############ Fonctions de conversion
15 def convertit_jours_vers_python(chaine
,liste_err
):
16 """ convertit une chaine de type 1a 3m 1s 10j en jours
17 Renvoie un nombre de jours en float
18 Si un des caractères n'est ni un nombre, ni une lettre "autorisée" ni une espace,
19 on affiche un warning et on ignore ce caractère
25 chainenombre
+= lettre
27 if lettre
== 'a' or lettre
== 'A':
28 # On a trouvé l'année, on ajoute tout ce qui est trouvé jusque là
29 agejours
+= int(chainenombre
)*jours_dans_annee
31 elif lettre
== 'm' or lettre
== 'M':
33 agejours
+= int(chainenombre
)*jours_dans_mois
35 elif lettre
== 's' or lettre
== 'S':
37 agejours
+= int(chainenombre
)*jours_dans_semaine
39 elif lettre
== 'j' or lettre
== 'J':
41 agejours
+= int(chainenombre
)
44 # autre caractère : bizarre ?
45 warning("convertit_jour_vers_python : caractère invalide : "+lettre
,liste_err
)
46 # à la fin s'il reste qqch on le garde dans les jours
47 if chainenombre
!= "":
48 agejours
+= int(chainenombre
)
50 warning("L'âge est négatif !",liste_err
)
54 def convertit_age_vers_texte(nombre
):
55 """ convertit un nombre de jours en un truc plus lisible en mois, années, jours
56 et renvoie une chaîne sous la forme 3a2m1j par exemple"""
57 annees
= int(nombre
/ jours_dans_annee
)
58 restant
= nombre
- annees
*jours_dans_annee
59 mois
= int(restant
/jours_dans_mois
)
60 jours
= round(nombre
- mois
*jours_dans_mois
- annees
*jours_dans_annee
)
64 chaine
+= str(annees
)+"a"
66 chaine
+= str(mois
)+"m"
67 if jours
>0 or nombre
==0: # si c'est la naissance, faut beien écrire 0j quand même
68 chaine
+= str(jours
)+"j"
70 ##########################
73 def simplifie_nom(chaine
):
74 """ simplifie le nom chaine afin d'en faire une extension
75 pour le nom du fichier. Met tout en minuscules et vire les caractères spéciaux
76 et max 15 caractères"""
81 chaine2
= unidecode
.unidecode(chaine2
)
84 def convertit_poids_vers_python(chaine
,liste_err
):
85 """ convertit une chaine vers un float qui est le poids.
86 On gère notamment la virgule, et on enlève les espaces
87 Un poids invalide -> on renvoie 0 avec un warning"""
88 chaine2
= chaine
.replace(",",".")
89 chaine2
= chaine2
.replace(" ","")
92 poids
= float(chaine2
)
94 warning("Poids impossible à lire : "+chaine
,liste_err
)
96 if not( 0<=poids
<poids_maxi
):
97 warning("Poids incohérent : "+str(poids
),liste_err
)
101 #def convertit_poids_vers_texte(poids):
102 # """ convertit un poids vers du texte. Rien à dire là pour l'instant """
105 #########################
107 def convertit_date_vers_python(chaine
,liste_err
):
108 """ prend une chaine comme renvoyée par un champ de formulaire date
109 aaaa-mm-jj et en fait une date python
110 renvoie "" si ne marche pas"""
111 liste
= chaine
.split("-")
113 warning("La date : "+chaine
+" est invalide !",liste_err
)
117 date
= datetime
.date(int(liste
[0]),int(liste
[1]),int(liste
[2]))
120 warning("Impossible de lire la date "+chaine
,liste_err
)
123 def convertit_date_vers_texte(date
):
124 """ convertit une date python en format texte aaaa-mm-jj"""
128 return (str(date
.year
)+"-"+str(date
.month
)+"-"+str(date
.day
))
131 def delta_date(date1
,datenaissance
):
132 """ renvoie le nombre de jours (entier) entre date1 et datenaissance format "datetime"
133 datenaissance est supposée antérieure. Erreur sinon."""
134 d
= date1
- datenaissance
137 erreur_continue("La différence entre les dates est négative... :/")
142 ########### Fonctions qui gèretn les données
145 def gere_configuration(data
,liste_err
):
146 """ prend en argument le dictionnaire de requête (configuration imparfaite), et
147 construit le dictionnaire de configuration qui va bien.
148 Vérifie que chaque entrée est cohérente évidemment."""
151 # Pour le nom, osef qu'il soit vide
152 nom
= data
.get("nom","")
153 # Par contre s'il est trop long on le tronque
154 configuration
["nom"] = nom
[:longueur_max_nom_bebe
]
156 sexe
= data
.get("sexe","")
157 if not (sexe
in ["F","M","N"]):
158 warning("Le sexe de l'enfant est invalide ! "+sexe
,liste_err
)
160 configuration
["sexe"] = sexe
162 naissance
= data
.get("naissance","")
164 naissance
= convertit_date_vers_python(naissance
,liste_err
)
165 configuration
["naissance"] = naissance
167 # Type de courbe. Au pire on met P
168 tyc
= data
.get("typecourbe","")
169 if not (tyc
in ["P","Z"]):
171 configuration
["typecourbe"] = tyc
174 unite
= data
.get("unite","")
175 if not (unite
in liste_unites_valides
):
177 #warning("L'unité "+unite+" n'est pas reconnue !",liste_err)
178 configuration
["unite"] = unite
181 grille
= data
.get("grille","")
183 configuration
["grille"] = ""
185 configuration
["grille"] = "oui"
187 # maxi. 0 signifie qu'on veut pas de maxi
188 maxi
= data
.get("maxi","")
190 configuration
["maxi"] = 0
192 configuration
["maxi"] = convertit_jours_vers_python(maxi
,liste_err
)
194 # dimensions du graphique
195 largeur
= data
.get("largeur","")
197 largeur
= DEFAUT
["largeur_graphique"]
200 largeur
= int(largeur
)
202 warning("La largeur "+largeur
+"est invalide !",liste_err
)
203 largeur
= DEFAUT
["largeur_graphique"]
204 if largeur
> largeur_graphique_max
:
205 largeur
= largeur_graphique_max
206 warning("Largeur trop grande !",liste_err
)
207 elif largeur
< largeur_graphique_min
:
208 largeur
= largeur_graphique_min
209 warning("Largeur trop petite !",liste_err
)
210 configuration
["largeur"] = largeur
212 hauteur
= data
.get("hauteur","")
214 hauteur
= DEFAUT
["hauteur_graphique"]
217 hauteur
= int(hauteur
)
219 warning("La hauteur "+hauteur
+"est invalide !",liste_err
)
220 hauteur
= DEFAUT
["hauteur_graphique"]
221 if hauteur
> hauteur_graphique_max
:
222 hauteur
= hauteur_graphique_max
223 warning("Hauteur trop grande !",liste_err
)
224 elif hauteur
< hauteur_graphique_min
:
225 hauteur
= hauteur_graphique_min
226 warning("Hauteur trop petite !",liste_err
)
227 configuration
["hauteur"] = hauteur
229 # existence et position de la légende
230 legende
= data
.get("legende","")
237 configuration
["legende"] = legende
239 positionlegende
= data
.get("positionlegende","")
240 if not(positionlegende
in ['upper left','upper right','lower left','lower right']):
241 positionlegende
= "upper left"
242 configuration
["positionlegende"] = positionlegende
244 #warning("bla"+data["couleur1"],liste_err)
245 # coul1 = rgb_vers_tuple(data.get("couleur1",""),couleur_defaut_1_tuple,liste_err)
246 # coul2 = rgb_vers_tuple(data.get("couleur2",""),couleur_defaut_2_tuple,liste_err)
247 # coul3 = rgb_vers_tuple(data.get("couleur3",""),couleur_defaut_3_tuple,liste_err)
248 # #warning("bla2"+str(coul1),liste_err)
249 # configuration["couleur1"] = coul1
250 # configuration["couleur2"] = coul2
251 # configuration["couleur3"] = coul3
253 configuration
["couleurs"] = {}
255 #warning("data : "+str(data),liste_err)
256 for clecouleur
in DEFAUT
["couleurs"]:
257 coul
= rgb_vers_tuple(data
.get("couleur_"+clecouleur
,""),CONFIG
["couleurs"][clecouleur
],liste_err
)
258 configuration
["couleurs"][clecouleur
] = coul
260 #warning("config : "+str(configuration["couleurs"]),liste_err)
262 # coul_fond = rgb_vers_tuple(data.get("couleur_fond",""),couleur_defaut_fond_tuple,liste_err)
263 # configuration["couleur_fond"] = coul_fond
265 # # couleur d'axes et de texte
266 # coul_cadretxt = rgb_vers_tuple(data.get("couleur_cadretxt",""),couleur_defaut_cadretxt_tuple,liste_err)
267 # configuration["couleur_cadretxt"] = coul_cadretxt
269 # # couleur de la grille
270 # coul_grille = rgb_vers_tuple(data.get("couleur_grille",""),couleur_defaut_grille_tuple,liste_err)
271 # configuration["couleur_grille"] = coul_grille
272 #warning(str(configuration["couleur1"]),liste_err)
277 def gere_donneespoids(data
,naissance
,liste_err
):
278 """ prend en argument le dictionnaire de requête, et la date de naissance
279 (éventuellement vide) et construit les deux listes l_jours et l_poids"""
281 # On construit la liste des couples
285 # On va chercher si y'a des données à poids_i
286 while "poids_"+str(i
) in data
.keys():
287 if data
["poids_"+str(i
)] != "":
288 poids
= convertit_poids_vers_python(data
["poids_"+str(i
)],liste_err
)
289 age
= data
.get("age_"+str(i
),"")
291 age
= convertit_jours_vers_python(age
,liste_err
)
292 liste_donnees
.append((age
,poids
))
294 date
= data
.get("date_"+str(i
),"")
295 datep
= convertit_date_vers_python(date
,liste_err
)
298 warning("La date de naissance n'a pas été précisée. Du coup on ne peut pas calculer l'âge de l'enfant le "+date
,liste_err
)
299 elif datep
!= "": # la date est valide et on a une date de naissance
300 age
= delta_date(datep
,naissance
)
301 liste_donnees
.append((age
,poids
))
305 liste_donnees
.sort(key
=lambda x
: x
[0])
308 l_jours
= [x
[0] for x
in liste_donnees
]
309 l_poids
= [x
[1] for x
in liste_donnees
]
311 return (l_jours
,l_poids
)
316 def donnees_vers_json(l_jours
,l_poids
,config
):
317 """ retourne le json à renvoyer"""
318 gros_dico
= copy
.deepcopy(config
)
319 l_jours2
= [convertit_age_vers_texte(d
) for d
in l_jours
]
320 gros_dico
["data_j"] = l_jours2
321 gros_dico
["data_p"] = l_poids
322 # gérer la date de naissance
323 if gros_dico
.get("naissance","") != "":
324 gros_dico
["naissance"] = convertit_date_vers_texte(gros_dico
["naissance"])
326 gros_dico
["maxi"] = convertit_age_vers_texte(gros_dico
["maxi"])
328 # for cle in ["couleur1", "couleur2", "couleur3", "couleur_fond","couleur_grille","couleur_cadretxt"]:
329 # gros_dico[cle] = tuple_vers_rgb(gros_dico[cle])
330 for clecouleur
in DEFAUT
["couleurs"]:
331 gros_dico
["couleurs"][clecouleur
] = tuple_vers_rgb(gros_dico
["couleurs"][clecouleur
])
335 return json
.dumps(gros_dico
, indent
=2,ensure_ascii
=False )
338 def fichier_json_vers_configdonnees(fichier
,liste_err
):
339 """ prend le json importé et l'exporte vers les valeurs du formulaire """
340 chaine
= fichier
.read()
341 valform
= json
.loads(chaine
)
342 # Il faut maintenant récupérer les l_jours et l_poids puis les remettre
343 # sous forme de age_i et poids_i
344 l_jours
= valform
.get("data_j",[])
345 l_poids
=valform
.get("data_p",[])
346 if len(l_poids
) != len(l_jours
):
347 warning("Lecture du json : les données sont incohérentes (listes de taille différentes et/ou pb de lecture")
348 long = min(len(l_jours
),len(l_poids
))
351 for i
in range(long):
352 valform
["age_"+str(i
)] = l_jours
[i
]
353 valform
["poids_"+str(i
)] = l_poids
[i
]
355 valform
["nb_data"] = max(long +2,DEFAUT
["nb_data"])