''' @author: olivier.massot, févr. 2018 ''' import logging logger = logging.getLogger("model") class Model(): """ Modèle de données d'un objet """ _FIELDS = [] def __init__(self): """ Génère un objet vide, les propriétés de l'objet sont générées automatiquement à partir de la variable de classe _FIELDS""" for fld in self._FIELDS: setattr(self, fld, None) def __repr__(self): return "<{} => {}>".format(self.__class__.__name__, ",".join(["{}={}".format(field, getattr(self, field)) for field in self._FIELDS])) @classmethod def from_dict(cls, data): """ Retourne un objet à partir d'un dictionnaire de données """ facture = cls() for key, value in data.items(): setattr(facture, key, value) return facture def to_csv(self): """ Renvoie une chaine de caractère correspondant aux données de l'objet au format CSV Séparateur = tabulation (car c'est un caractère interdit dans Access) """ return "\t".join([str(getattr(self, field)).replace("\t", " ") for field in self._FIELDS] + ["\n"]) @classmethod def from_csv(cls, line): """ Retourne un objet Facture à partir d'une ligne de texte au format CSV Séparateur = tabulation (car c'est un caractère interdit dans Access) """ return cls.from_dict(dict(zip(cls._FIELDS, line.split("\t")))) def dump(self, path): """ Ajoute les données du modèle au format CSV dans le fichier spécifié en paramètre. Créé le fichier s'il n'existe pas, avec une ligne d'en-tête """ if not path.exists(): logger.debug("Génère le fichier %s", path) firstline = "\t".join(self._FIELDS + ["\n"]) with open(path, 'w+') as f: f.write(firstline) with open(path, 'a') as f: f.write(self.to_csv())