Source code for parsons.quickbase.quickbase

import logging
from parsons.etl.table import Table
from parsons.utilities import check_env
from parsons.utilities.api_connector import APIConnector


logger = logging.getLogger(__name__)


[docs]class Quickbase(object): """ Instantiate the Quickbase class `Args:` hostname: str The URL for the homepage/login page of the organization's Quickbase instance (e.g. demo.quickbase.com). user_token: str The Quickbase account user token (API key). Not required if ``QUICKBASE_USER_TOKEN`` env variable is set. `Returns:` Quickbase Class """ def __init__(self, hostname=None, user_token=None): self.hostname = check_env.check('QUICKBASE_HOSTNAME', hostname) self.user_token = check_env.check('QUICKBASE_USER_TOKEN', user_token) self.api_hostname = 'https://api.quickbase.com/v1' self.client = APIConnector(self.api_hostname, headers={'QB-Realm-Hostname': self.hostname, 'AUTHORIZATION': f'QB-USER-TOKEN {self.user_token}'})
[docs] def get_app_tables(self, app_id=None): """ Query records in a Quickbase table. This follows the patterns laid out in Quickbase query documentaiton, located here: https://help.quickbase.com/api-guide/componentsquery.html `Args:` app_id: str Identifies which Quickbase app from which to fetch tables. `Returns:` Table Class """ return Table(self.client.request( f'{self.api_hostname}/tables?appId={app_id}', 'GET').json())
[docs] def query_records(self, table_from=None): """ Query records in a Quickbase table. This follows the patterns laid out in Quickbase query documentaiton, located here: https://help.quickbase.com/api-guide/componentsquery.html `Args:` from: str The ID of a Quickbase resource (i.e. a table) to query. `Returns:` Table Class """ req_resp = \ (self.client.request(f'{self.api_hostname}/records/query', 'POST', json={"from": table_from}).json()) resp_tbl = Table(req_resp['data']) cleaned_tbl = Table() for row in resp_tbl: row_dict = {} for column in resp_tbl.columns: row_dict[column] = row[column]['value'] cleaned_tbl.concat(Table([row_dict])) cleaned_tbl.materialize() column_resp = req_resp['fields'] column_map = {} for entry in column_resp: column_map[str(entry['id'])] = entry['label'].lower().strip() for column in cleaned_tbl.columns: cleaned_tbl.rename_column(column, column_map[column]) return cleaned_tbl