Cleaning up create and update Cvent person in Aether for IDAA members. Added lookup by external ID and email for Cvent.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
from __future__ import annotations
|
||||
import datetime, json, pprint, pytz, random, requests, secrets, time
|
||||
import datetime, json, pprint, pytz, random, requests, secrets, string, time
|
||||
from requests.auth import HTTPBasicAuth
|
||||
|
||||
from typing import Dict, List, Optional, Set, Union
|
||||
@@ -8,7 +8,8 @@ from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, v
|
||||
from app.db_sql import redis_lookup_id_random, sql_insert, sql_select, sql_update
|
||||
from app.lib_general import log, logging, logger_reset, secure_hash_string, verify_secure_hash_string
|
||||
|
||||
from app.methods.person_methods import get_person_rec_w_external_id, load_person_obj, update_person_kiss
|
||||
from app.methods.person_methods import create_person_kiss, 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
|
||||
|
||||
|
||||
app = {}
|
||||
@@ -78,10 +79,8 @@ def get_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()
|
||||
log.warning('Sleeping for 1 second to avoid Cvent rate limit...')
|
||||
time.sleep(1.5)
|
||||
|
||||
return api
|
||||
|
||||
@@ -115,10 +114,12 @@ def get_contact_custom_field_list(api):
|
||||
|
||||
# Updated 2022-01-31
|
||||
@logger_reset
|
||||
def get_contact_list(api, external_id: str=False):
|
||||
def get_contact_list(external_id: str=None, email: str=None):
|
||||
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
|
||||
log.debug(locals())
|
||||
|
||||
get_access_token()
|
||||
|
||||
endpoint = '/contacts'
|
||||
uri = api['base_url']+endpoint
|
||||
|
||||
@@ -126,21 +127,21 @@ def get_contact_list(api, external_id: str=False):
|
||||
# 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}'"
|
||||
if external_id:
|
||||
params['filter'] = f"deleted eq 'False' and customField.609ab766-7d79-4a9d-a72c-f126412659ee eq '{external_id}'"
|
||||
elif email:
|
||||
params['filter'] = f"deleted eq 'False' and email eq '{email}'"
|
||||
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'"
|
||||
else:
|
||||
params['filter'] = f"deleted eq 'False'"
|
||||
|
||||
resp = requests.get(url=uri, headers=api['headers'], params=params)
|
||||
|
||||
response_data = resp.json()
|
||||
log.debug(json.dumps(response_data, indent=2, default=str))
|
||||
|
||||
# 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))
|
||||
if 'message' in response_data and response_data['message'] == 'Too Many Requests': return False
|
||||
|
||||
return response_data
|
||||
|
||||
@@ -153,19 +154,23 @@ def get_recent_contact_list(created_on=None, updated_on=None):
|
||||
|
||||
get_access_token()
|
||||
|
||||
log.warning('Sleeping for 1 second to avoid Cvent rate limit...')
|
||||
time.sleep(1)
|
||||
|
||||
endpoint = f'/contacts'
|
||||
uri = api['base_url']+endpoint
|
||||
|
||||
params = {}
|
||||
if created_on:
|
||||
if created_on and updated_on:
|
||||
created_on_str = created_on.isoformat()
|
||||
print(f'Created On: {created_on_str}')
|
||||
updated_on_str = updated_on.isoformat()
|
||||
log.info(f'Created On: {created_on_str}')
|
||||
log.info(f'Updated On: {updated_on_str}')
|
||||
params['filter'] = f"deleted eq 'False' and created gt '{created_on_str}Z' or lastModified gt '{updated_on_str}Z'"
|
||||
elif created_on:
|
||||
created_on_str = created_on.isoformat()
|
||||
log.info(f'Created On: {created_on_str}')
|
||||
params['filter'] = f"deleted eq 'False' and created gt '{created_on_str}Z'"
|
||||
elif updated_on:
|
||||
print(f'Updated On: {created_on_str}')
|
||||
updated_on_str = updated_on.isoformat()
|
||||
log.info(f'Updated On: {updated_on_str}')
|
||||
params['filter'] = f"deleted eq 'False' and lastModified gt '{updated_on_str}Z'"
|
||||
else:
|
||||
log.warning('Created On or Updated On is requried. Returing False')
|
||||
@@ -174,7 +179,7 @@ def get_recent_contact_list(created_on=None, updated_on=None):
|
||||
resp = requests.get(url=uri, headers=api['headers'], params=params)
|
||||
|
||||
response_data = resp.json()
|
||||
log.debug(response_data)
|
||||
log.debug(json.dumps(response_data, indent=2, default=str))
|
||||
|
||||
if 'message' in response_data and response_data['message'] == 'Too Many Requests': return False
|
||||
|
||||
@@ -191,8 +196,8 @@ def get_contact_id(contact_id: str):
|
||||
# else: get_access_token()
|
||||
get_access_token()
|
||||
|
||||
log.warning('Sleeping for 1 second to avoid Cvent rate limit...')
|
||||
time.sleep(1)
|
||||
# log.warning('Sleeping for 1 second to avoid Cvent rate limit...')
|
||||
# time.sleep(1)
|
||||
|
||||
endpoint = f'/contacts/{contact_id}'
|
||||
uri = api['base_url']+endpoint
|
||||
@@ -202,7 +207,7 @@ def get_contact_id(contact_id: str):
|
||||
resp = requests.get(url=uri, headers=api['headers'], params=params)
|
||||
|
||||
response_data = resp.json()
|
||||
log.debug(response_data)
|
||||
log.debug(json.dumps(response_data, indent=2, default=str))
|
||||
|
||||
if 'message' in response_data and response_data['message'] == 'Too Many Requests': return False
|
||||
|
||||
@@ -242,7 +247,7 @@ def modify_contact_id(contact_id: str, field_list: list=[], custom_field_id: str
|
||||
resp = requests.patch(url=uri, headers=api['headers'], params=params, json=data)
|
||||
|
||||
response_data = resp.json()
|
||||
log.debug(response_data)
|
||||
log.debug(json.dumps(response_data, indent=2, default=str))
|
||||
|
||||
if 'message' in response_data and response_data['message'] == 'Too Many Requests': return False
|
||||
|
||||
@@ -261,6 +266,7 @@ def create_update_aether_person(
|
||||
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
|
||||
log.debug(locals())
|
||||
|
||||
# Important variables used more than once.
|
||||
person_external_id = None
|
||||
if custom_field_list := cvent_contact_obj.get('customFields'): # List
|
||||
for custom_field in custom_field_list:
|
||||
@@ -339,12 +345,13 @@ def create_update_aether_person(
|
||||
person_data['user'] = user_data
|
||||
|
||||
if cvent_contact_obj.get('type'):
|
||||
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}')
|
||||
# NOTE: Should this be renamed to contact_type_id and contact_type_name???
|
||||
cvent_contact_type_id = cvent_contact_obj.get('type').get('id')
|
||||
cvent_contact_type_name = cvent_contact_obj.get('type').get('name')
|
||||
log.info(f'Found Cvent Contact Type Named: {cvent_contact_type_name}')
|
||||
else:
|
||||
membership_type_cvent_id = None
|
||||
membership_type_cvent_name = None
|
||||
cvent_contact_type_id = None
|
||||
cvent_contact_type_name = None
|
||||
|
||||
# 'id': '5EB898D8-C253-482C-A93A-0B6667C26E04', 'name': 'Al-Anon Member'
|
||||
# 'id': 'A20358C5-0F6C-47AF-9843-BA9483A9D767', 'name': 'Al-Anon Non-Member'
|
||||
@@ -362,34 +369,44 @@ def create_update_aether_person(
|
||||
# 'id': 'DA17F721-9924-43E3-A31F-C567BA96DC64', 'name': 'IDAA Teen (13-19 years)'
|
||||
# 'id': 'C49439B3-5AE6-496F-A0AD-4CCB1A9000E3', 'name': 'Spouse/SO Guest Registration'
|
||||
|
||||
# Currently in use for IDAA:
|
||||
# Currently in use Member Type names for IDAA:
|
||||
# Member Type = Member Contact Type
|
||||
# Annual Contribution(s) = Attendee
|
||||
# Doctoral Qualifying Member(s) = Member
|
||||
# Student Member(s) = Student Member
|
||||
# Al-Anon Member(s) = "Al-Anon Member" and "Al-Anon Non-Member"
|
||||
# Annual Contribution(s) = "Attendee" and "Non-Member"
|
||||
# Doctoral Qualifying Member(s) = "Member" and "Non-Member"
|
||||
# Student Member(s) = "Student Member" and "Student Non-member"
|
||||
# NOTE: "Student Non-member" is NOT "Student Non-Member" (the lowercase m)
|
||||
|
||||
membership_person_data = {}
|
||||
membership_person_type_data = {}
|
||||
if membership_type_cvent_name:
|
||||
if membership_type_cvent_name == 'Al-Anon Member' or membership_type_cvent_name == 'Al-Anon Members':
|
||||
# NOTE: Should this be renamed to contact_type_id and contact_type_name???
|
||||
# Technically the membership type naming is slightly different and more of them.
|
||||
# if cvent_contact_type_name:
|
||||
if cvent_contact_obj.get('membership'):
|
||||
if cvent_contact_type_name == 'Al-Anon Member' or cvent_contact_type_name == 'Al-Anon Members':
|
||||
membership_person_type_data['membership_type_id'] = 6
|
||||
membership_person_type_data['product_id'] = 13
|
||||
membership_person_type_data['level'] = 1
|
||||
elif membership_type_cvent_name == 'Annual Contribution' or membership_type_cvent_name == 'Annual Contributions' or membership_type_cvent_name == 'Attendee': # Unsure... making affiliate
|
||||
elif cvent_contact_type_name == 'Annual Contribution' or cvent_contact_type_name == 'Annual Contributions' or cvent_contact_type_name == 'Attendee': # Unsure... making affiliate
|
||||
membership_person_type_data['membership_type_id'] = 8
|
||||
membership_person_type_data['product_id'] = 13
|
||||
membership_person_type_data['level'] = 3
|
||||
elif membership_type_cvent_name == 'Doctoral Qualifying Member' or membership_type_cvent_name == 'Doctoral Qualifying Members' or membership_type_cvent_name == 'Member':
|
||||
elif cvent_contact_type_name == 'Doctoral Qualifying Member' or cvent_contact_type_name == 'Doctoral Qualifying Members' or cvent_contact_type_name == 'Member':
|
||||
membership_person_type_data['membership_type_id'] = 5
|
||||
membership_person_type_data['product_id'] = 4
|
||||
membership_person_type_data['level'] = 1
|
||||
elif membership_type_cvent_name == 'Student Member' or membership_type_cvent_name == 'Student Members':
|
||||
elif cvent_contact_type_name == 'Student Member' or cvent_contact_type_name == 'Student Members':
|
||||
membership_person_type_data['membership_type_id'] = 7
|
||||
membership_person_type_data['product_id'] = 14
|
||||
membership_person_type_data['level'] = 1
|
||||
elif cvent_contact_type_name in ['Al-Anon Non-Member', 'Non-Member', 'Student Non-member', 'Student Non-Member']:
|
||||
membership_person_type_data['membership_type_id'] = 8
|
||||
membership_person_type_data['product_id'] = 13
|
||||
membership_person_type_data['level'] = 3
|
||||
else:
|
||||
log.error(f'Unknown Membership Type Name from Cvent: {membership_type_cvent_name}')
|
||||
return False
|
||||
log.error(f'Unknown Contact Type Name from Cvent: {cvent_contact_type_name}')
|
||||
cvent_contact_type_id = None
|
||||
cvent_contact_type_name = None
|
||||
|
||||
membership_person_type_data['first_start_on'] = datetime.datetime.strptime(cvent_contact_obj.get('membership').get('joined'), '%Y-%m-%d')
|
||||
if cvent_contact_obj.get('membership').get('lastRenewal'):
|
||||
@@ -461,7 +478,7 @@ def create_update_aether_person(
|
||||
time.sleep(1)
|
||||
|
||||
contact_mod_result = modify_contact_id(
|
||||
contact_id = cvent_person_id, # This is the Cvent Contact UUID for a person
|
||||
contact_id = cvent_contact_id, # This is the Cvent Contact UUID for a person
|
||||
# field_list = field_list,
|
||||
custom_field_id = custom_field_id,
|
||||
custom_field_value = custom_field_value,
|
||||
@@ -511,7 +528,7 @@ def create_update_aether_person(
|
||||
# return False
|
||||
# ### TESTING BREAK POINT ###
|
||||
|
||||
if membership_type_cvent_id and membership_person_id:
|
||||
if cvent_contact_type_id and membership_person_id:
|
||||
# membership_person_id = person_obj.membership_person.id
|
||||
membership_person_data['id'] = membership_person_id
|
||||
membership_person_data['membership_person_type']['id'] = membership_person_type_id
|
||||
@@ -519,7 +536,7 @@ def create_update_aether_person(
|
||||
log.info(f'Updated Membership Person ID: {membership_person_id}')
|
||||
else:
|
||||
log.info(f'Did not update Membership Person ID: {membership_person_id}')
|
||||
elif membership_type_cvent_id:
|
||||
elif cvent_contact_type_id:
|
||||
if create_membership_person_obj_result := create_membership_person_obj(account_id=account_id, person_id=person_id, membership_person_dict_obj=membership_person_data):
|
||||
membership_person_id = create_membership_person_obj_result
|
||||
log.info(f'Created Membership Person ID: {membership_person_id}')
|
||||
@@ -531,8 +548,8 @@ def create_update_aether_person(
|
||||
person_data['membership_person'] = membership_person_data
|
||||
log.debug(json.dumps(person_data, indent=2, default=str))
|
||||
|
||||
person_obj = load_person_obj(person_id=person_id, inc_address=True, inc_contact=True, inc_membership_person=True, inc_membership_person_type=True, inc_user=True)
|
||||
log.debug(person_obj)
|
||||
# person_obj = load_person_obj(person_id=person_id, inc_address=True, inc_contact=True, inc_membership_person=True, inc_membership_person_type=True, inc_user=True)
|
||||
# log.debug(person_obj)
|
||||
|
||||
return person_obj # True
|
||||
return person_id # True
|
||||
# ### END ### API External Cvent ### create_update_aether_person() ###
|
||||
|
||||
Reference in New Issue
Block a user