From 003ffb4adfbc7b79a9b14e663b3362e6342f565e Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Tue, 15 Feb 2022 13:25:19 -0500 Subject: [PATCH] General code clean up. Work on event tracking related --- app/methods/event_exhibit_tracking_methods.py | 102 +++++++++++++++++- app/methods/event_person_tracking_methods.py | 2 +- app/methods/person_methods.py | 14 ++- app/models/event_exhibit_models.py | 5 +- app/models/event_exhibit_tracking_models.py | 7 ++ app/models/event_person_models.py | 2 + app/routers/event_exhibit.py | 7 +- app/routers/event_exhibit_tracking.py | 39 +++++-- 8 files changed, 155 insertions(+), 23 deletions(-) diff --git a/app/methods/event_exhibit_tracking_methods.py b/app/methods/event_exhibit_tracking_methods.py index 3027250..a13c882 100644 --- a/app/methods/event_exhibit_tracking_methods.py +++ b/app/methods/event_exhibit_tracking_methods.py @@ -11,6 +11,106 @@ from app.models.common_field_schema import default_num_bytes from app.models.event_exhibit_tracking_models import Event_Exhibit_Tracking_Base +# ### BEGIN ### API Event Exhibit Tracking Methods ### create_event_exhibit_tracking_obj() ### +# Updated 2022-02-15 +@logger_reset +def create_event_exhibit_tracking_obj( + exhibit_id: int|str, + event_exhibit_tracking_dict_obj: Event_Exhibit_Tracking_Base, + event_badge_id: int = None, + event_person_id: int = None, + create_sub_obj: bool = False, + fail_any: bool = False, # Fail if any thing goes wrong for sub objects + log_lvl: int = logging.WARNING, # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + ) -> int|bool: + log.setLevel(log_lvl) + + # ### SECTION ### Secondary data validation + log.info('Create dictionary or Pydantic object') + log.debug(type(event_exhibit_tracking_dict_obj)) + if isinstance(event_exhibit_tracking_dict_obj, dict): + event_exhibit_tracking_dict = event_exhibit_tracking_dict_obj + event_exhibit_tracking_dict['event_id'] = event_id + event_exhibit_tracking_dict['event_badge_id'] = event_badge_id + event_exhibit_tracking_dict['event_person_id'] = event_person_id + try: + event_exhibit_tracking_obj = Event_Exhibit_Tracking_Base(**event_exhibit_tracking_dict) + except ValidationError as e: + log.error(e.json()) + return False + else: + event_exhibit_tracking_obj = event_exhibit_tracking_dict_obj + event_exhibit_tracking_obj.event_id = event_id + event_exhibit_tracking_obj.event_badge_id = event_badge_id + event_exhibit_tracking_obj.event_person_id = event_person_id + log.debug(event_exhibit_tracking_obj) + + event_exhibit_tracking_dict = event_exhibit_tracking_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'event_badge', 'event_badge_id_random', 'event_person', 'event_person_id_random', 'created_on', 'updated_on'}) + + # ### SECTION ### Process data + if event_exhibit_tracking_dict_in_result := sql_insert( + data = event_exhibit_tracking_dict, + table_name = 'event_exhibit_tracking', + rm_id_random = True, + id_random_length = default_num_bytes + ): pass + else: + log.warning(f'Event Exhibit Tracking not created.') + return False + + log.debug(event_exhibit_tracking_dict_in_result) + event_exhibit_tracking_id = event_exhibit_tracking_dict_in_result + + log.info(f'Returning the new Event Exhibit Tracking ID: {event_exhibit_tracking_id}') + + return event_exhibit_tracking_id +# ### END ### API Event Exhibit Tracking Methods ### create_event_exhibit_tracking_obj() ### + + +# ### BEGIN ### API Event Exhibit Tracking Methods ### update_event_exhibit_tracking_obj() ### +# Updated 2022-02-15 +@logger_reset +def update_event_exhibit_tracking_obj( + event_exhibit_tracking_id: int, + event_exhibit_tracking_dict_obj: Event_Exhibit_Tracking_Base, + log_lvl: int = logging.WARNING, # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + ) -> bool: + log.setLevel(log_lvl) + + # ### SECTION ### Secondary data validation + log.info('Create dictionary or Pydantic object') + log.debug(type(event_exhibit_tracking_dict_obj)) + if isinstance(event_exhibit_tracking_dict_obj, dict): + event_exhibit_tracking_dict = event_exhibit_tracking_dict_obj + event_exhibit_tracking_dict['id'] = event_exhibit_tracking_id + try: + event_exhibit_tracking_obj = Person_Base(**event_exhibit_tracking_dict) + except ValidationError as e: + log.error(e.json()) + return False + else: + event_exhibit_tracking_obj = event_exhibit_tracking_dict_obj + event_exhibit_tracking_obj.id = event_exhibit_tracking_id + log.debug(event_exhibit_tracking_obj) + + event_exhibit_tracking_dict = event_exhibit_tracking_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'event_badge', 'event_badge_id_random', 'event_person', 'event_person_id_random', 'created_on', 'updated_on'}) + + # ### SECTION ### Process data + if event_exhibit_tracking_dict_up_result := sql_update( + data = event_exhibit_tracking_dict, + table_name = 'event_exhibit_tracking', + rm_id_random = True, + ): pass + else: + log.warning(f'Event Exhibit Tracking not updated.') + return False + + log.debug(event_exhibit_tracking_dict_up_result) + + return True +# ### END ### API Event Exhibit Tracking Methods ### update_event_exhibit_tracking_obj() ### + + # ### BEGIN ### API Event Exhibit Tracking Methods ### load_event_exhibit_tracking_obj() ### # Updated 2022-02-14 @logger_reset @@ -59,7 +159,7 @@ def load_event_exhibit_tracking_obj( else: event_exhibit_tracking_obj.event_exhibit = None if inc_event_person: - log.info('Need to include Event Person data...') + log.info('Need to include Event Exhibit data...') event_person_id = event_exhibit_tracking_rec.get('event_person_id', None) log.debug(event_person_id) from app.methods.event_person_methods import load_event_person_obj diff --git a/app/methods/event_person_tracking_methods.py b/app/methods/event_person_tracking_methods.py index 55b0139..d43ad2a 100644 --- a/app/methods/event_person_tracking_methods.py +++ b/app/methods/event_person_tracking_methods.py @@ -5,7 +5,7 @@ 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.lib_general import log, logging, logger_reset from app.models.common_field_schema import default_num_bytes from app.models.event_person_tracking_models import Event_Person_Tracking_Base diff --git a/app/methods/person_methods.py b/app/methods/person_methods.py index 9feb1c8..ad9e7bc 100644 --- a/app/methods/person_methods.py +++ b/app/methods/person_methods.py @@ -29,9 +29,9 @@ def create_person_kiss( contact_id: int|None = None, organization_id: int|None = None, user_id: int|None = None, + log_lvl: int = logging.WARNING, # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL ) -> int|bool: - log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL - log.debug(locals()) + log.setLevel(log_lvl) # ### SECTION ### Secondary data validation log.info('Create dictionary or Pydantic object') @@ -47,7 +47,6 @@ def create_person_kiss( else: person_obj = person_dict_obj person_obj.account_id = account_id - log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(person_obj) person_dict = person_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'contact', 'contact_id', 'contact_id_random', 'email', 'cc_email', 'membership_person_id', 'membership_person_id_random', 'organization', 'user', 'created_on', 'updated_on'}) @@ -59,7 +58,6 @@ def create_person_kiss( # person_obj.account_id = account_id # Is this needed? - # Look for a contact_id in the contact_obj if contact_id: pass elif contact_id := person_obj.contact.id: pass @@ -133,7 +131,7 @@ def create_person_kiss( else: return False else: pass - log.info(f'Returning the Person ID: {person_id}') + log.info(f'Returning the new Person ID: {person_id}') return person_id # ### END ### API Person Methods ### create_person_kiss() ### @@ -149,9 +147,9 @@ def update_person_kiss( contact_id: int|None = None, organization_id: int|None = None, user_id: int|None = None, - ): - log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL - log.debug(locals()) + log_lvl: int = logging.WARNING, # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + ) -> bool: + log.setLevel(log_lvl) # ### SECTION ### Secondary data validation log.info('Create dictionary or Pydantic object') diff --git a/app/models/event_exhibit_models.py b/app/models/event_exhibit_models.py index 81cea38..6ebb979 100644 --- a/app/models/event_exhibit_models.py +++ b/app/models/event_exhibit_models.py @@ -8,7 +8,7 @@ from app.db_sql import redis_lookup_id_random from app.lib_general import log, logging from .common_field_schema import base_fields, default_num_bytes - +from app.models.event_exhibit_tracking_models import Event_Exhibit_Tracking_Base class Event_Exhibit_Base(BaseModel): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL @@ -72,6 +72,9 @@ class Event_Exhibit_Base(BaseModel): created_on: Optional[datetime.datetime] = None updated_on: Optional[datetime.datetime] = None + # Including other related objects + event_exhibit_tracking_list: Optional[list[Event_Exhibit_Tracking_Base]] + _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) #@validator('event_exhibit_id_random', always=True) diff --git a/app/models/event_exhibit_tracking_models.py b/app/models/event_exhibit_tracking_models.py index 6c27bef..270c76f 100644 --- a/app/models/event_exhibit_tracking_models.py +++ b/app/models/event_exhibit_tracking_models.py @@ -9,6 +9,9 @@ from app.lib_general import log, logging from app.models.common_field_schema import base_fields, default_num_bytes +from app.models.event_badge_models import Event_Badge_Base +from app.models.event_person_models import Event_Person_Base + class Event_Exhibit_Tracking_Base(BaseModel): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL @@ -65,6 +68,10 @@ class Event_Exhibit_Tracking_Base(BaseModel): event_exhibit_name: Optional[str] + # Including other related objects + event_badge: Optional[Union[Event_Badge_Base, None]] + event_person: Optional[Union[Event_Person_Base, None]] + _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) #@validator('event_exhibit_tracking_id_random', always=True) diff --git a/app/models/event_person_models.py b/app/models/event_person_models.py index 1f61dec..3416ad8 100644 --- a/app/models/event_person_models.py +++ b/app/models/event_person_models.py @@ -10,6 +10,7 @@ from app.lib_general import log, logging from app.models.common_field_schema import base_fields, default_num_bytes # from app.models.event_models import Event_Base # Causes an import loop from app.models.event_badge_models import Event_Badge_Base +# from app.models.event_exhibit_tracking_models import Event_Exhibit_Tracking_Base # Causes an import loop from app.models.event_person_profile_models import Event_Person_Profile_Base from app.models.event_registration_models import Event_Registration_Base from app.models.person_models import Person_Base @@ -103,6 +104,7 @@ class Event_Person_Base(BaseModel): event_badge_vendor: Optional[Event_Badge_Base] # Additional vendor badge event_badge_vip: Optional[Event_Badge_Base] # Additional VIP badge event_exhibit_list: Optional[list] # Use event_person_detail table. An event_person record can be linked to one or more exhibits + # event_exhibit_tracking_list: Optional[list[Event_Exhibit_Tracking_Base]] event_file_list: Optional[list] # Use event_person_detail table. An event_person record can be linked to one or more files event_location_list: Optional[list] # Use event_person_detail table. An event_person record can be linked to one or more locations (but unlikely?) #event_person_detail_list: Optional[list] # list of Event_Person_Detail diff --git a/app/routers/event_exhibit.py b/app/routers/event_exhibit.py index 7132fd5..2f46546 100644 --- a/app/routers/event_exhibit.py +++ b/app/routers/event_exhibit.py @@ -1,17 +1,16 @@ 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 * +from app.lib_general import log, logging, common_route_params, Common_Route_Params from app.config import settings -from app.db_sql import * +from app.db_sql import sql_enable_part, sql_insert, sql_update, sql_insert_or_update, sql_limit_offset_part, sql_select, sql_delete, redis_lookup_id_random from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template from app.models.event_exhibit_models import Event_Exhibit_Base -from app.models.response_models import * +from app.models.response_models import Resp_Body_Base, mk_resp router = APIRouter() diff --git a/app/routers/event_exhibit_tracking.py b/app/routers/event_exhibit_tracking.py index 6260f66..cea89cf 100644 --- a/app/routers/event_exhibit_tracking.py +++ b/app/routers/event_exhibit_tracking.py @@ -10,10 +10,10 @@ from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, 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_exhibit_tracking_methods import get_event_exhibit_tracking_rec_list, load_event_exhibit_tracking_obj +from app.methods.event_exhibit_tracking_methods import create_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 * +from app.models.response_models import Resp_Body_Base, mk_resp router = APIRouter() @@ -22,15 +22,38 @@ router = APIRouter() @router.post('/event/exhibit/tracking', response_model=Resp_Body_Base) async def post_event_exhibit_tracking_obj( event_exhibit_tracking_obj: Event_Exhibit_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, + event_exhibit_id: str = Query(..., min_length=11, max_length=22), + event_badge_id: str = Query(None, min_length=11, max_length=22), + event_person_id: str = Query(None, min_length=11, max_length=22), + + return_obj: bool = True, + + commons: Common_Route_Params = Depends(common_route_params), ): - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) + # ### 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.') + + # ### SECTION ### Process data + if membership_person_id := create_membership_person_obj( + account_id = commons.x_account_id, + person_id = person_id, + membership_person_dict_obj = membership_person_obj, + ): pass + else: return mk_resp(data=False, status_code=400, response=commons.response, status_message='The membership person was not created. Check the field names and data types.') # Bad Request + obj_type = 'event_exhibit_tracking' event_exhibit_tracking_obj_data_dict = event_exhibit_tracking_obj.dict(by_alias=False, exclude_unset=True) result = post_obj_template(