summaryrefslogtreecommitdiff
path: root/ishtar_common/serializers.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-09-08 01:12:33 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-09-08 01:13:44 +0200
commit76b5d6bf028389be2e9ac421478b868c4f5e7899 (patch)
tree1f31c31260464801cc42222289ceb3eaa8a6f6f9 /ishtar_common/serializers.py
parent2e8c185916cd352427f59b250279f511348da84f (diff)
downloadIshtar-76b5d6bf028389be2e9ac421478b868c4f5e7899.tar.bz2
Ishtar-76b5d6bf028389be2e9ac421478b868c4f5e7899.zip
Serializer: concat media.zip in main archive - fix restore order (importer before conf)
Diffstat (limited to 'ishtar_common/serializers.py')
-rw-r--r--ishtar_common/serializers.py59
1 files changed, 48 insertions, 11 deletions
diff --git a/ishtar_common/serializers.py b/ishtar_common/serializers.py
index 7e61df517..1b18ccab5 100644
--- a/ishtar_common/serializers.py
+++ b/ishtar_common/serializers.py
@@ -174,36 +174,73 @@ def document_serialization(archive=False, return_empty_types=False,
return_empty_types=return_empty_types, archive_name=archive_name)
if not media_archive:
return full_archive
- with ZipFile(full_archive, 'a') as current_zip:
- current_zip.write(media_archive, arcname="media.zip")
+
+ has_media = "media.zip" in ZipFile(full_archive, 'r').namelist()
+ if not has_media:
+ with ZipFile(full_archive, 'a') as current_zip:
+ current_zip.write(media_archive, arcname="media.zip")
+ os.remove(media_archive)
+ return full_archive
+
+ with tempfile.TemporaryDirectory() as tmp_dir_name:
+ # extract the current archive
+ current_zip = ZipFile(full_archive, 'r')
+ name_list = current_zip.namelist()
+ for name in name_list:
+ current_zip.extract(name, tmp_dir_name)
+ current_zip.close()
+
+ # extract the media and recreate a media.zip
+ old_media_archive = ZipFile(
+ os.path.join(tmp_dir_name, "media.zip"), "r")
+ with ZipFile(media_archive, "a") as new_zip:
+ for name in old_media_archive.namelist():
+ new_zip.writestr(
+ name, old_media_archive.open(name).read())
+
+ # rewrite the archive
+ with ZipFile(full_archive + "_new", "w") as new_zip:
+ for name in name_list:
+ if name == "media.zip":
+ continue
+ new_zip.write(os.path.join(tmp_dir_name, name), arcname=name)
+ new_zip.write(media_archive, arcname="media.zip")
+ os.remove(media_archive)
+ os.remove(full_archive)
+ os.rename(full_archive + "_new", full_archive)
return full_archive
def full_serialization(operation_queryset=None, site_queryset=None,
cr_queryset=None, find_queryset=None,
- warehouse_queryset=None):
- archive_name = type_serialization()
- conf_serialization(archive_name=archive_name)
- importer_serialization(archive_name=archive_name)
- geo_serialization(archive_name=archive_name)
- directory_serialization(archive_name=archive_name)
- document_serialization(archive_name=archive_name)
+ warehouse_queryset=None, archive=True):
+ archive_name = type_serialization(archive=archive)
+ conf_serialization(archive=archive, archive_name=archive_name)
+ importer_serialization(archive=archive, archive_name=archive_name)
+ geo_serialization(archive=archive, archive_name=archive_name)
+ directory_serialization(archive=archive, archive_name=archive_name)
+ document_serialization(archive=archive, archive_name=archive_name)
operation_serialization(
+ archive=archive,
archive_name=archive_name, operation_queryset=operation_queryset,
site_queryset=site_queryset, cr_queryset=cr_queryset,
find_queryset=find_queryset, warehouse_queryset=warehouse_queryset)
cr_serialization(
+ archive=archive,
archive_name=archive_name, operation_queryset=operation_queryset,
site_queryset=site_queryset, cr_queryset=cr_queryset,
find_queryset=find_queryset, warehouse_queryset=warehouse_queryset)
find_serialization(
+ archive=archive,
archive_name=archive_name, operation_queryset=operation_queryset,
site_queryset=site_queryset, cr_queryset=cr_queryset,
find_queryset=find_queryset, warehouse_queryset=warehouse_queryset)
warehouse_serialization(
+ archive=archive,
archive_name=archive_name, operation_queryset=operation_queryset,
site_queryset=site_queryset, cr_queryset=cr_queryset,
find_queryset=find_queryset, warehouse_queryset=warehouse_queryset)
+ return archive_name
def restore_serialized(archive_name, delete_existing=False):
@@ -218,15 +255,15 @@ def restore_serialized(archive_name, delete_existing=False):
DIRS = (
("types", [None]),
- ("common_configuration", CONF_MODEL_LIST),
("common_imports", IMPORT_MODEL_LIST),
+ ("common_configuration", CONF_MODEL_LIST),
("common_geo", GEO_MODEL_LIST),
("common_directory", DIRECTORY_MODEL_LIST),
("documents", [models.Document]),
("operations", OPERATION_MODEL_LIST),
("context_records", CR_MODEL_LIST),
- ("finds", FIND_MODEL_LIST),
("warehouse", WAREHOUSE_MODEL_LIST),
+ ("finds", FIND_MODEL_LIST),
)
namelist = zip_file.namelist()
for current_dir, model_list in DIRS: