From 76b5d6bf028389be2e9ac421478b868c4f5e7899 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Sun, 8 Sep 2019 01:12:33 +0200 Subject: Serializer: concat media.zip in main archive - fix restore order (importer before conf) --- ishtar_common/serializers.py | 59 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 11 deletions(-) (limited to 'ishtar_common/serializers.py') 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: -- cgit v1.2.3