Skip to content

Commit 618c14b

Browse files
committed
Spliting update_next_page method
1 parent be23c4e commit 618c14b

2 files changed

Lines changed: 63 additions & 33 deletions

File tree

python-lib/pagination.py

Lines changed: 62 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ def __init__(self, config=None, skip_key=None, limit_key=None, total_key=None, n
1111
self.next_page_key = None
1212
self.next_page_url_base = None
1313
self.skip_key = None
14-
self.limit_key = None
15-
self.total_key = None
16-
self.total = None
1714
self.next_page_url = None
1815
self.remaining_records = None
1916
self.records_to_skip = None
@@ -26,10 +23,10 @@ def __init__(self, config=None, skip_key=None, limit_key=None, total_key=None, n
2623
self.next_page_number = None
2724
self.params_must_be_blanked = False
2825
self.data_is_list = None
26+
self.update_next_page = None
2927

3028
def configure_paging(self, config=None, skip_key=None, limit_key=None, total_key=None, next_page_key=None, next_page_url_base=None, url=None, pagination_type="na"):
3129
config = {} if config is None else config
32-
self.limit_key = config.get("limit_key", limit_key)
3330
self.pagination_type = config.get("pagination_type", pagination_type)
3431
if self.pagination_type == "next_page":
3532
self.next_page_key = config.get("next_page_key", next_page_key)
@@ -39,9 +36,15 @@ def configure_paging(self, config=None, skip_key=None, limit_key=None, total_key
3936
self.next_page_url_base = next_page_url_base
4037
elif self.pagination_type in ["offset", "page"]:
4138
self.skip_key = config.get("skip_key", skip_key)
42-
logger.info("configure_paging: self.limit_key='{}', self.pagination_type='{}', self.next_page_key='{}', self.next_page_url_base='{}', self.skip_key='{}'".format(
43-
self.limit_key, self.pagination_type, self.next_page_key, self.next_page_url_base, self.skip_key
39+
logger.info("configure_paging: self.pagination_type='{}', self.next_page_key='{}', self.next_page_url_base='{}', self.skip_key='{}'".format(
40+
self.pagination_type, self.next_page_key, self.next_page_url_base, self.skip_key
4441
))
42+
if self.pagination_type == "next_page":
43+
self.update_next_page = self.update_next_page_link
44+
elif self.pagination_type == "offset":
45+
self.update_next_page = self.update_next_page_offset
46+
elif self.pagination_type == "page":
47+
self.update_next_page = self.update_next_page_per_page
4548

4649
def reset_paging(self, counting_key=None, url=None):
4750
self.remaining_records = 0
@@ -62,19 +65,10 @@ def set_counting_key(self, counting_key):
6265
self.counting_key = counting_key
6366
logger.info("set_counting_key: counting_key set to {}".format(self.counting_key))
6467

65-
def update_next_page(self, data, response_links=None):
66-
response_links = response_links or {}
67-
next_link = response_links.get('next', {})
68-
next_page_url = next_link.get("url")
68+
def update_next_page_offset(self, data, response_links=None):
6969
self.is_first_batch = False
7070
self.counter += 1
7171
self.next_page_number = self.next_page_number + 1
72-
if next_page_url:
73-
self.next_page_url = next_page_url
74-
self.params_must_be_blanked = True
75-
logger.info("update_next_page:next_link={}, next_page_url={}, params_must_be_blanked={}, next_page_number={}, counter={}".format(
76-
next_link, self.next_page_url, self.params_must_be_blanked, self.next_page_number, self.counter
77-
))
7872
self.data_is_list = False
7973
if isinstance(data, list):
8074
self.data_is_list = True
@@ -95,6 +89,58 @@ def update_next_page(self, data, response_links=None):
9589
self.is_last_batch_empty = True
9690
else:
9791
batch_size = 1
92+
if self.skip_key:
93+
self.skip = data.get(self.skip_key)
94+
logger.info("update_next_page:skip=data[{}]={}".format(self.skip_key, self.skip))
95+
self.records_to_skip = self.records_to_skip + batch_size
96+
logger.info("update_next_page:records_to_skip={}, batch_size={}".format(self.records_to_skip, batch_size))
97+
98+
99+
def update_next_page_per_page(self, data, response_links=None):
100+
self.is_first_batch = False
101+
self.counter += 1
102+
self.next_page_number = self.next_page_number + 1
103+
self.data_is_list = False
104+
if isinstance(data, list):
105+
self.data_is_list = True
106+
batch_size = len(data)
107+
self.records_to_skip = self.records_to_skip + batch_size
108+
if batch_size == 0:
109+
self.is_last_batch_empty = True
110+
logger.info("update_next_page:update_next_page:data is list:batch_size={}, records_to_skip={}, is_last_batch_empty={}".format(
111+
batch_size, self.records_to_skip, self.is_last_batch_empty
112+
))
113+
return
114+
elif self.counting_key:
115+
extracted_data = get_value_from_path(data, self.counting_key.split("."), can_raise=False)
116+
if extracted_data:
117+
batch_size = len(extracted_data)
118+
else:
119+
batch_size = 0
120+
self.is_last_batch_empty = True
121+
else:
122+
batch_size = 1
123+
if self.skip_key:
124+
self.skip = data.get(self.skip_key)
125+
logger.info("update_next_page:skip=data[{}]={}".format(self.skip_key, self.skip))
126+
self.records_to_skip = self.records_to_skip + batch_size
127+
logger.info("update_next_page:records_to_skip={}, batch_size={}".format(self.records_to_skip, batch_size))
128+
129+
130+
def update_next_page_link(self, data, response_links=None):
131+
response_links = response_links or {}
132+
next_link = response_links.get('next', {})
133+
next_page_url = next_link.get("url")
134+
self.is_first_batch = False
135+
self.counter += 1
136+
# self.next_page_number = self.next_page_number + 1
137+
if next_page_url:
138+
self.next_page_url = next_page_url
139+
self.params_must_be_blanked = True
140+
logger.info("update_next_page:next_link={}, next_page_url={}, params_must_be_blanked={}, next_page_number={}, counter={}".format(
141+
next_link, self.next_page_url, self.params_must_be_blanked, self.next_page_number, self.counter
142+
))
143+
self.data_is_list = False
98144
if self.next_page_key:
99145
next_page_path = extract_key_using_json_path(data, self.next_page_key)
100146
if self.next_page_url_base and next_page_path:
@@ -104,22 +150,6 @@ def update_next_page(self, data, response_links=None):
104150
logger.info("update_next_page:next_page_url_base={}, next_page_path={}, next_page_url={}".format(
105151
self.next_page_url_base, next_page_path, self.next_page_url
106152
))
107-
if self.skip_key:
108-
self.skip = data.get(self.skip_key)
109-
logger.info("update_next_page:skip=data[{}]={}".format(self.skip_key, self.skip))
110-
if self.limit_key:
111-
self.limit = data.get(self.limit_key)
112-
logger.info("update_next_page:limit=data[{}]={}".format(self.limit_key, self.limit))
113-
if self.total_key:
114-
self.total = data.get(self.total_key)
115-
logger.info("update_next_page:total=data[{}]={}".format(self.total_key, self.total))
116-
self.records_to_skip = self.records_to_skip + batch_size
117-
logger.info("update_next_page:records_to_skip={}, batch_size={}".format(self.records_to_skip, batch_size))
118-
if self.total:
119-
self.remaining_records = self.total - self.records_to_skip
120-
logger.info("update_next_page:remaining_records={}, total={}, records_to_skip={}".format(
121-
self.remaining_records, self.total, self.records_to_skip
122-
))
123153

124154
def has_next_page(self):
125155
if self.is_last_batch_empty:

python-lib/rest_api_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ def request(self, method, url, can_raise_exeption=True, **kwargs):
160160
try:
161161
json_response = response.json()
162162
except Exception as err:
163-
self.pagination.update_next_page({}, response.links)
163+
self.pagination.update_next_page({}, None)
164164
error_message = "Error '{}' when decoding JSON".format(str(err)[:100])
165165
logger.error(error_message)
166166
logger.error("response.content={}".format(response.content))

0 commit comments

Comments
 (0)