From 65fd3ebe286eb0cd72e40747381f46270a0fde49 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Thu, 27 May 2021 16:29:27 -0400 Subject: [PATCH] Working on event_person and session proposals. Also general clean up of models and methods. --- app/db_sql.py | 4 +- app/{models => methods}/account_methods.py | 2 +- .../event_person_methods.py | 28 ++++- app/{models => methods}/membership_methods.py | 2 +- .../{account_model.py => account_models.py} | 0 app/models/event_badge_models.py | 112 ++++++++++++++++++ ...hibit_model.py => event_exhibit_models.py} | 0 .../{event_model.py => event_models.py} | 0 ...person_model.py => event_person_models.py} | 19 +++ ..._model.py => event_registration_models.py} | 0 ...mbership_model.py => membership_models.py} | 0 app/models/user_methods.py | 4 +- app/models/user_model.py | 7 +- app/routers/account.py | 4 +- app/routers/api_crud.py | 11 +- app/routers/event.py | 2 +- app/routers/event_exhibit.py | 2 +- app/routers/event_person.py | 19 ++- app/routers/event_registration.py | 2 +- app/routers/membership.py | 4 +- 20 files changed, 198 insertions(+), 24 deletions(-) rename app/{models => methods}/account_methods.py (95%) rename app/{models => methods}/event_person_methods.py (53%) rename app/{models => methods}/membership_methods.py (99%) rename app/models/{account_model.py => account_models.py} (100%) create mode 100644 app/models/event_badge_models.py rename app/models/{event_exhibit_model.py => event_exhibit_models.py} (100%) rename app/models/{event_model.py => event_models.py} (100%) rename app/models/{event_person_model.py => event_person_models.py} (84%) rename app/models/{event_registration_model.py => event_registration_models.py} (100%) rename app/models/{membership_model.py => membership_models.py} (100%) diff --git a/app/db_sql.py b/app/db_sql.py index d301baa..b5667ff 100644 --- a/app/db_sql.py +++ b/app/db_sql.py @@ -650,7 +650,7 @@ def sql_delete( # If not success and there is a table_name then check the database table passed # If found in database table then store in Redis and return the ID number def redis_lookup_id_random(record_id_random:int|str, table_name:str): - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + #log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if isinstance(record_id_random, str) and len(record_id_random) >= 11 and len(record_id_random) <= 22: pass @@ -699,7 +699,7 @@ def redis_lookup_id_random(record_id_random:int|str, table_name:str): """ if select_results := sql_select(sql=sql, data=data): - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + #log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(select_results) log.debug(type(select_results)) if isinstance(select_results, dict): diff --git a/app/models/account_methods.py b/app/methods/account_methods.py similarity index 95% rename from app/models/account_methods.py rename to app/methods/account_methods.py index f965c41..569a38c 100644 --- a/app/models/account_methods.py +++ b/app/methods/account_methods.py @@ -7,7 +7,7 @@ from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, v from ..lib_general import * from ..db_sql import redis_lookup_id_random, sql_select -from .membership_model import Membership_Cfg_Base +from ..models.membership_models import Membership_Cfg_Base # ### BEGIN ### API Account Methods ### load_account_cfg_obj() ### diff --git a/app/models/event_person_methods.py b/app/methods/event_person_methods.py similarity index 53% rename from app/models/event_person_methods.py rename to app/methods/event_person_methods.py index 4832374..bfcc9cb 100644 --- a/app/models/event_person_methods.py +++ b/app/methods/event_person_methods.py @@ -7,11 +7,11 @@ from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, v from ..lib_general import * from ..db_sql import redis_lookup_id_random, sql_insert, sql_select, sql_update -from .event_person_model import Event_Person_New_Base, Event_Person_Base +from ..models.event_person_models import Event_Person_New_Base, Event_Person_Base # ### BEGIN ### API Event Person Methods ### create_event_person_obj() ### -def create_event_person_obj(event_person_obj_new:Event_Person_Base): +def create_event_person_obj(event_person_obj_new:Event_Person_Base) -> int|bool: log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) @@ -33,3 +33,27 @@ def create_event_person_obj(event_person_obj_new:Event_Person_Base): log.debug(f'Returning the new event_person_id: {event_person_id}') return event_person_id # ### END ### API Event Person Methods ### create_event_person_obj() ### + + +# ### BEGIN ### API Event Person Methods ### load_event_person_obj() ### +def load_event_person_obj(event_person_id:int|str, inc_person:bool=False, inc_user:bool=False, inc_event_person_detail:bool=False, inc_event_registration:bool=False, inc_event_badge:bool=False) -> Event_Person_Base|bool: + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if event_person_id := redis_lookup_id_random(record_id_random=event_person_id, table_name='event_person'): pass + else: return False + + if event_person_rec := sql_select(table_name='v_event_person', record_id=event_person_id): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(event_person_rec) + else: + return False + + try: + event_person_obj = Event_Person_Base(**event_person_rec) + log.debug(event_person_obj) + except ValidationError as e: + log.error(e.json()) + return False + + return event_person_obj \ No newline at end of file diff --git a/app/models/membership_methods.py b/app/methods/membership_methods.py similarity index 99% rename from app/models/membership_methods.py rename to app/methods/membership_methods.py index 3427ebc..b8223f7 100644 --- a/app/models/membership_methods.py +++ b/app/methods/membership_methods.py @@ -9,7 +9,7 @@ from ..db_sql import redis_lookup_id_random, sql_select #from .address_model import Address_Base #from .contact_model import Contact_Base -from .membership_model import Membership_Base +from ..models.membership_models import Membership_Base #from .organization_model import Organization_Base #from .person_model import Person_Base #from .user_model import User_Base diff --git a/app/models/account_model.py b/app/models/account_models.py similarity index 100% rename from app/models/account_model.py rename to app/models/account_models.py diff --git a/app/models/event_badge_models.py b/app/models/event_badge_models.py new file mode 100644 index 0000000..53125f0 --- /dev/null +++ b/app/models/event_badge_models.py @@ -0,0 +1,112 @@ +from __future__ import annotations +import datetime, hashlib, logging, os, pytz, redis, secrets + +from typing import Dict, List, Optional, Set, Union +from pydantic import BaseModel, EmailStr, Field, Json, PrivateAttr, ValidationError, validator + +from ..db_sql import redis_lookup_id_random +from ..lib_general import * + +from .common_field_schema import base_fields, default_num_bytes + + +class Event_Badge_Base(BaseModel): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + id_random: Optional[str] = Field( + **base_fields['event_badge_id_random'], + alias='event_badge_id_random', + default_factory=lambda:secrets.token_urlsafe(default_num_bytes), + ) + id: Optional[int] = Field( + #alias='event_badge_id' + ) + # account_id_random: Optional[str] + # account_id: Optional[int] + event_id_random: Optional[str] + event_id: Optional[int] + event_person_id_random: Optional[str] + event_person_id: Optional[int] + person_id_random: Optional[str] + person_id: Optional[int] + + pronoun: Optional[str] + given_name: Optional[str] + family_name: Optional[str] + full_name: Optional[str] + email: Optional[str] + degree: Optional[str] + degrees: Optional[str] # Do we want this? + credentials: Optional[str] + title: Optional[str] + affiliation: Optional[str] + affiliations: Optional[str] # Do we want this? + city: Optional[str] + county: Optional[str] # NOTE: This is for a county within a state or province + state_province: Optional[str] + country: Optional[str] + + # NOTE: More badge fields need to be added here once things are cleaned up + + priority: Optional[bool] + sort: Optional[int] + group: Optional[str] + + notes: Optional[str] + created_on: Optional[datetime.datetime] = None + updated_on: Optional[datetime.datetime] = None + + _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) + + #@validator('event_badge_id_random', always=True) + def event_badge_id_random_copy(cls, v, values, **kwargs): + log.setLevel(logging.WARNING) + log.debug(locals()) + + if values['id_random']: + return values['id_random'] + return None + + @validator('id', always=True) + def event_badge_id_lookup(cls, v, values, **kwargs): + log.setLevel(logging.WARNING) + log.debug(locals()) + + if values['id_random']: + log.debug(values['id_random']) + return redis_lookup_id_random(record_id_random=values['id_random'], table_name='event_badge') + return None + + @validator('event_id', always=True) + def event_id_lookup(cls, v, values, **kwargs): + log.setLevel(logging.WARNING) + log.debug(locals()) + + if values['event_id_random']: + return redis_lookup_id_random(record_id_random=values['event_id_random'], table_name='event') + return None + + @validator('event_person_id', always=True) + def event_person_id_lookup(cls, v, values, **kwargs): + log.setLevel(logging.WARNING) + log.debug(locals()) + + if values['event_person_id_random']: + return redis_lookup_id_random(record_id_random=values['event_person_id_random'], table_name='event_person') + return None + + @validator('person_id', always=True) + def person_id_lookup(cls, v, values, **kwargs): + log.setLevel(logging.WARNING) + log.debug(locals()) + + if values['person_id_random']: + return redis_lookup_id_random(record_id_random=values['person_id_random'], table_name='person') + return None + + class Config: + underscore_attrs_are_private = True + fields = base_fields + +Event_Badge_Base.update_forward_refs() diff --git a/app/models/event_exhibit_model.py b/app/models/event_exhibit_models.py similarity index 100% rename from app/models/event_exhibit_model.py rename to app/models/event_exhibit_models.py diff --git a/app/models/event_model.py b/app/models/event_models.py similarity index 100% rename from app/models/event_model.py rename to app/models/event_models.py diff --git a/app/models/event_person_model.py b/app/models/event_person_models.py similarity index 84% rename from app/models/event_person_model.py rename to app/models/event_person_models.py index 2927e3f..df16484 100644 --- a/app/models/event_person_model.py +++ b/app/models/event_person_models.py @@ -8,6 +8,10 @@ from ..db_sql import redis_lookup_id_random from ..lib_general import * from .common_field_schema import base_fields, default_num_bytes +from .event_badge_models import Event_Badge_Base +from .person_model import Person_Base +from .event_registration_models import Event_Registration_Base +from .user_model import User_Base class Event_Person_New_Base(BaseModel): @@ -121,6 +125,21 @@ class Event_Person_Base(BaseModel): user_id_random: Optional[str] user_id: Optional[int] + event_badge: Optional[dict] # Should be Event_Badge_Base() + event_registration: Optional[dict] # Should be Event_Registration_Base() + + event_abstract: Optional[list] # An event_person record can be linked to one or more abstracts + event_exhibit: Optional[list] # An event_person record can be linked to one or more exhibits + event_file: Optional[list] # An event_person record can be linked to one or more files + event_location: Optional[list] # An event_person record can be linked to one or more locations (but unlikely?) + event_presentation: Optional[list] # An event_person record can be linked to one or more presentations + event_presenter: Optional[list] # An event_person record can be linked to one or more presenters (part of multiple presentations) + event_session: Optional[list] # An event_person record can be linked to one or more sessions + event_track: Optional[list] # An event_person record can be linked to one or more tracks + + person: Optional[Person_Base] = Person_Base() + user: Optional[User_Base] = User_Base() + priority: Optional[bool] sort: Optional[int] group: Optional[str] diff --git a/app/models/event_registration_model.py b/app/models/event_registration_models.py similarity index 100% rename from app/models/event_registration_model.py rename to app/models/event_registration_models.py diff --git a/app/models/membership_model.py b/app/models/membership_models.py similarity index 100% rename from app/models/membership_model.py rename to app/models/membership_models.py diff --git a/app/models/user_methods.py b/app/models/user_methods.py index 9af6f83..01303f9 100644 --- a/app/models/user_methods.py +++ b/app/models/user_methods.py @@ -12,7 +12,7 @@ from .user_role_model import User_Role_Base # ### BEGIN ### API User Methods ### create_user_obj() ### -def create_user_obj(user_obj_new:User_Base): +def create_user_obj(user_obj_new:User_Base) -> int|bool: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) @@ -66,7 +66,7 @@ def create_user_obj(user_obj_new:User_Base): # ### BEGIN ### API User Methods ### load_user_obj() ### -def load_user_obj(user_id:int|str, inc_roles:bool=False, inc_contact:bool=False, inc_organization:bool=False, inc_person:bool=False) -> User_Base: +def load_user_obj(user_id:int|str, inc_roles:bool=False, inc_contact:bool=False, inc_organization:bool=False, inc_person:bool=False) -> User_Out_Base|bool: log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) diff --git a/app/models/user_model.py b/app/models/user_model.py index 8ea1d07..f5e926b 100644 --- a/app/models/user_model.py +++ b/app/models/user_model.py @@ -15,6 +15,7 @@ from .contact_model import Contact_Base from .user_role_model import User_Role_Base +# ### BEGIN ### API User Models ### User_New_Base() ### class User_New_Base(BaseModel): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) @@ -127,8 +128,10 @@ class User_New_Base(BaseModel): class Config: underscore_attrs_are_private = True fields = base_fields +# ### END ### API User Models ### User_New_Base() ### +# ### BEGIN ### API User Models ### User_Out_Base() ### class User_Out_Base(BaseModel): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) @@ -188,9 +191,10 @@ class User_Out_Base(BaseModel): class Config: underscore_attrs_are_private = True fields = base_fields +# ### END ### API User Models ### User_Out_Base() ### - +# ### BEGIN ### API User Models ### User_Base() ### class User_Base(BaseModel): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) @@ -317,6 +321,7 @@ class User_Base(BaseModel): class Config: underscore_attrs_are_private = True fields = base_fields +# ### END ### API User Models ### User_Base() ### #User_Base.update_forward_refs() #User_Out_Base.update_forward_refs() diff --git a/app/routers/account.py b/app/routers/account.py index a1cd4af..cdf301c 100644 --- a/app/routers/account.py +++ b/app/routers/account.py @@ -11,8 +11,8 @@ from app.db_sql import * from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template -from ..models.account_model import Account_Base -from ..models.account_methods import load_account_cfg_obj +from ..models.account_models import Account_Base +from ..methods.account_methods import load_account_cfg_obj from ..models.response_model import * diff --git a/app/routers/api_crud.py b/app/routers/api_crud.py index bb2262f..d5c1a35 100644 --- a/app/routers/api_crud.py +++ b/app/routers/api_crud.py @@ -10,16 +10,17 @@ from app.db_sql import * from ..models.response_model import * -from ..models.account_model import * +from ..models.account_models import * from ..models.account_cfg_model import * from ..models.address_model import * from ..models.archive_model import * from ..models.archive_content_model import * from ..models.contact_model import * -from ..models.event_model import * -from ..models.event_exhibit_model import * -from ..models.event_registration_model import * -from ..models.membership_model import * +from ..models.event_models import * +from ..models.event_exhibit_models import * +from ..models.event_person_models import * +from ..models.event_registration_models import * +from ..models.membership_models import * from ..models.order_model import * from ..models.order_cart_model import * from ..models.organization_model import * diff --git a/app/routers/event.py b/app/routers/event.py index 86eb678..aa83a6d 100644 --- a/app/routers/event.py +++ b/app/routers/event.py @@ -11,7 +11,7 @@ from app.db_sql import * from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template -from ..models.event_model import Event_Base +from ..models.event_models import Event_Base from ..models.response_model import * diff --git a/app/routers/event_exhibit.py b/app/routers/event_exhibit.py index 6705558..6e9f869 100644 --- a/app/routers/event_exhibit.py +++ b/app/routers/event_exhibit.py @@ -10,7 +10,7 @@ from app.db_sql import * from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template -from ..models.event_exhibit_model import Event_Exhibit_Base +from ..models.event_exhibit_models import Event_Exhibit_Base from ..models.response_model import * diff --git a/app/routers/event_person.py b/app/routers/event_person.py index fccf2e8..488a8ce 100644 --- a/app/routers/event_person.py +++ b/app/routers/event_person.py @@ -11,8 +11,8 @@ from app.db_sql import * from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template -from ..models.event_person_model import Event_Person_New_Base, Event_Person_Base -from ..models.event_person_methods import create_event_person_obj +from ..models.event_person_models import Event_Person_New_Base, Event_Person_Base +from ..methods.event_person_methods import create_event_person_obj, load_event_person_obj from ..models.person_model import Person_Base from ..models.person_methods import create_person_obj, load_person_obj from ..models.user_model import User_New_Base, User_Base @@ -126,11 +126,24 @@ async def post_event_person_new( event_person_obj_new = Event_Person_Base(**event_person_new) log.debug(event_person_obj_new) - event_person_obj = create_event_person_obj(event_person_obj_new=event_person_obj_new) + event_person_obj_result = create_event_person_obj(event_person_obj_new=event_person_obj_new) + if isinstance(event_person_obj_result, bool): + log.debug('Returning False something is not right.') + return mk_resp(data=False) + elif isinstance(event_person_obj_result, int): + event_person_id = event_person_obj_result + event_person_obj = load_event_person_obj(event_person_id=event_person_id) + log.debug(event_person_id) + log.debug(event_person_obj) + else: + log.debug('A new event_person was not created') + return mk_resp(data=False) return_data = {} return_data['person'] = person_obj return_data['user'] = user_obj return_data['event_person'] = event_person_obj + log.debug(return_data) + return mk_resp(data=return_data) \ No newline at end of file diff --git a/app/routers/event_registration.py b/app/routers/event_registration.py index 713fcf3..26cefe2 100644 --- a/app/routers/event_registration.py +++ b/app/routers/event_registration.py @@ -11,7 +11,7 @@ from app.db_sql import * from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template -from ..models.event_registration_model import Event_Registration_Base +from ..models.event_registration_models import Event_Registration_Base from ..models.response_model import * diff --git a/app/routers/membership.py b/app/routers/membership.py index b1734f6..54a8329 100644 --- a/app/routers/membership.py +++ b/app/routers/membership.py @@ -11,8 +11,8 @@ from app.db_sql import * from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template -from ..models.membership_model import Membership_Base -from ..models.membership_methods import load_membership_obj +from ..models.membership_models import Membership_Base +from ..methods.membership_methods import load_membership_obj from ..models.response_model import *