Handle date placeholders in error messages too.

Signed-off-by: James Tanner <tanner.jc@gmail.com>
This commit is contained in:
James Tanner 2024-03-19 15:51:09 -04:00
parent 570e127bad
commit f1c615ecd6
No known key found for this signature in database
GPG Key ID: EB4645E850012701
2 changed files with 12 additions and 4 deletions

View File

@ -149,7 +149,7 @@ class ValidationError(APIException):
status_code = status.HTTP_400_BAD_REQUEST
default_detail = _('Invalid input.')
default_code = 'invalid'
default_params = SafeReplacerDict()
default_params = {}
def __init__(self, detail=None, code=None, params=None):
if detail is None:
@ -162,7 +162,7 @@ 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, str):
detail = [detail % params]
detail = [self.template_detail(detail, params)]
elif isinstance(detail, ValidationError):
detail = detail.detail
elif isinstance(detail, (list, tuple)):
@ -171,13 +171,22 @@ class ValidationError(APIException):
if isinstance(detail_item, ValidationError):
final_detail += detail_item.detail
else:
final_detail += [detail_item % params if isinstance(detail_item, str) else detail_item]
final_detail += [self.template_detail(detail_item, params) if isinstance(detail_item, str) else detail_item]
detail = final_detail
elif not isinstance(detail, dict) and not isinstance(detail, list):
detail = [detail]
self.detail = _get_error_details(detail, code)
def template_detail(self, detail, params):
"""Handle error messages with templates and placeholders."""
try:
return detail % params
except KeyError:
return detail
except ValueError:
return detail
class ParseError(APIException):
status_code = status.HTTP_400_BAD_REQUEST

View File

@ -164,7 +164,6 @@ class TestValidationErrorWithDjangoStyle(TestCase):
params={'value3': '44'}
)
assert isinstance(error.detail, list)
import pdb; pdb.set_trace()
assert len(error.detail) == 3
assert str(error.detail[0]) == 'Invalid value: 42'
assert str(error.detail[1]) == 'Invalid value: 43'