Пример #1
0
        def create_collection(**path_data):
            request_data = load_request_data(definition.request_schema)
            # NB: if we don't filter the request body through an explicit page schema,
            # we will leak other request arguments into the pagination query strings
            page = self.page_cls.from_query_string(self.page_schema(),
                                                   request_data)

            result = definition.func(**merge_data(
                path_data,
                merge_data(
                    request_data,
                    page.to_dict(func=identity),
                ),
            ))

            response_data, headers = page.to_paginated_list(
                result, ns, Operation.CreateCollection)
            definition.header_func(headers, response_data)
            response_format = self.negotiate_response_content(
                definition.response_formats)
            return dump_response_data(
                paginated_list_schema,
                response_data,
                headers=headers,
                response_format=response_format,
            )
Пример #2
0
 def update_batch(**path_data):
     request_data = load_request_data(definition.request_schema)
     response_data = definition.func(
         **merge_data(path_data, request_data))
     return dump_response_data(definition.response_schema,
                               response_data,
                               operation.value.default_code)
Пример #3
0
 def create(**path_data):
     request_data = load_request_data(definition.request_schema)
     response_data = require_response_data(
         definition.func(**merge_data(path_data, request_data)))
     return dump_response_data(definition.response_schema,
                               response_data,
                               Operation.CreateFor.value.default_code)
Пример #4
0
 def update(**path_data):
     # NB: using partial here means that marshmallow will not validate required fields
     request_data = load_request_data(definition.request_schema,
                                      partial=True)
     response_data = require_response_data(
         definition.func(**merge_data(path_data, request_data)))
     return dump_response_data(definition.response_schema,
                               response_data)
Пример #5
0
 def replace(**path_data):
     request_data = load_request_data(definition.request_schema)
     # Replace/put should create a resource if not already present, but we do not
     # enforce these semantics at the HTTP layer. If `func` returns falsey, we
     # will raise a 404.
     response_data = require_response_data(
         definition.func(**merge_data(path_data, request_data)))
     return dump_response_data(definition.response_schema,
                               response_data)
Пример #6
0
        def upload(**path_data):
            merged_data = merge_data(request.args.to_dict(), request.form.to_dict())
            request_data = load_query_string_data(request_schema, merged_data)

            if not request.files:
                raise BadRequest("No files were uploaded")

            uploads = [
                temporary_upload(name, fileobj)
                for name, fileobj
                in request.files.items()
                if not self.exclude_func(name, fileobj)
            ]
            with nested(*uploads) as files:
                response_data = definition.func(files, **merge_data(path_data, request_data))
                if response_data is None:
                    return "", 204

            return dump_response_data(response_schema, response_data, operation.value.default_code)
Пример #7
0
 def retrieve(**path_data):
     headers = dict()
     request_data = load_query_string_data(request_schema)
     response_data = require_response_data(definition.func(**merge_data(path_data, request_data)))
     definition.header_func(headers, response_data)
     response_format = self.negotiate_response_content(definition.response_formats)
     return dump_response_data(
         definition.response_schema,
         response_data,
         headers=headers,
         response_format=response_format,
     )
Пример #8
0
        def retrieve(**path_data):
            # request_schema is optional for Alias
            request_data = (load_query_string_data(definition.request_schema)
                            if definition.request_schema else dict())
            resource = definition.func(**merge_data(path_data, request_data))

            kwargs = dict()
            identifier = "{}_id".format(name_for(ns.subject))
            kwargs[identifier] = resource.id
            url = ns.url_for(Operation.Retrieve, **kwargs)

            return redirect(url)
Пример #9
0
 def search(**path_data):
     page = self.page_cls.from_query_string(definition.request_schema)
     result = definition.func(**merge_data(path_data, page.to_dict(func=identity)))
     response_data, headers = page.to_paginated_list(result, ns, Operation.Search)
     definition.header_func(headers, response_data)
     response_format = self.negotiate_response_content(definition.response_formats)
     return dump_response_data(
         paginated_list_schema,
         response_data,
         headers=headers,
         response_format=response_format,
     )
Пример #10
0
        def upload(**path_data):
            merged_data = merge_data(request.args.to_dict(),
                                     request.form.to_dict())
            request_data = load_query_string_data(request_schema, merged_data)

            if not request.files:
                raise BadRequest("No files were uploaded")

            uploads = [
                temporary_upload(name, fileobj)
                for name, fileobj in request.files.items()
                if not self.exclude_func(name, fileobj)
            ]
            with nested(*uploads) as files:
                response_data = definition.func(
                    files, **merge_data(path_data, request_data))
                if response_data is None:
                    return "", 204

            return dump_response_data(response_schema, response_data,
                                      operation.value.default_code)
Пример #11
0
 def create(**path_data):
     request_data = load_request_data(definition.request_schema)
     response_data = definition.func(**merge_data(path_data, request_data))
     headers = encode_id_header(response_data)
     definition.header_func(headers, response_data)
     response_format = self.negotiate_response_content(definition.response_formats)
     return dump_response_data(
         definition.response_schema,
         response_data,
         status_code=Operation.Create.value.default_code,
         headers=headers,
         response_format=response_format,
     )
Пример #12
0
 def update_batch(**path_data):
     headers = dict()
     request_data = load_request_data(definition.request_schema)
     response_data = definition.func(**merge_data(path_data, request_data))
     definition.header_func(headers, response_data)
     response_format = self.negotiate_response_content(definition.response_formats)
     return dump_response_data(
         definition.response_schema,
         response_data,
         status_code=operation.value.default_code,
         headers=headers,
         response_format=response_format,
     )
Пример #13
0
 def count(**path_data):
     request_data = load_query_string_data(definition.request_schema)
     response_data = dict()
     count = definition.func(**merge_data(path_data, request_data))
     headers = encode_count_header(count)
     definition.header_func(headers, response_data)
     response_format = self.negotiate_response_content(definition.response_formats)
     return dump_response_data(
         None,
         None,
         headers=headers,
         response_format=response_format,
     )
Пример #14
0
 def update(**path_data):
     headers = dict()
     # NB: using partial here means that marshmallow will not validate required fields
     request_data = load_request_data(definition.request_schema, partial=True)
     response_data = require_response_data(definition.func(**merge_data(path_data, request_data)))
     definition.header_func(headers, response_data)
     response_format = self.negotiate_response_content(definition.response_formats)
     return dump_response_data(
         definition.response_schema,
         response_data,
         headers=headers,
         response_format=response_format,
     )
Пример #15
0
 def delete(**path_data):
     headers = dict()
     request_data = load_query_string_data(request_schema)
     response_data = require_response_data(definition.func(**merge_data(path_data, request_data)))
     definition.header_func(headers, response_data)
     response_format = self.negotiate_response_content(definition.response_formats)
     return dump_response_data(
         "",
         None,
         status_code=Operation.Delete.value.default_code,
         headers=headers,
         response_format=response_format,
     )
Пример #16
0
        def create_collection(**path_data):
            request_data = load_request_data(definition.request_schema)
            # NB: if we don't filter the request body through an explicit page schema,
            # we will leak other request arguments into the pagination query strings
            page = self.page_cls.from_query_string(self.page_schema(), request_data)

            result = definition.func(**merge_data(
                path_data,
                merge_data(
                    request_data,
                    page.to_dict(func=identity),
                ),
            ))

            response_data, headers = page.to_paginated_list(result, ns, Operation.CreateCollection)
            definition.header_func(headers, response_data)
            response_format = self.negotiate_response_content(definition.response_formats)
            return dump_response_data(
                paginated_list_schema,
                response_data,
                headers=headers,
                response_format=response_format,
            )
Пример #17
0
        def create_collection(**path_data):
            request_data = load_request_data(definition.request_schema)
            page = self.page_cls.from_query_string(self.page_schema(), {})

            result = definition.func(**merge_data(
                path_data,
                merge_data(
                    request_data,
                    page.to_dict(func=identity),
                ),
            ))

            response_data, headers = page.to_paginated_list(
                result, ns, Operation.CreateCollection)
            definition.header_func(headers, response_data)
            response_format = self.negotiate_response_content(
                definition.response_formats)
            return dump_response_data(
                paginated_list_schema,
                response_data,
                headers=headers,
                response_format=response_format,
            )
Пример #18
0
        def search(**path_data):
            request_data = load_query_string_data(definition.request_schema)
            page = Page.from_query_string(request_data)
            items, count, context = definition.func(
                **merge_data(path_data, request_data))

            response_data = self.paginated_list_class(
                ns=ns,
                page=page,
                items=items,
                count=count,
                schema=definition.response_schema,
                operation=Operation.SearchFor,
                **context)
            return dump_response_data(paginated_list_schema, response_data)
Пример #19
0
        def retrieve(**path_data):
            # request_schema is optional for Alias
            request_data = (
                load_query_string_data(definition.request_schema)
                if definition.request_schema
                else dict()
            )
            resource = definition.func(**merge_data(path_data, request_data))

            kwargs = dict()
            identifier = "{}_id".format(name_for(ns.subject))
            kwargs[identifier] = resource.id
            url = ns.url_for(Operation.Retrieve, **kwargs)

            return redirect(url)
Пример #20
0
 def replace(**path_data):
     headers = dict()
     request_data = load_request_data(definition.request_schema)
     # Replace/put should create a resource if not already present, but we do not
     # enforce these semantics at the HTTP layer. If `func` returns falsey, we
     # will raise a 404.
     response_data = require_response_data(definition.func(**merge_data(path_data, request_data)))
     definition.header_func(headers, response_data)
     response_format = self.negotiate_response_content(definition.response_formats)
     return dump_response_data(
         definition.response_schema,
         response_data,
         headers=headers,
         response_format=response_format,
     )
Пример #21
0
        def search(**path_data):
            request_data = load_query_string_data(definition.request_schema)
            page = self.page_cls.from_query_string(request_data)
            return_value = definition.func(
                **merge_data(path_data, request_data))

            if len(return_value) == 3:
                items, count, context = return_value
            else:
                context = {}
                items, count = return_value

            response_data = PaginatedList(ns=ns,
                                          page=page,
                                          items=items,
                                          count=count,
                                          schema=definition.response_schema,
                                          operation=Operation.Search,
                                          **context)
            return dump_response_data(paginated_list_schema, response_data)
Пример #22
0
 def retrieve(**path_data):
     request_data = load_query_string_data(request_schema)
     response_data = require_response_data(
         definition.func(**merge_data(path_data, request_data)))
     return dump_response_data(definition.response_schema,
                               response_data)
Пример #23
0
 def count(**path_data):
     request_data = load_query_string_data(definition.request_schema)
     count = definition.func(**merge_data(path_data, request_data))
     headers = encode_count_header(count)
     return dump_response_data(None, None, headers=headers)