diff --git a/wagtail/images/fields.py b/wagtail/images/fields.py index e9492567f..2c4919ea1 100644 --- a/wagtail/images/fields.py +++ b/wagtail/images/fields.py @@ -7,8 +7,8 @@ from django.forms.fields import ImageField from django.template.defaultfilters import filesizeformat from django.utils.translation import ugettext_lazy as _ -ALLOWED_EXTENSIONS = ['gif', 'jpg', 'jpeg', 'png'] -SUPPORTED_FORMATS_TEXT = _("GIF, JPEG, PNG") +ALLOWED_EXTENSIONS = ['gif', 'jpg', 'jpeg', 'png', 'webp'] +SUPPORTED_FORMATS_TEXT = _("GIF, JPEG, PNG, WEBP") class WagtailImageField(ImageField): diff --git a/wagtail/images/models.py b/wagtail/images/models.py index e07973005..424786e21 100644 --- a/wagtail/images/models.py +++ b/wagtail/images/models.py @@ -297,6 +297,7 @@ class AbstractImage(CollectionMember, index.Indexed, models.Model): 'jpeg': '.jpg', 'png': '.png', 'gif': '.gif', + 'webp': '.webp', } output_extension = filter.spec.replace('|', '.') + FORMAT_EXTENSIONS[generated_image.format_name] @@ -414,6 +415,10 @@ class Filter: if original_format == 'gif' and not willow.has_animation(): output_format = 'png' + # Convert WEBP files to PNG + if original_format == 'webp': + output_format = 'png' + if output_format == 'jpeg': # Allow changing of JPEG compression quality if 'jpeg-quality' in env: @@ -432,6 +437,8 @@ class Filter: return willow.save_as_png(output, optimize=True) elif output_format == 'gif': return willow.save_as_gif(output) + elif output_format == 'webp': + return willow.save_as_webp(output) def get_cache_key(self, image): vary_parts = [] diff --git a/wagtail/images/tests/test_admin_views.py b/wagtail/images/tests/test_admin_views.py index 1248339c0..e7d088a23 100644 --- a/wagtail/images/tests/test_admin_views.py +++ b/wagtail/images/tests/test_admin_views.py @@ -853,7 +853,7 @@ class TestImageChooserUploadView(TestCase, WagtailTestUtils): self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'wagtailimages/chooser/chooser.html') - self.assertFormError(response, 'uploadform', 'file', "Not a supported image format. Supported formats: GIF, JPEG, PNG.") + self.assertFormError(response, 'uploadform', 'file', "Not a supported image format. Supported formats: GIF, JPEG, PNG, WEBP.") # the action URL of the re-rendered form should include the select_format=true parameter # (NB the HTML in the response is embedded in a JS string, so need to escape accordingly) @@ -1050,7 +1050,7 @@ class TestMultipleImageUploader(TestCase, WagtailTestUtils): self.assertIn('error_message', response_json) self.assertFalse(response_json['success']) self.assertEqual( - response_json['error_message'], "Not a supported image format. Supported formats: GIF, JPEG, PNG." + response_json['error_message'], "Not a supported image format. Supported formats: GIF, JPEG, PNG, WEBP." ) def test_edit_get(self):