]> git.immae.eu Git - perso/Denise/oms.git/blobdiff - gestion_donnees.py
Quelques infos, release
[perso/Denise/oms.git] / gestion_donnees.py
index 71c96231c6c9ba6fe78d5bdc8f2736fc4b7ccbb1..d214bcd9d47b7c42154de0ddb4fcd5aa58e17231 100644 (file)
@@ -1,16 +1,22 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
-from configuration import *
+from configuration import CONFIG,DEFAUT
 from gestion_erreurs import *
 from gestion_erreurs import *
+from gestion_couleurs import *
 import datetime
 import datetime
+import json
+import unidecode
+import copy
 
 
+### Les données "tournent" selon :
+### python -> json -> (export/import) -> formulaire HTML -> données POST -> python etc
 
 ############ Fonctions de conversion
 
 def convertit_jours_vers_python(chaine,liste_err):
     """ convertit une chaine de type 1a 3m 1s 10j en jours
 
 ############ Fonctions de conversion
 
 def convertit_jours_vers_python(chaine,liste_err):
     """ convertit une chaine de type 1a 3m 1s 10j en jours
-    Renvoie un nombre de jours en entiers.
+    Renvoie un nombre de jours en float
     Si un des caractères n'est ni un nombre, ni une lettre "autorisée" ni une espace,
     on affiche un warning et on ignore ce caractère
     """
     Si un des caractères n'est ni un nombre, ni une lettre "autorisée" ni une espace,
     on affiche un warning et on ignore ce caractère
     """
@@ -22,15 +28,15 @@ def convertit_jours_vers_python(chaine,liste_err):
         else:
             if lettre == 'a' or lettre == 'A':
                 # On a trouvé l'année, on ajoute tout ce qui est trouvé jusque là
         else:
             if lettre == 'a' or lettre == 'A':
                 # On a trouvé l'année, on ajoute tout ce qui est trouvé jusque là
-                agejours += int(chainenombre)*jours_dans_annee
+                agejours += int(chainenombre)*CONFIG["jours_dans_annee"]
                 chainenombre = ""
             elif lettre == 'm' or lettre == 'M':
                 # On a trouvé le mois
                 chainenombre = ""
             elif lettre == 'm' or lettre == 'M':
                 # On a trouvé le mois
-                agejours += int(chainenombre)*jours_dans_mois
+                agejours += int(chainenombre)*CONFIG["jours_dans_mois"]
                 chainenombre = ""
             elif lettre == 's' or lettre == 'S':
                 # la semaine
                 chainenombre = ""
             elif lettre == 's' or lettre == 'S':
                 # la semaine
-                agejours += int(chainenombre)*jours_dans_semaine
+                agejours += int(chainenombre)*CONFIG["jours_dans_semaine"]
                 chainenombre = ""
             elif lettre == 'j' or lettre == 'J':
                 # On a trouvé le jour
                 chainenombre = ""
             elif lettre == 'j' or lettre == 'J':
                 # On a trouvé le jour
@@ -41,19 +47,19 @@ def convertit_jours_vers_python(chaine,liste_err):
                 warning("convertit_jour_vers_python : caractère invalide : "+lettre,liste_err)
     # à la fin s'il reste qqch on le garde dans les jours
     if chainenombre != "":
                 warning("convertit_jour_vers_python : caractère invalide : "+lettre,liste_err)
     # à la fin s'il reste qqch on le garde dans les jours
     if chainenombre != "":
-        agejour += int(chainenombre)
+        agejours += int(chainenombre)
     if agejours<0:
         warning("L'âge est négatif !",liste_err)
         agejours = 0
     if agejours<0:
         warning("L'âge est négatif !",liste_err)
         agejours = 0
-    return round(agejours)
+    return agejours
 
 def convertit_age_vers_texte(nombre):
     """ convertit un nombre de jours en un truc plus lisible en mois, années, jours
     et renvoie une chaîne sous la forme 3a2m1j par exemple"""
 
 def convertit_age_vers_texte(nombre):
     """ convertit un nombre de jours en un truc plus lisible en mois, années, jours
     et renvoie une chaîne sous la forme 3a2m1j par exemple"""
-    annees = int(nombre / jours_dans_annee)
-    restant = nombre - round(annees*jours_dans_annee)
-    mois = int(restant/jours_dans_mois)
-    jours= nombre - round(mois*jours_dans_mois + annees*jours_dans_annee)
+    annees = int(nombre / CONFIG["jours_dans_annee"])
+    restant = nombre - annees*CONFIG["jours_dans_annee"]
+    mois = int(restant/CONFIG["jours_dans_mois"])
+    jours= round(nombre - mois*CONFIG["jours_dans_mois"] - annees*CONFIG["jours_dans_annee"])
     
     chaine = ""
     if annees >0:
     
     chaine = ""
     if annees >0:
@@ -64,6 +70,18 @@ def convertit_age_vers_texte(nombre):
         chaine += str(jours)+"j"
     return chaine
 ##########################
         chaine += str(jours)+"j"
     return chaine
 ##########################
+    
+
+def simplifie_nom(chaine):
+    """ simplifie le nom chaine afin d'en faire une extension
+    pour le nom du fichier. Met tout en minuscules et vire les caractères spéciaux
+    et max 15 caractères"""
+    chaine2 = ""
+    for l in chaine:
+        if l.isalpha():
+            chaine2+=l
+    chaine2 =  unidecode.unidecode(chaine2)
+    return chaine2[:15]
 
 def convertit_poids_vers_python(chaine,liste_err):
     """ convertit une chaine vers un float qui est le poids.
 
 def convertit_poids_vers_python(chaine,liste_err):
     """ convertit une chaine vers un float qui est le poids.
@@ -77,14 +95,14 @@ def convertit_poids_vers_python(chaine,liste_err):
     except:
         warning("Poids impossible à lire : "+chaine,liste_err)
         poids = 0
     except:
         warning("Poids impossible à lire : "+chaine,liste_err)
         poids = 0
-    if not( 0<=poids<poids_maxi):
+    if not( 0<=poids<CONFIG["poids_maxi"]):
         warning("Poids incohérent : "+str(poids),liste_err)
         poids = 0
     return poids
 
         warning("Poids incohérent : "+str(poids),liste_err)
         poids = 0
     return poids
 
-def convertit_poids_vers_texte(poids):
-    """ convertit un poids vers du texte. Rien à dire là pour l'instant """
-    return str(poids)
+#def convertit_poids_vers_texte(poids):
+#    """ convertit un poids vers du texte. Rien à dire là pour l'instant """
+#    return str(poids)
 
 #########################
 
 
 #########################
 
@@ -101,7 +119,7 @@ def convertit_date_vers_python(chaine,liste_err):
             date = datetime.date(int(liste[0]),int(liste[1]),int(liste[2]))
         except:
             date = ""
             date = datetime.date(int(liste[0]),int(liste[1]),int(liste[2]))
         except:
             date = ""
-            warning("Impossible de lire la date "+chaine)
+            warning("Impossible de lire la date "+chaine,liste_err)
         return date
     
 def convertit_date_vers_texte(date):
         return date
     
 def convertit_date_vers_texte(date):
@@ -127,7 +145,7 @@ def delta_date(date1,datenaissance):
 
 
 def gere_configuration(data,liste_err):
 
 
 def gere_configuration(data,liste_err):
-    """ prend en argument le dictionnaire de requête (configuratio imparfaite), et
+    """ prend en argument le dictionnaire de requête (configuration imparfaite), et
     construit le dictionnaire de configuration qui va bien.
     Vérifie que chaque entrée est cohérente évidemment."""
     configuration = {}
     construit le dictionnaire de configuration qui va bien.
     Vérifie que chaque entrée est cohérente évidemment."""
     configuration = {}
@@ -135,7 +153,7 @@ def gere_configuration(data,liste_err):
     # Pour le nom, osef qu'il soit vide
     nom = data.get("nom","")
     # Par contre s'il est trop long on le tronque   
     # Pour le nom, osef qu'il soit vide
     nom = data.get("nom","")
     # Par contre s'il est trop long on le tronque   
-    configuration["nom"] = nom[:longueur_max_nom_bebe]
+    configuration["nom"] = nom[:CONFIG["longueur_max_nom_bebe"]]
         
     sexe = data.get("sexe","")
     if not (sexe in ["F","M","N"]):
         
     sexe = data.get("sexe","")
     if not (sexe in ["F","M","N"]):
@@ -156,11 +174,12 @@ def gere_configuration(data,liste_err):
     
     # unité
     unite = data.get("unite","")
     
     # unité
     unite = data.get("unite","")
-    if not (unite in liste_unites_valides):
+
+    if not (unite in CONFIG["liste_unites"]):
         unite = ""
         #warning("L'unité "+unite+" n'est pas reconnue !",liste_err)
     configuration["unite"] = unite
         unite = ""
         #warning("L'unité "+unite+" n'est pas reconnue !",liste_err)
     configuration["unite"] = unite
-    
+
     # grille
     grille = data.get("grille","")
     if grille != "on":
     # grille
     grille = data.get("grille","")
     if grille != "on":
@@ -176,38 +195,38 @@ def gere_configuration(data,liste_err):
         configuration["maxi"] = convertit_jours_vers_python(maxi,liste_err)
     
     # dimensions du graphique
         configuration["maxi"] = convertit_jours_vers_python(maxi,liste_err)
     
     # dimensions du graphique
-    largeur = data.get("largeur")
+    largeur = data.get("largeur","")
     if largeur == "":
     if largeur == "":
-        largeur = largeur_graphique
+        largeur = DEFAUT["largeur_graphique"]
     else:
         try:
             largeur = int(largeur)
         except:
             warning("La largeur "+largeur+"est invalide !",liste_err)
     else:
         try:
             largeur = int(largeur)
         except:
             warning("La largeur "+largeur+"est invalide !",liste_err)
-            largeur = largeur_graphique
-        if largeur > largeur_graphique_max:
-            largeur = largeur_graphique_max
-            warning("Largeur trop grande !",liste_err)
-        elif largeur < largeur_graphique_min:
-            largeur = largeur_graphique_min
-            warning("Largeur trop petite !",liste_err)
+            largeur = DEFAUT["largeur_graphique"]
+        if largeur > CONFIG["largeur_graphique_max"]:
+            largeur = CONFIG["largeur_graphique_max"]
+            warning("Largeur du graphique trop grande !",liste_err)
+        elif largeur < CONFIG["largeur_graphique_min"]:
+            largeur = CONFIG["largeur_graphique_min"]
+            warning("Largeur du graphique trop petite !",liste_err)
     configuration["largeur"] = largeur
     
     configuration["largeur"] = largeur
     
-    hauteur = data.get("hauteur")
+    hauteur = data.get("hauteur","")
     if hauteur == "":
     if hauteur == "":
-        hauteur = hauteur_graphique
+        hauteur = DEFAUT["hauteur_graphique"]
     else:
         try:
             hauteur = int(hauteur)
         except:
             warning("La hauteur "+hauteur+"est invalide !",liste_err)
     else:
         try:
             hauteur = int(hauteur)
         except:
             warning("La hauteur "+hauteur+"est invalide !",liste_err)
-            hauteur = hauteur_graphique
-        if hauteur > hauteur_graphique_max:
-            hauteur = hauteur_graphique_max
-            warning("Hauteur trop grande !",liste_err)
-        elif hauteur < hauteur_graphique_min:
-            hauteur = hauteur_graphique_min
-            warning("Hauteur trop petite !",liste_err)
+            hauteur = DEFAUT["hauteur_graphique"]
+        if hauteur > CONFIG["hauteur_graphique_max"]:
+            hauteur = CONFIG["hauteur_graphique_max"]
+            warning("Hauteur du graphique trop grande !",liste_err)
+        elif hauteur < CONFIG["hauteur_graphique_min"]:
+            hauteur = CONFIG["hauteur_graphique_min"]
+            warning("Hauteur du graphique trop petite !",liste_err)
     configuration["hauteur"] = hauteur   
     
     # existence et position de la légende
     configuration["hauteur"] = hauteur   
     
     # existence et position de la légende
@@ -224,22 +243,16 @@ def gere_configuration(data,liste_err):
     if not(positionlegende in ['upper left','upper right','lower left','lower right']):
         positionlegende = "upper left"
     configuration["positionlegende"] = positionlegende
     if not(positionlegende in ['upper left','upper right','lower left','lower right']):
         positionlegende = "upper left"
     configuration["positionlegende"] = positionlegende
+
     
     
+    configuration["couleurs"] = {}
+    # gérer les couleurs
+    for clecouleur in DEFAUT["couleurs"]:
+        coul = rgb_vers_tuple(data.get("couleur_"+clecouleur,""),CONFIG["couleurs"][clecouleur],liste_err)
+        configuration["couleurs"][clecouleur] = coul
     
     
     return configuration   
     
     
     return configuration   
-
-def configuration_vers_texte(config):
-    """ exporte le texte associé à une configuration 
-    on dumpe simplement sauf pour maxi """
-    texte = "# Section configuration\n"
-    for (cle,val) in config.items():
-        if cle != "maxi":
-            texte+= cle + "=" + str(val) + "\n"
-        else:
-            texte+= cle + "=" + convertit_age_vers_texte(val)+"\n"
-    texte +="\n"
-    return texte
  
 
 def gere_donneespoids(data,naissance,liste_err):
  
 
 def gere_donneespoids(data,naissance,liste_err):
@@ -277,48 +290,56 @@ def gere_donneespoids(data,naissance,liste_err):
     l_poids = [x[1] for x in liste_donnees]   
     
     return (l_jours,l_poids)
     l_poids = [x[1] for x in liste_donnees]   
     
     return (l_jours,l_poids)
+
+
+
+
+def donnees_vers_json(l_jours,l_poids,config):
+    """ retourne le json à renvoyer"""
+    gros_dico = copy.deepcopy(config)
+    l_jours2 = [convertit_age_vers_texte(d) for d in l_jours]
+    gros_dico["data_j"] = l_jours2
+    gros_dico["data_p"] = l_poids
+    # gérer la date de naissance
+    if gros_dico.get("naissance","") != "":
+        gros_dico["naissance"] = convertit_date_vers_texte(gros_dico["naissance"])
+    # gérer l'age maxi
+    gros_dico["maxi"] = convertit_age_vers_texte(gros_dico["maxi"])
+    # gérer les couleurs
+#    for cle in ["couleur1", "couleur2", "couleur3", "couleur_fond","couleur_grille","couleur_cadretxt"]:
+#        gros_dico[cle] = tuple_vers_rgb(gros_dico[cle])
+    for clecouleur in DEFAUT["couleurs"]:
+        gros_dico["couleurs"][clecouleur] = tuple_vers_rgb(gros_dico["couleurs"][clecouleur])
     
     
     
     
-def donnees_poids_vers_texte(l_jours,l_poids):
-    """ retourne le texte correspondant aux données de poids """
-    texte = "# Section données\n"
-    
-    for i in range(len(l_poids)):
-        texte +=convertit_age_vers_texte(l_jours[i])+","+convertit_poids_vers_texte(l_poids[i])+"\n"
         
         
-    texte+="\n"
-    return texte
+    return json.dumps(gros_dico, indent=2,ensure_ascii=False )
 
 
 
 
-def fichier_texte_vers_configdonnees(fichier,liste_err):
-    """ prend le texte importé et l'exporte vers configuration et données
-    sous forme de valeurs du formulaire """
+def fichier_json_vers_configdonnees(chaine,liste_err):
+    """ prend le json importé (chaine) et l'exporte vers les valeurs du formulaire """
+    debug("json vers config : Prêt à interpréter le json",liste_err)
+    try:    
+        valform = json.loads(chaine)
+    except :
+        erreur("Impossible de lire le fichier json !",liste_err)
+        return {}
+    # Il faut maintenant récupérer les l_jours et l_poids puis les remettre
+    # sous forme de age_i et poids_i
+    l_jours= valform.get("data_j",[])
+    l_poids=valform.get("data_p",[])
+    if len(l_poids) != len(l_jours):
+        warning("Lecture du json : les données sont incohérentes (listes de taille différentes et/ou pb de lecture")
+        long = min(len(l_jours),len(l_poids))
+    else:
+        long = len(l_jours)
+    for i in range(long):
+        valform["age_"+str(i)] = l_jours[i]
+        valform["poids_"+str(i)] = l_poids[i]
+        
+    valform["nb_data"] = max(long +2,DEFAUT["nb_data"])
     
     
-    valform = {}
-    indice_formulaire = 0 # l'indice du formulaire pour les données : age_1, date_1, poids_1 etc
-    num_ligne = 0
-    lignes = fichier.readlines()
-    for ligne in lignes:
-        num_ligne +=1
-        ligne = str(ligne,"utf8")
-        ligne = ligne.rstrip("\n")
-        if ligne != "" and ligne[0] != "#" and not(ligne.isspace()): # les lignes commençant par # sont des commentaires
-            # On essaie de partitionner pour voir
-            (var,egal,val) = ligne.partition("=")
-            if egal == "=": # c'est une ligne de config 
-                valform[var] = val
-            else:
-                (age,virgule,poids) = ligne.partition(",") # On partitionne avec ,
-                if virgule == ",":
-                    # c'est une ligne de data
-                    valform["age_"+str(indice_formulaire)] = age
-                    valform["poids_"+str(indice_formulaire)] = poids
-                    indice_formulaire +=1
-                    
-                else:
-                    warning("La ligne "+str(num_ligne)+" n'est pas reconnue et sera ignorée : <"+ligne+">",liste_err)
+    return valform
     
     
-    #le nb max du formulaire
-    valform["nb_data"] = indice_formulaire +2
     
     
-    return valform
+    
\ No newline at end of file