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