diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-06-17 18:06:46 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-06-17 18:06:46 +0200 |
commit | fc0e811f9f5042fe72b91db4548142f5f2d4e1df (patch) | |
tree | 30adfd1fabc9b9aec7003b71d723a800606b0dfa /ishtar_common/models_imports.py | |
parent | fb1046c52552461a2d8dd9db5f73747eb3da51e6 (diff) | |
download | Ishtar-fc0e811f9f5042fe72b91db4548142f5f2d4e1df.tar.bz2 Ishtar-fc0e811f9f5042fe72b91db4548142f5f2d4e1df.zip |
✨ Media exporter: export action
Diffstat (limited to 'ishtar_common/models_imports.py')
-rw-r--r-- | ishtar_common/models_imports.py | 47 |
1 files changed, 47 insertions, 0 deletions
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" |