@@ -338,13 +338,18 @@ def extract_meta(serializer, resource):
338
338
return data
339
339
340
340
@staticmethod
341
- def extract_root_meta (serializer , resource , meta ):
341
+ def extract_root_meta (serializer , resource ):
342
+ many = False
343
+ if hasattr (serializer , 'child' ):
344
+ many = True
345
+ serializer = serializer .child
346
+
347
+ data = {}
342
348
if getattr (serializer , 'get_root_meta' , None ):
343
- root_meta = serializer .get_root_meta (resource )
344
- if root_meta :
345
- assert isinstance (root_meta , dict ), 'get_root_meta must return a dict'
346
- meta .update (root_meta )
347
- return meta
349
+ json_api_meta = serializer .get_root_meta (resource , many )
350
+ assert isinstance (json_api_meta , dict ), 'get_root_meta must return a dict'
351
+ data .update (json_api_meta )
352
+ return data
348
353
349
354
@staticmethod
350
355
def build_json_resource_obj (fields , resource , resource_instance , resource_name ):
@@ -412,6 +417,7 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
412
417
else :
413
418
included_resources = list ()
414
419
420
+ json_api_data = data
415
421
json_api_included = list ()
416
422
# initialize json_api_meta with pagination meta or an empty dict
417
423
json_api_meta = data .get ('meta' , {}) if isinstance (data , dict ) else {}
@@ -421,51 +427,44 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
421
427
else :
422
428
serializer_data = data
423
429
424
- if hasattr (serializer_data , 'serializer' ) and getattr (serializer_data .serializer , 'many' , False ):
425
- # The below is not true for non-paginated responses
426
- # and isinstance(data, dict):
427
-
428
- # If detail view then json api spec expects dict, otherwise a list
429
- # - http://jsonapi.org/format/#document-top-level
430
- # The `results` key may be missing if unpaginated or an OPTIONS request
430
+ serializer = getattr (serializer_data , 'serializer' , None )
431
431
432
- resource_serializer = serializer_data . serializer
432
+ if serializer is not None :
433
433
434
434
# Get the serializer fields
435
- fields = utils .get_serializer_fields (resource_serializer )
435
+ fields = utils .get_serializer_fields (serializer )
436
436
437
- json_api_data = list ()
438
- for position in range (len (serializer_data )):
439
- resource = serializer_data [position ] # Get current resource
440
- resource_instance = resource_serializer .instance [position ] # Get current instance
437
+ # Extract root meta for any type of serializer
438
+ json_api_meta .update (self .extract_root_meta (serializer , serializer_data ))
441
439
442
- json_resource_obj = self .build_json_resource_obj (fields , resource , resource_instance , resource_name )
443
- meta = self .extract_meta (resource_serializer , resource )
444
- if meta :
445
- json_resource_obj .update ({'meta' : utils .format_keys (meta )})
446
- json_api_meta = self .extract_root_meta (resource_serializer , resource , json_api_meta )
447
- json_api_data .append (json_resource_obj )
440
+ if getattr (serializer , 'many' , False ):
441
+ json_api_data = list ()
448
442
449
- included = self .extract_included (fields , resource , resource_instance , included_resources )
450
- if included :
451
- json_api_included .extend (included )
452
- else :
453
- # Check if data contains a serializer
454
- if hasattr (data , 'serializer' ):
455
- fields = utils .get_serializer_fields (data .serializer )
456
- resource_instance = data .serializer .instance
457
- json_api_data = self .build_json_resource_obj (fields , data , resource_instance , resource_name )
443
+ for position in range (len (serializer_data )):
444
+ resource = serializer_data [position ] # Get current resource
445
+ resource_instance = serializer .instance [position ] # Get current instance
446
+
447
+ json_resource_obj = self .build_json_resource_obj (fields , resource , resource_instance , resource_name )
448
+ meta = self .extract_meta (serializer , resource )
449
+ if meta :
450
+ json_resource_obj .update ({'meta' : utils .format_keys (meta )})
451
+ json_api_data .append (json_resource_obj )
452
+
453
+ included = self .extract_included (fields , resource , resource_instance , included_resources )
454
+ if included :
455
+ json_api_included .extend (included )
456
+ else :
457
+ resource_instance = serializer .instance
458
+ json_api_data = self .build_json_resource_obj (fields , serializer_data , resource_instance , resource_name )
458
459
459
- meta = self .extract_meta (data . serializer , data )
460
+ meta = self .extract_meta (serializer , serializer_data )
460
461
if meta :
461
462
json_api_data .update ({'meta' : utils .format_keys (meta )})
462
- json_api_meta = self .extract_root_meta (data .serializer , data , json_api_meta )
463
463
464
- included = self .extract_included (fields , data , resource_instance , included_resources )
464
+ included = self .extract_included (fields , serializer_data , resource_instance , included_resources )
465
465
if included :
466
466
json_api_included .extend (included )
467
- else :
468
- json_api_data = data
467
+
469
468
470
469
# Make sure we render data in a specific order
471
470
render_data = OrderedDict ()
0 commit comments