from __future__ import annotations import datetime from typing import Dict, List, Optional, Set, Union from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator from app.db_sql import get_account_id_w_for_type_id, redis_lookup_id_random, sql_insert, sql_select, sql_update from app.lib_general import log, logging # from app.methods.event_abstract_methods import load_event_abstract_obj from app.methods.event_badge_methods import load_event_badge_obj # from app.methods.event_exhibit_methods import load_event_exhibit_obj # from app.methods.event_file_methods import load_event_file_obj from app.methods.event_person_profile_methods import load_event_person_profile_obj # from app.methods.event_presentation_methods import load_event_presentation_obj # from app.methods.event_presenter_methods import get_event_presenter_rec_list, load_event_presenter_obj # from app.methods.event_registration_methods import create_event_registration_obj, load_event_registration_obj, update_event_registration_obj_v3 # from app.methods.event_session_methods import load_event_session_obj # from app.methods.event_track_methods import load_event_track_obj from app.methods.person_methods import create_person_obj_v3, load_person_obj, update_person_obj # from app.methods.user_methods import create_user_obj, load_user_obj, update_user_obj from app.models.common_field_schema import default_num_bytes from app.models.event_person_models import Event_Person_New_Base, Event_Person_Base # ### BEGIN ### API Event Person Methods ### load_event_person_obj() ### def load_event_person_obj( event_person_id: int|str, enabled: str = 'enabled', # enabled, disabled, all limit: int = 1000, by_alias: bool = True, exclude_unset: bool = True, model_as_dict: bool = False, event_file_file_purpose_id: int = None, event_file_file_purpose: str = None, event_file_priority: bool = None, event_file_group: str = None, inc_address: bool = False, inc_contact: bool = False, inc_event_abstract_list: bool = False, inc_event_badge: bool = False, inc_event_exhibit_list: bool = False, inc_event_file_list: bool = False, #inc_event_person_detail: bool = False, # Should this be done differently? inc_event_person_profile: bool = False, inc_event_presentation_list: bool = False, inc_event_presenter_list: bool = False, inc_event_registration: bool = False, inc_event_session_list: bool = False, inc_event_track_list: bool = False, inc_person: bool = False, inc_user: bool = False, ) -> Event_Person_Base|bool: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if event_person_id := redis_lookup_id_random(record_id_random=event_person_id, table_name='event_person'): pass else: return False if event_person_rec := sql_select(table_name='v_event_person', record_id=event_person_id): pass else: return False #log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(event_person_rec) try: event_person_obj = Event_Person_Base(**event_person_rec) log.debug(event_person_obj) except ValidationError as e: log.error(e.json()) return False event_person_profile_id = event_person_rec.get('event_person_profile_id', None) person_id = event_person_rec.get('person_id', None) user_id = event_person_rec.get('user_id', None) # event_person_obj = Event_Person_Base(**event_person_rec) # person_id = event_person_obj.person_id # user_id = event_person_obj.user_id if inc_event_abstract_list: pass # Updated 2021-08-17 if inc_event_badge: log.info('Need to include event badge data...') # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL event_badge_id = event_person_rec.get('event_badge_id', None) if event_badge_obj := load_event_badge_obj( event_badge_id = event_badge_id ): log.debug(event_badge_obj) event_person_obj.event_badge = event_badge_obj.dict(by_alias=True, exclude_unset=True) else: log.warning('A event_badge object was not returned.') event_person_obj.event_badge = None if inc_event_exhibit_list: pass if inc_event_file_list: pass # Updated 2021-09-07 if inc_event_person_profile: # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.info('Need to include event person profile data...') if event_person_profile_obj := load_event_person_profile_obj( event_person_profile_id = event_person_profile_id ): log.debug(event_person_profile_obj) event_person_obj.event_person_profile = event_person_profile_obj.dict(by_alias=True, exclude_unset=True) else: log.warning('A event_person_profile object was not returned.') event_person_obj.event_person_profile = None if inc_event_presentation_list: pass # Updated 2021-09-10 if inc_event_presenter_list: log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.info('Need to include event presenter list...') from app.methods.event_presenter_methods import get_event_presenter_rec_list, load_event_presenter_obj if event_presenter_rec_list_result := get_event_presenter_rec_list( event_person_id = event_person_id, # event_presentation_id = event_presentation_id, enabled = enabled, limit = limit, ): event_presenter_result_list = [] for event_presenter_rec in event_presenter_rec_list_result: if load_event_presenter_result := load_event_presenter_obj( event_presenter_id = event_presenter_rec.get('event_presenter_id', None), enabled = enabled, limit = limit, inc_event_file_list = inc_event_file_list, inc_event_person = False, by_alias = by_alias, exclude_unset = exclude_unset, # model_as_dict = model_as_dict, ): event_presenter_result_list.append(load_event_presenter_result) else: event_presenter_result_list.append(None) log.debug(event_presenter_result_list) event_person_obj.event_presenter_list = event_presenter_result_list elif isinstance(event_presenter_rec_list_result, list): event_person_obj.event_presenter_list = [] else: event_person_obj.event_presenter_list = None if inc_event_registration: pass if inc_event_session_list: pass if inc_event_track_list: pass # Updated 2021-08-17 if inc_person: log.info('Need to include person data...') # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL if person_obj := load_person_obj( inc_address = inc_address, inc_contact = inc_contact, person_id = person_id ): log.debug(person_obj) event_person_obj.person = person_obj.dict(by_alias=True, exclude_unset=True) else: log.warning('A person object was not returned.') event_person_obj.person = None # Updated 2021-08-17 if inc_user: log.warning(f'This is being deprecated? load_event_person_obj() inc_user') log.info('Need to include user data...') # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL from app.methods.user_methods import load_user_obj if user_obj := load_user_obj( user_id = user_id ): log.debug(user_obj) event_person_obj.user = user_obj.dict(by_alias=True, exclude_unset=True) else: log.warning('A user object was not returned.') event_person_obj.user = None return event_person_obj # ### END ### API Event Person Methods ### load_event_person_obj() ### # ### BEGIN ### API Event Person Methods ### get_event_person_rec_list() ### # for_obj_type: account, event, event_registration, event_badge, person, user # Updated 2021-09-10 def get_event_person_rec_list( for_obj_type: str, # NOTE: This is not for_type because the field name generated based for_obj_id: str, # NOTE: This is not for_id because the field name generated based enabled: str = 'enabled', # enabled, disabled, all limit: int = 1000, ) -> list|bool: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name=for_obj_type): pass else: return False data = {} data[f'{for_obj_type}_id'] = for_obj_id sql_obj_type_id = f'`tbl`.{for_obj_type}_id = :{for_obj_type}_id' # if enabled in ['enabled', 'disabled', 'all']: # if enabled == 'enabled': # data['enable'] = True # sql_enabled = f'AND `tbl`.enable = :enable' # elif enabled == 'disabled': # data['enable'] = False # sql_enabled = f'AND `tbl`.enable = :enable' # elif enabled == 'all': # sql_enabled = '' sql_enabled = '' if limit: data['limit'] = limit sql_limit = f'LIMIT :limit' else: sql_limit = '' sql = f""" SELECT `tbl`.id AS 'event_person_id', `tbl`.id_random AS 'event_person_id_random' FROM `event_person` AS `tbl` WHERE {sql_obj_type_id} {sql_enabled} ORDER BY `tbl`.created_on DESC, `tbl`.updated_on DESC {sql_limit}; """ if event_person_rec_li_result := sql_select(data=data, sql=sql, as_list=True): event_person_rec_li = event_person_rec_li_result else: event_person_rec_li = [] log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(event_person_rec_li_result) return event_person_rec_li # ### END ### API Event Person Methods ### get_event_person_rec_list() ### # ### BEGIN ### API Event Person Methods ### get_account_id_w_event_person_id() ### # Updated 2021-08-24 def get_account_id_w_event_person_id( event_person_id: int|str, ) -> bool|int|None: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if event_person_id := redis_lookup_id_random(record_id_random=event_person_id, table_name='event_person'): pass else: return False data = {} data['event_person_id'] = event_person_id sql = f""" SELECT `event_person`.id AS 'event_person_id', `event_person`.id_random AS 'event_person_id_random', `event_person`.account_id AS account_id FROM `event_person` AS `event_person` WHERE `event_person`.id = :event_person_id LIMIT 1; """ log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL if event_person_data_result := sql_select(data=data, sql=sql): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(event_person_data_result) if account_id := event_person_data_result.get('account_id', None): return account_id else: return False else: return None # ### END ### API Event Person Methods ### get_account_id_w_event_person_id() ### # ### BEGIN ### API Event Person Methods ### get_event_id_w_event_person_id() ### # Updated 2021-08-24 def get_event_id_w_event_person_id( event_person_id: int|str, ) -> bool|int|None: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if event_person_id := redis_lookup_id_random(record_id_random=event_person_id, table_name='event_person'): pass else: return False data = {} data['event_person_id'] = event_person_id sql = f""" SELECT `event_person`.id AS 'event_person_id', `event_person`.id_random AS 'event_person_id_random', `event_person`.event_id AS event_id FROM `event_person` AS `event_person` WHERE `event_person`.id = :event_person_id LIMIT 1; """ log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL if event_person_data_result := sql_select(data=data, sql=sql): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(event_person_data_result) if event_id := event_person_data_result.get('event_id', None): return event_id else: return False else: return None # ### END ### API Event Person Methods ### get_event_id_w_event_person_id() ### # ### BEGIN ### API Event Person Methods ### create_update_event_person_obj_v4() ### # NOTE: This will create or update a event_person. # Rewrite and updated 2021-08-25 def create_update_event_person_obj_v4( event_person_dict_obj: Event_Person_Base|dict, event_person_id: int|str|None = None, account_id: int|str|None = None, event_id: int|str|None = None, create_sub_obj: bool = False, fail_any: bool = False, # Fail if any thing goes wrong for sub objects return_outline: bool = False, ) -> int|bool: log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) log.info('Checking requirements...') if event_person_id: log.info(f'Event Person ID passed. Update existing Event Person. Event Person ID: {event_person_id}') if event_person_id := redis_lookup_id_random(record_id_random=event_person_id, table_name='event_person'): pass else: log.error('Event Person ID passed but is invalid. Failed requirement.') return False if event_id := redis_lookup_id_random(record_id_random=event_id, table_name='event'): pass else: log.error('Missing or invalid Event ID passed. Not required. Ignoring.') log.info(f'Event ID: {event_id}') log.info('Attempting to get Event ID from related object.') from app.methods.event_methods import get_event_id_w_for_type_id if event_id := get_event_id_w_for_type_id(for_type='event_person', for_id=event_person_id): pass else: log.error('Unable to get Event ID from related object.') # return False if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass else: log.error('Missing or invalid Account ID passed. Not required. Ignoring.') log.info(f'Account ID: {account_id}') log.info('Attempting to get Account ID from related object.') if account_id := get_account_id_w_for_type_id(for_type='event', for_id=event_id): pass elif account_id := get_account_id_w_for_type_id(for_type='event_person', for_id=event_person_id): pass else: log.error('Unable to get Account ID from related object.') # return False else: log.info('No Event Person ID passed. Create new Event Person. Required: Account ID, Event ID') if event_id := redis_lookup_id_random(record_id_random=event_id, table_name='event'): pass else: log.error('Missing or invalid Event ID passed. Failed requirement.') log.info(f'Event ID: {event_id}') return False if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass else: log.error('Missing or invalid Account ID passed. Failed requirement.') log.info(f'Account ID: {account_id}') log.info('Attempting to get Account ID from related object.') if account_id := get_account_id_w_for_type_id(for_type='event', for_id=event_id): pass else: log.error('Unable to get Account ID from related object.') return False log.debug(type(event_person_dict_obj)) if isinstance(event_person_dict_obj, dict): event_person_dict = event_person_dict_obj if event_person_id: event_person_dict['event_person_id'] = event_person_id if account_id: event_person_dict['account_id'] = account_id if event_id: event_person_dict['event_id'] = event_id try: event_person_obj = Event_Person_Base(**event_person_dict) log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(event_person_obj) except ValidationError as e: log.error(e.json()) return False else: event_person_obj = event_person_dict_obj if event_person_id: # NOTE: Can't update the ID alias if it was never set. event_person_obj.id = event_person_id if account_id: event_person_obj.account_id = account_id if event_id: event_person_obj.event_id = event_id event_person_dict = event_person_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'event_badge', 'event_registration', 'created_on', 'updated_on'}) if event_person_id: if event_person_dict_up_result := sql_update(data=event_person_dict, table_name='event_person', rm_id_random=True): pass else: log.warning(f'Event Person not updated. Event Person ID: {event_person_id}') log.debug(event_person_dict_up_result) return False log.debug(event_person_dict_up_result) else: if event_person_dict_in_result := sql_insert(data=event_person_dict, table_name='event_person', rm_id_random=True, id_random_length=default_num_bytes): pass else: log.warning(f'Event Person not created.') log.debug(event_person_dict_in_result) return False log.debug(event_person_dict_in_result) event_person_id = event_person_dict_in_result event_person_outline = {} event_person_outline['event_person_id'] = event_person_id # NOTE: WARNING: This has not been fully tested yet. 2021-08-25 # NOTE: Use object model version because of better type checking and validations # if event_person_obj.event_badge: # event_person_outline['event_badge_id'] = None # event_badge_obj = event_person_obj.event_badge # if event_badge_id := event_person_obj.event_badge_id: pass # elif event_badge_id := event_badge_obj.id: pass # else: event_badge_id = None # # event_badge_obj.id # event_badge_obj.event_person_id = event_person_id # create_update_event_badge_obj_result = create_update_event_badge_obj_v4( # event_badge_dict_obj = event_badge_obj, # event_badge_id = event_badge_id, # # account_id = account_id, # event_id = event_id, # event_person_id = event_person_id, # fail_any = fail_any, # return_outline = return_outline, # ) # if isinstance(create_update_event_badge_obj_result, int): # event_badge_id = create_update_event_badge_obj_result # elif create_update_event_badge_obj_result == True: pass # else: # log.warning(f'Create or Update failed while trying create_update_event_badge_obj_v4(): {create_update_event_badge_obj_result}') # event_badge_id = None # event_person_outline['event_badge_id'] = event_badge_id # NOTE: WARNING: This has not been fully tested yet. 2021-09-07 # NOTE: Use object model version because of better type checking and validations if event_person_obj.event_person_profile: event_person_outline['event_person_profile_id'] = None event_person_profile_obj = event_person_obj.event_person_profile if event_person_profile_id := event_person_obj.event_person_profile_id: pass elif event_person_profile_id := event_person_profile_obj.id: pass else: event_person_profile_id = None # event_person_profile_obj.id event_person_profile_obj.event_person_id = event_person_id create_update_event_person_profile_obj_result = create_update_event_person_profile_obj_v4( event_person_profile_dict_obj = event_person_profile_obj, event_person_profile_id = event_person_profile_id, account_id = account_id, event_id = event_id, event_person_id = event_person_id, fail_any = fail_any, return_outline = return_outline, ) if isinstance(create_update_event_person_profile_obj_result, int): event_person_profile_id = create_update_event_person_profile_obj_result elif create_update_event_person_profile_obj_result == True: pass else: log.warning(f'Create or Update failed while trying create_update_event_person_profile_obj_v4(): {create_update_event_person_profile_obj_result}') event_person_profile_id = None event_person_outline['event_person_profile_id'] = event_person_profile_id if return_outline: log.debug(f'Returning the Event Person Outline: {event_person_outline}') return event_person_outline else: log.debug(f'Returning the Event Person ID: {event_person_id}') return event_person_id # ### END ### API Event Person Methods ### create_update_event_person_obj_v4() ### # ### BEGIN ### API Event Person Methods ### create_event_person_obj() ### # NOTE: This will create an event_person. This event_person should include at least a person_id. # NOTE: Is it a good idea to create and or update a person and or user here??? The create_event_person_obj() below does do that. # NOTE NOTE NOTE NOTE: I don't like the idea of creating or updating person and or user here. It just does not seem right... Security risk? Complexity? # Updated 2021-08-25 def create_event_person_obj( event_id: int|str, event_person_obj_new: Event_Person_Base, 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.debug(locals()) if event_id := redis_lookup_id_random(record_id_random=event_id, table_name='event'): pass else: return False log.debug(type(event_person_obj_new)) if isinstance(event_person_obj_new, dict): try: event_person_obj_new = Event_Person_Base(**event_person_obj_new) log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(event_person_obj_new) except ValidationError as e: log.error(e.json()) return False event_person_obj_data = event_person_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'event_badge', 'event_registration', 'created_on', 'updated_on'}) log.debug(event_person_obj_data) if event_person_obj_in_result := sql_insert(data=event_person_obj_data, table_name='event_person', rm_id_random=True, id_random_length=8): pass else: log.warning(f'Event Person not created.') log.debug(event_person_obj_in_result) return False event_person_id = event_person_obj_in_result return_dict = {} return_dict['event_person_id'] = None return_dict['event_badge_id'] = None return_dict['event_registration_id'] = None if event_person_obj_new.event_badge and isinstance(event_person_obj_new.event_badge, dict): log.info(f'Event Badge was found. Create a new Event Badge and link it to the new Event Person or update existing Event Badge. Event Person ID: {event_person_id}') log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL event_badge_obj_unknown = event_person_obj_new.event_badge log.debug(event_badge_obj_unknown) if event_badge_id := event_badge_obj_unknown.get('event_badge_id_random', None): log.warning('Event Badge ID found. This is not expected, but should be ok.') from app.methods.event_badge_methods import update_event_badge_obj_v3 if update_event_badge_obj_result := update_event_badge_obj_v3( event_badge_id = event_badge_id, event_badge_obj_exist = event_badge_obj_unknown, create_sub_obj = create_sub_obj, fail_any = fail_any, ): event_badge_id = update_event_badge_obj_result log.info(f'Event Badge updated. Event Badge ID: {event_badge_id}') else: log.warning(f'Event Badge not updated. Event Person ID: {event_person_id}') log.debug(update_event_badge_obj_result) event_badge_id = None if fail_any: return False if isinstance(update_event_badge_obj_result, int): event_badge_id = update_event_badge_obj_result log.info(f'Event Badge updated. Event Badge ID: {event_badge_id}') else: log.warning(f'Event Badge not updated. Event Person ID: {event_person_id}') log.debug(update_event_badge_obj_result) event_badge_id = None if fail_any: return False else: log.info(f'No Event Badge ID found.') from app.methods.event_badge_methods import create_event_badge_obj if create_event_badge_obj_result := create_event_badge_obj( event_person_id = event_person_id, event_badge_obj_new = event_badge_obj_unknown, create_sub_obj = create_sub_obj, fail_any = fail_any, ): if isinstance(create_event_badge_obj_result, int): event_badge_id = create_event_badge_obj_result log.info(f'Event Badge created. Event Badge ID: {event_badge_id}') else: log.warning(f'Event Badge not created. Event Person ID: {event_person_id}') log.debug(create_event_badge_obj_result) event_badge_id = None if fail_any: return False else: log.warning(f'Event Badge not created. Event Person ID: {event_person_id}') log.debug(create_event_badge_obj_result) event_badge_id = None if fail_any: return False return_dict['event_badge_id'] = event_badge_id else: log.info('Event Badge not found or not in a dict.') pass if event_person_obj_new.event_registration and isinstance(event_person_obj_new.event_registration, dict): log.info(f'Event Registration was found. Create a new Event Registration and link it to the new Event Person or update existing Event Registration. Event Person ID: {event_person_id}') log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL event_registration_obj_unknown = event_person_obj_new.event_registration log.debug(event_registration_obj_unknown) if event_registration_id := event_registration_obj_unknown.get('event_registration_id_random', None): log.warning('Event Registration ID found. This is not expected, but should be ok. Careful with primary vs secondary registrants.') from app.methods.event_registration_methods import update_event_registration_obj_v3 if update_event_registration_obj_result := update_event_registration_obj_v3( event_registration_id = event_registration_id, event_registration_obj_exist = event_registration_obj_unknown, create_sub_obj = create_sub_obj, fail_any = fail_any, ): event_registration_id = update_event_registration_obj_result log.info(f'Event Registration updated. Event Registration ID: {event_registration_id}') else: log.warning(f'Event Registration not updated. Event Person ID: {event_person_id}') log.debug(update_event_registration_obj_result) event_registration_id = None if fail_any: return False if isinstance(update_event_registration_obj_result, int): event_registration_id = update_event_registration_obj_result log.info(f'Event Registration updated. Event Registration ID: {event_registration_id}') else: log.warning(f'Event Registration not updated. Event Person ID: {event_person_id}') log.debug(update_event_registration_obj_result) event_registration_id = None if fail_any: return False else: log.info(f'No Event Registration ID found.') from app.methods.event_registration_methods import create_event_registration_obj if create_event_registration_obj_result := create_event_registration_obj( event_person_id = event_person_id, event_registration_obj_new = event_registration_obj_unknown, create_sub_obj = create_sub_obj, fail_any = fail_any, ): if isinstance(create_event_registration_obj_result, int): event_registration_id = create_event_registration_obj_result log.info(f'Event Registration created. Event Registration ID: {event_registration_id}') else: log.warning(f'Event Registration not created. Event Person ID: {event_person_id}') log.debug(create_event_registration_obj_result) event_registration_id = None if fail_any: return False else: log.warning(f'Event Registration not created. Event Person ID: {event_person_id}') log.debug(create_event_registration_obj_result) event_registration_id = None if fail_any: return False return_dict['event_registration_id'] = event_registration_id else: log.info('Event Registration not found or not in a dict.') pass # Linked to (from event_person) if event_person_obj_new.event_badge and event_person_obj_new.event_badge_id: pass if event_person_obj_new.event_badge_vendor and event_person_obj_new.event_badge_vendor_id: pass if event_person_obj_new.event_badge_vip and event_person_obj_new.event_badge_vip_id: pass if event_person_obj_new.event_registration and event_person_obj_new.event_registration_id: pass # Linked from if event_person_obj_new.event and event_person_obj_new.poc_event_id: pass # POC for event; only one if event_person_obj_new.event_presenter and event_person_obj_new.event_presenter_id: pass # actual presenter; could be more than one if event_person_obj_new.event_session and event_person_obj_new.poc_event_session_id: pass # POC for event session; could be more than one if event_person_obj_new.event_registration and event_person_obj_new.poc_event_registration_id: pass # Primary registrant for registration; only one log.info(f'The Event Person has been created. Event Person ID: {event_person_id}') return event_person_id # ### END ### API Event Person Methods ### create_event_person_obj() ### # ### BEGIN ### API Event Person Methods ### update_event_person_obj_v3() ### # Updated 2021-08-25 def update_event_person_obj_v3( event_person_id: int|str, event_person_obj_exist: Event_Person_Base, create_sub_obj: bool = False, fail_any: bool = False, # Fail if any thing goes wrong for sub objects ) -> bool: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if event_person_id := redis_lookup_id_random(record_id_random=event_person_id, table_name='event_person'): pass else: return False log.debug(type(event_person_obj_exist)) if isinstance(event_person_obj_exist, dict): try: event_person_obj_exist = Event_Person_Base(**event_person_obj_exist) log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(event_person_obj_exist) except ValidationError as e: log.error(e.json()) return False # Can't update the event_person_id alias if the .id was never set. # event_person_obj_exist.event_person_id = event_person_id if not event_person_obj_exist.id: event_person_obj_exist.id = event_person_id event_person_obj_data = event_person_obj_exist.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'event_badge', 'event_registration', 'created_on', 'updated_on'}) log.debug(event_person_obj_data) if event_person_obj_up_result := sql_update(data=event_person_obj_data, table_name='event_person', rm_id_random=True): pass else: log.warning(f'Event Person not updated.') log.debug(event_person_obj_up_result) return False return_dict = {} return_dict['event_person_id'] = event_person_id return_dict['event_badge_id'] = None return_dict['event_registration_id'] = None if event_person_obj_exist.event_badge and isinstance(event_person_obj_exist.event_badge, dict): log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL event_badge_obj_unknown = event_person_obj_exist.event_badge log.debug(event_badge_obj_unknown) if event_badge_id := event_badge_obj_unknown.get('event_badge_id_random', None): from app.methods.event_badge_methods import update_event_badge_obj_v3 if update_event_badge_obj_result := update_event_badge_obj_v3( event_badge_id = event_badge_id, event_badge_obj_exist = event_badge_obj_unknown, create_sub_obj = create_sub_obj, fail_any = fail_any, ): event_badge_id = update_event_badge_obj_result log.info(f'Event Badge updated. Event Badge ID: {event_badge_id}') else: log.warning(f'Event Badge not updated. Event Person ID: {event_person_id}') log.debug(update_event_badge_obj_result) event_badge_id = None if fail_any: return False if isinstance(update_event_badge_obj_result, int): event_badge_id = update_event_badge_obj_result log.info(f'Event Badge updated. Event Badge ID: {event_badge_id}') else: log.warning(f'Event Badge not updated. Event Person ID: {event_person_id}') log.debug(update_event_badge_obj_result) event_badge_id = None if fail_any: return False else: log.info(f'No Event Badge ID found.') from app.methods.event_badge_methods import create_event_badge_obj if create_event_badge_obj_result := create_event_badge_obj( event_person_id = event_person_id, event_badge_obj_new = event_badge_obj_unknown, create_sub_obj = create_sub_obj, fail_any = fail_any, ): if isinstance(create_event_badge_obj_result, int): event_badge_id = create_event_badge_obj_result log.info(f'Event Badge created. Event Badge ID: {event_badge_id}') else: log.warning(f'Event Badge not created. Event Person ID: {event_person_id}') log.debug(create_event_badge_obj_result) event_badge_id = None if fail_any: return False else: log.warning(f'Event Badge not created. Event Person ID: {event_person_id}') log.debug(create_event_badge_obj_result) event_badge_id = None if fail_any: return False return_dict['event_badge_id'] = event_badge_id else: log.info('Event Badge not found or not in a dict.') pass if event_person_obj_exist.event_registration and isinstance(event_person_obj_exist.event_registration, dict): log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL event_registration_obj_unknown = event_person_obj_exist.event_registration log.debug(event_registration_obj_unknown) if event_registration_id := event_registration_obj_unknown.get('event_registration_id_random', None): from app.methods.event_registration_methods import update_event_registration_obj_v3 if update_event_registration_obj_result := update_event_registration_obj_v3( event_registration_id = event_registration_id, event_registration_obj_exist = event_registration_obj_unknown, create_sub_obj = create_sub_obj, fail_any = fail_any, ): event_registration_id = update_event_registration_obj_result log.info(f'Event Registration updated. Event Registration ID: {event_registration_id}') else: log.warning(f'Event Registration not updated. Event Person ID: {event_person_id}') log.debug(update_event_registration_obj_result) event_registration_id = None if fail_any: return False if isinstance(update_event_registration_obj_result, int): event_registration_id = update_event_registration_obj_result log.info(f'Event Registration updated. Event Registration ID: {event_registration_id}') else: log.warning(f'Event Registration not updated. Event Person ID: {event_person_id}') log.debug(update_event_registration_obj_result) event_registration_id = None if fail_any: return False else: log.info(f'No Event Registration ID found.') from app.methods.event_registration_methods import create_event_registration_obj if create_event_registration_obj_result := create_event_registration_obj( event_person_id = event_person_id, event_registration_obj_new = event_registration_obj_unknown, create_sub_obj = create_sub_obj, fail_any = fail_any, ): if isinstance(create_event_registration_obj_result, int): event_registration_id = create_event_registration_obj_result log.info(f'Event Registration created. Event Registration ID: {event_registration_id}') else: log.warning(f'Event Registration not created. Event Person ID: {event_person_id}') log.debug(create_event_registration_obj_result) event_registration_id = None if fail_any: return False else: log.warning(f'Event Registration not created. Event Person ID: {event_person_id}') log.debug(create_event_registration_obj_result) event_registration_id = None if fail_any: return False return_dict['event_registration_id'] = event_registration_id else: log.info('Event Registration not found or not in a dict.') pass log.info(f'The Event Person has been updated. Event Person ID: {event_person_id}') return True # ### END ### API Event Person Methods ### update_event_person_obj_v3() ### # ### BEGIN ### API Event Person Methods ### update_event_person_obj() ### # NOTE: This will update an event_person. This also tries to create or update a person or user if that data is passed. # NOTE: Is it a good idea to create and or update a person and or user here??? # NOTE NOTE NOTE NOTE: This will be taken over by _exist version # NOTE NOTE NOTE NOTE: I don't like the idea of creating or updating person and or user here. It just does not seem right... Security risk? Complexity? # Reviewed and updated 2021-08-10 def update_event_person_obj( event_person_id: int|str, # Ideally the int ID should be passed. This allows for updating of the id_random value. event_person_obj_up: Event_Person_Base, create_sub_obj: bool = False, ) -> bool: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if event_person_id := redis_lookup_id_random(record_id_random=event_person_id, table_name='event_person'): pass else: return False account_id = get_account_id_w_event_person_id(event_person_id) event_person_obj_up.id = event_person_id log.debug(event_person_obj_up) # log.debug(event_person_obj_up.dict(by_alias=True, exclude_unset=True)) log.debug(event_person_obj_up.dict(by_alias=False, exclude_unset=True)) # log.debug(event_person_obj_up.dict(by_alias=False, exclude_unset=False)) if event_person_obj_up.person_id and event_person_obj_up.person: person_id = event_person_obj_up.person_id person_obj_up = event_person_obj_up.person log.debug(person_id) log.debug(person_obj_up) if person_obj_up_result := update_person_obj( person_id=person_id, person_obj_up=person_obj_up, create_sub_obj=create_sub_obj, ): log.debug(person_obj_up_result) else: log.debug(person_obj_up_result) return False elif event_person_obj_up.person and not event_person_obj_up.person.id: # NOTE: This will blindly create a new person even if there was one associated but the event_person.person_id was not found. person_obj_in = event_person_obj_up.person log.debug(person_obj_in) if person_obj_in_result := create_person_obj_v3(account_id=account_id, person_obj_new=person_obj_in): # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(person_obj_in_result) event_person_obj_up.person_id = person_obj_in_result else: # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(person_obj_in_result) return False if event_person_obj_up.user_id and event_person_obj_up.user: # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL from app.methods.user_methods import update_user_obj user_id = event_person_obj_up.user_id user_obj_up = event_person_obj_up.user log.debug(user_id) log.debug(user_obj_up) if user_obj_up_result := update_user_obj( user_id = user_id, user_obj_up = user_obj_up, create_sub_obj = create_sub_obj, ): log.debug(user_obj_up_result) else: log.debug(user_obj_up_result) return False elif event_person_obj_up.user and not event_person_obj_up.user.id: # NOTE: This will blindly create a new user even if there was one associated but the event_person.user_id was not found. from app.methods.user_methods import create_user_obj user_obj_in = event_person_obj_up.user log.debug(user_obj_in) if user_obj_in_result := create_user_obj(account_id=account_id, user_obj_new=user_obj_in): # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(user_obj_in_result) event_person_obj_up.user_id = user_obj_in_result else: # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(user_obj_in_result) return False event_person_dict_up = event_person_obj_up.dict(by_alias=False, exclude_unset=True, exclude={'event_abstract_list', 'event_badge', 'event_exhibit_list', 'event_file_list', 'event_location_list', 'event_presentation_list', 'event_presenter_list', 'event_registration', 'event_session', 'event_track', 'person', 'user'}) log.debug(event_person_dict_up) if event_person_obj_up_result := sql_update(data=event_person_dict_up, table_name='event_person', rm_id_random=True): log.debug(event_person_obj_up_result) return True else: log.debug(event_person_obj_up_result) return False # ### END ### API Event Person Methods ### update_event_person_obj() ### # ### BEGIN ### API Event Person Methods ### smart_event_person_obj() ### # NOTE: This will create an event_person. This event_person should include at least a person_id. # NOTE: Is it a good idea to create and or update a person and or user here??? The smart_event_person_obj() below does do that. # Reviewed and updated 2021-08-10 def smart_event_person_obj(event_person_obj_new:Event_Person_Base) -> int|bool: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if event_person_id := event_person_obj_new.event_person_id: pass if event_id := event_person_obj_new.event_id: pass if event_presentation_id := event_person_obj_new.event_presentation_id: pass if event_session_id := event_person_obj_new.event_session_id: pass # 1: Pull out the event_person data and possible sub object data # event_person # if not event_person_id: create_event_person # if event_person_id: update_event_person # # event # event_badge # event_presenter # could be more than one # event_registration # POC/primary or secondary # event_session # could be more than one # def create_event_person(): # 1: Pull out the event_person data and possible sub object data # event # ignore for now # event_badge # ignore for now # event_presenter # could be more than one # if event_id and event_session_id and event_presentation_id and not event_presenter_id: create_event_presenter # if event_presenter_id: update_event_presenter # event_registration # POC/primary or secondary # ignore for now # event_session # could be more than one # if event_id and not event_session_id: create_event_session # if event_session_id: update_event_session # def update_event_person(): # 1: Pull out the event_person data and possible sub object data # event # ignore for now # event_badge # ignore for now # event_presenter # could be more than one # if event_id and event_session_id and event_presentation_id and not event_presenter_id: create_event_presenter # if event_presenter_id: update_event_presenter # event_registration # POC/primary or secondary # ignore for now # event_session # could be more than one # if event_id and not event_session_id: create_event_session # if event_session_id: update_event_session event_person_obj_data = event_person_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'created_on', 'updated_on'}) log.debug(event_person_obj_data) if event_person_obj_in_result := sql_insert(data=event_person_obj_data, table_name='event_person', rm_id_random=True, id_random_length=8): pass else: return False #log.setLevel(logging.DEBUG) log.debug(event_person_obj_in_result) event_person_id = event_person_obj_in_result # Linked to (from event_person) if event_person_obj_new.event_badge and event_person_obj_new.event_badge_id: pass if event_person_obj_new.event_badge_vendor and event_person_obj_new.event_badge_vendor_id: pass if event_person_obj_new.event_badge_vip and event_person_obj_new.event_badge_vip_id: pass if event_person_obj_new.event_registration and event_person_obj_new.event_registration_id: pass # Linked from if event_person_obj_new.event and event_person_obj_new.poc_event_id: pass # POC for event; only one if event_person_obj_new.event_presenter and event_person_obj_new.event_presenter_id: pass # actual presenter; could be more than one if event_person_obj_new.event_session and event_person_obj_new.poc_event_session_id: pass # POC for event session; could be more than one if event_person_obj_new.event_registration and event_person_obj_new.poc_event_registration_id: pass # Primary registrant for registration; only one log.debug(f'Returning the new event_person_id: {event_person_id}') return event_person_id # ### END ### API Event Person Methods ### smart_event_person_obj() ###