summaryrefslogtreecommitdiff
path: root/ishtar_common/serializers.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-08-29 18:39:43 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-09-01 10:32:52 +0200
commit954951026722f59a7b9d988d8f01d34c2fb24096 (patch)
tree945ed8fb2ddd8c44632a561b7f36386dce19aa00 /ishtar_common/serializers.py
parent9666ede3c0f72fb1d8ccd38d3c957980b2f28efa (diff)
downloadIshtar-954951026722f59a7b9d988d8f01d34c2fb24096.tar.bz2
Ishtar-954951026722f59a7b9d988d8f01d34c2fb24096.zip
Restoration: restore types
Diffstat (limited to 'ishtar_common/serializers.py')
-rw-r--r--ishtar_common/serializers.py32
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()