This commit is contained in:
Anton Chasnyk 2021-08-10 14:05:52 +03:00
parent cdd53c7de9
commit 36bf34dd1b
2 changed files with 25 additions and 3 deletions

View File

@ -142,7 +142,7 @@ class ValidationError(APIException):
default_detail = _('Invalid input.')
default_code = 'invalid'
def __init__(self, detail=None, code=None):
def __init__(self, detail=None, code=None, params=None):
if detail is None:
detail = self.default_detail
if code is None:
@ -151,8 +151,17 @@ 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):
detail_list = list()
if params is not None:
for msg in detail:
detail_list.append(msg % params)
detail = detail_list
else:
detail = list(detail)
elif not isinstance(detail, dict) and not isinstance(detail, list):
if params is not None:
detail = [detail % params]
else:
detail = [detail]
self.detail = _get_error_details(detail, code)

View File

@ -109,3 +109,16 @@ class TestValidationErrorConvertsTuplesToLists(TestCase):
assert len(error.detail) == 2
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'})
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'