123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- 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
|