diff --git a/app/main.py b/app/main.py index 201db3c..d801f89 100644 --- a/app/main.py +++ b/app/main.py @@ -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', diff --git a/app/methods/contact_methods.py b/app/methods/contact_methods.py index 83b3db5..4bbeb57 100644 --- a/app/methods/contact_methods.py +++ b/app/methods/contact_methods.py @@ -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 diff --git a/app/methods/e_cvent_methods.py b/app/methods/e_cvent_methods.py new file mode 100644 index 0000000..cbfce63 --- /dev/null +++ b/app/methods/e_cvent_methods.py @@ -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 diff --git a/app/methods/membership_person_methods.py b/app/methods/membership_person_methods.py index bd55872..785b301 100644 --- a/app/methods/membership_person_methods.py +++ b/app/methods/membership_person_methods.py @@ -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: diff --git a/app/methods/membership_person_type_methods.py b/app/methods/membership_person_type_methods.py index 8314ff5..90fe35b 100644 --- a/app/methods/membership_person_type_methods.py +++ b/app/methods/membership_person_type_methods.py @@ -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) diff --git a/app/methods/person_methods.py b/app/methods/person_methods.py index 8c1f833..4bdcbea 100644 --- a/app/methods/person_methods.py +++ b/app/methods/person_methods.py @@ -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, diff --git a/app/models/membership_person_models.py b/app/models/membership_person_models.py index 18c50ce..9472ec0 100644 --- a/app/models/membership_person_models.py +++ b/app/models/membership_person_models.py @@ -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: diff --git a/app/models/membership_person_type_models.py b/app/models/membership_person_type_models.py index 3d087ad..3deb891 100644 --- a/app/models/membership_person_type_models.py +++ b/app/models/membership_person_type_models.py @@ -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: diff --git a/app/routers/e_cvent.py b/app/routers/e_cvent.py index 88ef1ef..bebf0ae 100644 --- a/app/routers/e_cvent.py +++ b/app/routers/e_cvent.py @@ -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 \ No newline at end of file + # 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)