@@ -308,13 +308,7 @@ def format_drf_errors(response, context, exc):
308308 # handle generic errors. ValidationError('test') in a view for example
309309 if isinstance (response .data , list ):
310310 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 ))
318312 # handle all errors thrown from serializers
319313 else :
320314 for field , error in response .data .items ():
@@ -325,46 +319,40 @@ def format_drf_errors(response, context, exc):
325319 errors .append (error )
326320 elif isinstance (exc , Http404 ) and isinstance (error , str ):
327321 # 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 ))
332323 elif isinstance (error , str ):
333324 classes = inspect .getmembers (exceptions , inspect .isclass )
334325 # DRF sets the `field` to 'detail' for its own exceptions
335326 if isinstance (exc , tuple (x [1 ] for x in classes )):
336327 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 ))
344329 elif isinstance (error , list ):
345330 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 ))
353332 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 ))
361334
362335 context ['view' ].resource_name = 'errors'
363336 response .data = errors
364337
365338 return response
366339
367340
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+
368356def format_errors (data ):
369357 if len (data ) > 1 and isinstance (data , list ):
370358 data .sort (key = lambda x : x .get ('source' , {}).get ('pointer' , '' ))
0 commit comments