Fix image preview when Willow optimizers are enabled (#12047)

Avoids https://github.com/wagtail/Willow/issues/147
stable/5.2.x
Alex Tomkins 2024-06-13 13:51:07 +02:00 zatwierdzone przez Jake Howard
rodzic b82553a653
commit 67a968cb92
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 8198AEBFA7E86782
3 zmienionych plików z 45 dodań i 3 usunięć

Wyświetl plik

@ -1,6 +1,12 @@
Changelog
=========
5.2.6 (xx.xx.xxxx) - IN DEVELOPMENT
~~~~~~~~~~~~~~~~~~
* Fix: Fix image preview when Willow optimizers are enabled (Alex Tomkins)
5.2.5 (01.05.2024)
~~~~~~~~~~~~~~~~~~

Wyświetl plik

@ -1,6 +1,7 @@
import datetime
import json
import urllib
from unittest.mock import patch
from django.contrib.auth.models import Group, Permission
from django.core.files.uploadedfile import SimpleUploadedFile, TemporaryUploadedFile
@ -12,6 +13,8 @@ from django.utils.encoding import force_str
from django.utils.html import escape, escapejs
from django.utils.http import RFC3986_SUBDELIMS, urlencode
from django.utils.safestring import mark_safe
from willow.optimizers.base import OptimizerBase
from willow.registry import registry
from wagtail.admin.admin_url_finder import AdminURLFinder
from wagtail.images import get_image_model
@ -3434,6 +3437,35 @@ class TestPreviewView(WagtailTestUtils, TestCase):
self.assertEqual(response.status_code, 200)
self.assertEqual(response["Content-Type"], "image/png")
def test_preview_with_optimizer(self):
"""
Test that preview works with optimizers
Willow optimizers require
"""
class DummyOptimizer(OptimizerBase):
library_name = "dummy"
image_format = "png"
@classmethod
def check_library(cls):
return True
@classmethod
def process(cls, file_path: str):
pass
# Get the image
with patch.object(registry, "_registered_optimizers", [DummyOptimizer]):
response = self.client.get(
reverse("wagtailimages:preview", args=(self.image.id, "fill-800x600"))
)
# Check response
self.assertEqual(response.status_code, 200)
self.assertEqual(response["Content-Type"], "image/png")
def test_get_invalid_filter_spec(self):
"""
Test that an invalid filter spec returns a 400 response

Wyświetl plik

@ -1,9 +1,10 @@
import os
from tempfile import SpooledTemporaryFile
from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.core.paginator import InvalidPage, Paginator
from django.http import Http404, HttpResponse, JsonResponse
from django.http import FileResponse, Http404, HttpResponse, JsonResponse
from django.shortcuts import get_object_or_404, redirect
from django.template.response import TemplateResponse
from django.urls import reverse
@ -333,8 +334,11 @@ def preview(request, image_id, filter_spec):
image = get_object_or_404(get_image_model(), id=image_id)
try:
response = HttpResponse()
image = Filter(spec=filter_spec).run(image, response)
# Temporary image needs to be an instance that Willow can run optimizers on
temp_image = SpooledTemporaryFile(max_size=settings.FILE_UPLOAD_MAX_MEMORY_SIZE)
image = Filter(spec=filter_spec).run(image, temp_image)
temp_image.seek(0)
response = FileResponse(temp_image)
response["Content-Type"] = "image/" + image.format_name
return response
except InvalidFilterSpecError: