@@ -308,13 +308,7 @@ def format_drf_errors(response, context, exc):
308
308
# handle generic errors. ValidationError('test') in a view for example
309
309
if isinstance (response .data , list ):
310
310
for message in response .data :
311
- errors .append ({
312
- 'detail' : message ,
313
- 'source' : {
314
- 'pointer' : '/data' ,
315
- },
316
- 'status' : encoding .force_text (response .status_code ),
317
- })
311
+ errors .append (format_error_object (message , '/data' , response ))
318
312
# handle all errors thrown from serializers
319
313
else :
320
314
for field , error in response .data .items ():
@@ -325,46 +319,40 @@ def format_drf_errors(response, context, exc):
325
319
errors .append (error )
326
320
elif isinstance (exc , Http404 ) and isinstance (error , str ):
327
321
# 404 errors don't have a pointer
328
- errors .append ({
329
- 'detail' : error ,
330
- 'status' : encoding .force_text (response .status_code ),
331
- })
322
+ errors .append (format_error_object (error , None , response ))
332
323
elif isinstance (error , str ):
333
324
classes = inspect .getmembers (exceptions , inspect .isclass )
334
325
# DRF sets the `field` to 'detail' for its own exceptions
335
326
if isinstance (exc , tuple (x [1 ] for x in classes )):
336
327
pointer = '/data'
337
- errors .append ({
338
- 'detail' : error ,
339
- 'source' : {
340
- 'pointer' : pointer ,
341
- },
342
- 'status' : encoding .force_text (response .status_code ),
343
- })
328
+ errors .append (format_error_object (error , pointer , response ))
344
329
elif isinstance (error , list ):
345
330
for message in error :
346
- errors .append ({
347
- 'detail' : message ,
348
- 'source' : {
349
- 'pointer' : pointer ,
350
- },
351
- 'status' : encoding .force_text (response .status_code ),
352
- })
331
+ errors .append (format_error_object (message , pointer , response ))
353
332
else :
354
- errors .append ({
355
- 'detail' : error ,
356
- 'source' : {
357
- 'pointer' : pointer ,
358
- },
359
- 'status' : encoding .force_text (response .status_code ),
360
- })
333
+ errors .append (format_error_object (error , pointer , response ))
361
334
362
335
context ['view' ].resource_name = 'errors'
363
336
response .data = errors
364
337
365
338
return response
366
339
367
340
341
+ def format_error_object (message , pointer , response ):
342
+ error_obj = {
343
+ 'detail' : message ,
344
+ 'status' : encoding .force_text (response .status_code ),
345
+ }
346
+ if pointer is not None :
347
+ error_obj ['source' ] = {
348
+ 'pointer' : pointer ,
349
+ }
350
+ code = getattr (message , "code" , None )
351
+ if code is not None :
352
+ error_obj ['code' ] = code
353
+ return error_obj
354
+
355
+
368
356
def format_errors (data ):
369
357
if len (data ) > 1 and isinstance (data , list ):
370
358
data .sort (key = lambda x : x .get ('source' , {}).get ('pointer' , '' ))
0 commit comments