def _pagination_links(resource, req, documents_count): """Returns the appropriate set of resource links depending on the current page and the total number of documents returned by the query. :param resource: the resource name. :param req: and instace of :class:`eve.utils.ParsedRequest`. :param document_count: the number of documents returned by the query. .. versionchanged:: 0.0.5 Support for optional pagination. .. versionchanged:: 0.0.3 JSON links """ _links = {'parent': home_link(), 'self': collection_link(resource)} if documents_count and config.DOMAIN[resource]['pagination']: if req.page * req.max_results < documents_count: q = querydef(req.max_results, req.where, req.sort, req.page + 1) _links['next'] = {'title': 'next page', 'href': '%s%s' % (resource_uri(resource), q)} if req.page > 1: q = querydef(req.max_results, req.where, req.sort, req.page - 1) _links['prev'] = {'title': 'previous page', 'href': '%s%s' % (resource_uri(resource), q)} return _links
def _pagination_links(resource, req, documents_count): """Returns the appropriate set of resource links depending on the current page and the total number of documents returned by the query. :param resource: the resource name. :param req: and instace of :class:`eve.utils.ParsedRequest`. :param document_count: the number of documents returned by the query. .. versionchanged:: 0.0.7 Support for Rate-Limiting. .. versionchanged:: 0.0.5 Support for optional pagination. .. versionchanged:: 0.0.3 JSON links """ _links = {"parent": home_link(), "self": collection_link(resource)} if documents_count and config.DOMAIN[resource]["pagination"]: if req.page * req.max_results < documents_count: q = querydef(req.max_results, req.where, req.sort, req.page + 1) _links["next"] = {"title": "next page", "href": "%s%s" % (resource_uri(resource), q)} if req.page > 1: q = querydef(req.max_results, req.where, req.sort, req.page - 1) _links["prev"] = {"title": "previous page", "href": "%s%s" % (resource_uri(resource), q)} return _links
def _pagination_links(resource, req, documents_count): """Returns the appropriate set of resource links depending on the current page and the total number of documents returned by the query. :param resource: the resource name. :param req: and instace of :class:`eve.utils.ParsedRequest`. :param document_count: the number of documents returned by the query. .. versionchanged:: 0.0.5 Support for optional pagination. .. versionchanged:: 0.0.3 JSON links """ _links = {'parent': home_link(), 'self': collection_link(resource)} if documents_count and config.DOMAIN[resource]['pagination']: if req.page * req.max_results < documents_count: q = querydef(req.max_results, req.where, req.sort, req.page + 1) _links['next'] = { 'title': 'next page', 'href': '%s%s' % (resource_uri(resource), q) } if req.page > 1: q = querydef(req.max_results, req.where, req.sort, req.page - 1) _links['prev'] = { 'title': 'previous page', 'href': '%s%s' % (resource_uri(resource), q) } return _links
def getitem(resource, **lookup): """ Retrieves and returns a single document. :param resource: the name of the resource to which the document belongs. :param **lookup: the lookup query. .. versionchanged:: 0.0.7 Support for Rate-Limiting. .. versionchanged:: 0.0.6 Support for HEAD requests. .. versionchanged:: 0.0.6 ETag added to payload. .. versionchanged:: 0.0.5 Support for user-restricted access to resources. Support for LAST_UPDATED field missing from documents, because they were created outside the API context. .. versionchanged:: 0.0.4 Added the ``requires_auth`` decorator. .. versionchanged:: 0.0.3 Superflous ``response`` container removed. Links wrapped with ``_links``. Links are now properly JSON formatted. """ response = {} req = parse_request(resource) document = app.data.find_one(resource, **lookup) if document: # need to update the document field as well since the etag must # be computed on the same document representation that might have # been used in the collection 'get' method last_modified = document[config.LAST_UPDATED] = _last_updated(document) document["etag"] = document_etag(document) if req.if_none_match and document["etag"] == req.if_none_match: # request etag matches the current server representation of the # document, return a 304 Not-Modified. return response, last_modified, document["etag"], 304 if req.if_modified_since and last_modified <= req.if_modified_since: # request If-Modified-Since conditional request match. We test # this after the etag since Last-Modified dates have lower # resolution (1 second). return response, last_modified, document["etag"], 304 response["_links"] = { "self": document_link(resource, document[config.ID_FIELD]), "collection": collection_link(resource), "parent": home_link(), } response.update(document) return response, last_modified, document["etag"], 200 abort(404)
def getitem(resource, **lookup): """ Retrieves and returns a single document. :param resource: the name of the resource to which the document belongs. :param **lookup: the lookup query. .. versionchanged:: 0.0.6 Support for HEAD requests. .. versionchanged:: 0.0.6 ETag added to payload. .. versionchanged:: 0.0.5 Support for user-restricted access to resources. Support for LAST_UPDATED field missing from documents, because they were created outside the API context. .. versionchanged:: 0.0.4 Added the ``requires_auth`` decorator. .. versionchanged:: 0.0.3 Superflous ``response`` container removed. Links wrapped with ``_links``. Links are now properly JSON formatted. """ response = {} req = parse_request(resource) document = app.data.find_one(resource, **lookup) if document: # need to update the document field as well since the etag must # be computed on the same document representation that might have # been used in the collection 'get' method last_modified = document[config.LAST_UPDATED] = _last_updated(document) document['etag'] = document_etag(document) if req.if_none_match and document['etag'] == req.if_none_match: # request etag matches the current server representation of the # document, return a 304 Not-Modified. return response, last_modified, document['etag'], 304 if req.if_modified_since and last_modified <= req.if_modified_since: # request If-Modified-Since conditional request match. We test # this after the etag since Last-Modified dates have lower # resolution (1 second). return response, last_modified, document['etag'], 304 response['_links'] = { 'self': document_link(resource, document[config.ID_FIELD]), 'collection': collection_link(resource), 'parent': home_link() } response.update(document) return response, last_modified, document['etag'], 200 abort(404)
def _pagination_links(resource, req, documents_count): """Returns the appropriate set of resource links depending on the current page and the total number of documents returned by the query. :param resource: the resource name. :param req: and instace of :class:`eve.utils.ParsedRequest`. :param document_count: the number of documents returned by the query. .. versionchanged:: 0.0.8 Link to last page is provided if pagination is enabled (and the current page is not the last one). .. versionchanged:: 0.0.7 Support for Rate-Limiting. .. versionchanged:: 0.0.5 Support for optional pagination. .. versionchanged:: 0.0.3 JSON links """ _links = {'parent': home_link(), 'self': collection_link(resource)} if documents_count and config.DOMAIN[resource]['pagination']: if req.page * req.max_results < documents_count: q = querydef(req.max_results, req.where, req.sort, req.page + 1) _links['next'] = { 'title': 'next page', 'href': '%s%s' % (resource_uri(resource), q) } # in python 2.x dividing 2 ints produces an int and that's rounded # before the ceil call. Have to cast one value to float to get # a correct result. Wonder if 2 casts + ceil() call are actually # faster than documents_count // req.max_results and then adding # 1 if the modulo is non-zero... last_page = int(math.ceil(documents_count / float(req.max_results))) q = querydef(req.max_results, req.where, req.sort, last_page) _links['last'] = { 'title': 'last page', 'href': '%s%s' % (resource_uri(resource), q) } if req.page > 1: q = querydef(req.max_results, req.where, req.sort, req.page - 1) _links['prev'] = { 'title': 'previous page', 'href': '%s%s' % (resource_uri(resource), q) } return _links
def _pagination_links(resource, req, documents_count): """Returns the appropriate set of resource links depending on the current page and the total number of documents returned by the query. :param resource: the resource name. :param req: and instace of :class:`eve.utils.ParsedRequest`. :param document_count: the number of documents returned by the query. .. versionchanged:: 0.0.8 Link to last page is provided if pagination is enabled (and the current page is not the last one). .. versionchanged:: 0.0.7 Support for Rate-Limiting. .. versionchanged:: 0.0.5 Support for optional pagination. .. versionchanged:: 0.0.3 JSON links """ _links = {'parent': home_link(), 'self': collection_link(resource)} if documents_count and config.DOMAIN[resource]['pagination']: if req.page * req.max_results < documents_count: q = querydef(req.max_results, req.where, req.sort, req.page + 1) _links['next'] = {'title': 'next page', 'href': '%s%s' % (resource_uri(resource), q)} # in python 2.x dividing 2 ints produces an int and that's rounded # before the ceil call. Have to cast one value to float to get # a correct result. Wonder if 2 casts + ceil() call are actually # faster than documents_count // req.max_results and then adding # 1 if the modulo is non-zero... last_page = int(math.ceil(documents_count / float(req.max_results))) q = querydef(req.max_results, req.where, req.sort, last_page) _links['last'] = {'title': 'last page', 'href': '%s%s' % (resource_uri(resource), q)} if req.page > 1: q = querydef(req.max_results, req.where, req.sort, req.page - 1) _links['prev'] = {'title': 'previous page', 'href': '%s%s' % (resource_uri(resource), q)} return _links
def getitem(resource, **lookup): """ Retrieves and returns a single document. :param resource: the name of the resource to which the document belongs. :param **lookup: the lookup query. .. versionchanged:: 0.0.4 Added the ``requires_auth`` decorator. .. versionchanged:: 0.0.3 Superflous ``response`` container removed. Links wrapped with ``_links``. Links are now properly JSON formatted. """ response = {} req = parse_request() document = app.data.find_one(resource, **lookup) if document: # need to update the document field as well since the etag must # be computed on the same document representation that might have # been used in the collection 'get' method last_modified = document[config.LAST_UPDATED] = \ document[config.LAST_UPDATED].replace(tzinfo=None) etag = document_etag(document) if req.if_none_match and etag == req.if_none_match: # request etag matches the current server representation of the # document, return a 304 Not-Modified. return response, last_modified, etag, 304 if req.if_modified_since and last_modified <= req.if_modified_since: # request If-Modified-Since conditional request match. We test # this after the etag since Last-Modified dates have lower # resolution (1 second). return response, last_modified, etag, 304 response['_links'] = { 'self': document_link(resource, document[config.ID_FIELD]), 'collection': collection_link(resource), 'parent': home_link() } response.update(document) return response, last_modified, etag, 200 abort(404)
def getitem(resource, **lookup): """ Retrieves and returns a single document. :param resource: the name of the resource to which the document belongs. :param **lookup: the lookup query. .. versionchanged: 0.0.8 'on_getting_item' event is raised when a document has been read from the database and is about to be sent to the client. .. versionchanged:: 0.0.7 Support for Rate-Limiting. .. versionchanged:: 0.0.6 Support for HEAD requests. .. versionchanged:: 0.0.6 ETag added to payload. .. versionchanged:: 0.0.5 Support for user-restricted access to resources. Support for LAST_UPDATED field missing from documents, because they were created outside the API context. .. versionchanged:: 0.0.4 Added the ``requires_auth`` decorator. .. versionchanged:: 0.0.3 Superflous ``response`` container removed. Links wrapped with ``_links``. Links are now properly JSON formatted. """ response = {} req = parse_request(resource) document = app.data.find_one(resource, **lookup) if document: # need to update the document field as well since the etag must # be computed on the same document representation that might have # been used in the collection 'get' method last_modified = document[config.LAST_UPDATED] = _last_updated(document) document['etag'] = document_etag(document) if req.if_none_match and document['etag'] == req.if_none_match: # request etag matches the current server representation of the # document, return a 304 Not-Modified. return response, last_modified, document['etag'], 304 if req.if_modified_since and last_modified <= req.if_modified_since: # request If-Modified-Since conditional request match. We test # this after the etag since Last-Modified dates have lower # resolution (1 second). return response, last_modified, document['etag'], 304 response['_links'] = { 'self': document_link(resource, document[config.ID_FIELD]), 'collection': collection_link(resource), 'parent': home_link() } # notify registered callback functions. Please note that, should the # functions modify the document, last_modified and etag won't be # updated to reflect the changes (they always reflect the documents # state on the database). getattr(app, "on_getting_item")(resource, document[config.ID_FIELD], document) response.update(document) return response, last_modified, document['etag'], 200 abort(404)
def standard_links(resource): """Returns the standard set of resource links that are included in every kind of GET response. """ return [home_link(), collection_link(resource)]
def getitem(resource, **lookup): """ Retrieves and returns a single document. :param resource: the name of the resource to which the document belongs. :param **lookup: the lookup query. .. versionchanged: 0.0.8 'on_getting_item' event is raised when a document has been read from the database and is about to be sent to the client. .. versionchanged:: 0.0.7 Support for Rate-Limiting. .. versionchanged:: 0.0.6 Support for HEAD requests. .. versionchanged:: 0.0.6 ETag added to payload. .. versionchanged:: 0.0.5 Support for user-restricted access to resources. Support for LAST_UPDATED field missing from documents, because they were created outside the API context. .. versionchanged:: 0.0.4 Added the ``requires_auth`` decorator. .. versionchanged:: 0.0.3 Superflous ``response`` container removed. Links wrapped with ``_links``. Links are now properly JSON formatted. """ response = {} req = parse_request(resource) document = app.data.find_one(resource, **lookup) if document: # need to update the document field as well since the etag must # be computed on the same document representation that might have # been used in the collection 'get' method last_modified = document[config.LAST_UPDATED] = _last_updated(document) document['etag'] = document_etag(document) if req.if_none_match and document['etag'] == req.if_none_match: # request etag matches the current server representation of the # document, return a 304 Not-Modified. return response, last_modified, document['etag'], 304 if req.if_modified_since and last_modified <= req.if_modified_since: # request If-Modified-Since conditional request match. We test # this after the etag since Last-Modified dates have lower # resolution (1 second). return response, last_modified, document['etag'], 304 response['_links'] = { 'self': document_link(resource, document[config.ID_FIELD]), 'collection': collection_link(resource), 'parent': home_link() } # notify registered callback functions. Please note that, should the # functions modify the document, last_modified and etag won't be # updated to reflect the changes (they always reflect the documents # state on the database). item_title = config.DOMAIN[resource]['item_title'].lower() getattr(app, "on_fetch_item")(resource, document[config.ID_FIELD], document) getattr(app, "on_fetch_item_%s" % item_title)(document[config.ID_FIELD], document) response.update(document) return response, last_modified, document['etag'], 200 abort(404)