From d4da7535f95cf7e38055b31101a3332fe0f52efa Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Thu, 24 Feb 2022 18:11:14 -0500 Subject: [PATCH] Work on Impexium and badges for ISHLT --- app/methods/e_impexium_methods.py | 3 +- app/models/event_badge_models.py | 8 +++ app/routers/e_impexium.py | 13 ++++- app/routers/event_badge.py | 96 +++++++++++++++++++++++++++---- 4 files changed, 107 insertions(+), 13 deletions(-) diff --git a/app/methods/e_impexium_methods.py b/app/methods/e_impexium_methods.py index b61085d..3baafb9 100644 --- a/app/methods/e_impexium_methods.py +++ b/app/methods/e_impexium_methods.py @@ -179,6 +179,7 @@ def get_events(page=1): # Updated 2021-10-07 def get_event_registrants( event_code: str, + details: bool = False, page: int = 0, # return_all: bool = False ): @@ -209,7 +210,7 @@ def get_event_registrants( # pass endpoint = f'/Events/{event_code}/Registrations/{page}' uri = api['base_url']+endpoint - params = {} + params = { 'includeDetails': details } if resp := requests.get(url=uri, params=params, headers=api['headers']): pass else: break diff --git a/app/models/event_badge_models.py b/app/models/event_badge_models.py index 774fc73..a8e1cda 100644 --- a/app/models/event_badge_models.py +++ b/app/models/event_badge_models.py @@ -30,6 +30,10 @@ class Event_Badge_Base(BaseModel): event_id_random: Optional[str] event_id: Optional[int] + # NOTE: This should only be used when the event_person record can not be created. And records before 2022. + event_id_random_only: Optional[str] + event_id_only: Optional[int] + event_person_id_random: Optional[str] event_person_id: Optional[int] @@ -73,6 +77,10 @@ class Event_Badge_Base(BaseModel): full_address: Optional[str] + # This is updated using SQL triggers and a SQL function + # Combines informal, given, middle, family, email + query_str: Optional[str] + # NOTE: More badge fields need to be added here once things are cleaned up badge_type_code: Optional[str] badge_type: Optional[str] diff --git a/app/routers/e_impexium.py b/app/routers/e_impexium.py index 6889cc4..6fcb13c 100644 --- a/app/routers/e_impexium.py +++ b/app/routers/e_impexium.py @@ -26,6 +26,7 @@ router = APIRouter() @router.get('/event/{e_impexium_event_id}/import_reg', response_model=Resp_Body_Base) async def event_import_reg( e_impexium_event_id: str = Query(..., min_length=11, max_length=22), # For ISHLT: 42_AM (2022-04); EX22_AM (2022-04); 41V_2 (2021-04) + details: bool = False, page: int = 0, # 250 per page from Impexium event_id: str = Query(..., min_length=11, max_length=22), # For ISHLT: ZDzTBlevhZs (2022-04) # Account ID For ISHLT: d8TqXqf1EOg @@ -41,7 +42,7 @@ async def event_import_reg( if event_id := redis_lookup_id_random(record_id_random=event_id, table_name='event'): pass else: return mk_resp(data=None, status_code=404, status_message=f'The Event ID was not found. Event ID: {event_id}', response=commons.response) - event_registrant_li = get_event_registrants(event_code=e_impexium_event_id, page=page) + event_registrant_li = get_event_registrants(event_code=e_impexium_event_id, details=details, page=page) log.debug(type(event_registrant_li)) # return mk_resp(data=len(event_registrant_li), status_code=501, response=commons.response) # Not Implemented @@ -62,6 +63,12 @@ async def event_import_reg( event_person_data['event_id'] = event_id event_person_data['external_id'] = external_id + email = None + if details: + if emails := event_registrant.get('emails'): + if isinstance(emails, list) and len(emails): + email = emails[0].get('address') + event_person_profile_data = {} event_person_profile_data['pronouns'] = event_registrant.get('gender') event_person_profile_data['informal_name'] = event_registrant.get('preferredFirstName') @@ -78,6 +85,8 @@ async def event_import_reg( event_person_profile_data['affiliations'] = event_registrant.get('badgeOrganization') + if email: event_person_profile_data['email'] = email + event_person_data['event_person_profile'] = {} event_person_data['event_person_profile'] = event_person_profile_data @@ -106,6 +115,8 @@ async def event_import_reg( event_badge_data['affiliations'] = event_registrant.get('badgeOrganization') + if email: event_badge_data['email'] = email + event_badge_data['city'] = event_registrant.get('badgeCity') event_badge_data['state_province'] = event_registrant.get('badgeState') diff --git a/app/routers/event_badge.py b/app/routers/event_badge.py index 86db293..59990b1 100644 --- a/app/routers/event_badge.py +++ b/app/routers/event_badge.py @@ -142,15 +142,17 @@ async def search_event_badge_obj_li( event_badge_id: str = Query(None, min_length=3, max_length=22), event_person_id: str = Query(None, min_length=3, max_length=22), - external_id: str = Query('%', max_length=100), # NOTE: Not currently used! 2022-02-15 + external_id: str = Query(None, max_length=100), # NOTE: Not currently used! 2022-02-15 - given_name: str = Query('%', max_length=25), - family_name: str = Query('%', max_length=25), - email: str = Query('%', max_length=50), + query_str: str = Query('', max_length=50), + + given_name: str = Query('', max_length=25), + family_name: str = Query('', max_length=25), + email: str = Query('', max_length=50), commons: Common_Route_Params = Depends(common_route_params), ): - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) # account_id = commons.x_account_id @@ -158,24 +160,50 @@ async def search_event_badge_obj_li( if event_id := redis_lookup_id_random(record_id_random=event_id, table_name='event'): pass else: return mk_resp(data=None, status_code=404, response=commons.response) - log.info(f'Searching: Event ID: {event_id}; Event Badge ID: {event_badge_id}; Event Person ID: {event_person_id}; External ID: {external_id}; Give Name: {given_name}; Family Name: {family_name}; Email: {email}') + if event_badge_id or event_person_id or external_id: + log.info(f'Searching: Event ID: {event_id}; Event Badge ID: {event_badge_id}; Event Person ID: {event_person_id}; External ID: {external_id}') + elif query_str: + log.info(f'Searching: Event ID: {event_id}; Query String: {query_str}') + else: + log.info(f'Searching: Event ID: {event_id}; Event Badge ID: {event_badge_id}; Event Person ID: {event_person_id}; External ID: {external_id}; Give Name: {given_name}; Family Name: {family_name}; Email: {email}') data = {} # data['account_id'] = account_id data['event_id'] = event_id + # Adding the % symbol here because it turns certain combinations into special characters if event_badge_id and len(event_badge_id) > 2: log.info(f'Using Event Badge ID: {event_badge_id}') data['event_badge_id_random'] = f'%{event_badge_id}%' elif event_person_id and len(event_person_id) > 2: log.info(f'Using Event Person ID: {event_person_id}') data['event_person_id_random'] = f'%{event_person_id}%' - else: + elif external_id and len(external_id) > 2: + log.info(f'Using External ID: {external_id}') + data['external_id'] = f'%{external_id}%' + elif query_str and len(query_str) > 1: + log.info(f'Using Query String: {query_str}') + + # Strip (left right) whitespace then commas then semicolons + query_str = query_str.strip().strip(',').strip(';') + # Replace commas, semicolons, and then spaces with % + query_str_like = query_str.replace(',', ' ').replace(';', ' ').replace(' ', '%').replace(' ', '%') + # data['query_str'] = f'%{query_str}%' + log.debug(query_str_like) + data['query_str'] = f'%{query_str_like}%' + + query_li = query_str.split() + data['query_li'] = query_li + elif len(given_name) > 1 or len(family_name) > 1 or len(email) > 1: log.info(f'Using other data fields') - data['external_id'] = '%'+external_id+'%' - data['given_name'] = '%'+given_name+'%' - data['family_name'] = '%'+family_name+'%' - data['email'] = '%'+email+'%' # Adding the % symbol here because it turns certain combinations into special characters + if given_name: data['given_name'] = '%'+given_name+'%' + else: data['given_name'] = '%' + if family_name: data['family_name'] = '%'+family_name+'%' + else: data['family_name'] = '%' + if email: data['email'] = '%'+email+'%' + else: data['email'] = '%' + else: + return mk_resp(data=None, status_code=404, status_message=f'Need more characters for query.', response=commons.response) log.debug(data) sql_enabled, data['enable'] = sql_enable_part(table_name='event_badge', enabled=commons.enabled) # Reasonably safe return str and bool @@ -201,6 +229,52 @@ async def search_event_badge_obj_li( ORDER BY event_badge.given_name ASC, event_badge.family_name ASC, event_badge.created_on DESC, event_badge.updated_on DESC {sql_limit}; """ + elif external_id and len(external_id) > 2: + sql = f""" + SELECT * + FROM `v_event_badge` AS event_badge + WHERE event_badge.event_id = :event_id + AND event_badge.external_id LIKE :external_id + {sql_enabled} + ORDER BY event_badge.given_name ASC, event_badge.family_name ASC, event_badge.created_on DESC, event_badge.updated_on DESC + {sql_limit}; + """ + elif query_str and len(query_str) > 1: + # sql = f""" + # SELECT * + # FROM `v_event_badge` AS event_badge + # WHERE event_badge.event_id = :event_id + # AND ( + # event_badge.given_name LIKE :query_str + # OR event_badge.family_name LIKE :query_str + # OR event_badge.email LIKE :query_str + # ) + # {sql_enabled} + # ORDER BY event_badge.given_name ASC, event_badge.family_name ASC, event_badge.created_on DESC, event_badge.updated_on DESC + # {sql_limit}; + # """ + # sql = f""" + # SELECT * + # FROM `v_event_badge` AS event_badge + # WHERE event_badge.event_id = :event_id + # AND ( + # event_badge.given_name IN (:query_li) + # OR event_badge.family_name IN (:query_li) + # OR event_badge.email IN (:query_li) + # ) + # {sql_enabled} + # ORDER BY event_badge.given_name ASC, event_badge.family_name ASC, event_badge.created_on DESC, event_badge.updated_on DESC + # {sql_limit}; + # """ + sql = f""" + SELECT * + FROM `v_event_badge` AS event_badge + WHERE event_badge.event_id = :event_id + AND event_badge.query_str LIKE :query_str + {sql_enabled} + ORDER BY event_badge.given_name ASC, event_badge.family_name ASC, event_badge.created_on DESC, event_badge.updated_on DESC + {sql_limit}; + """ else: # sql = f""" # SELECT *