csv_exporter.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. class csv_exporter:
  2. def __init__(self, separator=",", line_separator="\n"):
  3. self.__separator = separator
  4. self.__line_separator = line_separator
  5. def __retrieve_properties(self, model):
  6. properties = [
  7. attr for attr in dir(model) if hasattr(getattr(model, attr), "csv_export")
  8. ]
  9. csv_data = []
  10. for prop in properties:
  11. value = prop()
  12. header = prop(True)
  13. csv_data.append((header, value))
  14. return csv_data
  15. def generate_line(self, model):
  16. """
  17. Сгенерировать строку CSV-файла для модели
  18. Args:
  19. model (any): модель, для которой нужно сгенерировать CSV строку
  20. Returns:
  21. (str) строка CSV файла
  22. Raises:
  23. argument_exception
  24. TODO
  25. """
  26. props = list(self.__retrieve_properties(model))
  27. return self.__separator.join([prop[1] for prop in props])
  28. def generate_header(self, model):
  29. """
  30. Сгенерировать заголовок CSV-файла для модели
  31. Args:
  32. model (any): модель, для которой нужно сгенерировать CSV заголовок
  33. Returns:
  34. (str) заголовок CSV файла
  35. Raises:
  36. argument_exception
  37. TODO
  38. """
  39. props = list(self.__retrieve_properties(model))
  40. return self.__separator.join([prop[0] for prop in props])
  41. def generate_csv_content(self, models: list):
  42. """
  43. Сгенерировать содержимое CSV файла для списка моделей
  44. Args:
  45. models (list): список моделей, которые нужно включить в CSV-файл
  46. Returns:
  47. (str) содержимое CSV файла
  48. Raises:
  49. argument_exception
  50. TODO
  51. """
  52. lines = []
  53. lines.append(self.generate_header(models[0]))
  54. for model in models:
  55. lines.append(self.generate_line(model))
  56. return self.__line_separator.join(lines)
  57. def export_to_file(self, models: list, path: str):
  58. """
  59. Сгенерировать CSV и экспортировать в файл
  60. Args:
  61. models (list): список моделей, которые нужно включить в CSV-файл
  62. Returns:
  63. (bool) результат сохранения
  64. Raises:
  65. file_exception
  66. argument_exception
  67. TODO
  68. """
  69. with open(path, "w", encoding="UTF-8") as file:
  70. file.write(self.generate_header(models[0]))
  71. for model in models:
  72. file.write(self.__line_separator + self.generate_line(model))
  73. return True