X-Git-Url: https://git.immae.eu/?p=perso%2FDenise%2Foms.git;a=blobdiff_plain;f=gestion_donnees.py;h=137849d7e6701725c94efedcbcf8ecb57cc22345;hp=5876c5abac245e32b9a99b0103fdefd17d956523;hb=64be08b2203c801c5231be30a2096790cd0c3b12;hpb=38b5e10ae817f79fb10b6c4b8655e6d95b2885b8 diff --git a/gestion_donnees.py b/gestion_donnees.py index 5876c5a..137849d 100644 --- a/gestion_donnees.py +++ b/gestion_donnees.py @@ -46,7 +46,7 @@ def convertit_jours_vers_python(chaine,liste_err): chainenombre = "" elif lettre != ' ': # autre caractère : bizarre ? - warning("convertit_jour_vers_python : caractère invalide : "+lettre,liste_err) + warning("problème à la conversion de "+chaine+". Caractère invalide : "+lettre,liste_err) # à la fin s'il reste qqch on le garde dans les jours if chainenombre != "": agejours += int(chainenombre) @@ -130,8 +130,12 @@ def convertit_donnee_vers_python(chaine,typedonnee,liste_err): def convertit_date_vers_python(chaine,liste_err): """ prend une chaine comme renvoyée par un champ de formulaire date aaaa-mm-jj et en fait une date python - renvoie "" si ne marche pas""" - liste = chaine.split("-") + renvoie "" si ne marche pas. + Si jamais la date est au format avec des / ça devrait passer aussi.""" + if "/" in chaine: + liste = chaine.split("/") + else: + liste = chaine.split("-") if len(liste) != 3: warning("La date : "+chaine+" est invalide !",liste_err) return "" @@ -150,8 +154,8 @@ def convertit_date_vers_texte(date): if date == "": return "" else: - return (str(date.year)+"-"+str(date.month)+"-"+str(date.day)) - + #return (str(date.year)+"-"+str(date.month)+"-"+str(date.day)) + return str(date) def delta_date(date1,datenaissance): """ renvoie le nombre de jours (entier) entre date1 et datenaissance format "datetime" @@ -164,11 +168,12 @@ def delta_date(date1,datenaissance): return jours + ################### On regroupe tout ce qui gère les données en une fonction def web_vers_python(data,liste_err, court=False): """ prend en argument le dictionnaire de requête et renvoie la config, et les - tableaux de donnée + tableaux de données court : si True est précisé, on ne met que le nom dans la config (enfant additionnel)""" @@ -383,8 +388,8 @@ def gere_donnees(data,naissance,typedonnee,liste_err): i = 0 # On va chercher si y'a des données à donnee_i - while typedonnee+"_"+str(i) in data.keys(): - if data[typedonnee+"_"+str(i)] != "": + while "age_"+str(i) in data.keys(): + if data.get(typedonnee+"_"+str(i), "") != "": # si la donne de ce type existe donnee = convertit_donnee_vers_python(data[typedonnee+"_"+str(i)],typedonnee,liste_err) age = data.get("age_"+str(i),"") if age !="": @@ -417,6 +422,7 @@ def gere_donnees(data,naissance,typedonnee,liste_err): def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config): """ retourne le json à renvoyer""" gros_dico = copy.deepcopy(config) + gros_dico["version"] = CONFIG["version"] l_jours2 = [convertit_age_vers_texte(d) for d in l_jours] l_jourst2 = [convertit_age_vers_texte(d) for d in l_jourst] gros_dico["data_j"] = l_jours2 @@ -426,6 +432,13 @@ def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config): # gérer la date de naissance if gros_dico.get("naissance","") != "": gros_dico["naissance"] = convertit_date_vers_texte(gros_dico["naissance"]) + # Calcul de toutes les dates de données + l_dates_poids = [convertit_date_vers_texte( config["naissance"] + datetime.timedelta(days=jours) ) for jours in l_jours] + l_dates_taille = [convertit_date_vers_texte( config["naissance"] + datetime.timedelta(days=jours) ) for jours in l_jourst] + gros_dico["data_dates_poids"]= l_dates_poids + gros_dico["data_dates_taille"] = l_dates_taille + + # gérer l'age maxi gros_dico["maxi"] = convertit_age_vers_texte(gros_dico["maxi"]) # gérer les couleurs @@ -438,11 +451,12 @@ def donnees_vers_json(l_jours,l_poids,l_jourst,l_taille,config): return json.dumps(gros_dico, indent=2,ensure_ascii=False ) -def fusionne_donnees(listes_jours,listes_donnees): +def fusionne_donnees(listes_jours,listes_donnees, listes_dates): """ prend en argument deux dicos de listes. Chaque liste de jours est associée à une liste de données (par la même clé de type de données). Il faut les fusionner pour avoir une liste de dictionnaires, de type - ("age":truc, "donnee1":truc, "donnee2":truc, ...) triée par ordre de jours. Si jamais une des données est vide, - le champ du dictionnaire n'est pas rempli""" + {"age":truc, "donnee1":truc, "donnee2":truc, ...} triée par ordre de jours. Si jamais une des données est vide, + le champ du dictionnaire n'est pas rempli + Le troisième paquet de listes (les dates) peut être vide ou bien simiaire : même clés.""" def fini(lj): """ teste si les listes sont toutes vides """ @@ -468,11 +482,18 @@ def fusionne_donnees(listes_jours,listes_donnees): # On extrait les données dans les deux listes (jours et données) jour = listes_jours[typedonnee].pop(0) donnee = listes_donnees[typedonnee].pop(0) + if liste_f == [] or jour != liste_f[-1]["age"]: # Si le jour est un "nouveau" jour liste_f.append({"age":jour}) - # On met à jour l'élément + # On met à jour l'élément (ou on l'ajoute) liste_f[-1][typedonnee] = donnee + # Si il y a une date associée, on la met ! + if listes_dates[typedonnee] != []: + date = listes_dates[typedonnee].pop(0) + liste_f[-1]["date"] = convertit_date_vers_texte(date) + + return liste_f @@ -492,16 +513,20 @@ def fichier_json_vers_configdonnees(chaine,liste_err): listes_jours = {} listes_donnees = {} + listes_dates = {} for typed in CONFIG["liste_typedonnees"]: if typed == "poids": # pour la rétrocompatibilité listes_jours[typed] = valform.get("data_j",[]) listes_donnees[typed] = valform.get("data_p",[]) + listes_dates[typed] = valform.get("data_dates_"+typed,[]) else: listes_jours[typed] = valform.get("data_jours_"+typed,[]) listes_donnees[typed] = valform.get("data_"+typed,[]) + listes_dates[typed] = valform.get("data_dates_"+typed,[]) + debug("Avant fusion : listes jours "+str(listes_jours),liste_err) - liste_donnees = fusionne_donnees(listes_jours,listes_donnees) + liste_donnees = fusionne_donnees(listes_jours,listes_donnees, listes_dates) debug("Fusion de listes ok. Liste moche : "+str(liste_donnees),liste_err) for i in range(len(liste_donnees)): for (cle,val) in liste_donnees[i].items(): @@ -520,6 +545,7 @@ def eclate_donnees_additionnelles(conf, ljours, ldonnees, symb, couleur): symb est le symbole choisi pour cette courbe additionnelle (déjà vérifié) On fabrique un joli dictionnaire typed -> (conf lj, ldonnee) avec le nom de l'enfant, et les données pour chaque typed""" + print("test conf avant "+str(ldonnees)+str(ljours)) retour = {} conf["symbole"] = symb # On ajoute le symbole additionnel @@ -527,4 +553,5 @@ def eclate_donnees_additionnelles(conf, ljours, ldonnees, symb, couleur): for typed in CONFIG["liste_typedonnees"]: retour[typed] = (conf, ljours[typed], ldonnees[typed]) + print("test "+str(retour)) return retour \ No newline at end of file