|
@@ -0,0 +1,87 @@
|
|
|
+class csv_exporter:
|
|
|
+ def __init__(self, separator=",", line_separator="\n"):
|
|
|
+ self.__separator = separator
|
|
|
+ self.__line_separator = line_separator
|
|
|
+
|
|
|
+ def __retrieve_properties(self, model):
|
|
|
+ properties = [
|
|
|
+ attr for attr in dir(model) if hasattr(getattr(model, attr), "csv_export")
|
|
|
+ ]
|
|
|
+ csv_data = []
|
|
|
+ for prop in properties:
|
|
|
+ value = prop()
|
|
|
+ header = prop(True)
|
|
|
+ csv_data.append((header, value))
|
|
|
+ return csv_data
|
|
|
+
|
|
|
+ def generate_line(self, model):
|
|
|
+ """
|
|
|
+ Сгенерировать строку CSV-файла для модели
|
|
|
+ Args:
|
|
|
+ model (any): модель, для которой нужно сгенерировать CSV строку
|
|
|
+ Returns:
|
|
|
+ (str) строка CSV файла
|
|
|
+ Raises:
|
|
|
+ argument_exception
|
|
|
+ TODO
|
|
|
+ """
|
|
|
+
|
|
|
+ props = list(self.__retrieve_properties(model))
|
|
|
+ return self.__separator.join([prop[1] for prop in props])
|
|
|
+
|
|
|
+ def generate_header(self, model):
|
|
|
+ """
|
|
|
+ Сгенерировать заголовок CSV-файла для модели
|
|
|
+ Args:
|
|
|
+ model (any): модель, для которой нужно сгенерировать CSV заголовок
|
|
|
+ Returns:
|
|
|
+ (str) заголовок CSV файла
|
|
|
+ Raises:
|
|
|
+ argument_exception
|
|
|
+ TODO
|
|
|
+ """
|
|
|
+
|
|
|
+ props = list(self.__retrieve_properties(model))
|
|
|
+ return self.__separator.join([prop[0] for prop in props])
|
|
|
+
|
|
|
+ def generate_csv_content(self, models: list):
|
|
|
+ """
|
|
|
+ Сгенерировать содержимое CSV файла для списка моделей
|
|
|
+ Args:
|
|
|
+ models (list): список моделей, которые нужно включить в CSV-файл
|
|
|
+ Returns:
|
|
|
+ (str) содержимое CSV файла
|
|
|
+ Raises:
|
|
|
+ argument_exception
|
|
|
+ TODO
|
|
|
+ """
|
|
|
+
|
|
|
+ lines = []
|
|
|
+
|
|
|
+ lines.append(self.generate_header(models[0]))
|
|
|
+
|
|
|
+ for model in models:
|
|
|
+ lines.append(self.generate_line(model))
|
|
|
+
|
|
|
+ return self.__line_separator.join(lines)
|
|
|
+
|
|
|
+ def export_to_file(self, models: list, path: str):
|
|
|
+ """
|
|
|
+ Сгенерировать CSV и экспортировать в файл
|
|
|
+ Args:
|
|
|
+ models (list): список моделей, которые нужно включить в CSV-файл
|
|
|
+ Returns:
|
|
|
+ (bool) результат сохранения
|
|
|
+ Raises:
|
|
|
+ file_exception
|
|
|
+ argument_exception
|
|
|
+ TODO
|
|
|
+ """
|
|
|
+
|
|
|
+ with open(path, "w", encoding="UTF-8") as file:
|
|
|
+ file.write(self.generate_header(models[0]))
|
|
|
+
|
|
|
+ for model in models:
|
|
|
+ file.write(self.__line_separator + self.generate_line(model))
|
|
|
+
|
|
|
+ return True
|