Skip to content

Instantly share code, notes, and snippets.

@Cguilliman
Created August 22, 2019 14:55
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save Cguilliman/c5d94a61b1a7f29d7becf9d3e2caa3a3 to your computer and use it in GitHub Desktop.
Save Cguilliman/c5d94a61b1a7f29d7becf9d3e2caa3a3 to your computer and use it in GitHub Desktop.
# HANDLER
from django.utils.translation import ugettext_lazy as _
from rest_framework.exceptions import ErrorDetail
from rest_framework.views import exception_handler
non_field_errors = 'non_field_errors'
def set_custome_errors(errors):
for key, values in errors.items():
errors[key] = values[0] if len(values) == 1 else values
return errors
def append_errors_collection(field_errors, errors, field_name=None):
if isinstance(errors, dict):
if errors.get('custome'):
field_errors['state'][field_name] = set_custome_errors(errors)
return field_errors
for _field_name, _errors in errors.items():
if not field_name:
local_field_name = _field_name
elif field_name is not non_field_errors:
local_field_name = f"{field_name}__{_field_name}"
else:
local_field_name = field_name
append_errors_collection(
field_errors,
_errors,
local_field_name
)
return field_errors
for error in errors:
if not isinstance(error, dict):
field_errors['state'][field_name] = {
'reason': getattr(error, 'code'),
'message': str(error)
}
else :
append_errors_collection(
field_errors,
error,
field_name
)
def custom_exception_handler(exc, context):
response = exception_handler(exc, context)
if response is not None and hasattr(exc, 'detail'):
general_message = _('Bad request')
response.data = {}
errors = exc.detail
dumped_errors = []
if isinstance(errors, dict):
if errors.get('custom'):
dumped_errors.append(set_custome_errors(errors))
else:
field_errors = append_errors_collection(
{'message': 'Request is invalid', 'state': {}},
errors)
dumped_errors.append(field_errors)
else:
response.data['errors'] = dumped_errors
if isinstance(errors, list):
for error in errors:
dumped_errors.append({'message': str(error), 'reason': error.code})
else:
dumped_errors.append({'message': str(errors), 'reason': errors.code})
response.data['errors'] = dumped_errors
response.data['code'] = response.status_code
response.data['message'] = general_message
return response
# settings.py
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'path.to.custom_exception_handler'
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment