Merge pull request #3364 from linovia/bug/3361

Don't pass `allow_empty` to `ListSerializer`'s children.
This commit is contained in:
Tom Christie 2015-09-09 09:28:25 +01:00
commit a985fc521f
2 changed files with 52 additions and 5 deletions

View File

@ -113,8 +113,13 @@ class BaseSerializer(Field):
kwargs['child'] = cls() kwargs['child'] = cls()
return CustomListSerializer(*args, **kwargs) return CustomListSerializer(*args, **kwargs)
""" """
allow_empty = kwargs.pop('allow_empty', None)
child_serializer = cls(*args, **kwargs) child_serializer = cls(*args, **kwargs)
list_kwargs = {'child': child_serializer} list_kwargs = {
'child': child_serializer,
}
if allow_empty is not None:
list_kwargs['allow_empty'] = allow_empty
list_kwargs.update(dict([ list_kwargs.update(dict([
(key, value) for key, value in kwargs.items() (key, value) for key, value in kwargs.items()
if key in LIST_SERIALIZER_KWARGS if key in LIST_SERIALIZER_KWARGS

View File

@ -79,17 +79,23 @@ class TestNestedSerializerWithMany:
class TestSerializer(serializers.Serializer): class TestSerializer(serializers.Serializer):
allow_null = NestedSerializer(many=True, allow_null=True) allow_null = NestedSerializer(many=True, allow_null=True)
not_allow_null = NestedSerializer(many=True) not_allow_null = NestedSerializer(many=True)
allow_empty = NestedSerializer(many=True, allow_empty=True)
not_allow_empty = NestedSerializer(many=True, allow_empty=False)
self.Serializer = TestSerializer self.Serializer = TestSerializer
def test_null_allowed_if_allow_null_is_set(self): def test_null_allowed_if_allow_null_is_set(self):
input_data = { input_data = {
'allow_null': None, 'allow_null': None,
'not_allow_null': [{'example': '2'}, {'example': '3'}] 'not_allow_null': [{'example': '2'}, {'example': '3'}],
'allow_empty': [{'example': '2'}],
'not_allow_empty': [{'example': '2'}],
} }
expected_data = { expected_data = {
'allow_null': None, 'allow_null': None,
'not_allow_null': [{'example': 2}, {'example': 3}] 'not_allow_null': [{'example': 2}, {'example': 3}],
'allow_empty': [{'example': 2}],
'not_allow_empty': [{'example': 2}],
} }
serializer = self.Serializer(data=input_data) serializer = self.Serializer(data=input_data)
@ -99,7 +105,9 @@ class TestNestedSerializerWithMany:
def test_null_is_not_allowed_if_allow_null_is_not_set(self): def test_null_is_not_allowed_if_allow_null_is_not_set(self):
input_data = { input_data = {
'allow_null': None, 'allow_null': None,
'not_allow_null': None 'not_allow_null': None,
'allow_empty': [{'example': '2'}],
'not_allow_empty': [{'example': '2'}],
} }
serializer = self.Serializer(data=input_data) serializer = self.Serializer(data=input_data)
@ -118,10 +126,44 @@ class TestNestedSerializerWithMany:
input_data = { input_data = {
'allow_null': None, 'allow_null': None,
'not_allow_null': [{'example': 2}] 'not_allow_null': [{'example': 2}],
'allow_empty': [{'example': 2}],
'not_allow_empty': [{'example': 2}],
} }
serializer = TestSerializer(data=input_data) serializer = TestSerializer(data=input_data)
assert serializer.is_valid() assert serializer.is_valid()
assert serializer.validated_data == input_data assert serializer.validated_data == input_data
assert TestSerializer.validation_was_run assert TestSerializer.validation_was_run
def test_empty_allowed_if_allow_empty_is_set(self):
input_data = {
'allow_null': [{'example': '2'}],
'not_allow_null': [{'example': '2'}],
'allow_empty': [],
'not_allow_empty': [{'example': '2'}],
}
expected_data = {
'allow_null': [{'example': 2}],
'not_allow_null': [{'example': 2}],
'allow_empty': [],
'not_allow_empty': [{'example': 2}],
}
serializer = self.Serializer(data=input_data)
assert serializer.is_valid(), serializer.errors
assert serializer.validated_data == expected_data
def test_empty_not_allowed_if_allow_empty_is_set_to_false(self):
input_data = {
'allow_null': [{'example': '2'}],
'not_allow_null': [{'example': '2'}],
'allow_empty': [],
'not_allow_empty': [],
}
serializer = self.Serializer(data=input_data)
assert not serializer.is_valid()
expected_errors = {'not_allow_empty': {'non_field_errors': [serializers.ListSerializer.default_error_messages['empty']]}}
assert serializer.errors == expected_errors