From 1482be99ce249d01c8836b7f75b3a696974e8d2f Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Sat, 25 Jul 2020 20:26:21 +0200 Subject: Admin: Import/export as JSON for types and importers --- ishtar_common/serializers_utils.py | 47 +++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 6 deletions(-) (limited to 'ishtar_common/serializers_utils.py') diff --git a/ishtar_common/serializers_utils.py b/ishtar_common/serializers_utils.py index 74ffbe176..c03a55e35 100644 --- a/ishtar_common/serializers_utils.py +++ b/ishtar_common/serializers_utils.py @@ -9,6 +9,7 @@ from zipfile import ZipFile from django.contrib.sites.models import Site from django.core.serializers import serialize +from django.db.models import Q from ishtar_common.version import get_version from . import models @@ -19,7 +20,10 @@ SERIALIZATION_VERSION = "1.0" def get_model_from_filename(filename): filename = filename.split(".")[0] # remove extension - module_name, model_name = filename.split("__") + splitted = filename.split("__") + if len(splitted) != 2: + return + module_name, model_name = splitted if module_name == "django": if model_name in ("Group", "Permission"): module = importlib.import_module("django.contrib.auth.models") @@ -107,6 +111,21 @@ def archive_serialization(result, archive_dir=None, archive=False, return archive_name +GENERIC_QUERYSET_FILTER = { + "Regexp": {"ImporterType": 'columns__importer_type__pk__in'}, + "ImporterModel": {"ImporterType": ['importer_type_associated__pk__in', + 'importer_type_created__pk__in']}, + "ValueFormater": {"ImporterType": 'columns__importer_type__pk__in'}, + "ImporterColumn": {"ImporterType": 'importer_type__pk__in'}, + "ImporterDefault": {"ImporterType": 'importer_type__pk__in'}, + "ImportTarget": {"ImporterType": 'column__importer_type__pk__in'}, + "FormaterType": {"ImporterType": 'targets__column__importer_type__pk__in'}, + "ImporterDefaultValues": { + "ImporterType": 'default_target__importer_type__pk__in'}, + "ImporterDuplicateField": {"ImporterType": 'column__importer_type__pk__in'}, +} + + def generic_get_results(model_list, dirname, no_geo=True, result_queryset=None, serialization_include=None): result = OrderedDict() @@ -114,11 +133,27 @@ def generic_get_results(model_list, dirname, no_geo=True, base_model_name = model.__name__ model_name = str(model.__module__).split(".")[0] + "__" + \ base_model_name - - if result_queryset and base_model_name in result_queryset: - base_q = result_queryset[base_model_name] - else: - base_q = model.objects + base_q = model.objects + if result_queryset: + if result_queryset and base_model_name in result_queryset: + base_q = result_queryset[base_model_name] + elif base_model_name in GENERIC_QUERYSET_FILTER: + alt_filter = GENERIC_QUERYSET_FILTER[base_model_name] + for k in alt_filter: + if k in result_queryset: + terms = alt_filter[k] + if not isinstance(terms, (list, tuple)): + terms = [terms] + ids = [r["pk"] + for r in result_queryset[k].values("pk").all()] + q = None + for term in terms: + if not q: + q = Q(**{term: ids}) + else: + q |= Q(**{term: ids}) + base_q = base_q.filter(q) + break q = base_q recursion = None if hasattr(model, "parent"): -- cgit v1.2.3