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

@@ -18,7 +18,7 @@ from . import config
from app.log import log, logging
# Import the routers here first:
from app.routers import api_crud, api, importing, account, activity_log, address, archive, archive_content, contact, cont_edu_cert, cont_edu_cert_person, event, event_badge, event_badge_template, event_exhibit, event_file, event_importing, event_location, event_person, event_person_detail, event_person_tracking, event_presentation, event_presenter, event_registration, event_session, flask_cfg, hosted_file, journal, journal_entry, log_client_viewing, lookup, membership_cfg, membership_group, membership_person_group, membership_person, membership_person_profile, membership_type, membership_person_type, order, order_v3, order_line, order_cart, organization, page, person, person_user, post, post_comment, product, site, site_domain, user, websockets#, e_impexium
from app.routers import api_crud, api, importing, account, activity_log, address, archive, archive_content, contact, cont_edu_cert, cont_edu_cert_person, event, event_badge, event_badge_template, event_exhibit, event_file, event_importing, event_location, event_person, event_person_detail, event_person_tracking, event_presentation, event_presenter, event_registration, event_session, flask_cfg, hosted_file, journal, journal_entry, log_client_viewing, lookup, membership_cfg, membership_group, membership_person_group, membership_person, membership_person_profile, membership_type, membership_person_type, order, order_v3, order_line, order_cart, organization, page, person, person_user, post, post_comment, product, site, site_domain, user, websockets, e_cvent#, e_impexium
from app.db_sql import db
@@ -316,6 +316,11 @@ app.include_router(
#responses={404: {'description': 'Not found'}},
)
app.include_router(
e_cvent.router,
prefix='/e/cvent',
tags=['External Service: Cvent'],
)
# app.include_router(
# e_impexium.router,
# prefix='/e/impexium',

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,

View File

@@ -108,8 +108,8 @@ class Membership_Person_Base(BaseModel):
# membership_type_product_id_random: Optional[str]
# membership_type_product_id: Optional[int] # The product they purchased to get this type
user_id_random: Optional[str]
user_id: Optional[int]
# user_id_random: Optional[str]
# user_id: Optional[int]
level: Optional[int] = Field(0, ge=0, lt=150)
@@ -189,20 +189,24 @@ class Membership_Person_Base(BaseModel):
@validator('id', always=True)
def membership_person_id_lookup(cls, v, values, **kwargs):
log.setLevel(logging.WARNING)
log.setLevel(logging.INFO)
log.debug(locals())
if values['id_random']:
return redis_lookup_id_random(record_id_random=values['id_random'], table_name='membership_person')
if isinstance(v, int) and v > 0: return v
if id_random := values.get('id_random'):
return redis_lookup_id_random(record_id_random=id_random, table_name='membership_person')
return None
@validator('account_id', always=True)
def account_id_lookup(cls, v, values, **kwargs):
log.setLevel(logging.WARNING)
log.setLevel(logging.INFO)
log.debug(locals())
if values.get('account_id_random'):
return redis_lookup_id_random(record_id_random=values['account_id_random'], table_name='account')
if isinstance(v, int) and v > 0: return v
if id_random := values.get('account_id_random'):
return redis_lookup_id_random(record_id_random=id_random, table_name='account')
return None
# @validator('membership_group_id', always=True)
@@ -225,47 +229,35 @@ class Membership_Person_Base(BaseModel):
@validator('membership_type_id', always=True)
def membership_type_id_lookup(cls, v, values, **kwargs):
log.setLevel(logging.DEBUG)
log.setLevel(logging.INFO)
log.debug(locals())
if values.get('membership_type_id_random'):
return redis_lookup_id_random(record_id_random=values['membership_type_id_random'], table_name='membership_type')
if isinstance(v, int) and v > 0: return v
if id_random := values.get('membership_type_id_random'):
return redis_lookup_id_random(record_id_random=id_random, table_name='membership_type')
return None
@validator('membership_person_type_id', always=True)
def membership_person_type_id_lookup(cls, v, values, **kwargs):
log.setLevel(logging.WARNING)
log.setLevel(logging.INFO)
log.debug(locals())
if values.get('membership_person_type_id_random'):
return redis_lookup_id_random(record_id_random=values['membership_person_type_id_random'], table_name='membership_person_type')
if isinstance(v, int) and v > 0: return v
if id_random := values.get('membership_person_type_id_random'):
return redis_lookup_id_random(record_id_random=id_random, table_name='membership_person_type')
return None
@validator('person_id', always=True)
def person_id_lookup(cls, v, values, **kwargs):
log.setLevel(logging.WARNING)
log.setLevel(logging.INFO)
log.debug(locals())
if values.get('person_id_random'):
return redis_lookup_id_random(record_id_random=values['person_id_random'], table_name='person')
return None
if isinstance(v, int) and v > 0: return v
# @validator('product_id', always=True)
# def product_id_lookup(cls, v, values, **kwargs):
# log.setLevel(logging.WARNING)
# log.debug(locals())
# if values['product_id_random']:
# return redis_lookup_id_random(record_id_random=values['product_id_random'], table_name='product')
# return None
@validator('user_id', always=True)
def user_id_lookup(cls, v, values, **kwargs):
log.setLevel(logging.WARNING)
log.debug(locals())
if values.get('user_id_random'):
return redis_lookup_id_random(record_id_random=values['user_id_random'], table_name='user')
if id_random := values.get('person_id_random'):
return redis_lookup_id_random(record_id_random=id_random, table_name='person')
return None
class Config:

View File

@@ -91,11 +91,13 @@ class Membership_Person_Type_Base(BaseModel):
@validator('id', always=True)
def membership_person_type_id_lookup(cls, v, values, **kwargs):
log.setLevel(logging.WARNING)
log.setLevel(logging.INFO)
log.debug(locals())
if values['id_random']:
return redis_lookup_id_random(record_id_random=values['id_random'], table_name='membership_person_type')
if isinstance(v, int) and v > 0: return v
if id_random := values.get('id_random'):
return redis_lookup_id_random(record_id_random=id_random, table_name='membership_person_type')
return None
@validator('account_id', always=True)
@@ -103,8 +105,10 @@ class Membership_Person_Type_Base(BaseModel):
log.setLevel(logging.WARNING)
log.debug(locals())
if values['account_id_random']:
return redis_lookup_id_random(record_id_random=values['account_id_random'], table_name='account')
if isinstance(v, int) and v > 0: return v
if id_random := values.get('account_id_random'):
return redis_lookup_id_random(record_id_random=id_random, table_name='account')
return None
@validator('membership_type_id', always=True)
@@ -112,8 +116,10 @@ class Membership_Person_Type_Base(BaseModel):
log.setLevel(logging.WARNING)
log.debug(locals())
if values['membership_type_id_random']:
return redis_lookup_id_random(record_id_random=values['membership_type_id_random'], table_name='membership_type')
if isinstance(v, int) and v > 0: return v
if id_random := values.get('membership_type_id_random'):
return redis_lookup_id_random(record_id_random=id_random, table_name='membership_type')
return None
@validator('product_id', always=True)
@@ -121,8 +127,10 @@ class Membership_Person_Type_Base(BaseModel):
log.setLevel(logging.WARNING)
log.debug(locals())
if values['product_id_random']:
return redis_lookup_id_random(record_id_random=values['product_id_random'], table_name='product')
if isinstance(v, int) and v > 0: return v
if id_random := values.get('product_id_random'):
return redis_lookup_id_random(record_id_random=id_random, table_name='product')
return None
class Config:

View File

@@ -3,15 +3,18 @@ from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Resp
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging, secure_hash_string
from app.lib_general import log, logging, secure_hash_string, verify_secure_hash_string, common_route_params, Common_Route_Params
from app.config import settings
from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, sql_delete, redis_lookup_id_random
from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.methods.e_cvent_methods import get_customer_list, get_customer, get_custom_fields
from app.methods.e_cvent_methods import get_access_token, get_contact_custom_field_list, get_contact_list, get_contact_id
from app.methods.person_methods import get_person_rec_list, get_person_rec_w_external_id, load_person_obj, update_person_kiss
from app.methods.membership_person_methods import create_membership_person_obj, update_membership_person_obj
from app.models.response_models import Resp_Body_Base, mk_resp
from app.models.person_models import Person_Base
router = APIRouter()
@@ -21,19 +24,38 @@ router = APIRouter()
# Updated 2022-01-28
@router.get('/person/{e_person_id}', response_model=Resp_Body_Base)
async def get_person(
e_person_id: str = Query(..., min_length=36, max_length=36), # UUID v4
e_person_id: str = Query(..., min_length=36, max_length=36), # UUID v4; actually the Cvent Contact UUID for a person
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if cvent_customer_obj_result := get_customer(customer_id=e_person_id):
customer_obj = cvent_customer_obj_result
# current_datetime = datetime.datetime.now()
# log.debug(type(current_datetime))
# log.debug(current_datetime)
# expires_in = 3600
# log.debug(type(expires_in))
# log.debug(expires_in)
# future_datetime = current_datetime + datetime.timedelta(seconds=3600)
# log.debug(type(future_datetime))
# log.debug(future_datetime)
# return mk_resp(data=False, status_code=501, response=commons.response, status_message='Testing...')
if cvent_contact_obj_result := get_contact_id(contact_id=e_person_id):
cvent_contact_obj = cvent_contact_obj_result
else:
log.info(f'Cvent contact not found with ID: {e_person_id}')
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
account_id = commons.x_account_id
# return mk_resp(data=False, status_code=501, response=commons.response, status_message='Testing...')
# Important contact fields:
# id (UUID v4)
# type { id, name } for contact type (membership type)
@@ -56,50 +78,57 @@ async def get_person(
# homeAddress { address1, address2, address3, city, country, countryCode, postalCode, region, regionCode }
person_data = {}
if custom_field_list := customer_obj.get('customFields'): # List
if custom_field_list := cvent_contact_obj.get('customFields'): # List
for custom_field in custom_field_list:
# Get the External ID created by OSIT
if custom_field.get('id') == '609ab766-7d79-4a9d-a72c-f126412659ee':
person_data['external_id'] = custom_field.get('value')
person_data['external_id'] = custom_field.get('value')[0]
# person_data['pronouns'] = ???
person_data['informal_name'] = customer_obj.get('nickname')
person_data['title_names'] = customer_obj.get('prefix')
person_data['given_name'] = customer_obj.get('firstName')
person_data['middle_name'] = customer_obj.get('middleName')
person_data['family_name'] = customer_obj.get('lastName')
person_data['designations'] = customer_obj.get('designation')
person_data['professional_title'] = customer_obj.get('title')
person_data['informal_name'] = cvent_contact_obj.get('nickname')
person_data['title_names'] = cvent_contact_obj.get('prefix')
person_data['given_name'] = cvent_contact_obj.get('firstName')
person_data['middle_name'] = cvent_contact_obj.get('middleName')
person_data['family_name'] = cvent_contact_obj.get('lastName')
person_data['designations'] = cvent_contact_obj.get('designation')
person_data['professional_title'] = cvent_contact_obj.get('title')
person_data['affiliations'] = customer_obj.get('company')
person_data['affiliations'] = cvent_contact_obj.get('company')
log.debug(person_data)
contact_data = {}
contact_data['email'] = customer_obj.get('email')
contact_data['cc_email'] = customer_obj.get('ccEmail')
contact_data['phone_mobile'] = customer_obj.get('mobilePhone')
contact_data['phone_home'] = customer_obj.get('homePhone')
contact_data['phone_office'] = customer_obj.get('workPhone')
contact_data['email'] = cvent_contact_obj.get('email')
contact_data['cc_email'] = cvent_contact_obj.get('ccEmail')
contact_data['phone_mobile'] = cvent_contact_obj.get('mobilePhone')
contact_data['phone_home'] = cvent_contact_obj.get('homePhone')
contact_data['phone_office'] = cvent_contact_obj.get('workPhone')
log.debug(contact_data)
address_data = {}
address_data['line_1'] = customer_obj.get('homeAddress').get('address1')
address_data['line_2'] = customer_obj.get('homeAddress').get('address2')
address_data['line_3'] = customer_obj.get('homeAddress').get('address3')
address_data['city'] = customer_obj.get('homeAddress').get('city')
address_data['state_province'] = customer_obj.get('homeAddress').get('region')
country_subdivision_code = customer_obj.get('homeAddress').get('regionCode') +'-'+customer_obj.get('homeAddress').get('countryCode')
address_data['country_subdivision_code'] = customer_obj.get('homeAddress').get('regionCode')
address_data['postal_code'] = customer_obj.get('homeAddress').get('postalCode')
address_data['country_alpha_2_code'] = customer_obj.get('homeAddress').get('countryCode')
address_data['country'] = customer_obj.get('homeAddress').get('country')
address_data['country_alpha_2_code'] = customer_obj.get('homeAddress').get('countryCode')
address_data['line_1'] = cvent_contact_obj.get('homeAddress').get('address1')
address_data['line_2'] = cvent_contact_obj.get('homeAddress').get('address2')
address_data['line_3'] = cvent_contact_obj.get('homeAddress').get('address3')
address_data['city'] = cvent_contact_obj.get('homeAddress').get('city')
address_data['state_province'] = cvent_contact_obj.get('homeAddress').get('region')
country_subdivision_code = cvent_contact_obj.get('homeAddress').get('countryCode') +'-'+cvent_contact_obj.get('homeAddress').get('regionCode')
address_data['country_subdivision_code'] = country_subdivision_code
address_data['postal_code'] = cvent_contact_obj.get('homeAddress').get('postalCode')
address_data['country_alpha_2_code'] = cvent_contact_obj.get('homeAddress').get('countryCode')
address_data['country'] = cvent_contact_obj.get('homeAddress').get('country')
address_data['country_alpha_2_code'] = cvent_contact_obj.get('homeAddress').get('countryCode')
log.debug(address_data)
contact_data['address'] = address_data
person_data['contact'] = contact_data
membership = {}
membership['first_start_on'] = customer_obj.get('membership').get('joined') # A trigger should update 'first_start_on' if needed???
membership['start_on'] = customer_obj.get('membership').get('lastRenewal') # A trigger should update 'first_start_on' if needed???
membership['end_on'] = customer_obj.get('membership').get('expiration')
membership_person_data = {}
membership_person_data['first_start_on'] = cvent_contact_obj.get('membership').get('joined') # A trigger should update 'first_start_on' if needed???
membership_person_data['start_on'] = cvent_contact_obj.get('membership').get('lastRenewal') # A trigger should update 'first_start_on' if needed???
membership_person_data['end_on'] = cvent_contact_obj.get('membership').get('expiration')
log.debug(membership_person_data)
membership_type_id = customer_obj.get('type').get('id')
membership_type_name = customer_obj.get('type').get('name')
membership_type_cvent_id = cvent_contact_obj.get('type').get('id')
membership_type_cvent_name = cvent_contact_obj.get('type').get('name')
log.info(f'Found Cvent Membership Type Named: {membership_type_cvent_name}')
# 'id': '5EB898D8-C253-482C-A93A-0B6667C26E04', 'name': 'Al-Anon Member'
# 'id': 'A20358C5-0F6C-47AF-9843-BA9483A9D767', 'name': 'Al-Anon Non-Member'
# 'id': 'A01900AB-496A-48A1-9B04-C2874651227E', 'name': 'Member'
@@ -116,23 +145,101 @@ async def get_person(
# 'id': '71D07118-C24D-4B2E-888D-56AC1B941495', 'name': "IDAA 20's Guest Registration"
# 'id': 'DA17F721-9924-43E3-A31F-C567BA96DC64', 'name': 'IDAA Teen (13-19 years)'
if membership_type_name == 'Al-Anon Member' or membership_type_name == 'Al-Anon Members':
membership_person_data = {}
membership_person_type_data = {}
if membership_type_cvent_name == 'Al-Anon Member' or membership_type_cvent_name == 'Al-Anon Members':
# membership_person_data['membership_type_id'] = 6
membership_person_type_data['membership_type_id'] = 6
membership_person_type_data['product_id'] = 13
membership_person_data['level'] = 1
# membership_person_data['level'] = 1
membership_person_type_data['level'] = 1
elif membership_type_name == 'Annual Contribution' or membership_type_name == 'Annual Contributions': # Unsure... making affiliate
elif membership_type_cvent_name == 'Annual Contribution' or membership_type_cvent_name == 'Annual Contributions': # Unsure... making affiliate
# membership_person_data['membership_type_id'] = 8
membership_person_type_data['membership_type_id'] = 8
membership_person_type_data['product_id'] = 13
membership_person_data['level'] = 3
# membership_person_data['level'] = 3
membership_person_type_data['level'] = 3
elif membership_type_name == 'Doctoral Qualifying Member' or membership_type_name == 'Doctoral Qualifying Members':
membership_person_type_data['membership_type_id'] = 5
elif membership_type_cvent_name == 'Doctoral Qualifying Member' or membership_type_cvent_name == 'Doctoral Qualifying Members':
membership_person_data['membership_type_id'] = 5
# membership_person_type_data['membership_type_id'] = 5
membership_person_type_data['product_id'] = 4
membership_person_data['level'] = 1
# membership_person_data['level'] = 1
membership_person_type_data['level'] = 1
elif membership_type_name == 'Student Member' or membership_type_name == 'Student Members':
elif membership_type_cvent_name == 'Student Member' or membership_type_cvent_name == 'Student Members':
# membership_person_data['membership_type_id'] = 7
membership_person_type_data['membership_type_id'] = 7
membership_person_type_data['product_id'] = 14
membership_person_data['level'] = 1
membership_person_type_data['level'] = 1
# membership_person_data['level'] = 1
membership_person_type_data['level'] = 1
membership_person_type_data['first_start_on'] = datetime.datetime.strptime(cvent_contact_obj.get('membership').get('joined'), '%Y-%m-%d')
membership_person_type_data['start_on'] = datetime.datetime.strptime(cvent_contact_obj.get('membership').get('lastRenewal'), '%Y-%m-%d')
membership_person_type_data['end_on'] = datetime.datetime.strptime(cvent_contact_obj.get('membership').get('lastRenewal'), '%Y-%m-%d')
membership_person_type_data['last_end_on'] = datetime.datetime.strptime(cvent_contact_obj.get('membership').get('expiration'), '%Y-%m-%d')
current_datetime = datetime.datetime.now()
if membership_person_type_data['end_on'] >= current_datetime:
membership_person_type_data['lu_membership_type_status_id'] = 5 # 5 = active; expiration is > now
else:
membership_person_type_data['lu_membership_type_status_id'] = 7 # 7 = inactive; expiration is > now
membership_person_data['enable'] = True
membership_person_type_data['enable'] = True
membership_person_data['membership_person_type'] = membership_person_type_data
log.debug(membership_person_data)
if person_external_id := person_data.get('external_id') and 1==3:
log.info(f'Looking up person with External ID: {person_external_id}')
if result := get_person_rec_w_external_id(account_id=account_id, external_id=person_external_id):
log.debug(result)
person_id = result.get('person_id')
log.info(f'Person ID {person_id} found.')
person_obj = load_person_obj(person_id=person_id, inc_address=True, inc_contact=True, inc_membership_person=True, inc_membership_person_type=True)
log.debug(person_obj)
person_data['id'] = person_id
person_data['account_id'] = account_id
person_data['contact']['id'] = person_obj.contact.id
person_data['contact']['address']['id'] = person_obj.contact.address.id
log.debug(person_data)
membership_person_id = person_obj.membership_person.id
membership_person_data['id'] = person_obj.membership_person.id
membership_person_data['membership_person_type']['id'] = person_obj.membership_person.membership_person_type.id
if update_membership_person_obj(membership_person_id=membership_person_id, membership_person_dict_obj=membership_person_data):
log.info(f'Updated Membership Person ID: {membership_person_id}')
else:
log.info(f'Did not update Membership Person ID: {membership_person_id}')
person_data['membership_person'] = membership_person_data
return mk_resp(data=person_data, status_message='Updated and loaded person based on Cvent contact information', response=commons.response)
# try:
# person_obj = Person_Base(**person_data)
# log.debug(person_obj)
# except ValidationError as e:
# log.error(e.json())
# return False
update_person_kiss(person_id=person_id, person_dict_obj=person_obj)
person_obj = load_person_obj(person_id=person_id, inc_address=True, inc_contact=True)
log.debug(person_obj)
return mk_resp(data=person_obj, status_message='Updated and loaded person based on Cvent contact information', response=commons.response)
elif email := cvent_contact_obj.get('email'):
log.info(f'Looking up person with Email Address: {email}')
if result := get_person_rec_list(for_obj_type='account', for_obj_id=account_id, email=email):
log.debug(result[0])
person_id = result[0].get('person_id')
log.info(f'Person ID {person_id} found.')
else:
log.info(f'External ID and Email Address were not found.')
return mk_resp(data=person_data, status_message='Got Cvent contact information', response=commons.response)