def test_object_api_key(): cfg = config.get("toppings") kn = Knack(obj=cfg['obj'], app_id=AUTH['app_id'], api_key=AUTH['api_key'], page_limit=2, rows_per_page=10) assert len(kn.data) > 0
def test_object_api_key(self): from knackpy import Knack app = self.apps['object_api_key'] kn = Knack(obj=app['obj'], app_id=app['app_id'], api_key=app['api_key'], page_limit=2, rows_per_page=10) assert len(kn.data) == 20
def test_scene_view_no_api_key(self): from knackpy import Knack app = self.apps['scene_view_no_api_key'] kn = Knack(scene=app['scene'], view=app['view'], app_id=app['app_id'], page_limit=1, rows_per_page=10) assert len(kn.data_raw) > 0
def test_scene_view_with_api_key(): cfg = config.get("toppings") kn = Knack(scene=cfg['scene'], view=cfg['view'], ref_obj=cfg['ref_obj'], app_id=AUTH['app_id'], api_key=AUTH['api_key'], page_limit=2, rows_per_page=10) assert len(kn.data) > 0
def test_scene_view_with_api_key(self): from knackpy import Knack app = self.apps['scene_view_with_api_key'] kn = Knack(scene=app['scene'], view=app['view'], ref_obj=app['ref_obj'], app_id=app['app_id'], api_key=app['api_key'], page_limit=2, rows_per_page=10) assert len(kn.data) == 20
def update_output(contents): kn = Knack(obj='object_17', app_id='59ca76c0e4c83424df3eee62', api_key='a0998110-a889-11e7-9b23-7d5afe966012 ') # added if contents is not None: content_type, content_string = contents.split(',') if 'csv' in content_type: knack_csv = pd.read_csv( io.StringIO( pybase64.b64decode(content_string).decode('utf-8'))) knack_db = pd.DataFrame(kn.data) knack_db.drop('Email', axis=1, inplace=True) knack_db['LinkedIn profile'] = knack_db['LinkedIn profile_url'] #rename knack data to fit the new data knack_db.rename(columns={ 'Participant Name_first': 'First', 'Participant Name_last': 'Last', 'Address_city': 'City', 'Email_email': 'Email', 'Address_street': 'street', 'Address_country': 'Country', 'Address_state': 'State', 'Address_zip': 'Zip' }, inplace=True) knack_db.id = '' knack_db.drop([ 'Address_latitude', 'Address_longitude', 'Address', 'Participant Name_middle', 'Participant Name_title', ], axis=1, inplace=True) knack_db = knack_db[knack_csv.columns.tolist()] knack_db['Current Time Equation'] = '' knack_db['Date added'] = '' knack_db['Last updated'] = '' knack_db.Phone = knack_db.Phone.apply(pd.Series).iloc[::, 3:4] for col in knack_csv.columns.tolist(): knack_csv[col] = knack_csv[col].astype('object') list_of_columns = [ 'First', 'Last', 'Company is sponsor user', 'SU', 'Company name', 'street', 'Zip', 'City', 'State', 'Country', 'Time zone', 'Recruiting source', 'Phone', 'Email', 'LinkedIn profile', 'Total compensation this year', 'Personas', 'Date added', 'Last updated', 'Updated by', 'Wants to participate in future activities?', 'Age range', 'Years in current role', 'Years in current industry', 'Job duties', 'Time Zone Selector', 'Tome Zone Hours', 'Current Time Equation', 'Business Model', 'Company size', 'Company Revenue', 'Team size', 'Industry', 'Job title', 'Role/Responsibilities', 'WCE Products used', 'UserTesting ID', 'id' ] knack_csv = knack_csv[list_of_columns] knack_csv = knack_csv.apply(lambda x: x.astype('str')) knack_csv = knack_csv.replace('nan', '', regex=True) knack_csv['Company size'] = knack_csv['Company size'].str.split( '.', expand=True)[0] knack_db = knack_db[list_of_columns] knack_db = knack_db.apply(lambda x: x.astype('str')) knack_db = knack_db.replace('nan', '', regex=True) knack_csv = knack_csv.apply(lambda x: x.str.title()) knack_db = knack_db.apply(lambda x: x.str.title()) knack_csv = knack_csv.astype(knack_db.dtypes.to_dict()) df_knack = knack_csv.merge(knack_db, how='left', indicator=True) received = df_knack.shape[0] df_knack = df_knack[df_knack['_merge'] == 'left_only'] df_knack.drop('_merge', axis=1, inplace=True) df_knack.columns = cols.values() # Ectract other non objects values in their dataframe df_knack_sub1 = df_knack.iloc[::, 2:5] df_knack_sub2 = df_knack.iloc[::, 10:38] df_knack_sub = pd.concat([df_knack_sub1, df_knack_sub2], axis=1) # convert data into dict df_knack_sub_dict = df_knack_sub.to_dict(orient='records') dict_with_values = [] for dict_data in df_knack_sub_dict: dic = {i: j for i, j in dict_data.items() if j != 'N/A'} dict_with_values.append(dic) # lets get the name objects bio_object = df_knack.iloc[::, 0:2] bio_object_dict = bio_object.to_dict(orient='records') #lets get address objects address_object = df_knack.iloc[::, 5:10] address_object.columns = address_object.columns.str.lower() address_object_dict = address_object.to_dict(orient='records') bio_val = [] for i, dicti in enumerate(dict_with_values): dicti['field_298'] = bio_object_dict[i] bio_val.append(dicti) bio_val_addr = [] for i, dicti in enumerate(bio_val): dicti["field_301"] = address_object_dict[i] bio_val_addr.append(dicti) all_data = [] for record in bio_val_addr: response = knackpy.record( record, obj_key='object_17', app_id='59ca76c0e4c83424df3eee62', api_key='a0998110-a889-11e7-9b23-7d5afe966012', method='create') all_data.append(record) return html.Div(children=[ '{} records received, {} unique record succesfully loaded into Knack' .format(received, len(all_data)) ], style={ 'text-align': 'center', 'width': '600px', 'margin-left': '520px', 'margin-bottom': '300px', 'backgroundColor': '#e3c9c9' }, className= "alert alert-success alert-dismissible fade show") elif 'xlsx' in content_type: return html.Div([ html. h5("Knack migrate does not allow excel files files, save your file as csv" ) ]) else: return html.Div([html.h5(html.P("Wrong file upload"))])
from knackpy import Knack filters = { 'match': 'and', 'rules': [ { 'field':'field_208', 'operator':'is', 'value':'06/27/2020' }, { 'field':'field_148', 'operator':'is', 'value':'Complete' } ] } kn = Knack( obj = 'object_17', app_id = '5ee26710da32c300153905ca', api_key = 'abde5d40-ae8d-11ea-8cd1-1dc626a4204b', filters=filters ) for row in kn.data: print(row) kn.to_csv('c:\data\cert.csv')
def profile(): kn = Knack(obj='object_17', app_id='59ca76c0e4c83424df3eee62', api_key='a0998110-a889-11e7-9b23-7d5afe966012 ') info = oidc.user_getinfo(["sub", "name", "email"]) if request.method == 'POST': if 'file' not in request.files: print('No file attached in request') return redirect(request.url) knack_csv = pd.read_csv(request.files.get('file')) knack_db = pd.DataFrame(kn.data) knack_db.drop('Email', axis=1, inplace=True) knack_db['LinkedIn profile'] = knack_db['LinkedIn profile_url'] #rename knack data to fit the new data knack_db.rename(columns={ 'Participant Name_first': 'First', 'Participant Name_last': 'Last', 'Address_city': 'City', 'Email_email': 'Email', 'Address_street': 'street', 'Address_country': 'Country', 'Address_state': 'State', 'Address_zip': 'Zip' }, inplace=True) knack_db.id = '' knack_db.drop([ 'Address_latitude', 'Address_longitude', 'Address', 'Participant Name_middle', 'Participant Name_title', ], axis=1, inplace=True) knack_db = knack_db[knack_csv.columns.tolist()] knack_db['Current Time Equation'] = '' knack_db['Date added'] = '' knack_db['Last updated'] = '' knack_db.Phone = knack_db.Phone.apply(pd.Series).iloc[::, 3:4] for col in knack_csv.columns.tolist(): knack_csv[col] = knack_csv[col].astype('object') for col in knack_csv.columns.tolist(): knack_csv[col] = knack_csv[col].astype('object') list_of_columns = [ 'First', 'Last', 'Company is sponsor user', 'SU', 'Company name', 'street', 'Zip', 'City', 'State', 'Country', 'Time zone', 'Recruiting source', 'Phone', 'Email', 'LinkedIn profile', 'Total compensation this year', 'Personas', 'Date added', 'Last updated', 'Updated by', 'Wants to participate in future activities?', 'Age range', 'Years in current role', 'Years in current industry', 'Job duties', 'Time Zone Selector', 'Tome Zone Hours', 'Current Time Equation', 'Business Model', 'Company size', 'Company Revenue', 'Team size', 'Industry', 'Job title', 'Role/Responsibilities', 'WCE Products used', 'UserTesting ID', 'id' ] knack_csv = knack_csv[list_of_columns] knack_csv = knack_csv.apply(lambda x: x.astype('str')) knack_csv = knack_csv.replace('nan', '', regex=True) knack_csv['Company size'] = knack_csv['Company size'].str.split( '.', expand=True)[0] knack_db = knack_db[list_of_columns] knack_db = knack_db.apply(lambda x: x.astype('str')) knack_db = knack_db.replace('nan', '', regex=True) knack_csv = knack_csv.apply(lambda x: x.str.title()) knack_db = knack_db.apply(lambda x: x.str.title()) knack_csv = knack_csv.astype(knack_db.dtypes.to_dict()) df_knack = knack_csv.merge(knack_db, how='left', indicator=True) received = df_knack.shape[0] df_knack = df_knack[df_knack['_merge'] == 'left_only'] df_knack.drop('_merge', axis=1, inplace=True) df_knack.columns = cols.values() # Ectract other non objects values in their dataframe df_knack_sub1 = df_knack.iloc[::, 2:5] df_knack_sub2 = df_knack.iloc[::, 10:38] df_knack_sub = pd.concat([df_knack_sub1, df_knack_sub2], axis=1) # convert data into dict df_knack_sub_dict = df_knack_sub.to_dict(orient='records') # only retrieve those with values dict_with_values = [] for dict_data in df_knack_sub_dict: dic = {i: j for i, j in dict_data.items() if j != 'N/A'} dict_with_values.append(dic) # lets get the name objects bio_object = df_knack.iloc[::, 0:2] bio_object_dict = bio_object.to_dict(orient='records') #lets get address objects address_object = df_knack.iloc[::, 5:10] address_object.columns = address_object.columns.str.lower() address_object_dict = address_object.to_dict(orient='records') bio_val = [] for i, dicti in enumerate(dict_with_values): dicti['field_298'] = bio_object_dict[i] bio_val.append(dicti) bio_val_addr = [] for i, dicti in enumerate(bio_val): dicti["field_301"] = address_object_dict[i] bio_val_addr.append(dicti) all_data = [] for record in bio_val_addr: response = knackpy.record( record, obj_key='object_17', app_id='59ca76c0e4c83424df3eee62', api_key='a0998110-a889-11e7-9b23-7d5afe966012', method='create') all_data.append(record) # output = pd.DataFrame(all_data) text = '{} records received, {} unique record succesfully loaded into Knack'.format( received, len(all_data)) return render_template('profile.html', text=text, oidc=oidc) return render_template("profile.html", profile=info, oidc=oidc)