Files
OSIT-AE-API-FastAPI/app/routers/event_exhibit_tracking.py
Scott Idem dbe86b8ed8 Unknown
2022-04-23 19:45:37 -04:00

527 lines
27 KiB
Python

import datetime, time
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response, status
from fastapi.responses import FileResponse
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import create_export_file, return_full_tmp_path, log, logging, 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, get_id_random, 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.event_badge_methods import load_event_badge_obj
from app.methods.event_exhibit_tracking_methods import create_event_exhibit_tracking_obj, remove_event_exhibit_tracking_obj, get_event_exhibit_tracking_rec_list, load_event_exhibit_tracking_obj, update_event_exhibit_tracking_obj
from app.models.event_exhibit_tracking_models import Event_Exhibit_Tracking_Base
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
# ### BEGIN ### API Event Exhibit Tracking ### post_event_exhibit_tracking_obj() ###
# Updated 2022-02-15
@router.post('/event/exhibit/tracking', response_model=Resp_Body_Base)
async def post_event_exhibit_tracking_obj(
event_exhibit_id: str = Query(..., min_length=11, max_length=22),
event_exhibit_tracking_obj: Event_Exhibit_Tracking_Base = {},
event_badge_id: str = Query(None, min_length=11, max_length=22),
event_person_id: str = Query(None, min_length=11, max_length=22),
inc_event_badge: bool = False,
inc_event_exhibit: bool = False,
inc_event_person: bool = False,
return_obj: bool = True,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# time.sleep(1)
# ### SECTION ### Secondary data validation
if event_exhibit_id := redis_lookup_id_random(record_id_random=event_exhibit_id, table_name='event_exhibit'): pass
# elif event_exhibit_id is None: pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Exhibit ID was invalid or not found.')
if event_badge_id := redis_lookup_id_random(record_id_random=event_badge_id, table_name='event_badge'): pass
elif event_badge_id is None: pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Badge ID was invalid or not found.')
if event_person_id := redis_lookup_id_random(record_id_random=event_person_id, table_name='event_person'): pass
elif event_person_id is None: pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Person ID was invalid or not found.')
log.debug(event_exhibit_id)
log.debug(event_badge_id)
if event_badge_id or event_person_id: pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Badge ID or Event Person ID is required.')
# ### SECTION ### Process data
if event_exhibit_tracking_id := create_event_exhibit_tracking_obj(
event_exhibit_id = event_exhibit_id,
event_exhibit_tracking_dict_obj = event_exhibit_tracking_obj,
event_badge_id = event_badge_id,
event_person_id = event_person_id,
): pass
elif event_exhibit_tracking_id is None:
# NOTE: I think it makes sense to try and look up the record using the Exhibitor and Person ID. This is for API call convenience.
if event_exhibit_tracking_rec_li := get_event_exhibit_tracking_rec_list(
event_exhibit_id = event_exhibit_id,
event_badge_id = event_badge_id,
event_person_id = event_person_id,
hidden = 'all',
):
# log.debug(event_exhibit_tracking_rec_li)
event_exhibit_tracking_rec = event_exhibit_tracking_rec_li[0]
event_exhibit_tracking_id = event_exhibit_tracking_rec.get('event_exhibit_tracking_id')
log.debug(event_exhibit_tracking_rec.get('hide'))
if event_exhibit_tracking_rec.get('hide'):
event_exhibit_tracking_data = {}
event_exhibit_tracking_data['hide'] = False
if event_exhibit_tracking_update_result := update_event_exhibit_tracking_obj(
event_exhibit_tracking_id = event_exhibit_tracking_id,
event_exhibit_tracking_dict_obj = event_exhibit_tracking_data,
): pass
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response, status_message='Not updated. Something failed while processing the data. Check the field names and data types.') # Bad Request
else:
log.warning('Should this be possible if there was an existing record? Assuming there is an existing record because the SQL function result was None.')
return mk_resp(data=None, status_code=200, response=commons.response, status_message='Not created. Likely duplicate entry. Returning None.') # Success
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response, status_message='Not created. Something failed while processing the data. Check the field names and data types.') # Bad Request
# ### SECTION ### Return successful results
if return_obj:
event_exhibit_tracking_obj = load_event_exhibit_tracking_obj(
event_exhibit_tracking_id = event_exhibit_tracking_id,
inc_event_badge = inc_event_badge,
inc_event_person = inc_event_person,
).dict(by_alias=commons.by_alias, exclude_unset=commons.exclude_unset)
data = event_exhibit_tracking_obj
else:
event_exhibit_tracking_id_random = get_id_random(record_id=event_exhibit_tracking_id, table_name='event_exhibit_tracking')
data = {}
data['event_exhibit_tracking_id'] = event_exhibit_tracking_id
data['event_exhibit_tracking_id_random'] = person_id_random
return mk_resp(data=data, response=commons.response)
# ### END ### API Event Exhibit Tracking ### post_event_exhibit_tracking_obj() ###
# ### BEGIN ### API Event Exhibit Tracking ### patch_event_exhibit_tracking_obj() ###
# Updated 2022-02-15
@router.patch('/event/exhibit/tracking/{event_exhibit_tracking_id}', response_model=Resp_Body_Base)
async def patch_event_exhibit_tracking_obj(
event_exhibit_tracking_obj: Event_Exhibit_Tracking_Base,
event_exhibit_tracking_id: str = Query(..., min_length=11, max_length=22),
inc_event_badge: bool = False,
inc_event_exhibit: bool = False,
inc_event_person: bool = False,
return_obj: bool = True,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
time.sleep(2)
# ### SECTION ### Secondary data validation
event_exhibit_tracking_id_random = event_exhibit_tracking_id # This is used later for the response data
if event_exhibit_tracking_id := redis_lookup_id_random(record_id_random=event_exhibit_tracking_id, table_name='event_exhibit_tracking'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Exhibit Tracking ID was invalid or not found.')
# ### SECTION ### Process data
if event_exhibit_tracking_update_result := update_event_exhibit_tracking_obj(
event_exhibit_tracking_id = event_exhibit_tracking_id,
event_exhibit_tracking_dict_obj = event_exhibit_tracking_obj,
): pass
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response, status_message='Not updated. Something failed while processing the data. Check the field names and data types.') # Bad Request
# ### SECTION ### Return successful results
if return_obj:
event_exhibit_tracking_obj = load_event_exhibit_tracking_obj(
event_exhibit_tracking_id = event_exhibit_tracking_id,
inc_event_badge = inc_event_badge,
inc_event_person = inc_event_person,
).dict(by_alias=commons.by_alias, exclude_unset=commons.exclude_unset)
data = event_exhibit_tracking_obj
else:
data = {}
data['event_exhibit_tracking_id'] = event_exhibit_tracking_id
data['event_exhibit_tracking_id_random'] = event_exhibit_tracking_id_random
return mk_resp(data=data, response=commons.response)
# ### END ### API Event Exhibit Tracking ### patch_event_exhibit_tracking_obj() ###
@router.get('/event/exhibit/tracking/list', response_model=Resp_Body_Base)
async def get_event_exhibit_tracking_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_exhibit_tracking'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Event Exhibit Tracking ### get_event_exhibit_tracking_obj() ###
# Updated 2022-02-15
@router.get('/event/exhibit/tracking/{event_exhibit_tracking_id}', response_model=Resp_Body_Base)
async def get_event_exhibit_tracking_obj(
event_exhibit_tracking_id: str = Query(..., min_length=11, max_length=22),
inc_event_badge: bool = False,
inc_event_exhibit: bool = False,
inc_event_person: bool = False,
inc_event_person_profile: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# ### SECTION ### Secondary data validation
event_exhibit_tracking_id_random = event_exhibit_tracking_id # This is used later for the response data
if event_exhibit_tracking_id := redis_lookup_id_random(record_id_random=event_exhibit_tracking_id, table_name='event_exhibit_tracking'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Exhibit Tracking ID was invalid or not found.')
if event_exhibit_tracking_obj_result := load_event_exhibit_tracking_obj(
event_exhibit_tracking_id = event_exhibit_tracking_id,
inc_event_badge = inc_event_badge,
inc_event_person = inc_event_person,
inc_event_person_profile = inc_event_person_profile,
):
log.info('Loading successful. Returning result')
return mk_resp(data=event_exhibit_tracking_obj_result, response=commons.response) # Success
elif isinstance(event_exhibit_tracking_obj_result, list) or event_exhibit_tracking_obj_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
# ### END ### API Event Exhibit Tracking ### get_event_exhibit_tracking_obj() ###
# ### BEGIN ### API Event Exhibit Tracking ### get_event_exhibit_obj_tracking_export() ###
# Updated 2022-04-21
@router.get('/event/exhibit/{event_exhibit_id}/tracking/export', response_model=Resp_Body_Base)
async def get_event_exhibit_obj_tracking_list(
event_exhibit_id: str = Query(..., min_length=11, max_length=22),
file_type: str = 'CSV', # CSV, Excel
hidden: str = 'not_hidden', # hidden, not_hidden, all
return_file: Optional[bool] = True,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if event_exhibit_id := redis_lookup_id_random(record_id_random=event_exhibit_id, table_name='event_exhibit'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response)
if event_exhibit_tracking_rec_list_result := get_event_exhibit_tracking_rec_list(
event_exhibit_id = event_exhibit_id,
enabled = commons.enabled,
limit = commons.limit,
hidden = hidden,
):
event_exhibit_tracking_result_list = []
data_dict_list_for_export = []
for event_exhibit_tracking_rec in event_exhibit_tracking_rec_list_result:
if load_event_exhibit_tracking_result := load_event_exhibit_tracking_obj(
event_exhibit_tracking_id = event_exhibit_tracking_rec.get('event_exhibit_tracking_id'),
# inc_event_badge = inc_event_badge,
# inc_event_person = inc_event_person,
):
event_exhibit_tracking_result_list.append(load_event_exhibit_tracking_result)
data_dict = load_event_exhibit_tracking_result.dict(by_alias=True, exclude_unset=False)
data_dict['person_informal_name'] = data_dict.pop('event_badge_informal_name')
data_dict['person_title_names'] = data_dict.pop('event_badge_title_names')
data_dict['person_given_name'] = data_dict.pop('event_badge_given_name')
data_dict['person_middle_name'] = data_dict.pop('event_badge_middle_name')
data_dict['person_family_name'] = data_dict.pop('event_badge_family_name')
data_dict['person_designations'] = data_dict.pop('event_badge_designations')
data_dict['person_professional_title'] = data_dict.pop('event_badge_professional_title')
data_dict['person_display_professional_title'] = data_dict.pop('event_badge_display_professional_title')
data_dict['person_display_name'] = data_dict.pop('event_badge_display_name')
data_dict['person_full_name'] = data_dict.pop('event_badge_full_name')
data_dict['person_affiliations'] = data_dict.pop('event_badge_affiliations')
data_dict['person_display_affiliations'] = data_dict.pop('event_badge_display_affiliations')
data_dict['person_email'] = data_dict.pop('event_badge_email')
data_dict['person_city'] = data_dict.pop('event_badge_city')
data_dict['person_country_subdivision_code'] = data_dict.pop('event_badge_country_subdivision_code')
data_dict['person_state_province_abb'] = data_dict.pop('event_badge_state_province_abb')
data_dict['person_state_province'] = data_dict.pop('event_badge_state_province')
data_dict['person_country_alpha_2_code'] = data_dict.pop('event_badge_country_alpha_2_code')
data_dict['person_country'] = data_dict.pop('event_badge_country')
data_dict['person_location'] = data_dict.pop('event_badge_location')
data_dict['person_display_location'] = data_dict.pop('event_badge_display_location')
data_dict_list_for_export.append(data_dict)
else:
event_exhibit_tracking_result_list.append(None)
column_name_li = [
'event_exhibit_tracking_id_random',
'event_badge_id_random',
# 'person_pronouns',
'person_informal_name',
'person_title_names',
'person_given_name',
'person_middle_name',
'person_family_name',
'person_designations',
'person_professional_title', 'person_display_professional_title',
'person_display_name',
'person_full_name',
'person_affiliations',
'person_display_affiliations',
'person_email',
'person_city',
'person_country_subdivision_code', 'person_state_province_abb',
'person_state_province',
'person_country_alpha_2_code',
'person_country',
'person_location',
'person_display_location',
'priority',
'sort',
'exhibitor_notes',
'created_on',
'updated_on',
]
datetime_format='%Y-%m-%d_%H%M'
# current_datetime = datetime.datetime.now() # Servers timezone (Eastern)
current_datetime_utc = datetime.datetime.utcnow()
current_datetime_utc = current_datetime_utc.strftime(datetime_format)
filename = f'exhibit_tracking_list_{current_datetime_utc}'
if file_type == 'CSV':
filename_w_ext = filename+'.csv'
elif file_type == 'Excel':
filename_w_ext = filename+'.xlsx'
if result := create_export_file(data_dict_list=data_dict_list_for_export, column_name_li=column_name_li, subdir_path='event_exhibit', filename=filename, export_type=file_type):
tmp_file_path = result
else:
log.error('Something went wrong while creating or saving the export file')
tmp_file_path = result
log.info(f'Filename: {filename_w_ext}')
if return_file:
if full_tmp_path := return_full_tmp_path(full_tmp_path=tmp_file_path):
return FileResponse(path=full_tmp_path, filename=filename_w_ext) # , media_type='application/octet-stream'
else:
return mk_resp(data=data_dict_list_for_export, tmp_file_path=tmp_file_path, response=commons.response)
# return mk_resp(data=event_exhibit_tracking_result_list, response=commons.response) # Success
elif isinstance(event_exhibit_tracking_rec_list_result, list):
return mk_resp(data=False, status_code=404, response=commons.response) # Not Found
else:
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
# ### END ### API Event Exhibit Tracking ### get_event_exhibit_obj_tracking_export() ###
# ### BEGIN ### API Event Exhibit Tracking ### get_event_exhibit_obj_tracking_list() ###
# Updated 2022-02-15
@router.get('/event/exhibit/{event_exhibit_id}/tracking/list', response_model=Resp_Body_Base)
async def get_event_exhibit_obj_tracking_list(
event_exhibit_id: str = Query(..., min_length=11, max_length=22),
event_person_id: str = Query(None, min_length=11, max_length=22),
inc_event_badge: bool = False,
inc_event_exhibit: bool = False,
inc_event_person: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if event_exhibit_id := redis_lookup_id_random(record_id_random=event_exhibit_id, table_name='event_exhibit'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response)
if event_person_id:
if event_person_id := redis_lookup_id_random(record_id_random=event_person_id, table_name='event_person'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response)
if event_exhibit_tracking_rec_list_result := get_event_exhibit_tracking_rec_list(
event_exhibit_id = event_exhibit_id,
event_person_id = event_person_id,
enabled = commons.enabled,
limit = commons.limit,
):
event_exhibit_tracking_result_list = []
for event_exhibit_tracking_rec in event_exhibit_tracking_rec_list_result:
if load_event_exhibit_tracking_result := load_event_exhibit_tracking_obj(
event_exhibit_tracking_id = event_exhibit_tracking_rec.get('event_exhibit_tracking_id'),
inc_event_badge = inc_event_badge,
inc_event_person = inc_event_person,
# by_alias = commons.by_alias,
# exclude_unset = commons.exclude_unset,
# # model_as_dict = commons.model_as_dict,
):
event_exhibit_tracking_result_list.append(load_event_exhibit_tracking_result)
else:
event_exhibit_tracking_result_list.append(None)
return mk_resp(data=event_exhibit_tracking_result_list, response=commons.response) # Success
elif isinstance(event_exhibit_tracking_rec_list_result, list):
return mk_resp(data=False, status_code=404, response=commons.response) # Not Found
else:
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
# ### END ### API Event Exhibit Tracking ### get_event_exhibit_obj_tracking_list() ###
# ### BEGIN ### API Event Exhibit Tracking ### delete_event_exhibit_tracking_obj() ###
# Updated 2022-02-15
@router.delete('/event/exhibit/tracking/{event_exhibit_tracking_id}', response_model=Resp_Body_Base)
def delete_event_exhibit_tracking_obj(
event_exhibit_tracking_id: str = Query(..., min_length=11, max_length=22),
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# ### SECTION ### Secondary data validation
if event_exhibit_tracking_id := redis_lookup_id_random(record_id_random=event_exhibit_tracking_id, table_name='event_exhibit_tracking'): pass
else: return mk_resp(data=None, status_code=404, response=response, status_message='The Event Exhibit Tracking ID was invalid or not found.')
if event_exhibit_tracking_obj_result := remove_event_exhibit_tracking_obj(
event_exhibit_tracking_id = event_exhibit_tracking_id,
):
log.info('Delete successful. Returning True')
return mk_resp(data=True, response=response) # Success
elif event_exhibit_tracking_obj_result is None: # None
log.info('No results')
return mk_resp(data=None, status_code=404, response=response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
# ### END ### API Event Exhibit Tracking ### delete_event_exhibit_tracking_obj() ###
# ### BEGIN ### API Event Exhibit Tracking ### lookup_event_badge_id_tracking() ###
# Updated 2022-04-15
@router.get('/e/event/exhibit/lookup_id_for_tracking', response_model=Resp_Body_Base)
async def lookup_event_badge_id_tracking(
event_exhibit_id: str = Query(..., min_length=11, max_length=22),
event_badge_id: str = Query(..., min_length=11, max_length=22),
# add: bool = False,
remove: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if event_exhibit_id := redis_lookup_id_random(record_id_random=event_exhibit_id, table_name='event_exhibit'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Exhibit ID was invalid or not found.')
if event_badge_id := redis_lookup_id_random(record_id_random=event_badge_id, table_name='event_badge'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Badge ID was invalid or not found.')
if event_badge_obj_result := load_event_badge_obj(
event_badge_id = event_badge_id,
return_basic_model = True):
event_badge_obj = event_badge_obj_result
event_badge_id_random = event_badge_obj.id_random
log.info(f'Event Badge ID found: {event_badge_id_random}')
log.debug(event_badge_obj)
event_exhibit_tracking_data = {}
event_exhibit_tracking_data['sort'] = 3
if event_badge_obj.allow_tracking is True:
event_exhibit_tracking_data['hide'] = False
else:
event_exhibit_tracking_data['hide'] = True
event_exhibit_tracking_data['notes'] = 'Added by external API'
if get_event_exhibit_tracking_rec_list_result := get_event_exhibit_tracking_rec_list(
event_exhibit_id = event_exhibit_id,
event_badge_id = event_badge_id,
hidden = 'all',
limit = 1,
):
event_exhibit_tracking_rec = get_event_exhibit_tracking_rec_list_result[0]
event_exhibit_tracking_id = event_exhibit_tracking_rec.get('event_exhibit_tracking_id')
if update_event_exhibit_tracking_obj_result := update_event_exhibit_tracking_obj(
event_exhibit_tracking_id = event_exhibit_tracking_id,
event_exhibit_tracking_dict_obj = event_exhibit_tracking_data,
):
log.info(f'Updated Event Exhibit Tracking ID: {event_exhibit_tracking_id}')
else:
log.info(f'Event Exhibit Tracking ID not updated for Event Badge ID: {event_badge_id}')
log.debug(update_event_exhibit_tracking_obj_result)
else:
if create_event_exhibit_tracking_obj_result := create_event_exhibit_tracking_obj(
event_exhibit_id = event_exhibit_id,
event_exhibit_tracking_dict_obj = event_exhibit_tracking_data,
event_badge_id = event_badge_id
):
event_exhibit_tracking_id = create_event_exhibit_tracking_obj_result
# event_exhibit_tracking_id_random = event_exhibit_tracking_obj.id_random
log.info(f'New Event Exhibit Tracking ID: {event_exhibit_tracking_id}')
# log.debug(event_exhibit_tracking_id)
else:
log.info(f'New Event Exhibit Tracking ID not created for Event Badge ID: {event_badge_id}')
log.debug(create_event_exhibit_tracking_obj_result)
if event_badge_obj.allow_tracking is True:
return mk_resp(data=event_badge_obj, response=commons.response) # Success
else:
log.info('Tracking is now allowed')
return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Badge could not be returned. They have not opted in to lead retrieval at this time.') # Not Found
elif event_badge_obj_result is None: # None
log.info('No results')
return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Badge could not be returned. They may not have opted in to lead retrieval at this time.') # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
# ### END ### API Event Exhibit Tracking ###