diff options
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"): | 
