68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
from more_utils.httpClient import HttpClient
|
|
|
|
|
|
|
|
class Pagionation():
|
|
def __init__(self, http_client, target_url, target_params=None, headers=None, list_item="result"):
|
|
#self.__target_class = target_class
|
|
self.__http_client: HttpClient = http_client
|
|
self.__target_url = target_url
|
|
self.__target_params = target_params
|
|
self.__headers = headers
|
|
self.__list_item = list_item
|
|
self._has_next_page = True
|
|
self.__total_count = None
|
|
self.__page_size = None
|
|
self.elements = self._get_next_page()
|
|
|
|
|
|
|
|
def __iter__(self):# -> Iterator[T]:
|
|
for element in self.__elements:
|
|
yield element
|
|
|
|
while self._has_next_page:
|
|
new_elements = self._get_next_page()
|
|
for element in new_elements:
|
|
yield element
|
|
|
|
|
|
def __len__(self):
|
|
return self.__total_count or len(self.__elements)
|
|
|
|
def _get_next_page(self):
|
|
response = self.__http_client.make_request(self.__target_url, params=self.__target_params, headers=self.__headers)
|
|
json_response = response.json()
|
|
data = []
|
|
if json_response.get("nextPageKey", None):
|
|
self._has_next_page = True
|
|
self.__target_params = {"nextPageKey": json_response["nextPageKey"]}
|
|
else:
|
|
self._has_next_page = False
|
|
|
|
if self.__list_item in json_response:
|
|
elements = json_response[self.__list_item]
|
|
self.__total_count = json_response.get("totalCount") or len(elements)
|
|
|
|
while self._has_next_page == True:
|
|
self.__target_url = self.__target_url.split("?")[0]
|
|
elements += self._get_response()
|
|
|
|
return elements
|
|
|
|
def _get_response(self):
|
|
response = self.__http_client.make_request(self.__target_url, params=self.__target_params, headers=self.__headers)
|
|
json_response = response.json()
|
|
data = []
|
|
if json_response.get("nextPageKey", None):
|
|
self._has_next_page = True
|
|
self.__target_params = {"nextPageKey": json_response["nextPageKey"]}
|
|
else:
|
|
self._has_next_page = False
|
|
|
|
if self.__list_item in json_response:
|
|
elements = json_response[self.__list_item]
|
|
self.__total_count = json_response.get("totalCount") or len(elements)
|
|
|
|
|
|
return elements |