Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: issues with filer image crash when trying to generate thumbnail #1384

Merged
merged 11 commits into from
Jul 12, 2023
13 changes: 9 additions & 4 deletions filer/admin/fileadmin.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from django import forms
from django.contrib.admin.utils import unquote
from django.contrib.staticfiles.storage import staticfiles_storage
from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.urls import path, reverse
from django.utils.safestring import mark_safe
from django.utils.translation import gettext as _

from easy_thumbnails.exceptions import InvalidImageFormatError
from easy_thumbnails.files import get_thumbnailer
from easy_thumbnails.options import ThumbnailOptions

Expand Down Expand Up @@ -174,10 +176,13 @@ def icon_view(self, request, file_id: int, size: int) -> HttpResponse:
if not isinstance(file, BaseImage):
raise Http404()

thumbnailer = get_thumbnailer(file)
thumbnail_options = ThumbnailOptions({'size': (size, size), "crop": True})
thumbnail = thumbnailer.get_thumbnail(thumbnail_options, generate=True)
return HttpResponseRedirect(thumbnail.url)
try:
thumbnailer = get_thumbnailer(file)
thumbnail_options = ThumbnailOptions({'size': (size, size), "crop": True})
thumbnail = thumbnailer.get_thumbnail(thumbnail_options, generate=True)
return HttpResponseRedirect(thumbnail.url)
except InvalidImageFormatError:
return HttpResponseRedirect(staticfiles_storage.url('filer/icons/file-missing.svg'))


FileAdmin.fieldsets = FileAdmin.build_fieldsets()
43 changes: 42 additions & 1 deletion tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
from filer.models.filemodels import File
from filer.models.foldermodels import Folder, FolderPermission
from filer.models.virtualitems import FolderRoot
from filer.settings import FILER_IMAGE_MODEL
from filer.settings import DEFERRED_THUMBNAIL_SIZES, FILER_IMAGE_MODEL
from filer.templatetags.filer_admin_tags import file_icon_url
from filer.thumbnail_processors import normalize_subject_location
from filer.utils.loader import load_model
Expand Down Expand Up @@ -254,9 +254,50 @@
def setUp(self):
self.superuser = create_superuser()
self.client.login(username='admin', password='secret')
self.img = create_image()
self.image_name = 'test_file.jpg'
self.filename = os.path.join(settings.FILE_UPLOAD_TEMP_DIR, self.image_name)
self.img.save(self.filename, 'JPEG')
self.file_object = Image.objects.create(
file=django.core.files.File(open(self.filename, 'rb'), name=self.image_name)
Fixed Show fixed Hide fixed
)

def tearDown(self):
self.client.logout()
os.remove(self.filename)

def test_icon_view_sizes(self):
"""Tests if redirects are issued for accepted thumbnail sizes and 404 otherwise"""
test_set = tuple((size, 302) for size in DEFERRED_THUMBNAIL_SIZES)
test_set += (50, 404), (90, 404), (320, 404)
for size, expected_status in test_set:
url = reverse('admin:filer_file_fileicon', kwargs={
'file_id': self.file_object.pk,
'size': size,
})
response = self.client.get(url)
self.assertEqual(response.status_code, expected_status)
if response.status_code == 302: # redirect
# Redirects to a media file
self.assertIn("/media/", response["Location"])
# Does not redirect to a static file
self.assertNotIn("/static/", response["Location"])

def test_missing_file(self):
image = Image.objects.create(
owner=self.superuser,
original_filename="some-image.jpg",
)
url = reverse('admin:filer_file_fileicon', kwargs={
'file_id': image.pk,
'size': 80,
})
# Make file unaccessible

response = self.client.get(url)

self.assertEqual(response.status_code, 302)
self.assertIn("icons/file-missing.svg", response["Location"])


class FilerClipboardAdminUrlsTests(TestCase):
Expand Down
4 changes: 2 additions & 2 deletions tests/test_validation.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import os

import django.core
from django.apps import apps
from django.conf import settings
import django.core
from django.test import TestCase
from django.urls import reverse
from django.utils.crypto import get_random_string

from filer.models import File, Folder
from filer.validation import validate_upload, FileValidationError
from filer.validation import FileValidationError, validate_upload
from tests.helpers import create_superuser


Expand Down