From e36a95fd766e70ef61e19abd11dcbe6c6d57ff08 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Fri, 7 Oct 2022 17:47:58 -0400 Subject: [PATCH] Work on event program data importing. --- app/log.py | 22 +- app/main.py | 1 + app/methods/hosted_file_methods.py | 5 +- app/routers/event_importing.py | 550 ++++++++++++++++++++++++++--- 4 files changed, 521 insertions(+), 57 deletions(-) diff --git a/app/log.py b/app/log.py index e7a6ac5..c962ead 100644 --- a/app/log.py +++ b/app/log.py @@ -1,18 +1,24 @@ import functools, logging +# stream options: 'ext://sys.stderr' or 'ext://sys.stdout' +# NOTE: This log config is confusing and may need work... 2022-10-07 +# 'uvicorn' under 'loggers' creates an output to the 'console' handler +# Do not also add 'console' handler to the 'root' 'handlers' list +# For now just using that to add or remove file logging options. logging.config.dictConfig({ 'version': 1, 'formatters': { 'default': {'format': '[%(asctime)s] %(levelname)s @ %(module)s.%(funcName)s()#%(lineno)d: %(message)s'}, 'long': {'format': '[%(asctime)s] %(levelname)s @ %(module)s.%(funcName)s()#%(lineno)d: %(message)s', 'datefmt': '%Y-%m-%d %H:%M:%S'}, - 'short': {'format': '[%(asctime)s] %(levelname)s @ %(module)s.%(funcName)s()#%(lineno)d: %(message)s', 'datefmt': '%H:%M:%S'}, + 'short': {'format': '[%(asctime)s] %(levelname)s @ %(module)s.%(funcName)s()#%(lineno)d: %(message)s', 'datefmt': '%H:%M:%S', 'use_colors': True}, }, #'filename': 'example.log', - #'level': logging.ERROR, + # 'level': logging.ERROR, 'handlers': { 'console': { 'class': 'logging.StreamHandler', + 'stream': 'ext://sys.stderr', 'formatter': 'short', }, 'log_file_all': { @@ -37,15 +43,23 @@ logging.config.dictConfig({ 'formatter': 'short', } }, + 'loggers': { + # 'uvicorn': {'handlers': ['default'], 'level': 'INFO'}, + 'uvicorn': {'handlers': ['console'], 'level': 'INFO'}, + # 'uvicorn.error': {'level': 'INFO', 'handlers': ['default'], 'propagate': True}, + # 'uvicorn.error': {'level': 'INFO', 'handlers': ['console'], 'propagate': True}, + # 'uvicorn.access': {'handlers': ['access'], 'level': 'INFO', 'propagate': False}, + }, 'root': { - 'handlers': ['console'], #, 'log_file_all', 'log_file_warning'], + 'handlers': ['log_file_all'], #, 'log_file_all', 'log_file_warning'], + # 'handlers': ['console', 'log_file_all'], #, 'log_file_all', 'log_file_warning'], 'level': 'WARNING', # WARNING } }) log = logging.getLogger('root') -log.setLevel(logging.ERROR) # DEBUG > INFO > WARNING > ERROR > CRITICAL +# log.setLevel(logging.INFO) # DEBUG > INFO > WARNING > ERROR > CRITICAL # logging.basicConfig( # format='[%(asctime)s] %(levelname)s @ %(module)s.%(funcName)s()#%(lineno)d: %(message)s' # ) diff --git a/app/main.py b/app/main.py index abf33cc..9ce6f77 100644 --- a/app/main.py +++ b/app/main.py @@ -34,6 +34,7 @@ print('### **** *** ** * The Aether FastAPI API is loading... * ** *** **** ###' app = FastAPI( + # debug = True, title = 'Aether API', description = 'One Sky IT\'s Aether API using FastAPI.', version = '5.8.0', diff --git a/app/methods/hosted_file_methods.py b/app/methods/hosted_file_methods.py index 71d0776..d2e74b0 100644 --- a/app/methods/hosted_file_methods.py +++ b/app/methods/hosted_file_methods.py @@ -161,10 +161,10 @@ def allowed_file_extension(extension: str, extension_list: list): async def save_file( file: UploadFile, account_id: int, - account_id_random: str, link_to_type: str, link_to_id: int, - link_to_id_random: str, + account_id_random: str = None, + link_to_id_random: str = None, check_allowed_extension: bool = False, ): log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL @@ -173,7 +173,6 @@ async def save_file( hosted_files_path = settings.FILES_PATH['hosted_files_root'] # hosted_files_path = '/home/scott/tmp/hosted_files_dev/' log.info(f'Hosted Files Path: {hosted_files_path}') - log.debug(shutil.disk_usage(hosted_files_path)) log.debug(dir(file)) diff --git a/app/routers/event_importing.py b/app/routers/event_importing.py index fc7ee63..dcb9d23 100644 --- a/app/routers/event_importing.py +++ b/app/routers/event_importing.py @@ -1,10 +1,10 @@ -import datetime, json, pytz, secrets, time +import datetime, json, os, pathlib, pytz, secrets, shutil, time import pandas, xlrd # qrcode -from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response, status +from fastapi import APIRouter, Body, Depends, File, Header, HTTPException, Query, Response, status, UploadFile from pydantic import BaseModel, EmailStr, Field from typing import Dict, List, Optional, Set, Union -from app.lib_general import log, logging, secure_hash_string +from app.lib_general import log, logging, 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 @@ -13,6 +13,7 @@ from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_ # from app.methods.event_session_methods import create_update_event_session_obj_v4, get_event_session_rec_list, load_event_session_obj, update_event_session_obj # from app.methods.event_presentation_methods import create_update_event_presentation_obj_v4, get_event_presentation_rec_list, load_event_presentation_obj # from app.methods.event_presenter_methods import create_update_event_presenter_obj_v4, get_event_presenter_rec_list, load_event_presenter_obj +from app.methods.hosted_file_methods import load_hosted_file_obj, save_file from app.models.event_models import Event_Base from app.models.event_location_models import Event_Location_Base @@ -38,6 +39,9 @@ async def event_importing_create_update_w_external_id( log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) + allow_inserts = False + allow_updates = False + account_id = 2 # CMSC 2 8Gfxbxr19Nw event_id = 1438 # CMSC 2021 1438 8nMUlA93Ybw full_file_path = 'admin/temp/import_event_program_external_id.csv' @@ -117,11 +121,12 @@ async def event_importing_create_update_w_external_id( log.debug(event_location_data) - if event_location_obj_up_result := sql_update(data=event_location_data, table_name='event_location'): - log.debug(event_location_obj_up_result) - else: - log.warning(event_location_obj_up_result) - pass # Probably nothing to update + if allow_updates: + if event_location_obj_up_result := sql_update(data=event_location_data, table_name='event_location'): + log.debug(event_location_obj_up_result) + else: + log.warning(event_location_obj_up_result) + pass # Probably nothing to update else: log.info(f'No record found that needs to be updated. Creating a new event location. Event Location External ID: {event_location_external_id}') @@ -129,12 +134,13 @@ async def event_importing_create_update_w_external_id( log.debug(event_location_data) - if event_location_obj_in_result := sql_insert(data=event_location_data, table_name='event_location'): - log.debug(event_location_obj_in_result) - event_location_id = event_location_obj_in_result - else: - log.warning(event_location_obj_in_result) - continue # Something unexpected may have happened + if allow_inserts: + if event_location_obj_in_result := sql_insert(data=event_location_data, table_name='event_location'): + log.debug(event_location_obj_in_result) + event_location_id = event_location_obj_in_result + else: + log.warning(event_location_obj_in_result) + continue # Something unexpected may have happened # INSERT or UPDATE event_session data['event_session_external_id'] = event_session_external_id @@ -174,11 +180,12 @@ async def event_importing_create_update_w_external_id( log.debug(event_session_data) - if event_session_obj_up_result := sql_update(data=event_session_data, table_name='event_session'): - log.debug(event_session_obj_up_result) - else: - log.warning(event_session_obj_up_result) - pass # Probably nothing to update + if allow_updates: + if event_session_obj_up_result := sql_update(data=event_session_data, table_name='event_session'): + log.debug(event_session_obj_up_result) + else: + log.warning(event_session_obj_up_result) + pass # Probably nothing to update else: log.info(f'No record found that needs to be updated. Creating a new event session. Event Session External ID: {event_session_external_id}') @@ -186,12 +193,13 @@ async def event_importing_create_update_w_external_id( log.debug(event_session_data) - if event_session_obj_in_result := sql_insert(data=event_session_data, table_name='event_session'): - log.debug(event_session_obj_in_result) - event_session_id = event_session_obj_in_result - else: - log.warning(event_session_obj_in_result) - continue # Something unexpected may have happened + if allow_insert: + if event_session_obj_in_result := sql_insert(data=event_session_data, table_name='event_session'): + log.debug(event_session_obj_in_result) + event_session_id = event_session_obj_in_result + else: + log.warning(event_session_obj_in_result) + continue # Something unexpected may have happened # INSERT or UPDATE event_presentation data['event_presentation_external_id'] = event_presentation_external_id @@ -234,11 +242,12 @@ async def event_importing_create_update_w_external_id( log.debug(event_presentation_data) - if event_presentation_obj_up_result := sql_update(data=event_presentation_data, table_name='event_presentation'): - log.debug(event_presentation_obj_up_result) - else: - log.warning(event_presentation_obj_up_result) - pass # Probably nothing to update + if allow_updates: + if event_presentation_obj_up_result := sql_update(data=event_presentation_data, table_name='event_presentation'): + log.debug(event_presentation_obj_up_result) + else: + log.warning(event_presentation_obj_up_result) + pass # Probably nothing to update else: log.info(f'No record found that needs to be updated. Creating a new event presentation. Event Presentation External ID: {event_presentation_external_id}') @@ -246,12 +255,13 @@ async def event_importing_create_update_w_external_id( log.debug(event_presentation_data) - if event_presentation_obj_in_result := sql_insert(data=event_presentation_data, table_name='event_presentation'): - log.debug(event_presentation_obj_in_result) - event_presentation_id = event_presentation_obj_in_result - else: - log.warning(event_presentation_obj_in_result) - continue # Something unexpected may have happened + if allow_inserts: + if event_presentation_obj_in_result := sql_insert(data=event_presentation_data, table_name='event_presentation'): + log.debug(event_presentation_obj_in_result) + event_presentation_id = event_presentation_obj_in_result + else: + log.warning(event_presentation_obj_in_result) + continue # Something unexpected may have happened # INSERT or UPDATE event_presenter data['event_presenter_external_id'] = event_presenter_external_id @@ -290,11 +300,12 @@ async def event_importing_create_update_w_external_id( log.debug(event_presenter_data) - if event_presenter_obj_up_result := sql_update(data=event_presenter_data, table_name='event_presenter'): - log.debug(event_presenter_obj_up_result) - else: - log.warning(event_presenter_obj_up_result) - pass # Probably nothing to update + if allow_updates: + if event_presenter_obj_up_result := sql_update(data=event_presenter_data, table_name='event_presenter'): + log.debug(event_presenter_obj_up_result) + else: + log.warning(event_presenter_obj_up_result) + pass # Probably nothing to update else: log.info(f'No record found that needs to be updated. Creating a new event presenter. Event Presenter External ID: {event_presenter_external_id}') @@ -302,17 +313,456 @@ async def event_importing_create_update_w_external_id( log.debug(event_presenter_data) - if event_presenter_obj_in_result := sql_insert(data=event_presenter_data, table_name='event_presenter'): - log.debug(event_presenter_obj_in_result) - event_presenter_id = event_presenter_obj_in_result - else: - log.warning(event_presenter_obj_in_result) - continue # Something unexpected may have happened - - - + if allow_inserts: + if event_presenter_obj_in_result := sql_insert(data=event_presenter_data, table_name='event_presenter'): + log.debug(event_presenter_obj_in_result) + event_presenter_id = event_presenter_obj_in_result + else: + log.warning(event_presenter_obj_in_result) + continue # Something unexpected may have happened event_session_data_li.append(data) log.debug(f'Record processed: {event_session_id} {event_presentation_id} {event_presenter_full_name}') + # End of loop return mk_resp(data=event_session_data_li, response=response) + + +# ### BEGIN ### Event Importing ### event_importing_program_data() ### +# Based on the program import template the clients are given. +# Create and update locations, sessions, presentations, and presenters as needed. +# Updated 2022-10-07 +@router.post('/event/{event_id}/importing/program_data', response_model=Resp_Body_Base) +async def event_importing_program_data( + event_id: str = Query(..., min_length=11, max_length=22), + file: UploadFile = File(...), + + commons: Common_Route_Params = Depends(common_route_params), + ): + log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + allow_inserts = False + allow_updates = False + + account_id = commons.x_account_id + event_location_id = None + event_session_id = None + event_presentation_id = None + event_presenter_id = None + + 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) + + link_to_type = 'event' + link_to_id = event_id + + file_info = await save_file( + file = file, + account_id = account_id, + # account_id_random = account_id_random, + link_to_type = link_to_type, + link_to_id = link_to_id, + # link_to_id_random = link_to_id_random, + # check_allowed_extension = check_allowed_extension, + ) + if file_info['saved']: + log.info('File saved') + log.debug(file_info) + else: + log.error('Something may have gone wrong while saving the uploaded file?') + return mk_resp(data=None, status_code=500, response=commons.response) + + # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + + hosted_files_path = settings.FILES_PATH['hosted_files_root'] + # hosted_files_path = '/home/scott/tmp/hosted_files_dev/' + log.info(f'Hosted Files Path: {hosted_files_path}') + log.debug(shutil.disk_usage(hosted_files_path)) + + # full_file_path = 'admin/temp/import_event_program_external_id.csv' + subdirectory_dest = os.path.join(hosted_files_path, file_info.get('subdirectory_path')) + log.debug(subdirectory_dest) + hash_filename = file_info.get('hash_sha256')+'.file' + full_file_path = pathlib.Path( os.path.join(subdirectory_dest, hash_filename) ) # NOTE: Must use pathlib.Path to use .exists() + log.debug(full_file_path) + + if full_file_path.exists(): + log.info(f'Full File Path: {full_file_path}') + else: + log.warning(f'Not found at full File Path: {full_file_path}') + return mk_resp(data=None, status_code=500, response=commons.response) + + # return mk_resp(data=file_info, response=commons.response) + + df = pandas.read_csv( + full_file_path, + na_filter=False, + dtype={ + 'external_id': str, 'External ID': str, + 'event_location_external_id': str, 'event_location_code': str, 'event_location_sort': int, + 'event_presentation_external_id': str, 'event_presentation_code': str, 'event_presentation_sort': int, + 'event_presenter_external_id': str, 'event_presenter_code': str, 'event_presenter_number': int, 'event_presenter_designations': str, 'event_presenter_sort': int, + 'event_session_external_id': str, 'event_session_code': str, 'event_session_sort': int, + + 'location_external_id': str, 'location_code': str, 'location_sort': int, + 'presentation_external_id': str, 'presentation_code': str, 'presentation_sort': int, + 'presenter_external_id': str, 'presenter_code': str, 'presenter_number': int, 'presenter_designations': str, 'presenter_sort': int, + 'session_external_id': str, 'session_code': str, 'session_sort': int, + + 'source_id': str, 'Source ID': str, 'email': str, 'Email Address': str + } + ) + df.rename(columns={ + 'Source ID': 'source_id', + 'External ID': 'external_id', + + 'Title': 'title_names', + 'Title Names': 'title_names', + 'Prefix': 'title_names', + 'Informal_name': 'informal_name', + 'Nickname': 'informal_name', + 'given_name (first)': 'given_name', + 'Given Name': 'given_name', + 'First Name': 'given_name', + 'Middle Name': 'middle_name', + 'family_name (last)': 'family_name', + 'Family Name': 'family_name', + 'Last Name': 'family_name', + 'Designations': 'designations', + 'Suffix': 'designations', + + 'Professional Title': 'professional_title', + + 'Affiliations': 'affiliations', + 'Company': 'affiliations', + + 'Email': 'email', + 'Email Address': 'email', + 'CC Email Address': 'cc_email', + + 'location_title': 'location_name', + 'Location Code': 'location_code', + 'Location Name': 'location_name', + + 'session_title': 'session_name', + 'Session Code': 'session_code', + 'Session Name': 'session_name', + + 'presentation_title': 'presentation_name', + 'Presentation Code': 'presentation_code', + 'Presentation Name': 'presentation_name', + }, + inplace = True) + # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(df) + + df_dict = df.to_dict(orient='records') + + event_program_data_li = [] + + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + for record in df_dict: + # ### Figure out the external IDs + if event_location_external_id := record.get('location_external_id'): + log.info('Using location_external_id for event_location_external_id') + elif event_location_external_id := record.get('location_code'): + log.info('Using location_code for event_location_external_id') + else: + log.info('No location external ID or code was found. Creating one with the name...') + event_location_name = record.get('location_name', '').strip() + event_location_external_id = f'{event_location_name}' # .strip() + log.debug(f'Event Location External ID: {event_location_external_id}') + + if event_session_external_id := record.get('session_external_id'): + log.info('Using session_external_id for event_session_external_id') + elif event_session_external_id := record.get('session_code'): + log.info('Using session_code for event_session_external_id') + else: + log.info('No session external ID or code was found. Creating one with the name...') + event_session_name = record.get('session_name', '').strip() + event_session_external_id = f'{event_session_name}' # .strip() + log.debug(f'Event Session External ID: {event_session_external_id}') + + if event_presentation_external_id := record.get('presentation_external_id'): + log.info('Using presentation_external_id for event_presentation_external_id') + elif event_presentation_external_id := record.get('presentation_code'): + log.info('Using presentation_code for event_presentation_external_id') + else: + log.info('No presentation external ID or code was found. Creating one with the name...') + event_presentation_name = record.get('presentation_name', '').strip() + event_presentation_external_id = f'{event_session_external_id}:{event_presentation_name}' # .strip() + log.debug(f'Event Presentation External ID: {event_presentation_external_id}') + + if event_presenter_external_id := record.get('presenter_external_id'): + log.info('Using presenter_external_id for event_presenter_external_id') + elif event_presenter_external_id := record.get('presenter_code'): + log.info('Using presenter_code for event_presenter_external_id') + else: + log.info('No presenter external ID or code was found. Creating one with the name...') + event_presenter_last_first_name = ', '.join( [record.get('presenter_family_name', ''), record.get('presenter_given_name', '')] ) + # event_presenter_name = record.get('presenter_name', '').strip() + event_presenter_external_id = f'{event_presentation_external_id}:{event_presenter_last_first_name}' # .strip() + log.debug(f'Event Presenter External ID: {event_presenter_external_id}') + + # continue + + data = {} + data['account_id'] = account_id + data['event_id'] = event_id + + # ### INSERT or UPDATE event_location + # NOTE: In the future it may make more sense to pull this location part out and or add a checked ID array so we can avoid SQL queries. + data['event_location_external_id'] = event_location_external_id + + sql = f""" + SELECT * + FROM `v_event_location` AS `event_location` + WHERE event_location.event_id = :event_id + AND event_location.external_id = :event_location_external_id + LIMIT 1; + """ + + event_location_data = {} + event_location_data['code'] = record.get('location_code') + event_location_data['event_id'] = event_id # INSERT and UPDATE the event_id just in case + event_location_data['name'] = record.get('location_name') + + event_location_id = None + if event_location_rec_result := sql_select(data=data, sql=sql): + # Pull out IDs and UPDATE existing event_location record + event_location_rec = event_location_rec_result + event_location_id = event_location_rec.get('event_location_id') + event_location_id_random = event_location_rec.get('event_location_id_random') + event_location_name = event_location_data.get('name') + log.info(f'Found one record. Event Location ID: {event_location_id_random} Event Location Name: {event_location_name}') + + event_location_data['id'] = event_location_id + + log.debug(event_location_data) + + if allow_updates: + if event_location_obj_up_result := sql_update(data=event_location_data, table_name='event_location'): + log.debug(event_location_obj_up_result) + else: + log.warning(event_location_obj_up_result) + pass # Probably nothing to update + else: + log.info(f'No record found that needs to be updated. Creating a new event location. Event Location External ID: {event_location_external_id}') + + event_location_data['external_id'] = event_location_external_id # NOTE: This should never change + + log.debug(event_location_data) + + if allow_inserts: + if event_location_obj_in_result := sql_insert(data=event_location_data, table_name='event_location'): + log.debug(event_location_obj_in_result) + event_location_id = event_location_obj_in_result + else: + log.warning(event_location_obj_in_result) + continue # Something unexpected may have happened + data['event_location_id'] = event_location_id + + # ### INSERT or UPDATE event_session + data['event_session_external_id'] = event_session_external_id + + sql = f""" + SELECT * + FROM `v_event_session` AS `event_session` + WHERE event_session.event_id = :event_id + AND event_session.external_id = :event_session_external_id + LIMIT 1; + """ + + event_session_data = {} + event_session_data['code'] = record.get('session_code') + event_session_data['event_id'] = event_id # INSERT and UPDATE the event_id just in case + event_session_data['event_location_id'] = event_location_id # INSERT and UPDATE the event_location_id in case the session was moved + event_session_data['name'] = record.get('session_name') + event_session_data['description'] = record.get('session_description') + + event_session_data['start_datetime'] = record.get('session_start_datetime') + # event_session_start_datetime = record.get('event_session_start_date', '') + ' ' + record.get('event_session_start_time', '') + # event_session_data['start_datetime'] = event_session_start_datetime + + event_session_data['end_datetime'] = record.get('session_end_datetime') + # event_session_end_datetime = record.get('event_session_end_date', '') + ' ' + record.get('event_session_end_time', '') + # event_session_data['end_datetime'] = event_session_end_datetime + + event_session_data['sort'] = record.get('session_sort') + + event_session_data['notes'] = record.get('session_notes') + + event_session_id = None + if event_session_rec_result := sql_select(data=data, sql=sql): + # Pull out IDs and UPDATE existing event_session record + event_session_rec = event_session_rec_result + event_session_id = event_session_rec.get('event_session_id') + event_session_id_random = event_session_rec.get('event_session_id_random') + event_session_name = event_session_rec.get('name') + log.info(f'Found one record. Event Session ID: {event_session_id_random} Event Session Name: {event_session_name}') + + event_session_data['id'] = event_session_id + + log.debug(event_session_data) + + if allow_updates: + if event_session_obj_up_result := sql_update(data=event_session_data, table_name='event_session'): + log.debug(event_session_obj_up_result) + else: + log.warning(event_session_obj_up_result) + pass # Probably nothing to update + else: + log.info(f'No record found that needs to be updated. Creating a new event session. Event Session External ID: {event_session_external_id}') + + event_session_data['external_id'] = event_session_external_id # NOTE: This should never change + + log.debug(event_session_data) + + if allow_inserts: + if event_session_obj_in_result := sql_insert(data=event_session_data, table_name='event_session'): + log.debug(event_session_obj_in_result) + event_session_id = event_session_obj_in_result + else: + log.warning(event_session_obj_in_result) + continue # Something unexpected may have happened + data['event_session_id'] = event_session_id + + # INSERT or UPDATE event_presentation + data['event_presentation_external_id'] = event_presentation_external_id + + sql = f""" + SELECT * + FROM `v_event_presentation` AS `event_presentation` + WHERE event_presentation.event_session_id = :event_session_id + AND event_presentation.external_id = :event_presentation_external_id + LIMIT 1; + """ + + event_presentation_data = {} + event_presentation_data['code'] = record.get('presentation_code') + event_presentation_data['event_id'] = event_id # INSERT and UPDATE the event_id just in case + event_presentation_data['event_session_id'] = event_session_id # UPDATE the event_session_id in case the presentation was moved + + event_presentation_data['name'] = record.get('presentation_name') + event_presentation_data['description'] = record.get('presentation_description') + + event_presentation_data['start_datetime'] = record.get('presentation_start_datetime') + # event_presentation_start_datetime = record.get('presentation_start_date', '') + ' ' + record.get('presentation_start_time', '') + # event_presentation_data['start_datetime'] = event_presentation_start_datetime + + event_presentation_data['end_datetime'] = record.get('presentation_end_datetime') + # event_presentation_end_datetime = record.get('presentation_end_date', '') + ' ' + record.get('presentation_end_time', '') + # event_presentation_data['end_datetime'] = event_presentation_end_datetime + + event_presentation_data['sort'] = record.get('presentation_sort') + + event_presentation_data['notes'] = record.get('presentation_notes') + + event_presentation_id = None + if event_presentation_rec_result := sql_select(data=data, sql=sql): + # Pull out IDs and UPDATE existing event_presentation record + event_presentation_rec = event_presentation_rec_result + event_presentation_id = event_presentation_rec.get('event_presentation_id', None) + event_presentation_id_random = event_presentation_rec.get('event_presentation_id_random', None) + event_presentation_name = event_presentation_rec.get('name', None) + log.info(f'Found one record. Event Presentation ID: {event_presentation_id_random} Event Presentation Name: {event_presentation_name}') + + event_presentation_data['id'] = event_presentation_id + + log.debug(event_presentation_data) + + if allow_updates: + if event_presentation_obj_up_result := sql_update(data=event_presentation_data, table_name='event_presentation'): + log.debug(event_presentation_obj_up_result) + else: + log.warning(event_presentation_obj_up_result) + pass # Probably nothing to update + else: + log.info(f'No record found that needs to be updated. Creating a new event presentation. Event Presentation External ID: {event_presentation_external_id}') + + event_presentation_data['external_id'] = event_presentation_external_id # NOTE: This should never change + + log.debug(event_presentation_data) + + if allow_inserts: + if event_presentation_obj_in_result := sql_insert(data=event_presentation_data, table_name='event_presentation'): + log.debug(event_presentation_obj_in_result) + event_presentation_id = event_presentation_obj_in_result + else: + log.warning(event_presentation_obj_in_result) + continue # Something unexpected may have happened + data['event_presentation_id'] = event_presentation_id + + # INSERT or UPDATE event_presenter + data['event_presenter_external_id'] = event_presenter_external_id + + sql = f""" + SELECT * + FROM `v_event_presenter` AS `event_presenter` + WHERE event_presenter.event_id = :event_id + AND event_presenter.external_id = :event_presenter_external_id + LIMIT 1; + """ + + event_presenter_data = {} + event_presenter_data['event_id'] = event_id # INSERT and UPDATE the event_id just in case + event_presenter_data['event_session_id'] = event_session_id # UPDATE the event_session_id in case the presentation was moved + event_presenter_data['event_presentation_id'] = event_presentation_id # UPDATE the event_presentation_id in case the presenter was moved + + event_presenter_data['title_names'] = record.get('presenter_title_names', '') + event_presenter_data['informal_name'] = record.get('presenter_informal_name', '') + event_presenter_data['given_name'] = record.get('presenter_given_name', '') + event_presenter_data['middle_name'] = record.get('presenter_middle_name', '') + event_presenter_data['family_name'] = record.get('presenter_family_name', '') + event_presenter_full_name = (event_presenter_data['given_name'] + ' ' + event_presenter_data['family_name']).strip() + event_presenter_data['designations'] = record.get('presenter_designations', '') + event_presenter_data['professional_title'] = record.get('presenter_professional_title', '') + event_presenter_data['affiliations'] = record.get('presenter_affiliations', '') + + event_presenter_data['email'] = record.get('presenter_email', '') + + event_presenter_data['notes'] = record.get('presenter_notes', '') + + event_presenter_id = None + if event_presenter_rec_result := sql_select(data=data, sql=sql): + # Pull out IDs and UPDATE existing event_presenter record + event_presenter_rec = event_presenter_rec_result + event_presenter_id = event_presenter_rec.get('event_presenter_id') + event_presenter_id_random = event_presenter_rec.get('event_presenter_id_random') + event_presenter_given_name = event_presenter_rec.get('given_name') + log.info(f'Found one record. Event Presenter ID: {event_presenter_id_random} Event Presenter Given Name: {event_presenter_given_name}') + + event_presenter_data['id'] = event_presenter_id + + log.debug(event_presenter_data) + + if allow_updates: + if event_presenter_obj_up_result := sql_update(data=event_presenter_data, table_name='event_presenter'): + log.debug(event_presenter_obj_up_result) + else: + log.warning(event_presenter_obj_up_result) + pass # Probably nothing to update + else: + log.info(f'No record found that needs to be updated. Creating a new event presenter. Event Presenter External ID: {event_presenter_external_id}') + + event_presenter_data['external_id'] = event_presenter_external_id # NOTE: This should never change + + log.debug(event_presenter_data) + + if allow_inserts: + if event_presenter_obj_in_result := sql_insert(data=event_presenter_data, table_name='event_presenter'): + log.debug(event_presenter_obj_in_result) + event_presenter_id = event_presenter_obj_in_result + else: + log.warning(event_presenter_obj_in_result) + continue # Something unexpected may have happened + data['event_presenter_id'] = event_presenter_id + + # End of the loop. Append to program list data results. + + event_program_data_li.append(data) + log.debug(f'Record processed: {event_session_id} {event_presentation_id} {event_presenter_full_name}') + + return mk_resp(data=event_program_data_li, response=commons.response) +# ### END ### Event Importing ### event_importing_program_data() ###