Example #1
0
 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())
Example #2
0
    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
Example #3
0
    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}
Example #4
0
    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)
Example #5
0
 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
Example #6
0
    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'], [])
Example #7
0
    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'
        })
Example #8
0
    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},
        ])
Example #9
0
    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}
        ])
Example #10
0
    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)
Example #11
0
 def test_get(self):
     params = EmptyParams()
     self.assertEqual(params.get('key', default='value'), 'value')
Example #12
0
 def test_get_list_of(self):
     params = EmptyParams()
     self.assertEqual(params.get_list_of('key', str), [])
Example #13
0
 def test_get_list(self):
     params = EmptyParams()
     self.assertEqual(params.get_list('key'), [])
Example #14
0
 def test_get(self):
     params = EmptyParams()
     self.assertEqual(params.get('key', default='value'), 'value')
Example #15
0
 def test_get_list_of(self):
     params = EmptyParams()
     self.assertEqual(params.get_list_of('key', str), [])
Example #16
0
 def test_get_list(self):
     params = EmptyParams()
     self.assertEqual(params.get_list('key'), [])