From 0f87f69077ff1514dbd86983bc719e88dd1e6dba Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Tue, 21 Sep 2021 17:30:20 -0400 Subject: [PATCH] Work on things related to event_person, tracking, badges, sessions, etc --- app/main.py | 7 +- app/methods/event_person_methods.py | 1 + app/methods/event_person_tracking_methods.py | 131 +++++++++++++ app/models/event_models.py | 5 + app/models/event_person_models.py | 30 +++ app/models/event_person_tracking_models.py | 26 +++ app/models/event_presentation_models.py | 6 +- app/models/event_presenter_models.py | 7 +- app/models/event_session_models.py | 14 ++ app/routers/event_badge.py | 16 +- app/routers/event_person.py | 167 ++++++++++++++++- app/routers/event_person_tracking.py | 185 +++++++++++++++++++ app/routers/event_session.py | 93 ++++++++-- 13 files changed, 661 insertions(+), 27 deletions(-) create mode 100644 app/methods/event_person_tracking_methods.py create mode 100644 app/routers/event_person_tracking.py diff --git a/app/main.py b/app/main.py index 9f19143..1eaa373 100644 --- a/app/main.py +++ b/app/main.py @@ -18,7 +18,7 @@ from app.lib_general import log, logging from app.log import log # Import the routers here first: -from app.routers import api_crud, api, importing, account, address, archive, archive_content, contact, cont_edu_cert, cont_edu_cert_person, event, event_badge, event_badge_template, event_exhibit, event_file, event_person, event_person_detail, event_presentation, event_presenter, event_registration, event_session, flask_cfg, hosted_file, journal, journal_entry, log_client_viewing, lookup, membership_cfg, membership_group, membership_group_person, membership_person, membership_person_profile, membership_type, membership_type_person, order, order_cart, organization, page, person, post, post_comment, product, site, site_domain, user, user_person, websockets # , items, journals +from app.routers import api_crud, api, importing, account, address, archive, archive_content, contact, cont_edu_cert, cont_edu_cert_person, event, event_badge, event_badge_template, event_exhibit, event_file, event_person, event_person_detail, event_person_tracking, event_presentation, event_presenter, event_registration, event_session, flask_cfg, hosted_file, journal, journal_entry, log_client_viewing, lookup, membership_cfg, membership_group, membership_group_person, membership_person, membership_person_profile, membership_type, membership_type_person, order, order_cart, organization, page, person, post, post_comment, product, site, site_domain, user, user_person, websockets # , items, journals from app.db_sql import db @@ -142,6 +142,11 @@ app.include_router( prefix='/event/person/detail', tags=['Event Person Detail'], ) +app.include_router( + event_person_tracking.router, + # prefix='/event/person/tracking', + tags=['Event Person Tracking'], +) app.include_router( event_presentation.router, prefix='/event/presentation', diff --git a/app/methods/event_person_methods.py b/app/methods/event_person_methods.py index a506526..330f4fc 100644 --- a/app/methods/event_person_methods.py +++ b/app/methods/event_person_methods.py @@ -182,6 +182,7 @@ def load_event_person_obj( 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 diff --git a/app/methods/event_person_tracking_methods.py b/app/methods/event_person_tracking_methods.py new file mode 100644 index 0000000..cfe2ff3 --- /dev/null +++ b/app/methods/event_person_tracking_methods.py @@ -0,0 +1,131 @@ +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.models.common_field_schema import default_num_bytes +from app.models.event_person_tracking_models import Event_Person_Tracking_Base + + +# ### BEGIN ### API Event Person Tracking Methods ### load_event_person_tracking_obj() ### +# Updated 2021-09-21 +def load_event_person_tracking_obj( + event_person_tracking_id: int|str, + limit: int = 1000, + by_alias: bool = True, + exclude_unset: bool = True, + model_as_dict: bool = False, + enabled: str = 'enabled', # enabled, disabled, all + inc_event_session: bool = False, + inc_event_person: bool = False, + ) -> Event_Person_Tracking_Base|dict|bool: + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if event_person_tracking_id := redis_lookup_id_random(record_id_random=event_person_tracking_id, table_name='event_person_tracking'): pass + else: return False + + if event_person_tracking_rec := sql_select(table_name='v_event_person_tracking', record_id=event_person_tracking_id): pass + else: return False + + try: + event_person_tracking_obj = Event_Person_Tracking_Base(**event_person_tracking_rec) + log.debug(event_person_tracking_obj) + except ValidationError as e: + log.error(e.json()) + return False + + if inc_event_person: + log.info('Need to include Event Person data...') + event_person_id = event_person_tracking_rec.get('event_person_id', None) + log.debug(event_person_id) + from app.methods.event_person_methods import load_event_person_obj + if event_person_result := load_event_person_obj( + event_person_id = event_person_id, + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = model_as_dict, + ): + event_person_tracking_obj.event_person = event_person_result + else: event_person_tracking_obj.event_person = None + + if inc_event_session: + log.info('Need to include Event Session data...') + event_session_id = event_person_tracking_rec.get('event_session_id', None) + log.debug(event_session_id) + from app.methods.event_session_methods import load_event_session_obj + if event_session_result := load_event_session_obj( + event_session_id = event_session_id, + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = model_as_dict, + ): + event_person_tracking_obj.event_session = event_session_result + else: event_person_tracking_obj.event_session = None + + if model_as_dict: + return event_person_tracking_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member + else: + return event_person_tracking_obj +# ### END ### API Event Person Tracking Methods ### load_event_person_tracking_obj() ### + + +# ### BEGIN ### API Event Person Tracking Methods ### get_event_person_tracking_rec_list() ### +# for_obj_type: account, event, event_session, event_person +# Updated 2021-09-21 +def get_event_person_tracking_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'`event_person_tracking`.{for_obj_type}_id = :{for_obj_type}_id' + + # if enabled in ['enabled', 'disabled', 'all']: + # if enabled == 'enabled': + # data['enable'] = True + # sql_enabled = f'AND `event_person_tracking`.enable = :enable' + # elif enabled == 'disabled': + # data['enable'] = False + # sql_enabled = f'AND `event_person_tracking`.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 `event_person_tracking`.id AS 'event_person_tracking_id', `event_person_tracking`.id_random AS 'event_person_tracking_id_random' + FROM `event_person_tracking` AS `event_person_tracking` + WHERE + {sql_obj_type_id} + {sql_enabled} + ORDER BY `event_person_tracking`.created_on DESC, `event_person_tracking`.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 Tracking Methods ### get_event_person_tracking_rec_list() ### diff --git a/app/models/event_models.py b/app/models/event_models.py index 1aa8c46..7e55792 100644 --- a/app/models/event_models.py +++ b/app/models/event_models.py @@ -28,6 +28,11 @@ class Event_Base(BaseModel): id: Optional[int] = Field( alias = 'event_id' ) + + code: Optional[str] = Field( + alias = 'event_code' + ) + account_id_random: Optional[str] account_id: Optional[int] diff --git a/app/models/event_person_models.py b/app/models/event_person_models.py index af8a0d9..270865a 100644 --- a/app/models/event_person_models.py +++ b/app/models/event_person_models.py @@ -63,6 +63,36 @@ class Event_Person_Base(BaseModel): created_on: Optional[datetime.datetime] = None updated_on: Optional[datetime.datetime] = None + # Including convenience data + # This is only for convenience. Probably going to keep unless it causes a problem. + event_badge_informal_name: Optional[str] + event_badge_given_name: Optional[str] + event_badge_family_name: Optional[str] + event_badge_display_name: Optional[str] + event_badge_full_name: Optional[str] + event_badge_affiliations: Optional[str] + event_badge_email: Optional[str] + + event_person_informal_name: Optional[str] + event_person_given_name: Optional[str] + event_person_family_name: Optional[str] + event_person_display_name: Optional[str] + event_person_full_name: Optional[str] + event_person_affiliations: Optional[str] + event_person_email: Optional[str] + + person_informal_name: Optional[str] + person_given_name: Optional[str] + person_family_name: Optional[str] + person_display_name: Optional[str] + person_full_name: Optional[str] + person_affiliations: Optional[str] + person_email: Optional[str] + + user_email: Optional[str] + user_name: Optional[str] + user_username: Optional[str] + # Including other related objects # event: Optional[Event_Base] # Causes an import loop event_abstract_list: Optional[list] # Use event_person_detail table. An event_person record can be linked to one or more abstracts diff --git a/app/models/event_person_tracking_models.py b/app/models/event_person_tracking_models.py index 78835f0..ef0820f 100644 --- a/app/models/event_person_tracking_models.py +++ b/app/models/event_person_tracking_models.py @@ -58,6 +58,32 @@ class Event_Person_Tracking_Base(BaseModel): created_on: Optional[datetime.datetime] = None updated_on: Optional[datetime.datetime] = None + # Including convenience data + # This is only for convenience. Probably going to keep unless it causes a problem. + # full_name: Optional[str] = Field( + # alias = 'event_person_full_name' + # ) + # display_name: Optional[str] = Field( + # alias = 'event_person_display_name' + # ) + + event_person_informal_name: Optional[str] + event_person_given_name: Optional[str] + event_person_family_name: Optional[str] + event_person_display_name: Optional[str] + event_person_full_name: Optional[str] + event_person_affiliations: Optional[str] + event_person_email: Optional[str] + event_session_name: Optional[str] + + location_name: Optional[str] = Field( + alias = 'event_location_name' + ) + track_name: Optional[str] = Field( + alias = 'event_track_name' + ) + # Maybe add timezone in the future? + _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) #@validator('event_person_tracking_id_random', always=True) diff --git a/app/models/event_presentation_models.py b/app/models/event_presentation_models.py index 7f130b3..23cf4ac 100644 --- a/app/models/event_presentation_models.py +++ b/app/models/event_presentation_models.py @@ -29,6 +29,10 @@ class Event_Presentation_Base(BaseModel): alias = 'event_presentation_id' ) + code: Optional[str] = Field( + alias = 'event_presentation_code' + ) + event_id_random: Optional[str] event_id: Optional[int] @@ -50,8 +54,6 @@ class Event_Presentation_Base(BaseModel): for_type: Optional[str] for_id: Optional[int] - code: Optional[str] - name: Optional[str] description: Optional[str] diff --git a/app/models/event_presenter_models.py b/app/models/event_presenter_models.py index ca55300..1abe5b1 100644 --- a/app/models/event_presenter_models.py +++ b/app/models/event_presenter_models.py @@ -29,6 +29,11 @@ class Event_Presenter_Base(BaseModel): id: Optional[int] = Field( alias = 'event_presenter_id' ) + + code: Optional[str] = Field( + alias = 'event_presenter_code' + ) + account_id_random: Optional[str] account_id: Optional[int] @@ -59,8 +64,6 @@ class Event_Presenter_Base(BaseModel): for_type: Optional[str] for_id: Optional[int] - code: Optional[str] - pronouns: Optional[str] # Preferred pronouns informal_name: Optional[str] # Informal or nick name they commonly go by diff --git a/app/models/event_session_models.py b/app/models/event_session_models.py index 25f6e86..f82ff50 100644 --- a/app/models/event_session_models.py +++ b/app/models/event_session_models.py @@ -29,6 +29,10 @@ class Event_Session_Base(BaseModel): alias = 'event_session_id' ) + code: Optional[str] = Field( + alias = 'event_session_code' + ) + event_id_random: Optional[str] event_id: Optional[int] @@ -95,6 +99,16 @@ class Event_Session_Base(BaseModel): created_on: Optional[datetime.datetime] = None updated_on: Optional[datetime.datetime] = None + # Including convenience data + # This is only for convenience. Probably going to keep unless it causes a problem. + location_name: Optional[str] = Field( + alias = 'event_location_name' + ) + track_name: Optional[str] = Field( + alias = 'event_track_name' + ) + # Maybe add xxx in the future? + # Including other related objects # event: Optional[Event_Base] event_abstract_list: Optional[list] # Optional[Event_Abstract_Base] diff --git a/app/routers/event_badge.py b/app/routers/event_badge.py index 613b280..8b78a6d 100644 --- a/app/routers/event_badge.py +++ b/app/routers/event_badge.py @@ -119,7 +119,7 @@ async def get_event_badge_obj_li( resp_data = base_name(**record).dict(by_alias=by_alias, exclude_unset=exclude_unset) resp_data_li.append(resp_data) - return mk_resp(data=resp_data_li) + return mk_resp(data=resp_data_li, response=response) else: log.debug(sql_result) return mk_resp(data=False, status_code=404, response=response) @@ -212,7 +212,7 @@ async def search_event_badge_obj_li( resp_data = Event_Badge_Base(**record).dict(by_alias=by_alias, exclude_unset=exclude_unset) resp_data_li.append(resp_data) - return mk_resp(data=resp_data_li) + return mk_resp(data=resp_data_li, response=response) else: log.debug(sql_result) return mk_resp(data=False, status_code=404, response=response) @@ -236,7 +236,7 @@ async def get_event_badge_obj( log.debug(locals()) 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) + else: return mk_resp(data=None, status_code=404, response=response) event_badge_obj = load_event_badge_obj( event_badge_id = event_badge_id, @@ -248,7 +248,7 @@ async def get_event_badge_obj( inc_event_badge_template = inc_event_badge_template, ) event_badge_dict = event_badge_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) - return mk_resp(data=event_badge_dict) + return mk_resp(data=event_badge_dict, response=response) # ### END ### API Event Badge ### get_event_badge_obj() ### @@ -269,7 +269,7 @@ async def get_account_obj_event_badge_list( log.debug(locals()) if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass - else: return mk_resp(data=None, status_code=404) + else: return mk_resp(data=None, status_code=404, response=response) response_data = None # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL @@ -298,7 +298,7 @@ async def get_account_obj_event_badge_list( else: return mk_resp(data=False, status_code=400, response=response) # Bad Request - return mk_resp(data=response_data) + return mk_resp(data=response_data, response=response) # ### END ### API Event Badge ### get_account_obj_event_badge_list() ### @@ -318,7 +318,7 @@ async def get_event_obj_event_badge_list( log.debug(locals()) 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) + else: return mk_resp(data=None, status_code=404, response=response) response_data = None # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL @@ -346,7 +346,7 @@ async def get_event_obj_event_badge_list( else: return mk_resp(data=False, status_code=400, response=response) # Bad Request - return mk_resp(data=response_data) + return mk_resp(data=response_data, response=response) # ### END ### API Event Badge ### get_event_obj_event_badge_list() ### diff --git a/app/routers/event_person.py b/app/routers/event_person.py index 8f8d823..d6cae27 100644 --- a/app/routers/event_person.py +++ b/app/routers/event_person.py @@ -407,8 +407,7 @@ async def get_event_person_obj( log.debug(locals()) 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) + else: return mk_resp(data=None, status_code=404, response=response) if event_person_obj := load_event_person_obj( event_person_id = event_person_id, @@ -436,10 +435,172 @@ async def get_event_person_obj( else: return mk_resp(data=False, status_code=400, response=response) # Bad Request - return mk_resp(data=event_person_obj) + return mk_resp(data=event_person_obj, response=response) # ### END ### API Event Person ### get_event_person_obj() ### +# ### BEGIN ### API Event Person ### search_event_person_obj_li() ### +# Updated 2021-09-21 +@router.get('/event/{event_id}/person/search', response_model=Resp_Body_Base) +async def search_event_person_obj_li( + # account_id: str = Query(None, min_length=11, max_length=22), + event_id: str = Query(None, min_length=11, max_length=22), + event_person_id: str = Query('', max_length=50), + external_id: 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), + limit: int = 50, + enabled: str = 'enabled', + x_account_id: str = Header(...), + by_alias: bool = True, + exclude_unset: bool = True, + response: Response = Response, + ): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if account_id := redis_lookup_id_random(record_id_random=x_account_id, table_name='account'): pass + else: return mk_resp(data=None, status_code=404, response=response) + + if event_id: + log.info(f'Looking up Event ID based on Event ID Random: {event_id}') + 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=response) + + if event_person_id: + log.info(f'Looking up Event Person ID based on Event ID Random: {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=response) + + data = {} + data['account_id'] = account_id + data['event_id'] = event_id + data['event_person_id'] = event_person_id + 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 + # data['from_datetime'] = from_datetime + # data['to_datetime'] = to_datetime + log.debug(data) + + if enabled in ['enabled', 'disabled', 'all']: + if enabled == 'enabled': + data['enable'] = True + sql_enabled = f'AND `event_person`.enable = :enable' + elif enabled == 'disabled': + data['enable'] = False + sql_enabled = f'AND `event_person`.enable = :enable' + elif enabled == 'all': + sql_enabled = '' + + if limit: + data['limit'] = limit + sql_limit = f'LIMIT :limit' + else: + sql_limit = '' + + if event_person_id: + log.info('Looking up Event Person based on event_person_id') + sql = f""" + SELECT * + FROM `v_event_person` AS event_person + WHERE event_person.account_id = :account_id + AND event_person.event_id = :event_id + AND event_person.event_person_id LIKE :event_person_id + {sql_enabled} + ORDER BY event_person.event_person_family_name ASC, event_person.event_person_given_name ASC, event_person.created_on DESC, event_person.updated_on DESC + {sql_limit}; + """ + elif external_id: + log.info('Looking up Event Person based on external_id') + sql = f""" + SELECT * + FROM `v_event_person` AS event_person + WHERE event_person.account_id = :account_id + AND event_person.event_id = :event_id + AND event_person.external_id LIKE :external_id + {sql_enabled} + ORDER BY event_person.event_person_family_name ASC, event_person.event_person_given_name ASC, event_person.created_on DESC, event_person.updated_on DESC + {sql_limit}; + """ + elif given_name and family_name and email: + log.info('Looking up Event Person based on given_name, family_name, and email') + sql = f""" + SELECT * + FROM `v_event_person` AS event_person + WHERE event_person.account_id = :account_id + AND event_person.event_id = :event_id + AND (event_person.event_person_given_name LIKE :given_name OR event_person.person_given_name LIKE :given_name) + AND (event_person.event_person_family_name LIKE :family_name OR event_person.person_family_name LIKE :family_name) + AND (event_person.event_person_email LIKE :email OR event_person.user_email LIKE :email) + {sql_enabled} + ORDER BY event_person.event_person_family_name ASC, event_person.event_person_given_name ASC, event_person.created_on DESC, event_person.updated_on DESC + {sql_limit}; + """ + elif given_name and family_name: + log.info('Looking up Event Person based on given_name and family_name') + sql = f""" + SELECT * + FROM `v_event_person` AS event_person + WHERE event_person.account_id = :account_id + AND event_person.event_id = :event_id + AND (event_person.event_person_given_name LIKE :given_name OR event_person.person_given_name LIKE :given_name) + AND (event_person.event_person_family_name LIKE :family_name OR event_person.person_family_name LIKE :family_name) + AND (event_person.event_person_email IS NULL OR event_person.event_person_email LIKE :email OR event_person.user_email LIKE :email) + {sql_enabled} + ORDER BY event_person.event_person_family_name ASC, event_person.event_person_given_name ASC, event_person.created_on DESC, event_person.updated_on DESC + {sql_limit}; + """ + elif given_name or family_name: + log.info('Looking up Event Person based on given_name or family_name') + sql = f""" + SELECT * + FROM `v_event_person` AS event_person + WHERE event_person.account_id = :account_id + AND event_person.event_id = :event_id + + AND (event_person.event_person_given_name IS NULL OR event_person.event_person_given_name LIKE :given_name OR event_person.person_given_name LIKE :given_name) + + AND (event_person.event_person_family_name IS NULL OR event_person.event_person_family_name LIKE :family_name OR event_person.person_family_name LIKE :family_name) + + AND (event_person.event_person_email IS NULL OR event_person.event_person_email LIKE :email OR event_person.user_email LIKE :email) + + {sql_enabled} + ORDER BY event_person.event_person_family_name ASC, event_person.event_person_given_name ASC, event_person.created_on DESC, event_person.updated_on DESC + {sql_limit}; + """ + elif email: + log.info('Looking up Event Person based on email') + sql = f""" + SELECT * + FROM `v_event_person` AS event_person + WHERE event_person.account_id = :account_id + AND event_person.event_id = :event_id + AND (event_person.event_person_given_name IS NULL OR event_person.event_person_given_name LIKE :given_name OR event_person.person_given_name LIKE :given_name) + AND (event_person.event_person_family_name IS NULL OR event_person.event_person_family_name LIKE :family_name OR event_person.person_family_name LIKE :family_name) + AND (event_person.event_person_email LIKE :email OR event_person.user_email LIKE :email) + {sql_enabled} + ORDER BY event_person.event_person_family_name ASC, event_person.event_person_given_name ASC, event_person.created_on DESC, event_person.updated_on DESC + {sql_limit}; + """ + + log.debug(sql) + if sql_result := sql_select(data=data, sql=sql, as_list=True, rm_id_random=True): + resp_data_li = [] + for record in sql_result: + resp_data = Event_Person_Base(**record).dict(by_alias=by_alias, exclude_unset=exclude_unset) + resp_data_li.append(resp_data) + + return mk_resp(data=resp_data_li, response=response) + else: + log.debug(sql_result) + return mk_resp(data=False, status_code=404, response=response) +# ### END ### API Event Person ### search_event_person_obj_li() ### + + + # ### BEGIN ### API Event Person Methods ### get_event_registration_event_person_obj_li() ### # Similar to event_registration.py: /event/registration/ inc_event_person_list # Updated 2021-08-17 diff --git a/app/routers/event_person_tracking.py b/app/routers/event_person_tracking.py new file mode 100644 index 0000000..7b46da8 --- /dev/null +++ b/app/routers/event_person_tracking.py @@ -0,0 +1,185 @@ +import datetime +#from datetime import datetime, time, timedelta +from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response, status +from pydantic import BaseModel, EmailStr, Field +from typing import Dict, List, Optional, Set, Union + +from app.lib_general import log, logging +#from ..log import * +from app.config import settings +from app.db_sql import * + +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_person_tracking_methods import get_event_person_tracking_rec_list, load_event_person_tracking_obj + +from app.models.event_person_tracking_models import Event_Person_Tracking_Base +from app.models.response_models import * + + +router = APIRouter() + + +@router.post('/event/person/tracking', response_model=Resp_Body_Base) +async def post_event_person_tracking_obj( + obj: Event_Person_Tracking_Base, + x_account_id: str = Header(...), + return_obj: Optional[bool] = True, + 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_person_tracking' + obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) + result = post_obj_template( + obj_type=obj_type, + data=obj_data_dict, + return_obj=True, + by_alias=True, + exclude_unset=True, + ) + return result + + +@router.patch('/event/person/tracking/{obj_id}', response_model=Resp_Body_Base) +async def patch_event_person_tracking_obj( + obj: Event_Person_Tracking_Base, + obj_id: str = Query(..., min_length=1, max_length=22), + x_account_id: Optional[str] = Header(..., ), + return_obj: Optional[bool] = True, + 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_person_tracking' + obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) + obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type) + obj_data_dict['id_random'] = obj_id + result = patch_obj_template( + obj_type=obj_type, + data=obj_data_dict, + obj_id=obj_id, + return_obj=True, + by_alias=True, + exclude_unset=True, + ) + return result + + +@router.get('/event/person/tracking/list', response_model=Resp_Body_Base) +async def get_event_person_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_person_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 + + +@router.get('/event/person/tracking/{obj_id}', response_model=Resp_Body_Base) +async def get_event_person_tracking_obj( + obj_id: str = Query(..., 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_person_tracking' + result = get_obj_template( + obj_type=obj_type, + obj_id=obj_id, + by_alias=True, + exclude_unset=True, + ) + return result + + +# ### BEGIN ### API Event Person Tracking ### get_event_session_obj_event_person_tracking_list() ### +# Updated 2021-09-21 +@router.get('/event/session/{event_session_id}/event/person/tracking/list', response_model=Resp_Body_Base) +async def get_event_session_obj_event_person_tracking_list( + event_session_id: str = Query(..., min_length=11, max_length=22), + limit: int = 500, # For now this covers any included objects or object lists + enabled: str = 'enabled', # For now this covers any included objects or object lists + inc_event_person: bool = False, + inc_event_session: bool = False, + x_account_id: str = Header(...), + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + response: Response = Response, + ): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if event_session_id := redis_lookup_id_random(record_id_random=event_session_id, table_name='event_session'): pass + else: return mk_resp(data=None, status_code=404, response=response) + + # Updated 2021-09-21 + if event_person_tracking_rec_list_result := get_event_person_tracking_rec_list( + for_obj_type = 'event_session', + for_obj_id = event_session_id, + enabled = enabled, + limit = limit, + ): + event_person_tracking_result_list = [] + for event_person_tracking_rec in event_person_tracking_rec_list_result: + if load_event_person_tracking_result := load_event_person_tracking_obj( + event_person_tracking_id = event_person_tracking_rec.get('event_person_tracking_id', None), + enabled = enabled, + limit = limit, + inc_event_person = inc_event_person, + inc_event_session = inc_event_session, + by_alias = by_alias, + exclude_unset = exclude_unset, + # model_as_dict = model_as_dict, + ): + event_person_tracking_result_list.append(load_event_person_tracking_result) + else: + event_person_tracking_result_list.append(None) + response_data = event_person_tracking_result_list + elif isinstance(event_person_tracking_rec_list_result, list): + return mk_resp(data=False, status_code=404, response=response) # Not Found + else: + return mk_resp(data=False, status_code=400, response=response) # Bad Request + + return mk_resp(data=response_data, response=response) +# ### END ### API Event Person Tracking ### get_event_session_obj_event_person_tracking_list() ### + + +@router.delete('/event/person/tracking/{obj_id}', response_model=Resp_Body_Base) +async def delete_event_person_tracking_obj( + obj_id: str = Query(..., min_length=1, max_length=22), + x_account_id: str = Header(...), + response: Response = Response, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'event_person_tracking' + result = delete_obj_template( + obj_type=obj_type, + obj_id=obj_id, + ) + return result \ No newline at end of file diff --git a/app/routers/event_session.py b/app/routers/event_session.py index 57d2f14..ec4ab0f 100644 --- a/app/routers/event_session.py +++ b/app/routers/event_session.py @@ -96,7 +96,7 @@ async def patch_event_session_obj_exist_v4( log.debug(locals()) if event_session_id := redis_lookup_id_random(record_id_random=event_session_id, table_name='event_session'): pass - else: return mk_resp(data=None, status_code=404) + else: return mk_resp(data=None, status_code=404, response=response) if update_event_session_obj_result := create_update_event_session_obj_v4( event_session_dict_obj = event_session_obj, @@ -218,7 +218,7 @@ async def patch_event_session_obj_exist_v3( log.debug(locals()) if event_session_id := redis_lookup_id_random(record_id_random=event_session_id, table_name='event_session'): pass - else: return mk_resp(data=None, status_code=404) + else: return mk_resp(data=None, status_code=404, response=response) if update_event_session_obj_result := update_event_session_obj_v3( event_session_id = event_session_id, @@ -301,7 +301,7 @@ async def patch_event_session_json( if event_session_id := redis_lookup_id_random(record_id_random=event_session_id, table_name='event_session'): pass else: - return mk_resp(data=None, status_code=404) + return mk_resp(data=None, status_code=404, response=response) if event_session_obj_up_result := update_event_session_obj( event_session_id = event_session_id, @@ -313,9 +313,9 @@ async def patch_event_session_json( if return_obj: event_session_obj = load_event_session_obj(event_session_id=event_session_id) event_session_dict = event_session_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) - return mk_resp(data=event_session_dict) + return mk_resp(data=event_session_dict, response=response) else: - return mk_resp(data=event_session_obj_up_result) + return mk_resp(data=event_session_obj_up_result, response=response) else: return mk_resp(data=False, status_code=400, response=response) # Bad Request # ### END ### API Event Session ### patch_event_session_json() ### @@ -455,7 +455,7 @@ async def get_event_session_obj_li( ): data = event_session_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) event_session_li.append(data) - return mk_resp(data=event_session_li) + return mk_resp(data=event_session_li, response=response) else: log.debug(event_session_li_result) return mk_resp(data=False, status_code=404, response=response) @@ -496,7 +496,7 @@ async def get_event_session_obj( if event_session_id := redis_lookup_id_random(record_id_random=event_session_id, table_name='event_session'): pass else: - return mk_resp(data=None, status_code=404) + return mk_resp(data=None, status_code=404, response=response) if event_session_obj := load_event_session_obj( event_session_id = event_session_id, @@ -526,7 +526,7 @@ async def get_event_session_obj( else: return mk_resp(data=False, status_code=400, response=response) # Bad Request - return mk_resp(data=event_session_dict) + return mk_resp(data=event_session_dict, response=response) #return mk_resp(data=event_session_obj) # ### END ### API Event Session ### get_event_session_obj() ### @@ -558,8 +558,8 @@ async def get_event_event_session_obj_li( 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='person'): pass - else: return mk_resp(data=None, status_code=404) + 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=response) # Updated 2021-08-26 if event_session_rec_list_result := get_event_session_rec_list( @@ -594,10 +594,81 @@ async def get_event_event_session_obj_li( else: return mk_resp(data=False, status_code=400, response=response) # Bad Request - return mk_resp(data=response_data) + return mk_resp(data=response_data, response=response) # ### END ### API Event Session Methods ### get_event_event_session_obj_li() ### +# ### BEGIN ### API Event Session ### search_event_session_obj_li() ### +# Updated 2021-09-21 +@router.get('/event/{event_id}/session/search', response_model=Resp_Body_Base) +async def search_event_session_obj_li( + # account_id: str = Query(None, min_length=11, max_length=22), + event_id: str = Query(None, min_length=11, max_length=22), + event_session_id: str = Query('%', max_length=22), + event_session_code: str = Query('%', max_length=50), + event_session_name: str = Query('%', max_length=50), + limit: int = 50, + enabled: str = 'enabled', + x_account_id: str = Header(...), + by_alias: bool = True, + exclude_unset: bool = True, + response: Response = Response, + ): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + data = {} + data['account_id_random'] = x_account_id + data['event_id_random'] = event_id + data['event_session_id'] = '%'+event_session_id+'%' + data['event_session_code'] = '%'+event_session_code+'%' + data['event_session_name'] = '%'+event_session_name+'%' # Adding the % symbol here because it turns certain combinations into special characters + # data['from_datetime'] = from_datetime + # data['to_datetime'] = to_datetime + log.debug(data) + + if enabled in ['enabled', 'disabled', 'all']: + if enabled == 'enabled': + data['enable'] = True + sql_enabled = f'AND `event_session`.enable = :enable' + elif enabled == 'disabled': + data['enable'] = False + sql_enabled = f'AND `event_session`.enable = :enable' + elif enabled == 'all': + sql_enabled = '' + + if limit: + data['limit'] = limit + sql_limit = f'LIMIT :limit' + else: + sql_limit = '' + + sql = f""" + SELECT * + FROM `v_event_session` AS event_session + WHERE event_session.account_id = :account_id + AND event_session.event_id = :event_id + AND (event_session.event_session_code LIKE :event_session_code OR event_session.event_session_code IS NULL) + AND event_session.name LIKE :event_session_name + {sql_enabled} + ORDER BY event_session.start_datetime ASC, event_session.name ASC, event_session.created_on DESC, event_session.updated_on DESC + {sql_limit}; + """ + + log.debug(sql) + if sql_result := sql_select(data=data, sql=sql, as_list=True, rm_id_random=True): + resp_data_li = [] + for record in sql_result: + resp_data = Event_Session_Base(**record).dict(by_alias=by_alias, exclude_unset=exclude_unset) + resp_data_li.append(resp_data) + + return mk_resp(data=resp_data_li, response=response) + else: + log.debug(sql_result) + return mk_resp(data=False, status_code=404, response=response) +# ### END ### API Event Session ### search_event_session_obj_li() ### + + @router.delete('/event/session/{obj_id}', response_model=Resp_Body_Base) async def delete_event_session_obj( obj_id: str = Query(..., min_length=1, max_length=22),