processing only str (#8077)

This commit is contained in:
Anton Chasnyk 2021-08-11 16:58:02 +03:00
parent 2aab63d7a5
commit bfe9448358
2 changed files with 11 additions and 8 deletions

View File

@ -153,10 +153,13 @@ class ValidationError(APIException):
# For validation failures, we may collect many errors together,
# so the details should always be coerced to a list if not already.
if isinstance(detail, tuple) or isinstance(detail, list):
detail = [msg % params for msg in detail]
elif not isinstance(detail, dict):
detail = [detail % params]
# For str or list of str add params
if isinstance(detail, str):
detail = [detail % params]
elif isinstance(detail, list) or isinstance(detail, tuple):
detail = [msg % params if isinstance(msg, str) else msg for msg in detail]
elif not isinstance(detail, dict) and not isinstance(detail, list):
detail = [detail]
self.detail = _get_error_details(detail, code)

View File

@ -110,21 +110,21 @@ class TestValidationErrorConvertsTuplesToLists(TestCase):
assert str(error.detail[0]) == 'message1'
assert str(error.detail[1]) == 'message2'
class TestvalidationErrorWithDjangoStyle(TestCase):
def test_validation_error_details(self):
error = ValidationError('Invalid value: %(value)s', params={'value': '42'})
s = str(error.detail)
assert str(error.detail[0]) == 'Invalid value: 42'
def test_validation_error_details_tuple(self):
error = ValidationError(detail=('Invalid value: %(value1)s', 'Invalid value: %(value2)s'), params={'value1': '42', 'value2':'43'})
error = ValidationError(detail=('Invalid value: %(value1)s', 'Invalid value: %(value2)s'), params={'value1': '42', 'value2': '43'})
assert isinstance(error.detail, list)
assert len(error.detail) == 2
assert str(error.detail[0]) == 'Invalid value: 42'
assert str(error.detail[1]) == 'Invalid value: 43'
def test_validation_error_details_list(self):
error = ValidationError(detail=['Invalid value: %(value1)s', 'Invalid value: %(value2)s'], params={'value1': '42', 'value2':'43'})
error = ValidationError(detail=['Invalid value: %(value1)s', 'Invalid value: %(value2)s'], params={'value1': '42', 'value2': '43'})
assert isinstance(error.detail, list)
assert len(error.detail) == 2
assert str(error.detail[0]) == 'Invalid value: 42'