Working on Cvent API related

This commit is contained in:
Scott Idem
2022-01-31 19:37:02 -05:00
parent 1d39a01ded
commit 779bbb2f82
9 changed files with 404 additions and 111 deletions

View File

@@ -318,7 +318,7 @@ def create_contact_obj(
create_sub_obj: bool = False,
fail_any: bool = False, # Fail if any thing goes wrong for sub objects
) -> int|bool:
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# ### SECTION ### Secondary data validation

View File

@@ -0,0 +1,169 @@
from __future__ import annotations
import datetime, pprint, pytz, random, requests
from requests.auth import HTTPBasicAuth
from typing import Dict, List, Optional, Set, Union
from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator
from app.db_sql import redis_lookup_id_random, sql_insert, sql_select, sql_update
from app.lib_general import log, logging
from app.methods.person_methods import get_person_rec_w_external_id, load_person_obj, update_person_kiss
app = {}
app['client_id'] = '0oalt6dz82oSbN9ok1t7' # From Cvent Developer Portal
app['secret'] = 'gQY96qffZAuB_44k73C_hn_MHeByBS8LXHj1vPRm' # From Cvent Developer
api = {}
api['base_url'] = 'https://api-platform.cvent.com/ea' # Including /ea as the Cvent version. EA = Early Access
api['headers'] = {} # { 'Content-Type': content_type, 'Authorization': 'Basic '+str(cvent_authorization_base64) }
# def get_access_token(api, app):
def get_access_token():
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
log.debug(f'API data:\n{api}')
# api['access_token'] = 'eyJraWQiOiJXdWtMTUFGNFkxM1ZUQmFnV1I4WU94ZVdPU3dIYXM5RTRyaFhqc1p5X2JVIiwiYWxnIjoiUlMyNTYifQ.eyJ2ZXIiOjEsImp0aSI6IkFULmltZGJlbnJIbnE1Rjd4blhucEN2Y0ExTzdCWUtCUWhUTU1fQUdxd1Z0RUUiLCJpc3MiOiJodHRwczovL3Nzby5jdmVudC5jb20vb2F1dGgyL2F1c2kzbXowZjNvRENNMlRpMXQ3IiwiYXVkIjoiYXBpLXBsYXRmb3JtIiwiaWF0IjoxNjQzNjYxMTc1LCJleHAiOjE2NDM2NjQ3NzUsImNpZCI6IjBvYWx0NmR6ODJvU2JOOW9rMXQ3Iiwic2NwIjpbImV2ZW50L2NvbnRhY3QtZ3JvdXBzOnJlYWQiLCJldmVudC9jdXN0b20tZmllbGRzOnJlYWQiLCJldmVudC9jb250YWN0czpyZWFkLXNlbnNpdGl2ZSIsImV2ZW50L2NvbnRhY3RzOndyaXRlIiwiZXZlbnQvY29udGFjdHM6cmVhZCJdLCJzdWIiOiIwb2FsdDZkejgyb1NiTjlvazF0NyJ9.1BGae5F97OpRVlW_z7JFwhFuY5xSj-CTCdph4dy3mSW1fjSb2rXoTTMNqdBwssG8S5XD62MYabx1WpM9xHB1WPw4ydP3xDqpMDO_h1Im1wfdlkami8Xvm1vX293IibEG8sZwjmD7x1UoWE7svwLLKJ8yukpJXaQbrd3qhFpfCyyi-eFYLYYjRjkMaGSBDMQKUv9VV62afGNekkC3ARNJzUqe0Il6Wz7aj109q_gvFYr6XybYdMvXanWxoY9C2-b7g1AtmN7iGRqz2znIHLr7Vav8xvoXYXaWzaq1gbfd4QwrksBCaw4lpZWKJdM0bhCaiOiPGfKktGVQN2r0gaQ0nA'
if 'access_token' in api:
access_token = api.get('access_token')
log.info(f'Cvent Access Token found: {access_token}')
if 'expire_on' in api and datetime.datetime.now() < api['expire_on']:
expire_on = api.get('expire_on')
log.info(f'Cvent Access Token is current: {expire_on}')
return api
endpoint = '/oauth2/token'
uri = api['base_url']+endpoint
data = { 'grant_type': 'client_credentials', 'client_id': app['client_id'] }
log.debug(f'Oauth Token Request Data:\n{api}')
resp = requests.post(url=uri, data=data, auth=HTTPBasicAuth(app['client_id'], app['secret'])) # Sending as HTML form data
log.debug(f'Status Code: {resp.status_code}')
log.debug(f'Headers: {resp.headers}')
log.debug(f'Encoding: {resp.encoding}')
log.debug(f'JSON: {resp.json()}')
# log.debug('Text:', resp.text)
response_data = resp.json()
api['access_token'] = response_data['access_token']
api['expires_in'] = response_data['expires_in']
api['token_type'] = response_data['token_type']
# current_datetime = datetime.datetime.now()
# log.debug(type(current_datetime))
# log.debug(current_datetime)
# expires_in = response_data['expires_in']
# log.debug(type(expires_in))
# log.debug(expires_in)
api['expire_on'] = datetime.datetime.now() + datetime.timedelta(seconds=response_data['expires_in'])
# log.debug(type(api['expire_on']))
# log.debug(api['expire_on'])
api['headers']['Accept'] = 'application/json'
api['headers']['x-api-key'] = app['client_id']
api['headers']['Authorization'] = 'Bearer '+api['access_token']
log.debug(api)
# f = open("api_access.txt", "wb")
# f.write(pprint.pformat(api, indent=2, width=160))
# pickle.dump(api, f)
# f.close()
return api
def get_contact_custom_field_list(api):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
endpoint = '/custom-fields'
uri = api['base_url']+endpoint
params = { 'filter': "category eq 'Contact'" }
resp = requests.get(url=uri, headers=api['headers'], params=params)
log.debug('Status Code:', resp.status_code)
log.debug('Headers:', resp.headers)
log.debug('Encoding:', resp.encoding)
log.debug('JSON:', resp.json())
# log.debug('Text:', resp.text)
response_data = resp.json()
# f = open('contact_custom_field_list.txt', 'w')
# f.write(pprint.pformat(response_data, indent=2, width=160))
return response_data
def get_contact_list(api, external_id=False):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
endpoint = '/contacts'
uri = api['base_url']+endpoint
# External ID for IDAA: UUID = '609ab766-7d79-4a9d-a72c-f126412659ee'
# customField.609ab766-7d79-4a9d-a72c-f126412659ee eq external_id
params = {}
if external_id: params['filter'] = f"customField.609ab766-7d79-4a9d-a72c-f126412659ee eq '{external_id}'"
elif external_id is None:
params['filter'] = f"deleted eq 'False' and customField.609ab766-7d79-4a9d-a72c-f126412659ee lt '1'"
else: params['filter'] = f"deleted eq 'False'"
resp = requests.get(url=uri, headers=api['headers'], params=params)
response_data = resp.json()
# if external_id: filename = f'contact_{external_id}.txt'
# elif external_id is None: filename = f'contact_list_no_external_id.txt'
# else: filename = 'contact_list.txt'
# f = open(filename, 'w')
# f.write(pprint.pformat(response_data, indent=2, width=160))
return response_data
# def get_contact_id(api, contact_id):
def get_contact_id(contact_id):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# if 'access_token' in api: pass
# else: get_access_token()
get_access_token()
endpoint = f'/contacts/{contact_id}'
uri = api['base_url']+endpoint
params = {}
resp = requests.get(url=uri, headers=api['headers'], params=params)
response_data = resp.json()
log.debug(response_data)
if 'message' in response_data and response_data['message'] == 'Too Many Requests': return False
# filename = f'contact_{contact_id}.txt'
# f = open(filename, 'w')
# f.write(pprint.pformat(response_data, indent=2, width=160))
return response_data

View File

@@ -64,10 +64,11 @@ def load_membership_person_obj(
try:
membership_person_obj = Membership_Person_Base(**membership_person_rec)
log.debug(membership_person_obj)
except ValidationError as e:
log.error(e.json())
return False
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(membership_person_obj)
# Updated 2021-06-24
@@ -423,7 +424,7 @@ def create_membership_person_obj(
membership_person_obj.account_id = account_id
membership_person_obj.person_id = person_id
membership_person_dict = membership_person_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'membership_cfg', 'membership_person_group_list', 'membership_person_profile', 'membership_person_type', 'membership_group', 'membership_group_list', 'membership_type', 'membership_type_list', 'person', 'product', 'created_on', 'updated_on'})
membership_person_dict = membership_person_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'membership_cfg', 'membership_person_group_list', 'membership_person_profile', 'membership_person_type', 'membership_group', 'membership_group_list', 'membership_type', 'membership_type_list', 'person', 'product', 'created_on', 'updated_on'})
# ### SECTION ### Process data
membership_person_obj.account_id = account_id # Is this needed?
@@ -522,16 +523,21 @@ def update_membership_person_obj(
log.debug(type(membership_person_dict_obj))
if isinstance(membership_person_dict_obj, dict):
membership_person_dict = membership_person_dict_obj
membership_person_dict['membership_person_id'] = membership_person_id
try:
membership_person_obj = Person_Base(**membership_person_dict)
log.debug(membership_person_obj)
membership_person_obj = Membership_Person_Base(**membership_person_dict)
except ValidationError as e:
log.error(e.json())
return False
else:
membership_person_obj = membership_person_dict_obj
membership_person_obj.id = membership_person_id
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(membership_person_obj)
membership_person_dict = membership_person_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'membership_cfg', 'membership_person_group_list', 'membership_person_profile', 'membership_person_type', 'membership_group', 'membership_group_list', 'membership_type', 'membership_type_list', 'person', 'product', 'created_on', 'updated_on'})
membership_person_dict = membership_person_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'membership_cfg', 'membership_person_group_list', 'membership_person_profile', 'membership_person_type', 'membership_group', 'membership_group_list', 'membership_type', 'membership_type_list', 'person', 'product', 'created_on', 'updated_on'})
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(membership_person_dict)
# ### SECTION ### Process data
@@ -540,6 +546,7 @@ def update_membership_person_obj(
table_name = 'membership_person',
rm_id_random = True,
): pass
elif membership_person_dict_up_result is None: pass
else:
log.warning(f'Membership Person not updated.')
log.debug(membership_person_dict_up_result)
@@ -547,8 +554,8 @@ def update_membership_person_obj(
membership_person_outline = {}
membership_person_outline['membership_person_id'] = membership_person_id
membership_person_outline['account_id'] = account_id
membership_person_outline['person_id'] = person_id
# membership_person_outline['account_id'] = account_id
# membership_person_outline['person_id'] = person_id
membership_person_outline['membership_person_group_list'] = []
membership_person_outline['membership_person_profile'] = {}
@@ -604,13 +611,7 @@ def update_membership_person_obj(
# if membership_person_type_id:
# update_membership_person_type_obj_result = update_membership_person_type_obj(
# membership_person_type_dict_obj = membership_person_type_obj,
# membership_person_type_id = membership_person_type_id,
# fail_any = fail_any,
# return_outline = return_outline,
# )
# if update_membership_person_type_obj_result:
# membership_person_outline['membership_person_type_id'] = membership_person_type_id
# pass
# membership_person_type_id = memberssql_update
# else:
# pass
# else:

View File

@@ -313,6 +313,10 @@ def update_membership_person_type_obj(
log.debug(f'Returning True')
log.debug(membership_person_type_dict_up_result)
return True
elif membership_person_type_dict_up_result is None:
log.debug(f'Returning True')
log.debug(membership_person_type_dict_up_result)
return None
else:
log.warning(f'Membership Person Type not updated.')
log.debug(membership_person_type_dict_up_result)

View File

@@ -141,6 +141,7 @@ def create_person_kiss(
def update_person_kiss(
person_id: int,
person_dict_obj: Person_Base,
account_id: int|None = None,
contact_id: int|None = None,
organization_id: int|None = None,
user_id: int|None = None,
@@ -168,6 +169,10 @@ def update_person_kiss(
person_obj.id = person_id # Is this needed?
person_dict['id'] = person_id
# Look for a account_id in the person_obj
# if account_id: pass
if account_id := person_obj.account_id: pass
# Look for a contact_id in the contact_obj
if contact_id: pass
elif person_obj.contact:
@@ -429,12 +434,14 @@ def load_person_obj(
inc_address = inc_address,
inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
inc_membership_group = inc_membership_group, # The primary membership group, if there is one.
inc_membership_group_list = inc_membership_group_list, # All membership groups they are a part of.
# inc_membership_group = inc_membership_group, # The primary membership group, if there is one.
# inc_membership_group_list = inc_membership_group_list, # All membership groups they are a part of.
inc_membership_person_group_list = inc_membership_person_group_list,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_person_profile_cust = inc_membership_person_profile_cust,
inc_membership_type = inc_membership_type, # The primary membership type, if there is one.
inc_membership_type_list = inc_membership_type_list, # All the membership types they are a part of.
# inc_membership_person_profile_cust = inc_membership_person_profile_cust,
inc_membership_person_type = inc_membership_person_type,
# inc_membership_type = inc_membership_type, # The primary membership type, if there is one.
# inc_membership_type_list = inc_membership_type_list, # All the membership types they are a part of.
# inc_person = inc_person,
inc_product = inc_product,
# inc_product_list = inc_product_list,