model.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. '''
  2. @author: olivier.massot, févr. 2018
  3. '''
  4. import logging
  5. logger = logging.getLogger("model")
  6. class Model():
  7. """ Modèle de données d'un objet """
  8. def __repr__(self):
  9. return "<{} => {}>".format(self.__class__.__name__, ",".join(["{}={}".format(field, getattr(self, field)) for field in self.__dict__]))
  10. class CsvModel(Model):
  11. """ Modèle de données d'un objet à stocker au format CSV """
  12. _FIELDS = []
  13. def __init__(self):
  14. """ Génère un objet vide,
  15. les propriétés de l'objet sont générées automatiquement à partir de la variable de classe _FIELDS"""
  16. for fld in self._FIELDS:
  17. setattr(self, fld, None)
  18. @classmethod
  19. def from_dict(cls, data):
  20. """ Retourne un objet à partir d'un dictionnaire de données """
  21. facture = cls()
  22. for key, value in data.items():
  23. setattr(facture, key, value)
  24. return facture
  25. def to_csv(self):
  26. """ Renvoie une chaine de caractère correspondant aux données de l'objet au format CSV
  27. Séparateur = tabulation (car c'est un caractère interdit dans Access) """
  28. return "\t".join([str(getattr(self, field)).replace("\t", " ") for field in self._FIELDS] + ["\n"])
  29. @classmethod
  30. def from_csv(cls, line):
  31. """ Retourne un objet Facture à partir d'une ligne de texte au format CSV
  32. Séparateur = tabulation (car c'est un caractère interdit dans Access) """
  33. return cls.from_dict(dict(zip(cls._FIELDS, line.split("\t"))))
  34. def dump(self, path):
  35. """ Ajoute les données du modèle au format CSV dans le fichier spécifié en paramètre.
  36. Créé le fichier s'il n'existe pas, avec une ligne d'en-tête """
  37. if not path.exists():
  38. logger.debug("Génère le fichier %s", path)
  39. firstline = "\t".join(self._FIELDS + ["\n"])
  40. with open(path, 'w+') as f:
  41. f.write(firstline)
  42. with open(path, 'a') as f:
  43. f.write(self.to_csv())