@@ -27,6 +27,25 @@ class JSONParser(parsers.JSONParser):
2727 media_type = 'application/vnd.api+json'
2828 renderer_class = renderers .JSONRenderer
2929
30+ @staticmethod
31+ def parse_attributes (data ):
32+ return utils .format_keys (data .get ('attributes' ), 'underscore' ) if data .get ('attributes' ) else dict ()
33+
34+ @staticmethod
35+ def parse_relationships (data ):
36+ relationships = (utils .format_keys (data .get ('relationships' ), 'underscore' )
37+ if data .get ('relationships' ) else dict ())
38+
39+ # Parse the relationships
40+ parsed_relationships = dict ()
41+ for field_name , field_data in relationships .items ():
42+ field_data = field_data .get ('data' )
43+ if isinstance (field_data , dict ):
44+ parsed_relationships [field_name ] = field_data
45+ elif isinstance (field_data , list ):
46+ parsed_relationships [field_name ] = list (relation for relation in field_data )
47+ return parsed_relationships
48+
3049 def parse (self , stream , media_type = None , parser_context = None ):
3150 """
3251 Parses the incoming bytestream as JSON and returns the resulting data
@@ -61,28 +80,11 @@ def parse(self, stream, media_type=None, parser_context=None):
6180 resource_type = resource_name
6281 )
6382 )
64- # Get the ID
65- data_id = data .get ('id' )
66- # Get the attributes
67- attributes = utils .format_keys (data .get ('attributes' ), 'underscore' ) if data .get (
68- 'attributes' ) else dict ()
69- # Get the relationships
70- relationships = utils .format_keys (data .get ('relationships' ), 'underscore' ) if data .get (
71- 'relationships' ) else dict ()
72-
73- # Parse the relationships
74- parsed_relationships = dict ()
75- for field_name , field_data in relationships .items ():
76- field_data = field_data .get ('data' )
77- if isinstance (field_data , dict ):
78- parsed_relationships [field_name ] = field_data
79- elif isinstance (field_data , list ):
80- parsed_relationships [field_name ] = list (relation for relation in field_data )
8183
8284 # Construct the return data
83- parsed_data = {'id' : data_id }
84- parsed_data .update (attributes )
85- parsed_data .update (parsed_relationships )
85+ parsed_data = {'id' : data . get ( 'id' ) }
86+ parsed_data .update (self . parse_attributes ( data ) )
87+ parsed_data .update (self . parse_relationships ( data ) )
8688 return parsed_data
8789
8890 else :
0 commit comments