Quellcode durchsuchen

Added exporter and 4 strategies for it including abstract base strategy

Vsevolod Levitan vor 1 Jahr
Ursprung
Commit
2f8e0d1268

+ 31 - 0
src/export/exporter.py

@@ -0,0 +1,31 @@
+from src.models.abstract_reference import abstract_reference
+from src.export.strategies.export import export
+from src.validation.validator import validator
+from src.storage.storage import storage
+
+
+class exporter:
+    """Класс для экспорта данных моделей"""
+
+    # Валидатор
+    __vtor = validator()
+
+    def __init__(self, strategy: export):
+        self.__vtor.check_type(strategy, export)
+        self.__strat = strategy
+
+    def export_models(self, models: list[abstract_reference]) -> str:
+        """Экспортировать модели"""
+        self.__vtor.check_collection_types_all(models, abstract_reference)
+        res = self.__strat.export_header(models[0])
+        for model in models:
+            res += f"\n{self.__strat.export_model(model)}"
+
+        return res
+
+    def export_by_key(self, key):
+        """Экспортировать модели из storage по ключу"""
+
+        models = storage().data[key]
+
+        return self.export_models(models)

+ 36 - 0
src/export/strategies/csv_export.py

@@ -0,0 +1,36 @@
+from src.export.strategies.export import export
+from src.models.abstract_reference import abstract_reference
+
+
+class csv_export(export):
+    """Класс стратегии для экспорта в CSV"""
+
+    # Singleton
+    def __new__(cls):
+        if not hasattr(cls, "instance"):
+            cls.instance = super(csv_export, cls).__new__(cls)
+        return cls.instance
+
+    def export_header(self, model: abstract_reference):
+        """
+            Создать заголовок экспорта
+        Args:
+            model (abstract_reference): модель, по которой нужно построить заголовок
+        """
+
+        return ",".join(super().get_properties(model).keys())
+
+    def export_model(self, model: abstract_reference):
+        """
+            Экспортировать модель
+        Args:
+            model (abstract_reference): модель, строку с которой нужно создать
+        """
+
+        properties = super().get_properties(model)
+        res = ""
+        for property in properties.keys():
+            val = properties[property]
+            res += str(val) + ","
+
+        return res[:-1]

+ 39 - 0
src/export/strategies/export.py

@@ -0,0 +1,39 @@
+from src.models.abstract_reference import abstract_reference
+
+
+class export:
+    """Базовый класс стратегии экспорта"""
+
+    # Singleton
+    def __new__(cls):
+        if not hasattr(cls, "instance"):
+            cls.instance = super(export, cls).__new__(cls)
+        return cls.instance
+
+    def get_properties(self, model: abstract_reference):
+        properties = {}
+        for name in dir(model.__class__):
+            if name == "error":
+                continue
+            attr = getattr(model.__class__, name)
+            if isinstance(attr, property):
+                properties[name] = attr.fget(model)
+        return properties
+
+    def export_header(model: abstract_reference):
+        """
+            Создать заголовок экспорта
+        Args:
+            model (abstract_reference): модель, по которой нужно построить заголовок
+        """
+
+        pass
+
+    def export_model(model: abstract_reference):
+        """
+            Экспортировать модель
+        Args:
+            model (abstract_reference): модель, строку с которой нужно создать
+        """
+
+        pass

+ 28 - 0
src/export/strategies/json_export.py

@@ -0,0 +1,28 @@
+from src.export.strategies.export import export
+from src.models.abstract_reference import abstract_reference
+
+
+class json_export(export):
+    """Класс стратегии для экспорта в JSON"""
+
+    # Singleton
+    def __new__(cls):
+        if not hasattr(cls, "instance"):
+            cls.instance = super(json_export, cls).__new__(cls)
+        return cls.instance
+
+    def export_header(model: abstract_reference):
+        """
+            Создать заголовок экспорта
+        Args:
+            model (abstract_reference): модель, по которой нужно построить заголовок
+        """
+        pass
+
+    def export_model(model: abstract_reference):
+        """
+            Экспортировать модель
+        Args:
+            model (abstract_reference): модель, строку с которой нужно создать
+        """
+        pass

+ 28 - 0
src/export/strategies/xml_export.py

@@ -0,0 +1,28 @@
+from src.export.strategies.export import export
+from src.models.abstract_reference import abstract_reference
+
+
+class xml_export(export):
+    """Класс стратегии для экспорта в XML"""
+
+    # Singleton
+    def __new__(cls):
+        if not hasattr(cls, "instance"):
+            cls.instance = super(xml_export, cls).__new__(cls)
+        return cls.instance
+
+    def export_header(model: abstract_reference):
+        """
+            Создать заголовок экспорта
+        Args:
+            model (abstract_reference): модель, по которой нужно построить заголовок
+        """
+        pass
+
+    def export_model(model: abstract_reference):
+        """
+            Экспортировать модель
+        Args:
+            model (abstract_reference): модель, строку с которой нужно создать
+        """
+        pass