mirror of
https://github.com/inventree/InvenTree.git
synced 2026-09-27 22:26:00 +00:00
[bug] Fix for Attachment thumbnail generation (#12902)
This commit is contained in:
@@ -2276,7 +2276,11 @@ class Attachment(
|
|||||||
img.save(thumb_io, format='PNG')
|
img.save(thumb_io, format='PNG')
|
||||||
thumb_io.seek(0)
|
thumb_io.seek(0)
|
||||||
|
|
||||||
thumb_name = f'thumb_{os.path.basename(self.attachment.name)}'
|
# Save the thumbnail alongside the original attachment file
|
||||||
|
attachment_dir = os.path.dirname(self.attachment.name)
|
||||||
|
thumb_name = os.path.join(
|
||||||
|
attachment_dir, f'thumb_{os.path.basename(self.attachment.name)}'
|
||||||
|
)
|
||||||
self.thumbnail.save(thumb_name, ContentFile(thumb_io.read()), save=False)
|
self.thumbnail.save(thumb_name, ContentFile(thumb_io.read()), save=False)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -228,6 +228,54 @@ class AttachmentTest(InvenTreeAPITestCase):
|
|||||||
self.assertIs(type(url), str)
|
self.assertIs(type(url), str)
|
||||||
self.assertIn(f'/media/attachments/part/{part.pk}/test', url)
|
self.assertIn(f'/media/attachments/part/{part.pk}/test', url)
|
||||||
|
|
||||||
|
def test_generate_thumbnail_location(self):
|
||||||
|
"""Test that a generated thumbnail is stored alongside its attachment file.
|
||||||
|
|
||||||
|
Regression test: thumbnails were previously saved to the top-level media
|
||||||
|
root, rather than in the same directory as the attachment they belong to.
|
||||||
|
"""
|
||||||
|
part = Part.objects.first()
|
||||||
|
|
||||||
|
# Build a minimal valid PNG in memory
|
||||||
|
img_obj = Image.new('RGB', (10, 10), color='blue')
|
||||||
|
with io.BytesIO() as buf:
|
||||||
|
img_obj.save(buf, format='PNG')
|
||||||
|
png_bytes = buf.getvalue()
|
||||||
|
|
||||||
|
attachment = Attachment.objects.create(
|
||||||
|
attachment=ContentFile(png_bytes, 'thumbnail_location.png'),
|
||||||
|
comment='Testing thumbnail location',
|
||||||
|
model_type='part',
|
||||||
|
model_id=part.pk,
|
||||||
|
)
|
||||||
|
|
||||||
|
# The 'create' call offloads a task which generates the thumbnail synchronously
|
||||||
|
# (as no worker is running in the test environment), on a *separate* model
|
||||||
|
# instance - refresh from the DB to pick up those changes
|
||||||
|
attachment.refresh_from_db()
|
||||||
|
|
||||||
|
self.assertTrue(attachment.is_image)
|
||||||
|
self.assertTrue(attachment.thumbnail)
|
||||||
|
self.assertTrue(default_storage.exists(attachment.thumbnail.name))
|
||||||
|
|
||||||
|
attachment_dir = os.path.dirname(attachment.attachment.name)
|
||||||
|
thumbnail_dir = os.path.dirname(attachment.thumbnail.name)
|
||||||
|
|
||||||
|
self.assertEqual(attachment_dir, thumbnail_dir)
|
||||||
|
self.assertEqual(
|
||||||
|
os.path.basename(attachment.thumbnail.name),
|
||||||
|
f'thumb_{os.path.basename(attachment.attachment.name)}',
|
||||||
|
)
|
||||||
|
|
||||||
|
# Cleanup uploaded files to prevent them sticking around
|
||||||
|
attachment_path = attachment.attachment.name
|
||||||
|
thumbnail_path = attachment.thumbnail.name
|
||||||
|
attachment.delete()
|
||||||
|
|
||||||
|
for path in (attachment_path, thumbnail_path):
|
||||||
|
if default_storage.exists(path):
|
||||||
|
default_storage.delete(path)
|
||||||
|
|
||||||
def test_str_representation(self):
|
def test_str_representation(self):
|
||||||
"""Test the __str__ method of the Attachment model.
|
"""Test the __str__ method of the Attachment model.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user