From ad7274ff90e66fb4aa6ae0ba889b70f81b6ae6c3 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Wed, 27 Nov 2019 16:47:24 +0100
Subject: [PATCH] Fix #976: fix cover attachment migration under S3

---
 .../migrations/0043_album_cover_attachment.py | 29 ++++++++++++-------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/api/funkwhale_api/music/migrations/0043_album_cover_attachment.py b/api/funkwhale_api/music/migrations/0043_album_cover_attachment.py
index 17eda6b72..441d308d9 100644
--- a/api/funkwhale_api/music/migrations/0043_album_cover_attachment.py
+++ b/api/funkwhale_api/music/migrations/0043_album_cover_attachment.py
@@ -13,17 +13,24 @@ def create_attachments(apps, schema_editor):
         if path.lower().endswith('.png'):
             return "image/png"
         return "image/jpeg"
-
-    for album in Album.objects.filter(attachment_cover=None).exclude(cover="").exclude(cover=None):
-        try:
-            album_attachment_mapping[album] = Attachment(
-                file=album.cover,
-                size=album.cover.size,
-                mimetype=get_mimetype(album.cover.path),
-            )
-        except FileNotFoundError:
-            print('Skipping missing cover file {}'.format(album.cover.path))
-
+    qs = Album.objects.filter(attachment_cover=None).exclude(cover="").exclude(cover=None)
+    total = qs.count()
+    print('Creating attachments for {} album covers, this may take a while…'.format(total))
+    from django.core.files.storage import FileSystemStorage
+    for i, album in enumerate(qs):
+        if isinstance(album.cover.storage._wrapped, FileSystemStorage):
+            try:
+                size = album.cover.size
+            except FileNotFoundError:
+                # can occur when file isn't found on disk or S3
+                print("  Warning: cover file wasn't found in storage: {}".format(e.__class__))
+                size = None
+        album_attachment_mapping[album] = Attachment(
+            file=album.cover,
+            size=None,
+            mimetype=get_mimetype(album.cover.name),
+        )
+    print('Commiting changes…')
     Attachment.objects.bulk_create(album_attachment_mapping.values(), batch_size=2000)
     # map each attachment to the corresponding album
     # and bulk save
-- 
GitLab