kopia lustrzana https://github.com/wagtail/wagtail
				
				
				
			
							rodzic
							
								
									de1af00ba8
								
							
						
					
					
						commit
						32822a90ee
					
				| 
						 | 
					@ -4,6 +4,7 @@ Changelog
 | 
				
			||||||
5.0 (xx.xx.xxxx) - IN DEVELOPMENT
 | 
					5.0 (xx.xx.xxxx) - IN DEVELOPMENT
 | 
				
			||||||
~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 * Add `WAGTAILIMAGES_EXTENSIONS` setting to restrict image uploads to specific file types (Aman Pandey, Ananjan-R)
 | 
				
			||||||
 * Docs: Add code block to make it easier to understand contribution docs (Suyash Singh)
 | 
					 * Docs: Add code block to make it easier to understand contribution docs (Suyash Singh)
 | 
				
			||||||
 * Maintenance: Update djhtml (html formatting) library to v 1.5.2 (Loveth Omokaro)
 | 
					 * Maintenance: Update djhtml (html formatting) library to v 1.5.2 (Loveth Omokaro)
 | 
				
			||||||
 * Maintenance: Re-enable `strictPropertyInitialization` in tsconfig (Thibaud Colas)
 | 
					 * Maintenance: Re-enable `strictPropertyInitialization` in tsconfig (Thibaud Colas)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -360,6 +360,17 @@ This setting allows image renditions to be stored using an alternative storage b
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Custom storage classes should subclass `django.core.files.storage.Storage`. See the {doc}`Django file storage API <django:ref/files/storage>`.
 | 
					Custom storage classes should subclass `django.core.files.storage.Storage`. See the {doc}`Django file storage API <django:ref/files/storage>`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### `WAGTAILIMAGES_EXTENSIONS`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```python
 | 
				
			||||||
 | 
					WAGTAILIMAGES_EXTENSIONS = ['png', 'jpg']
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A list of allowed image extensions that will be validated during image uploading.
 | 
				
			||||||
 | 
					If this isn't supplied, all of GIF, JPG, JPEG, PNG, WEBP are allowed.
 | 
				
			||||||
 | 
					Warning: this doesn't always ensure that the uploaded file is valid as files can
 | 
				
			||||||
 | 
					be renamed to have an extension no matter what data they contain.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Documents
 | 
					## Documents
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### `WAGTAILDOCS_DOCUMENT_MODEL`
 | 
					### `WAGTAILDOCS_DOCUMENT_MODEL`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,7 @@ depth: 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Other features
 | 
					### Other features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 * ...
 | 
					 * Add `WAGTAILIMAGES_EXTENSIONS` setting to restrict image uploads to specific file types (Aman Pandey, Ananjan-R)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Bug fixes
 | 
					### Bug fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,6 @@ from django.template.defaultfilters import filesizeformat
 | 
				
			||||||
from django.utils.translation import gettext_lazy as _
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ALLOWED_EXTENSIONS = ["gif", "jpg", "jpeg", "png", "webp"]
 | 
					ALLOWED_EXTENSIONS = ["gif", "jpg", "jpeg", "png", "webp"]
 | 
				
			||||||
SUPPORTED_FORMATS_TEXT = _("GIF, JPEG, PNG, WEBP")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class WagtailImageField(ImageField):
 | 
					class WagtailImageField(ImageField):
 | 
				
			||||||
| 
						 | 
					@ -28,17 +27,23 @@ class WagtailImageField(ImageField):
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        self.max_upload_size_text = filesizeformat(self.max_upload_size)
 | 
					        self.max_upload_size_text = filesizeformat(self.max_upload_size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.allowed_image_extensions = getattr(
 | 
				
			||||||
 | 
					            settings, "WAGTAILIMAGES_EXTENSIONS", ALLOWED_EXTENSIONS
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.supported_formats_text = ", ".join(self.allowed_image_extensions).upper()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Help text
 | 
					        # Help text
 | 
				
			||||||
        if self.max_upload_size is not None:
 | 
					        if self.max_upload_size is not None:
 | 
				
			||||||
            self.help_text = _(
 | 
					            self.help_text = _(
 | 
				
			||||||
                "Supported formats: %(supported_formats)s. Maximum filesize: %(max_upload_size)s."
 | 
					                "Supported formats: %(supported_formats)s. Maximum filesize: %(max_upload_size)s."
 | 
				
			||||||
            ) % {
 | 
					            ) % {
 | 
				
			||||||
                "supported_formats": SUPPORTED_FORMATS_TEXT,
 | 
					                "supported_formats": self.supported_formats_text,
 | 
				
			||||||
                "max_upload_size": self.max_upload_size_text,
 | 
					                "max_upload_size": self.max_upload_size_text,
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            self.help_text = _("Supported formats: %(supported_formats)s.") % {
 | 
					            self.help_text = _("Supported formats: %(supported_formats)s.") % {
 | 
				
			||||||
                "supported_formats": SUPPORTED_FORMATS_TEXT,
 | 
					                "supported_formats": self.supported_formats_text,
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Error messages
 | 
					        # Error messages
 | 
				
			||||||
| 
						 | 
					@ -46,7 +51,7 @@ class WagtailImageField(ImageField):
 | 
				
			||||||
        # either right now if all values are known, otherwise when used.
 | 
					        # either right now if all values are known, otherwise when used.
 | 
				
			||||||
        self.error_messages["invalid_image_extension"] = _(
 | 
					        self.error_messages["invalid_image_extension"] = _(
 | 
				
			||||||
            "Not a supported image format. Supported formats: %(supported_formats)s."
 | 
					            "Not a supported image format. Supported formats: %(supported_formats)s."
 | 
				
			||||||
        ) % {"supported_formats": SUPPORTED_FORMATS_TEXT}
 | 
					        ) % {"supported_formats": self.supported_formats_text}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.error_messages["invalid_image_known_format"] = _(
 | 
					        self.error_messages["invalid_image_known_format"] = _(
 | 
				
			||||||
            "Not a valid .%(extension)s image. The extension does not match the file format (%(image_format)s)"
 | 
					            "Not a valid .%(extension)s image. The extension does not match the file format (%(image_format)s)"
 | 
				
			||||||
| 
						 | 
					@ -68,7 +73,7 @@ class WagtailImageField(ImageField):
 | 
				
			||||||
        # Check file extension
 | 
					        # Check file extension
 | 
				
			||||||
        extension = os.path.splitext(f.name)[1].lower()[1:]
 | 
					        extension = os.path.splitext(f.name)[1].lower()[1:]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if extension not in ALLOWED_EXTENSIONS:
 | 
					        if extension not in self.allowed_image_extensions:
 | 
				
			||||||
            raise ValidationError(
 | 
					            raise ValidationError(
 | 
				
			||||||
                self.error_messages["invalid_image_extension"],
 | 
					                self.error_messages["invalid_image_extension"],
 | 
				
			||||||
                code="invalid_image_extension",
 | 
					                code="invalid_image_extension",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1882,7 +1882,7 @@ class TestImageChooserUploadView(TestCase, WagtailTestUtils):
 | 
				
			||||||
            response,
 | 
					            response,
 | 
				
			||||||
            "form",
 | 
					            "form",
 | 
				
			||||||
            "file",
 | 
					            "file",
 | 
				
			||||||
            "Not a supported image format. Supported formats: GIF, JPEG, PNG, WEBP.",
 | 
					            "Not a supported image format. Supported formats: GIF, JPG, JPEG, PNG, WEBP.",
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # the action URL of the re-rendered form should include the select_format=true parameter
 | 
					        # the action URL of the re-rendered form should include the select_format=true parameter
 | 
				
			||||||
| 
						 | 
					@ -2238,6 +2238,7 @@ class TestMultipleImageUploader(TestCase, WagtailTestUtils):
 | 
				
			||||||
            "Upload a valid image. The file you uploaded was either not an image or a corrupted image.",
 | 
					            "Upload a valid image. The file you uploaded was either not an image or a corrupted image.",
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @override_settings(WAGTAILIMAGES_EXTENSIONS=["jpg", "gif"])
 | 
				
			||||||
    def test_add_post_bad_extension(self):
 | 
					    def test_add_post_bad_extension(self):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        The add view must check that the uploaded file extension is a valid
 | 
					        The add view must check that the uploaded file extension is a valid
 | 
				
			||||||
| 
						 | 
					@ -2251,6 +2252,14 @@ class TestMultipleImageUploader(TestCase, WagtailTestUtils):
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        post_with_invalid_extension = self.client.post(
 | 
				
			||||||
 | 
					            reverse("wagtailimages:add_multiple"),
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                "files[]": SimpleUploadedFile(
 | 
				
			||||||
 | 
					                    "test.png", get_test_image_file().file.getvalue()
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
        # Check response
 | 
					        # Check response
 | 
				
			||||||
        self.assertEqual(response.status_code, 200)
 | 
					        self.assertEqual(response.status_code, 200)
 | 
				
			||||||
        self.assertEqual(response["Content-Type"], "application/json")
 | 
					        self.assertEqual(response["Content-Type"], "application/json")
 | 
				
			||||||
| 
						 | 
					@ -2264,7 +2273,25 @@ class TestMultipleImageUploader(TestCase, WagtailTestUtils):
 | 
				
			||||||
        self.assertFalse(response_json["success"])
 | 
					        self.assertFalse(response_json["success"])
 | 
				
			||||||
        self.assertEqual(
 | 
					        self.assertEqual(
 | 
				
			||||||
            response_json["error_message"],
 | 
					            response_json["error_message"],
 | 
				
			||||||
            "Not a supported image format. Supported formats: GIF, JPEG, PNG, WEBP.",
 | 
					            "Not a supported image format. Supported formats: JPG, GIF.",
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Check post_with_invalid_extension
 | 
				
			||||||
 | 
					        self.assertEqual(post_with_invalid_extension.status_code, 200)
 | 
				
			||||||
 | 
					        self.assertEqual(
 | 
				
			||||||
 | 
					            post_with_invalid_extension["Content-Type"], "application/json"
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Check JSON
 | 
				
			||||||
 | 
					        response_json = json.loads(post_with_invalid_extension.content.decode())
 | 
				
			||||||
 | 
					        self.assertNotIn("image_id", response_json)
 | 
				
			||||||
 | 
					        self.assertNotIn("form", response_json)
 | 
				
			||||||
 | 
					        self.assertIn("success", response_json)
 | 
				
			||||||
 | 
					        self.assertIn("error_message", response_json)
 | 
				
			||||||
 | 
					        self.assertFalse(response_json["success"])
 | 
				
			||||||
 | 
					        self.assertEqual(
 | 
				
			||||||
 | 
					            response_json["error_message"],
 | 
				
			||||||
 | 
					            "Not a supported image format. Supported formats: JPG, GIF.",
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_add_post_duplicate(self):
 | 
					    def test_add_post_duplicate(self):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,7 +48,7 @@ class TestImage(TestCase):
 | 
				
			||||||
        self.assertTrue(self.image.is_landscape())
 | 
					        self.assertTrue(self.image.is_landscape())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_get_rect(self):
 | 
					    def test_get_rect(self):
 | 
				
			||||||
        self.assertTrue(self.image.get_rect(), Rect(0, 0, 640, 480))
 | 
					        self.assertEqual(self.image.get_rect(), Rect(0, 0, 640, 480))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_get_focal_point(self):
 | 
					    def test_get_focal_point(self):
 | 
				
			||||||
        self.assertIsNone(self.image.get_focal_point())
 | 
					        self.assertIsNone(self.image.get_focal_point())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Ładowanie…
	
		Reference in New Issue