def handle_outgoing(self, ctx, source_obj, target_dict): sub_model = self.get_submodel(ctx, source_obj) if sub_model is None: target_dict[self._compute_property(ctx)] = None else: target_dict[self._compute_property(ctx)] =\ self._resource_class(sub_model).get(ctx, EmptyParams())
def handle_outgoing(self, ctx, source_obj, target_dict): attrs = self._attribute.split('.') attribute = source_obj for attr in attrs: attribute = getattr(attribute, attr, None) if attribute is None: return None objects = [] # We are doing this outside of get_iterable so that subclasses can not # remove this override. if self._iterable_factory: iterable = self._iterable_factory(attribute) else: iterable = self.get_iterable(attribute) for model in iterable: model_resource = self._resource_class(model) model_dict = model_resource.get(ctx, EmptyParams()) # only add '_id' if there is no 'resourceUri' if 'resourceUri' not in model_dict: model_dict['_id'] = model_resource.key objects.append(model_dict) target_dict[self._compute_property(ctx)] = objects
def get(self, ctx, params): if not self.allow_unfiltered_query and not self.has_valid_key( ctx, params): raise SavoryPieError( 'Request must be filtered, will not return all. Acceptable filters are: {0}' .format([filter.name for filter in self.filters])) complete_queryset = self.queryset.all().distinct() filtered_queryset = self.filter_queryset(ctx, params, complete_queryset) sliced_queryset = self.slice_queryset(ctx, params, filtered_queryset) # prepare must be last for optimization to be respected by Django. final_queryset = self.prepare_queryset(ctx, sliced_queryset) objects = [] for model in final_queryset: model_json = self.to_resource(model).get(ctx, EmptyParams()) model_json['$hash'] = get_sha1(ctx, model_json) objects.append(model_json) meta = dict() count = filtered_queryset.count() meta['count'] = count meta = self.paginate(ctx, params, count, meta) # add meta-level resourceUri to QuerySet response if self.resource_path is not None: meta['resourceUri'] = ctx.build_resource_uri(self) return {'meta': meta, 'objects': objects}
def test_prepere_after_filter(self): """ Django will reset related selects when a filter is added """ queryset = MagicMock() queryset_resource = ComplexUserResourceQuerySetResource(queryset) queryset_resource.get(mock_context(), EmptyParams()) calls = call.all().distinct().filter().select_related('manager').prefetch_related('reports').call_list() queryset.assert_has_calls(calls)
def test_query_set_get_disallow_unfiltered_query(self): resource = AddressableUserQuerySetResource(mock_orm.QuerySet( User(pk=1, name='Alice', age=31), User(pk=2, name='Bob', age=20) )) resource.allow_unfiltered_query = False data = None with self.assertRaises(SavoryPieError): data = resource.get(mock_context(), EmptyParams()) self.assertEqual(data, None) # we should not ever have any data as this is not allowed
def test_empty_queryset(self): resource = AddressableUserQuerySetResource(mock_orm.QuerySet()) data = resource.get(mock_context(), EmptyParams()) self.assertEqual(data['meta'], { 'resourceUri': 'uri://users', 'count': 0 }) self.assertEqual(data['objects'], [])
def test_resource_get_returns_hash(self): user = User(pk=1, name='Bob', age=20) resource = AddressableUserResource(user) dct = resource.get(mock_context(), EmptyParams()) self.assertEqual(dct, { 'name': 'Bob', 'age': 20, 'resourceUri': 'uri://users/1' })
def test_get_distinct(self): resource = AddressableUserQuerySetResource(mock_orm.QuerySet( User(pk=1, name='Alice', age=31), User(pk=1, name='Alice', age=31) )) data = resource.get(mock_context(), EmptyParams()) self.assertEqual(data['meta'], { 'resourceUri': 'uri://users', 'count': 1 }) self.assertEqual(map(self.remove_hash, data['objects']), [ {'resourceUri': 'uri://users/1', 'name': 'Alice', 'age': 31}, ])
def test_query_set_get(self): resource = AddressableUserQuerySetResource(mock_orm.QuerySet( User(pk=1, name='Alice', age=31), User(pk=2, name='Bob', age=20) )) data = resource.get(mock_context(), EmptyParams()) self.assertEqual(data['meta'], { 'resourceUri': 'uri://users', 'count': 2 }) self.assertEqual(len(data['objects']), 2) data = sorted(data['objects'], key=lambda k: k['name']) self.assertEqual(map(self.remove_hash, data), [ {'resourceUri': 'uri://users/1', 'name': 'Alice', 'age': 31}, {'resourceUri': 'uri://users/2', 'name': 'Bob', 'age': 20} ])
def test_qsr_returns_hashes(self): resource = AddressableUserQuerySetResource(mock_orm.QuerySet( User(pk=1, name='Alice', age=31), User(pk=2, name='Bob', age=20) )) data = resource.get(mock_context(), EmptyParams()) self.assertEqual(data['meta'], { 'resourceUri': 'uri://users', 'count': 2 }) result = data['objects'] self.assertEqual(len(result), 2) first_result = OrderedDict() second_result = OrderedDict() for key in sorted(result[0].keys()): first_result[key] = result[0][key] for key in sorted(result[1].keys()): second_result[key] = result[1][key] alice = OrderedDict({ '$hash': '01a1b638ddf5318259419587f95ca091a179eeb5', 'age': 31, 'name': 'Alice', 'resourceUri': 'uri://users/1', }) bob = OrderedDict({ '$hash': 'df8c8b5694bcd438ea86a87414cf3f59ca42a051', 'age': 20, 'name': 'Bob', 'resourceUri': 'uri://users/2', }) if first_result['name'] == 'Alice': self._dict_compare(first_result, alice) self._dict_compare(second_result, bob) else: self._dict_compare(second_result, alice) self._dict_compare(first_result, bob)
def test_get(self): params = EmptyParams() self.assertEqual(params.get('key', default='value'), 'value')
def test_get_list_of(self): params = EmptyParams() self.assertEqual(params.get_list_of('key', str), [])
def test_get_list(self): params = EmptyParams() self.assertEqual(params.get_list('key'), [])