11from __future__ import unicode_literals
22
3- from collections import defaultdict
4-
53import six
64import copy
75
1715
1816class SideloadableRelationsMixin (object ):
1917 query_param_name = "sideload"
20- flat_param_name = "flat"
2118 sideloading_serializer_class = None
2219 _primary_field_name = None
2320 _sideloadable_fields = None
@@ -137,8 +134,6 @@ def list(self, request, *args, **kwargs):
137134 return super (SideloadableRelationsMixin , self ).list (
138135 request , * args , ** kwargs
139136 )
140- # check if result needs to be flattened
141- flatten = request .query_params .get (self .flat_param_name ) in ['true' , '1' ]
142137
143138 # After this `relations_to_sideload` is safe to use
144139 queryset = self .get_queryset ()
@@ -159,8 +154,6 @@ def list(self, request, *args, **kwargs):
159154 + list (self .relations_to_sideload ),
160155 context = {"request" : request },
161156 )
162- if flatten :
163- return self .get_paginated_response (self .flatten_sideloaded_data (serialized_data = serializer .data ))
164157 return self .get_paginated_response (serializer .data )
165158 else :
166159 sideloadable_page = self .get_sideloadable_page_from_queryset (queryset )
@@ -170,43 +163,8 @@ def list(self, request, *args, **kwargs):
170163 + list (self .relations_to_sideload ),
171164 context = {"request" : request },
172165 )
173- if flatten :
174- return Response (self .flatten_sideloaded_data (serialized_data = serializer .data ))
175166 return Response (serializer .data )
176167
177- def flatten_data (self , input_data , initial_key ):
178- out = {}
179-
180- def flatten (data , key ):
181- if isinstance (data , dict ):
182- for dict_key , dict_value in data .items ():
183- flatten (data = dict_value , key = "{}__{}" .format (key , dict_key ))
184- elif isinstance (data , list ):
185- if any (isinstance (list_obj , (dict , list )) for list_obj in data ):
186- for i , list_obj in enumerate (data ):
187- flatten (data = list_obj , key = "{}__{}" .format (key , i ))
188- else :
189- out [key ] = data
190- else :
191- out [key ] = data
192-
193- flatten (input_data , initial_key )
194- return out
195-
196- def flatten_sideloaded_data (self , serialized_data ):
197- primary_objects = serialized_data .pop (self ._primary_field_name )
198- sideloaded_data = defaultdict (dict )
199- relation_sources = {}
200- for relation in self .relations_to_sideload :
201- relation_sources [relation ] = self .sideloading_serializer_class ._declared_fields .get (relation ).source
202- for data in serialized_data [relation ]:
203- sideloaded_data [relation ][data ["url" ]] = self .flatten_data (data , relation_sources [relation ])
204-
205- for object in primary_objects :
206- for relation in self .relations_to_sideload :
207- object .update (sideloaded_data [relation ][object .pop (relation_sources [relation ])])
208- return primary_objects
209-
210168 def parse_query_param (self , sideload_parameter ):
211169 """
212170 Parse query param and take validated names
0 commit comments