From 7b42ec03a684abe90ac709c80eb9a1e8668a3844 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Thu, 29 Aug 2019 16:56:11 +0200 Subject: Restoration: check version --- ishtar_common/serializers.py | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) (limited to 'ishtar_common/serializers.py') diff --git a/ishtar_common/serializers.py b/ishtar_common/serializers.py index f71109374..6f3cf095d 100644 --- a/ishtar_common/serializers.py +++ b/ishtar_common/serializers.py @@ -1,7 +1,9 @@ import datetime import json +import importlib import os import tempfile +import zipfile from rest_framework import serializers from zipfile import ZipFile @@ -21,15 +23,22 @@ class PublicSerializer(serializers.BaseSerializer): SERIALIZATION_VERSION = "1.0" +def get_model_from_filename(filename): + filename = filename.split(".")[0] # remove extension + module_name, model_name = filename.split("__") + module = importlib.import_module(module_name + ".models") + return getattr(module, model_name) + + def serialization_info(): site = Site.objects.get_current() - return json.dumps({ + return { "serialize-version": SERIALIZATION_VERSION, "ishtar-version": get_version(), "domain": site.domain, "name": site.name, "date": datetime.datetime.now().isoformat() - }, indent=2) + } def type_serialization(archive=False, return_empty_types=False, @@ -76,7 +85,9 @@ def type_serialization(archive=False, return_empty_types=False, base_filename = "info.json" filename = tmpdirname + os.sep + base_filename with open(filename, "w") as json_file: - json_file.write(serialization_info()) + json_file.write( + json.dumps(serialization_info(), indent=2) + ) current_zip.write(filename, arcname=base_filename) for model_name in result: @@ -89,5 +100,21 @@ def type_serialization(archive=False, return_empty_types=False, return archive_name -def restore_serialized(archive_name): - pass +def restore_serialized(archive_name, delete_existing=False): + with zipfile.ZipFile(archive_name, "r") as zip_file: + # check version + info = json.loads(zip_file.read("info.json").decode("utf-8")) + if info["serialize-version"] != SERIALIZATION_VERSION: + raise ValueError( + "This dump version: {} is not managed by this Ishtar " + "installation".format(info["serialize-version"]) + ) + + # restore types + for json_filename in zip_file.namelist(): + 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.objects.all().delete() -- cgit v1.2.3