model.py 1.9 KB

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