diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-07-25 20:26:21 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-07-25 20:26:21 +0200 |
commit | bb8a2d51376614f163b0aaf729f2fddc3b41d8ad (patch) | |
tree | 487321e3273f26860c591841b47a206a5e855d65 /ishtar_common/serializers_utils.py | |
parent | 329e60a808267eb89fea5008e7f4ce1a9a79ed6f (diff) | |
download | Ishtar-bb8a2d51376614f163b0aaf729f2fddc3b41d8ad.tar.bz2 Ishtar-bb8a2d51376614f163b0aaf729f2fddc3b41d8ad.zip |
Admin: Import/export as JSON for types and importers
Diffstat (limited to 'ishtar_common/serializers_utils.py')
-rw-r--r-- | ishtar_common/serializers_utils.py | 47 |
1 files changed, 41 insertions, 6 deletions
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"): |