1
- import inspect
2
- from django .utils import six , encoding
3
1
from django .utils .translation import ugettext_lazy as _
4
2
from rest_framework import status , exceptions
5
3
6
- from rest_framework_json_api . utils import format_value
4
+ from rest_framework_json_api import utils
7
5
8
6
9
7
def exception_handler (exc , context ):
@@ -18,63 +16,9 @@ def exception_handler(exc, context):
18
16
19
17
if not response :
20
18
return response
21
-
22
- errors = []
23
- # handle generic errors. ValidationError('test') in a view for example
24
- if isinstance (response .data , list ):
25
- for message in response .data :
26
- errors .append ({
27
- 'detail' : message ,
28
- 'source' : {
29
- 'pointer' : '/data' ,
30
- },
31
- 'status' : encoding .force_text (response .status_code ),
32
- })
33
- # handle all errors thrown from serializers
34
- else :
35
- for field , error in response .data .items ():
36
- field = format_value (field )
37
- pointer = '/data/attributes/{}' .format (field )
38
- # see if they passed a dictionary to ValidationError manually
39
- if isinstance (error , dict ):
40
- errors .append (error )
41
- elif isinstance (error , six .string_types ):
42
- classes = inspect .getmembers (exceptions , inspect .isclass )
43
- # DRF sets the `field` to 'detail' for its own exceptions
44
- if isinstance (exc , tuple (x [1 ] for x in classes )):
45
- pointer = '/data'
46
- errors .append ({
47
- 'detail' : error ,
48
- 'source' : {
49
- 'pointer' : pointer ,
50
- },
51
- 'status' : encoding .force_text (response .status_code ),
52
- })
53
- elif isinstance (error , list ):
54
- for message in error :
55
- errors .append ({
56
- 'detail' : message ,
57
- 'source' : {
58
- 'pointer' : pointer ,
59
- },
60
- 'status' : encoding .force_text (response .status_code ),
61
- })
62
- else :
63
- errors .append ({
64
- 'detail' : error ,
65
- 'source' : {
66
- 'pointer' : pointer ,
67
- },
68
- 'status' : encoding .force_text (response .status_code ),
69
- })
70
-
71
-
72
- context ['view' ].resource_name = 'errors'
73
- response .data = errors
74
- return response
19
+ return utils .format_drf_errors (response , context , exc )
75
20
76
21
77
22
class Conflict (exceptions .APIException ):
78
23
status_code = status .HTTP_409_CONFLICT
79
24
default_detail = _ ('Conflict.' )
80
-
0 commit comments