Source code for fineract.pagination
import math
[docs]class PaginatedList:
"""This class represents a paginated list of items fetched from a Fineract API
:param klass: Child class of a :class:`fineract.objects.fineract_object.FineractObject`
:param request_handler: :class:`fineract.handlers.RequestHandler`
:param url: Endpoint to be called
:param params: dict Extra payload to pass during the call
:param list_item: Response field holding the items
:param page: int Page to return
"""
def __init__(self, klass, request_handler, url, params, list_item='pageItems', page=1):
self._request_handler = request_handler
self._klass = klass
self._url = url
self._params = params or {}
self._params['limit'] = self._request_handler.per_page
self._params['offset'] = (page - 1) * self._params['limit']
self._list_item = list_item
self._total_count = None
self._no_pagination = None
self._elements = list()
self._load_data()
def _load_data(self):
data = self._request_handler.make_request(
'GET',
self._url,
params=self._params
)
data = data if data else {}
if isinstance(data, dict):
if self._list_item in data:
self.__total_count = data.get('totalFilteredRecords')
data = data[self._list_item]
else:
data = []
else:
self._no_pagination = True
self._elements = [
self._klass(self._request_handler, element, False)
for element in data if element is not None
]
@property
def total_count(self):
"""Returns total count of items"""
if self._total_count is None:
self._total_count = len(self._elements)
return self._total_count
@property
def total_pages(self):
"""Return total pages"""
total = self.total_count
if self._no_pagination and total:
return 1
return math.ceil(total / self._params['limit'])
[docs] def get_next(self):
"""Load next page of items"""
self._params['offset'] = (self._params['offset'] + 1) * self._params['limit']
self._load_data()
[docs] def has_next(self):
"""Check if there is another page
:rtype: bool
"""
if self._no_pagination:
return False
return any(self._elements)
def __iter__(self):
for element in self._elements:
yield element
def __getitem__(self, item):
return self._elements[item]