Paul_s
05/25/2023, 11:42 AMpablo
05/25/2023, 1:43 PMpython
?Paul_s
05/25/2023, 1:44 PMpablo
05/25/2023, 1:45 PMPaul_s
05/25/2023, 1:49 PMpablo
05/25/2023, 2:01 PMpablo
05/25/2023, 2:04 PMdef get_netsuite_session(secrets: dict) -> OAuth1Session:
session = OAuth1Session(
client_key=secrets['CONSUMER_KEY'],
client_secret=secrets['CONSUMER_SECRET'],
resource_owner_key=secrets['ACCESS_TOKEN'],
resource_owner_secret=secrets['ACCESS_TOKEN_SECRET'],
realm=secrets['REALM'],
signature_type='AUTH_HEADER',
signature_method='HMAC-SHA256')
return session
Paul_s
05/25/2023, 2:10 PMpablo
05/25/2023, 2:17 PMPaul_s
05/25/2023, 2:20 PMpablo
05/25/2023, 2:21 PMdef get_netsuite_data(env: str, query: str):
secrets = get_netsuite_secret(env)
with get_netsuite_session(secrets=secrets) as session:
url = f"https://{secrets['REALM']}.<http://suitetalk.api.netsuite.com/services/rest/query/v1/suiteql|suitetalk.api.netsuite.com/services/rest/query/v1/suiteql>"
headers = {'Content-Type': 'application/json', 'Prefer': 'transient'}
payload = {'q': query}
row_count = 0
results = []
try:
while True:
response = <http://session.post|session.post>(url=url, headers=headers, json=payload)
response.raise_for_status()
count, total_results, next_url, items = parse_suiteql_response(resp=response)
results += items
row_count += count
print(f'retrieved {row_count} rows out of {total_results}.\nnext URL is: {next_url}\n')
if next_url:
url = next_url
else:
break
except requests.exceptions.HTTPError as e:
raise Exception(f'SuiteQL request failed. {e}. Status Code: Response: {response.text}')
# df = pd.json_normalize(results)
return results
You would be able to retrieve all data from a call without needing to concern yourself with the limit/offset -- since it is provided for you in the response of your initial call (if there are more records to retrieve), that is the next_url
.Paul_s
05/25/2023, 2:22 PMpablo
05/25/2023, 2:23 PMPaul_s
05/25/2023, 2:24 PMpablo
05/25/2023, 2:26 PMpablo
05/25/2023, 2:26 PMdef parse_suiteql_response(resp: requests.Response):
items = resp.json()['items']
count = resp.json()['count']
total_results = resp.json()['totalResults']
has_more = resp.json()['hasMore']
next_url = None
if has_more:
next_url = next(link for link in resp.json()['links'] if link['rel'] == 'next')['href']
return count, total_results, next_url, items
Paul_s
05/25/2023, 2:27 PMpablo
05/25/2023, 3:06 PM