Example #1
0
    def test_mutable_parameters(self):
        dct = {'a': 'http://one/two/three/four'}
        ctx = mock_context()
        ctx.formatter = JSONFormatter()

        get_sha1(ctx, dct)
        # Make sure that the dct that we pass in is the same dict that gets returned
        self.assertEqual(dct, {'a': 'http://one/two/three/four'})
Example #2
0
    def test_mutable_parameters(self):
        dct = {'a': 'http://one/two/three/four'}
        ctx = mock_context()
        ctx.formatter = JSONFormatter()

        get_sha1(ctx, dct)
        # Make sure that the dct that we pass in is the same dict that gets returned
        self.assertEqual(dct, {'a': 'http://one/two/three/four'})
Example #3
0
    def test_get_batch(self):
        root_resource = self.create_root_resource_with_children(
            r'^api/v2/(?P<base_resource>.*)$',
            methods=['GET'],
            result={'name': 'value'}
        )
        request_data = {
            "data": [
                self._generate_batch_partial(
                    'get',
                    'http://localhost:8081/api/v2/child/grandchild',
                    {'business_id': 12345}
                )
            ]
        }
        response = savory_dispatch_batch(
            root_resource,
            full_host='localhost:8081',
            method='POST',
            body=json.dumps(request_data)
        )
        self.assertEqual(response.status_code, 200)

        response_json = json.loads(response.content)
        data = response_json['data']

        self.assertEqual(len(data), 1)
        self.assertEqual(data[0]['status'], 200)
        self.assertEqual(data[0]['uri'], 'http://localhost:8081/api/v2/child/grandchild')
        self.assertEqual(data[0]['data'], {u'name': u'value'})

        ctx = mock_context()
        ctx.formatter = JSONFormatter()

        self.assertEqual(data[0]['etag'], get_sha1(ctx, {u'name': u'value'}))
Example #4
0
    def test_get_batch(self):
        root_resource = self.create_root_resource_with_children(
            r'^api/v2/(?P<base_resource>.*)$',
            methods=['GET'],
            result={'name': 'value'})
        request_data = {
            "data": [
                self._generate_batch_partial(
                    'get', 'http://localhost:8081/api/v2/child/grandchild',
                    {'business_id': 12345})
            ]
        }
        response = savory_dispatch_batch(root_resource,
                                         full_host='localhost:8081',
                                         method='POST',
                                         body=json.dumps(request_data))
        self.assertEqual(response.status_code, 200)

        response_json = json.loads(response.content)
        data = response_json['data']

        self.assertEqual(len(data), 1)
        self.assertEqual(data[0]['status'], 200)
        self.assertEqual(data[0]['uri'],
                         'http://localhost:8081/api/v2/child/grandchild')
        self.assertEqual(data[0]['data'], {u'name': u'value'})

        ctx = mock_context()
        ctx.formatter = JSONFormatter()

        self.assertEqual(data[0]['etag'], get_sha1(ctx, {u'name': u'value'}))
Example #5
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 #6
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 #7
0
    def _get_request_for_batch(ctx, resource, data):
        resource_result = {}
        get_data = MultiValueDict()
        get_data.update(data)
        content_dict = process_get_request(ctx, resource, get_data)
        resource_result['status'] = 200
        resource_result['etag'] = get_sha1(ctx, content_dict)
        resource_result['data'] = content_dict

        return resource_result
Example #8
0
    def _get_request_for_batch(ctx, resource, data):
        resource_result = {}
        get_data = MultiValueDict()
        get_data.update(data)
        content_dict = process_get_request(ctx, resource, get_data)
        resource_result['status'] = 200
        resource_result['etag'] = get_sha1(ctx, content_dict)
        resource_result['data'] = content_dict

        return resource_result
Example #9
0
    def get(self, ctx, params):
        if not self.allow_unfiltered_query and not params.keys():
            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()
        if self.supports_paging:
            # When paging the sliced_queryset will not contain all the objects,
            # so the count of the accumulated objects is insufficient.  In that case,
            # need to make a call to queryset.count.
            count = filtered_queryset.count()

            page = params.get_as('page', int, 0)
            if page > 0:
                meta['prev'] = self.build_page_uri(ctx, page - 1)

            meta['count'] = count

            if (page + 1) * self.page_size < count:
                meta['next'] = self.build_page_uri(ctx, page + 1)
        else:
            # When paging is disabled the sliced_queryset is the complete queryset,
            # so the accumulated objects contains all the objects.  In this case, just
            # do a len on the accumulated objects to avoid the extra COUNT(*) query.
            meta['count'] = len(objects)

        # 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 #10
0
def _content_success(ctx, resource, request, content_dict):
    if ctx.streaming_response:
        response = StreamingHttpResponse(
            content_dict, status=200, content_type=ctx.formatter.content_type)
        # No ETag, not practical on streaming
    else:
        response = HttpResponse(status=200,
                                content_type=ctx.formatter.content_type)
        response['ETag'] = get_sha1(ctx, content_dict)
        ctx.formatter.write_to(content_dict, response)
    headers = ctx.headers
    if headers:
        for header, value in headers.items():
            response[header] = value

    return response
Example #11
0
def _content_success(ctx, resource, request, content_dict):
    if ctx.streaming_response:
        response = StreamingHttpResponse(
            content_dict,
            status=200,
            content_type=ctx.formatter.content_type)
        # No ETag, not practical on streaming
    else:
        response = HttpResponse(
            status=200,
            content_type=ctx.formatter.content_type
        )
        response['ETag'] = get_sha1(ctx, content_dict)
        ctx.formatter.write_to(content_dict, response)
    if ctx.headers_dict:
        for header, value in ctx.headers_dict.items():
            response[header] = value

    return response
Example #12
0
 def test_has_dictionary(self):
     dct = {'a': 'b', 'c': 'd'}
     ctx = mock_context()
     ctx.formatter = JSONFormatter()
     self.assertEqual(get_sha1(ctx, dct), '855e751b12bf88bce273d5e1d93a31af9e4945d6')
Example #13
0
 def test_has_dictionary(self):
     dct = {'a': 'b', 'c': 'd'}
     ctx = mock_context()
     ctx.formatter = JSONFormatter()
     self.assertEqual(get_sha1(ctx, dct),
                      '855e751b12bf88bce273d5e1d93a31af9e4945d6')