Skip to content

Instantly share code, notes, and snippets.

@khanhkhuu
Last active June 13, 2023 07:51
Show Gist options
  • Save khanhkhuu/38fadfdf3529160909e577bb0e3a71e4 to your computer and use it in GitHub Desktop.
Save khanhkhuu/38fadfdf3529160909e577bb0e3a71e4 to your computer and use it in GitHub Desktop.
Domo Connector V2 for Python. Support CSV payload
from http.client import HTTPSConnection
from base64 import b64encode
import json
import pandas
class DomoConnector:
def __init__(self, client_id, client_secret):
self.__client_id = client_id
self.__client_secret = client_secret
def __basic_auth(self, username, password):
token = b64encode(f"{username}:{password}".encode('utf-8')).decode("ascii")
return f'Basic {token}'
def __get_oauth_token(self):
c = HTTPSConnection("api.domo.com")
headers = { 'Authorization' : self.__basic_auth(self.__client_id, self.__client_secret) }
c.request('GET', '/oauth/token?grant_type=client_credentials&scope=data', headers=headers)
res = c.getresponse()
data = res.read()
test = json.loads(data)
return test['access_token']
def update_json(self, data_set_id, json_data, append = False):
access_token = self.__get_oauth_token();
conn = HTTPSConnection("api.domo.com")
payload = json.dumps(json_data)
headers = {
'Authorization': 'Bearer ' + access_token,
'Content-Type': 'application/json'
}
conn.request("PUT", "/v1/json/" + data_set_id + "/data" + ('?updateMethod=APPEND' if append else ''), payload, headers)
res = conn.getresponse()
data = res.read()
return data.decode("utf-8")
def update_csv(self, data_set_id, csv_data, append = False):
access_token = self.__get_oauth_token();
conn = HTTPSConnection("api.domo.com")
payload = csv_data
headers = {
'Authorization': 'Bearer ' + access_token,
'Content-Type': 'text/csv'
}
conn.request("PUT", "/v1/datasets/" + data_set_id + "/data" + ('?updateMethod=APPEND' if append else ''), payload, headers)
res = conn.getresponse()
data = res.read()
return data.decode("utf-8")
def append_json(self, data_set_id, json_data):
return self.update(data_set_id, json_data, True)
def append_csv(self, data_set_id, csv_data):
return self.update_csv(data_set_id, csv_data, True)
def query(self, data_set_id, query_str = 'SELECT * FROM table'):
access_token = self.__get_oauth_token();
conn = HTTPSConnection("api.domo.com")
payload = json.dumps({"sql": query_str})
headers = {
'Authorization': 'Bearer ' + access_token,
'Content-Type': 'application/json'
}
conn.request("POST", "/v1/datasets/query/execute/" + data_set_id, payload, headers)
res = conn.getresponse()
data = res.read()
_json = json.loads(data.decode("utf-8"))
col_headers = _json['columns']
data_rows = _json['rows']
df = pandas.DataFrame(data=data_rows, columns=col_headers)
return df
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment