123456789101112131415161718192021222324252627282930313233343536373839 |
- from rest_framework import renderers
- class PlainTextRenderer(renderers.BaseRenderer):
- # Disregard Accept header
- media_type = '*/*'
- format = 'txt'
- def render(self, data, media_type=None, renderer_context=None):
- renderer_context = renderer_context or {}
- response = renderer_context.get('response')
- if response and response.exception:
- response['Content-Type'] = 'text/plain'
- try:
- return data['detail']
- except (KeyError, TypeError):
- pass
- try:
- details = list(filter(None, [el.get('detail') for el in data]))
- if details:
- return ', '.join(details)
- except (TypeError, AttributeError):
- pass
- try:
- return '; '.join([f'{err.code}: {err}' for err in data])
- except (TypeError, AttributeError):
- pass
- raise ValueError('Expected response.data to be one of the following:\n'
- '- a dict with error details in response.data[\'detail\'],\n'
- '- a list with at least one element that has error details in element[\'detail\'];\n'
- '- a list with all elements being ErrorDetail instances;\n'
- 'but got %s:\n\n%s' % (type(response.data), response.data))
- return data
|