diff options
Diffstat (limited to 'ishtar_common/models_imports.py')
-rw-r--r-- | ishtar_common/models_imports.py | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index 175d2f25b..0157b33ee 100644 --- a/ishtar_common/models_imports.py +++ b/ishtar_common/models_imports.py @@ -3115,6 +3115,19 @@ class MediaExporter(models.Model): return True return False + def _get_down_objects(self, obj_list): + if not obj_list: + return [] + down = [] + for o in obj_list: + if o.SLUG == "basefind": + attrs = ["find"] + else: + attrs = getattr(o, "DOWN_MODEL_UPDATE", []) + for attr in attrs: + down += list(getattr(o, attr).all()) + return down + def export(self, obj, tmpdir=None): if not tmpdir: tmpdir = tempfile.mkdtemp() @@ -3138,7 +3151,26 @@ class MediaExporter(models.Model): media_attrs.append("associated_file") archive_path = os.path.join(tmpdir, "archive") os.mkdir(archive_path) - for idx, document in enumerate(obj.documents.filter(q).all()): + items = [obj] + if self.cascade: + down = self._get_down_objects([obj]) + items += down + while down: + down = self._get_down_objects(down) + items += down + counters = {} + for item in items: + if not hasattr(item, "documents"): + continue + self._copy_media(item, q, media_attrs, counters, archive_path) + now = datetime.datetime.now() + archive_name = os.path.join(tmpdir, f"media-{now.strftime('%Y-%m-%d-%H%M%S')}") + shutil.make_archive(archive_name, "zip", archive_path) + return archive_name + ".zip" + + def _copy_media(self, item, q, media_attrs, counters, archive_path): + item_type = item.SLUG + for idx, document in enumerate(item.documents.filter(q).all()): for media_attr in media_attrs: media = getattr(document, media_attr) if not media or not media.path or not os.path.exists(media.path): @@ -3150,12 +3182,12 @@ class MediaExporter(models.Model): name = base_name else: if media_attr == "associated_file": - name = "file" + name = f"{item_type}_file" else: - name = "image" - name += f"_{idx + 1:05d}.{ext}" + name = f"{item_type}_image" + key = (item_type, media_attr) + if key not in counters: + counters[key] = 0 + counters[key] += 1 + name += f"_{idx + counters[key]:05d}.{ext}" shutil.copy(media.path, os.path.join(archive_path, name)) - now = datetime.datetime.now() - archive_name = os.path.join(tmpdir, f"media-{now.strftime('%Y-%m-%d-%H%M%S')}") - shutil.make_archive(archive_name, "zip", archive_path) - return archive_name + ".zip" |