From 311e8506f80490ef7a2d3db3ffa58ca829662f7b Mon Sep 17 00:00:00 2001 From: Sergei Azarkin Date: Fri, 27 Oct 2017 15:28:45 +0300 Subject: [PATCH] Change ImageField validation pattern, use validators from DjangoImageField --- rest_framework/fields.py | 3 +-- tests/test_fields.py | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 43fed9aee..f58e64841 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1540,8 +1540,7 @@ class ImageField(FileField): file_object = super(ImageField, self).to_internal_value(data) django_field = self._DjangoImageField() django_field.error_messages = self.error_messages - django_field.to_python(file_object) - return file_object + return django_field.clean(file_object) # Composite field types... diff --git a/tests/test_fields.py b/tests/test_fields.py index c1b99818a..41d736c9d 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -14,7 +14,7 @@ from django.utils.timezone import activate, deactivate, utc import rest_framework from rest_framework import compat, serializers -from rest_framework.fields import is_simple_callable +from rest_framework.fields import DjangoImageField, is_simple_callable try: import pytz @@ -1700,15 +1700,24 @@ class TestFieldFieldWithName(FieldValues): field = serializers.FileField(use_url=False) +def ext_validator(value): + if not value.name.endswith('.png'): + raise serializers.ValidationError('File extension is not allowed. Allowed extensions is png.') + + # Stub out mock Django `forms.ImageField` class so we don't *actually* # call into it's regular validation, or require PIL for testing. -class FailImageValidation(object): +class PassImageValidation(DjangoImageField): + default_validators = [ext_validator] + def to_python(self, value): - raise serializers.ValidationError(self.error_messages['invalid_image']) + return value -class PassImageValidation(object): +class FailImageValidation(PassImageValidation): def to_python(self, value): + if value.name == 'badimage.png': + raise serializers.ValidationError(self.error_messages['invalid_image']) return value @@ -1718,7 +1727,8 @@ class TestInvalidImageField(FieldValues): """ valid_inputs = {} invalid_inputs = [ - (MockFile(name='example.txt', size=10), ['Upload a valid image. The file you uploaded was either not an image or a corrupted image.']) + (MockFile(name='badimage.png', size=10), ['Upload a valid image. The file you uploaded was either not an image or a corrupted image.']), + (MockFile(name='goodimage.html', size=10), ['File extension is not allowed. Allowed extensions is png.']) ] outputs = {} field = serializers.ImageField(_DjangoImageField=FailImageValidation) @@ -1729,7 +1739,7 @@ class TestValidImageField(FieldValues): Values for an valid `ImageField`. """ valid_inputs = [ - (MockFile(name='example.txt', size=10), MockFile(name='example.txt', size=10)) + (MockFile(name='example.png', size=10), MockFile(name='example.png', size=10)) ] invalid_inputs = {} outputs = {}