#!/usr/bin/env python3 # -*- coding: utf-8 -*- from configuration import * from gestion_erreurs import * import datetime ############ 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. 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 """ chainenombre = "" agejours = 0. for lettre in chaine: if lettre.isdigit(): chainenombre += lettre 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 chainenombre = "" elif lettre == 'm' or lettre == 'M': # On a trouvé le mois agejours += int(chainenombre)*jours_dans_mois chainenombre = "" elif lettre == 's' or lettre == 'S': # la semaine agejours += int(chainenombre)*jours_dans_semaine chainenombre = "" elif lettre == 'j' or lettre == 'J': # On a trouvé le jour agejours += int(chainenombre) chainenombre = "" elif lettre != ' ': # autre caractère : bizarre ? 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) if agejours<0: warning("L'âge est négatif !",liste_err) agejours = 0 return round(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""" 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) chaine = "" if annees >0: chaine += str(annees)+"a" if mois >0: chaine += str(mois)+"m" if jours>0 or nombre ==0: # si c'est la naissance, faut beien écrire 0j quand même chaine += str(jours)+"j" return chaine ########################## def convertit_poids_vers_python(chaine,liste_err): """ convertit une chaine vers un float qui est le poids. On gère notamment la virgule, et on enlève les espaces Un poids invalide -> on renvoie 0 avec un warning""" chaine2 = chaine.replace(",",".") chaine2 = chaine2.replace(" ","") try: poids = float(chaine) except: warning("Poids impossible à lire : "+chaine,liste_err) poids = 0 if not( 0 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) configuration["largeur"] = largeur hauteur = data.get("hauteur") if hauteur == "": hauteur = hauteur_graphique 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) configuration["hauteur"] = hauteur # existence et position de la légende legende = data.get("legende","") if legende =="": legende = "non" elif legende=="on": legende = "oui" else: legende = "oui" configuration["legende"] = legende positionlegende = data.get("positionlegende","") if not(positionlegende in ['upper left','upper right','lower left','lower right']): positionlegende = "upper left" configuration["positionlegende"] = positionlegende 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): """ prend en argument le dictionnaire de requête, et la date de naissance (éventuellement vide) et construit les deux listes l_jours et l_poids""" # On construit la liste des couples liste_donnees = [] i = 0 # On va chercher si y'a des données à poids_i while "poids_"+str(i) in data.keys(): if data["poids_"+str(i)] != "": poids = convertit_poids_vers_python(data["poids_"+str(i)],liste_err) age = data.get("age_"+str(i),"") if age !="": age = convertit_jours_vers_python(age,liste_err) liste_donnees.append((age,poids)) else: date = data.get("date_"+str(i),"") datep = convertit_date_vers_python(date,liste_err) # on vérifie la date if naissance == "": 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) elif datep != "": # la date est valide et on a une date de naissance age = delta_date(datep,naissance) liste_donnees.append((age,poids)) i+=1 # Trier la liste liste_donnees.sort(key=lambda x : x[0]) # splitter la liste l_jours = [x[0] for x in liste_donnees] l_poids = [x[1] for x in liste_donnees] return (l_jours,l_poids) 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 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 """ 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) #le nb max du formulaire valform["nb_data"] = indice_formulaire +2 return valform