Source code for fasjson.web.utils.pagination

import math

from flask import current_app, request
from flask_restx import marshal, reqparse


page_request_parser = reqparse.RequestParser()
page_request_parser.add_argument("page_size", type=int, help="Page size.")
page_request_parser.add_argument("page_number", type=int, default=1, help="Page number.")


[docs] def add_page_data(output, result, model): """Use the pagination data from the LDAP result to add page info to the output. This function adds a dictionary with pagination info in a ``page`` key in the output dictionary. The pagination dictionary contains: * ``page_number``: the current page number * ``page_size``: the number of items per page * ``total_results``: the total number of items in the entire recordset * ``total_pages``: the number of pages available * ``next_page``: the URL to the next page if there is one. On the last page, this key is absent. If the query was not paginated, this ``page`` dictionary is not added to the output dictionary. This function does not return anything, the output dictionary is modified in-place. """ if not result.page_size: return total_pages = math.ceil(result.total / result.page_size) output["page"] = { "total_results": result.total, "page_size": result.page_size, "page_number": result.page_number, "total_pages": total_pages, } if result.page_number < total_pages: qs = request.args.copy() qs.update( { "page_size": result.page_size, "page_number": result.page_number + 1, } ) qs = "&".join(f"{k}={v}" for k, v in qs.items()) base_url = request.base_url output["page"]["next_page"] = f"{base_url}?{qs}"
[docs] def paged_marshal(result, model, **kwargs): if kwargs.get("mask") is None: mask_header = current_app.config["RESTX_MASK_HEADER"] kwargs["mask"] = request.headers.get(mask_header) output = marshal(result.items, model, envelope="result", **kwargs) add_page_data(output, result, model) return output