This commit is contained in:
Michael 2018-09-10 13:41:55 +00:00 committed by GitHub
commit e24d5c3faf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 0 deletions

View File

@ -263,6 +263,7 @@ class CreateOnlyDefault(object):
def set_context(self, serializer_field): def set_context(self, serializer_field):
self.is_update = serializer_field.parent.instance is not None self.is_update = serializer_field.parent.instance is not None
if callable(self.default) and hasattr(self.default, 'set_context') and not self.is_update: if callable(self.default) and hasattr(self.default, 'set_context') and not self.is_update:
self.default = copy.deepcopy(self.default)
self.default.set_context(serializer_field) self.default.set_context(serializer_field)
def __call__(self): def __call__(self):
@ -487,6 +488,7 @@ class Field(object):
raise SkipField() raise SkipField()
if callable(self.default): if callable(self.default):
if hasattr(self.default, 'set_context'): if hasattr(self.default, 'set_context'):
self.default = copy.deepcopy(self.default)
self.default.set_context(self) self.default.set_context(self)
return self.default() return self.default()
return self.default return self.default
@ -544,6 +546,7 @@ class Field(object):
errors = [] errors = []
for validator in self.validators: for validator in self.validators:
if hasattr(validator, 'set_context'): if hasattr(validator, 'set_context'):
validator = copy.deepcopy(validator)
validator.set_context(self) validator.set_context(self)
try: try:

View File

@ -365,6 +365,28 @@ class TestUniquenessTogetherValidation(TestCase):
validator.filter_queryset(attrs=data, queryset=queryset) validator.filter_queryset(attrs=data, queryset=queryset)
assert queryset.called_with == {'race_name': 'bar', 'position': 1} assert queryset.called_with == {'race_name': 'bar', 'position': 1}
def test_validator_instances_with_context_are_not_used_twice(self):
"""
Every instance of a serializer should use unique instances of validators
when calling `set_context`.
"""
def data():
return {'race_name': 'example', 'position': 3}
def check_validators(serializer):
for validator in serializer.validators:
assert not hasattr(validator, 'instance')
serializer = UniquenessTogetherSerializer(self.instance, data=data())
check_validators(serializer)
serializer.run_validators({})
check_validators(serializer)
another_serializer = UniquenessTogetherSerializer(data=data())
check_validators(another_serializer)
another_serializer.run_validators(data())
check_validators(another_serializer)
# Tests for `UniqueForDateValidator` # Tests for `UniqueForDateValidator`
# ---------------------------------- # ----------------------------------