diff options
Diffstat (limited to 'ishtar_common/serializers.py')
-rw-r--r-- | ishtar_common/serializers.py | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/ishtar_common/serializers.py b/ishtar_common/serializers.py index 6f3cf095d..2069c7e38 100644 --- a/ishtar_common/serializers.py +++ b/ishtar_common/serializers.py @@ -9,7 +9,7 @@ from zipfile import ZipFile from django.apps import apps from django.contrib.sites.models import Site -from django.core.serializers import serialize +from django.core.serializers import deserialize, serialize from version import get_version from . import models @@ -62,11 +62,34 @@ def type_serialization(archive=False, return_empty_types=False, continue model_name = model.__name__ model_name = str(model.__module__).split(".")[0] + "__" + model_name + base_q = model.objects + q = base_q + recursion = None + if hasattr(model, "parent"): + recursion = "parent" + elif hasattr(model, "inverse_relation"): + recursion = "inverse_relation" + if recursion: + q = q.filter(**{recursion + "__isnull": True}) result[model_name] = serialize( - "json", model.objects.all(), + "json", q.all(), indent=2, use_natural_foreign_keys=True, use_natural_primary_keys=True ) + if recursion: + serialized = [item["id"] for item in q.values("id").all()] + q = base_q.filter(**{recursion + "_id__in": serialized} + ).exclude(id__in=serialized) + while q.count(): + v = serialize( + "json", q.all(), indent=2, use_natural_foreign_keys=True, + use_natural_primary_keys=True) + new_result = json.loads(result[model_name]) + new_result += json.loads(v) + result[model_name] = json.dumps(new_result, indent=2) + serialized += [item["id"] for item in q.values("id").all()] + q = base_q.filter(**{recursion + "_id__in": serialized} + ).exclude(id__in=serialized) if return_empty_types: return [k for k in result if not result[k]] if not archive: @@ -115,6 +138,9 @@ def restore_serialized(archive_name, delete_existing=False): path = json_filename.split(os.sep) if len(path) != 2 or path[0] != "types": continue - model = get_model_from_filename(path[-1]) if delete_existing: + model = get_model_from_filename(path[-1]) model.objects.all().delete() + data = zip_file.read(json_filename).decode("utf-8") + for obj in deserialize("json", data): + obj.save() |