Working on Cvent API related
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
169
app/methods/e_cvent_methods.py
Normal file
169
app/methods/e_cvent_methods.py
Normal 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
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user