From fc0e811f9f5042fe72b91db4548142f5f2d4e1df Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 17 Jun 2025 18:06:46 +0200 Subject: ✨ Media exporter: export action MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ishtar_common/models_imports.py | 47 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'ishtar_common/models_imports.py') diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index 3d4bf632b..175d2f25b 100644 --- a/ishtar_common/models_imports.py +++ b/ishtar_common/models_imports.py @@ -3042,6 +3042,8 @@ class MediaExporter(models.Model): ) files_to_export = models.CharField(_("Files to export"), max_length=1, choices=MEDIA_EXPORT_TYPES, default="I") + thumbnail_for_images = models.BooleanField(_("Use thumbnails for images"), + default=False) cascade = models.BooleanField( _("Cascade export"), default=False, @@ -3112,3 +3114,48 @@ class MediaExporter(models.Model): user_profiles__person__ishtaruser__pk=user_id).exists(): return True return False + + def export(self, obj, tmpdir=None): + if not tmpdir: + tmpdir = tempfile.mkdtemp() + if not hasattr(obj, "documents"): + # database inconstency - should not occur + return + q = None + media_attrs = [] + if self.files_to_export in ("A", "I"): + q = Q(image__isnull=False) + if self.thumbnail_for_images: + media_attrs = ["thumbnail"] + else: + media_attrs = ["image"] + if self.files_to_export in ("A", "F"): + q2 = Q(associated_file__isnull=False) + if q: + q |= q2 + else: + q = q2 + 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()): + 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): + continue + base_name = media.path.split(os.path.sep)[-1] + ext = base_name.split(".")[-1] + if self.naming: + # TODO: naming + name = base_name + else: + if media_attr == "associated_file": + name = "file" + else: + name = "image" + name += f"_{idx + 1: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" -- cgit v1.2.3