Change ImageField validation pattern, use validators from DjangoImageField (#5539)

This commit is contained in:
Sergei Azarkin 2017-11-06 13:14:37 +03:00 committed by Carlton Gibson
parent 0552810410
commit d49d796c85
2 changed files with 17 additions and 8 deletions

View File

@ -1553,8 +1553,7 @@ class ImageField(FileField):
file_object = super(ImageField, self).to_internal_value(data) file_object = super(ImageField, self).to_internal_value(data)
django_field = self._DjangoImageField() django_field = self._DjangoImageField()
django_field.error_messages = self.error_messages django_field.error_messages = self.error_messages
django_field.to_python(file_object) return django_field.clean(file_object)
return file_object
# Composite field types... # Composite field types...

View File

@ -14,7 +14,7 @@ from django.utils.timezone import activate, deactivate, utc
import rest_framework import rest_framework
from rest_framework import compat, serializers from rest_framework import compat, serializers
from rest_framework.fields import is_simple_callable from rest_framework.fields import DjangoImageField, is_simple_callable
try: try:
import pytz import pytz
@ -1714,15 +1714,24 @@ class TestFieldFieldWithName(FieldValues):
field = serializers.FileField(use_url=False) 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* # Stub out mock Django `forms.ImageField` class so we don't *actually*
# call into it's regular validation, or require PIL for testing. # 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): def to_python(self, value):
return value
class FailImageValidation(PassImageValidation):
def to_python(self, value):
if value.name == 'badimage.png':
raise serializers.ValidationError(self.error_messages['invalid_image']) raise serializers.ValidationError(self.error_messages['invalid_image'])
class PassImageValidation(object):
def to_python(self, value):
return value return value
@ -1732,7 +1741,8 @@ class TestInvalidImageField(FieldValues):
""" """
valid_inputs = {} valid_inputs = {}
invalid_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 = {} outputs = {}
field = serializers.ImageField(_DjangoImageField=FailImageValidation) field = serializers.ImageField(_DjangoImageField=FailImageValidation)
@ -1743,7 +1753,7 @@ class TestValidImageField(FieldValues):
Values for an valid `ImageField`. Values for an valid `ImageField`.
""" """
valid_inputs = [ 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 = {} invalid_inputs = {}
outputs = {} outputs = {}