From 657523b9c93af3c779e4a789df8031580e4b40f3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micka=C3=ABl=20Desfr=C3=AAnes?=
 <mickael.desfrenes@unicaen.fr>
Date: Thu, 10 Apr 2025 15:10:20 +0200
Subject: [PATCH] add command to tile all images

---
 pount/apps/iiif/management/commands/__init__.py |  0
 .../apps/iiif/management/commands/ensureiiif.py | 17 +++++++++++++++++
 pount/apps/iiif/storage_backends.py             |  1 +
 pount/apps/iiif/tasks.py                        | 16 ++++++++++------
 4 files changed, 28 insertions(+), 6 deletions(-)
 create mode 100644 pount/apps/iiif/management/commands/__init__.py
 create mode 100644 pount/apps/iiif/management/commands/ensureiiif.py

diff --git a/pount/apps/iiif/management/commands/__init__.py b/pount/apps/iiif/management/commands/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/pount/apps/iiif/management/commands/ensureiiif.py b/pount/apps/iiif/management/commands/ensureiiif.py
new file mode 100644
index 00000000..51010075
--- /dev/null
+++ b/pount/apps/iiif/management/commands/ensureiiif.py
@@ -0,0 +1,17 @@
+import logging
+
+from django.core.management import BaseCommand
+
+logger = logging.getLogger(__file__)
+
+
+class Command(BaseCommand):
+    def handle(self, *args, **options):
+        """
+        Lancer les tuilages manquants sur les fichiers images pour IIIF
+        """
+        from pount.apps.api.models.item import MediaFile
+        from pount.apps.iiif.tasks import ensure_media_has_iiif
+
+        for f in MediaFile.objects.filter(component="Image"):
+            ensure_media_has_iiif.delay(f.id)
diff --git a/pount/apps/iiif/storage_backends.py b/pount/apps/iiif/storage_backends.py
index 3f45cafc..a0ebdbec 100644
--- a/pount/apps/iiif/storage_backends.py
+++ b/pount/apps/iiif/storage_backends.py
@@ -5,6 +5,7 @@ from pount.apps.api.storage_backends import MediaStorage
 
 class IIIFFileStorage(MediaStorage):
     location = str(settings.CANTALOUPE_S3SOURCE_BASICLOOKUPSTRATEGY_PATH_PREFIX).rstrip("/")
+    file_overwrite = False
 
     def get_default_settings(self):
         default_settings = super().get_default_settings()
diff --git a/pount/apps/iiif/tasks.py b/pount/apps/iiif/tasks.py
index 9bc95f5c..fafeffb5 100644
--- a/pount/apps/iiif/tasks.py
+++ b/pount/apps/iiif/tasks.py
@@ -48,18 +48,23 @@ def ensure_media_has_iiif(media_id: Union[str, UUID]) -> None:
     media_file: MediaFile = MediaFile.objects.filter(id=media_id).first()
 
     if not media_file:
-        logger.debug(f"no such media file: {media_id}")
+        logger.info(f"no such media file: {media_id}")
         return
 
     item_media_storage = ItemMediaFileStorage()
     full_name = item_mediafile_fullname(media_file.filename, media_file.item)
 
     if not item_media_storage.exists(full_name):
-        logger.debug(f"media file not on storage: {media_id} / {full_name}")
+        logger.info(f"media file not on storage: {media_id} / {full_name}")
         return
 
+    iiif_storage = IIIFFileStorage()
+    tiled_pic_name = f"{media_file.id}.tiled.tif"
+    if iiif_storage.exists(tiled_pic_name):
+        logger.info(f"Tiled file already exists: {tiled_pic_name}")
+        return
     with tempfile.TemporaryDirectory() as tmp_dirname:
-        logger.debug(f"Start tiling in {tmp_dirname}")
+        logger.info(f"Start tiling in {tmp_dirname}")
         response = requests.get(media_file.url, stream=True)
         if response.ok:
             tmp_file_name = Path(tmp_dirname, media_file.filename)
@@ -70,7 +75,6 @@ def ensure_media_has_iiif(media_id: Union[str, UUID]) -> None:
                         f.write(chunk)
             tiled_tif = f"{basename}.tiled.tif"
             pic_to_tiled_tiff(tmp_file_name, tiled_tif)
-            iiif_storage = IIIFFileStorage()
             with open(tiled_tif, "rb") as f:
-                iiif_storage.save(f"{media_file.id}.tiled.tif", f)
-                logger.debug(f"saved {tiled_tif}")
+                iiif_storage.save(tiled_pic_name, f)
+                logger.info(f"saved {tiled_tif}")
-- 
GitLab