import datetime, json, pytz, secrets, time from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response, status from pydantic import BaseModel, EmailStr, Field from typing import Dict, List, Optional, Set, Union 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_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() # ### BEGIN ### API Cvent ### get_person() ### # 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; 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()) # 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) # membership { expiration, joined, lastRenewal } # email and ccEmail # prefix # designation # title # nickname # firstName # lastName # middleName # company # homePhone # mobilePhone # workPhone # homeAddress { address1, address2, address3, city, country, countryCode, postalCode, region, regionCode } person_data = {} 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')[0] # person_data['pronouns'] = ??? 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'] = cvent_contact_obj.get('company') log.debug(person_data) contact_data = {} 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'] = 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_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_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' # 'id': '03622AEE-F586-4AE5-A191-B8372543A8C8', 'name': 'Student Member' # 'id': '65437A15-39C2-4EB5-9AFE-67AF6FE41C27', 'name': 'Non-Member' # 'id': 'A69FAF20-BF2A-4222-B15B-7B0C7EFBEAA7', 'name': 'Student Non-member' # 'id': 'C9FA7E47-A925-44AB-B94A-9B3003CA2AC4', 'name': 'Attendee' # 'id': '96D5B3CC-FD4E-4957-BA71-9CEF388095EF', 'name': 'Guest' # 'id': 'C49439B3-5AE6-496F-A0AD-4CCB1A9000E3', 'name': 'Spouse/SO Guest Registration' # 'id': 'AADABEF0-3C84-45A2-9D9B-E2CF585D4AE5', 'name': 'General Attendee' # 'id': '54127B4D-E531-4046-AF5C-0F0D71DC39D2', 'name': 'Adult Guest Registration' # 'id': '6F06D6B6-2C23-4EF8-986F-73BF0DB2B229', 'name': "Children's Program with Jerry Moe (7-12 years)" # 'id': '71D07118-C24D-4B2E-888D-56AC1B941495', 'name': "IDAA 20's Guest Registration" # 'id': 'DA17F721-9924-43E3-A31F-C567BA96DC64', 'name': 'IDAA Teen (13-19 years)' 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_type_data['level'] = 1 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_type_data['level'] = 3 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_type_data['level'] = 1 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_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)