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