From 486236f0a88a42d441826f7eb64fe44d0c2bb15d Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Thu, 27 May 2021 23:10:53 -0400 Subject: [PATCH] Working on event_person and session proposals. Also general clean up of models and methods. --- app/main.py | 10 +- app/methods/event_person_methods.py | 37 ++++- app/models/common_field_schema.py | 1 + app/models/event_person_detail_models.py | 80 +++++++++++ app/models/event_person_models.py | 11 +- ...ssion_model.py => event_session_models.py} | 0 app/models/user_methods.py | 4 +- app/routers/event_person.py | 22 ++- app/routers/event_person_detail.py | 126 ++++++++++++++++++ app/routers/event_session.py | 4 +- 10 files changed, 281 insertions(+), 14 deletions(-) create mode 100644 app/models/event_person_detail_models.py rename app/models/{event_session_model.py => event_session_models.py} (100%) create mode 100644 app/routers/event_person_detail.py diff --git a/app/main.py b/app/main.py index fbe507b..b400dc4 100644 --- a/app/main.py +++ b/app/main.py @@ -18,7 +18,7 @@ from .lib_general import * from .log import * # Import the routers here first: -from .routers import api_crud, api, account, address, archive, archive_content, contact, event, event_exhibit, event_person, event_registration, event_session, flask_cfg, hosted_file, journal, journal_entry, lookup, membership, order, order_cart, organization, page, person, post, post_comment, product, site, site_domain, user, user_person, websockets # , items, journals +from .routers import api_crud, api, account, address, archive, archive_content, contact, event, event_exhibit, event_person, event_person_detail, event_registration, event_session, flask_cfg, hosted_file, journal, journal_entry, lookup, membership, order, order_cart, organization, page, person, post, post_comment, product, site, site_domain, user, user_person, websockets # , items, journals from .db_sql import db @@ -134,6 +134,14 @@ app.include_router( #dependencies=[Depends(get_account_header)], #responses={404: {'description': 'Not found'}}, ) +app.include_router( + event_person.router, + prefix='/event/person/detail', + tags=['Event Person Detail'], + #dependencies=[Depends(get_token_header)], + #dependencies=[Depends(get_account_header)], + #responses={404: {'description': 'Not found'}}, +) app.include_router( event_registration.router, prefix='/event/registration', diff --git a/app/methods/event_person_methods.py b/app/methods/event_person_methods.py index bfcc9cb..6bd0228 100644 --- a/app/methods/event_person_methods.py +++ b/app/methods/event_person_methods.py @@ -36,7 +36,15 @@ def create_event_person_obj(event_person_obj_new:Event_Person_Base) -> int|bool: # ### 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: +def load_event_person_obj( + event_person_id:int|str, + inc_event:bool=False, + inc_event_badge:bool=False, + inc_event_person_detail:bool=False, + inc_event_registration:bool=False, + inc_person:bool=False, + inc_user:bool=False + ) -> Event_Person_Base|bool: log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) @@ -46,6 +54,33 @@ def load_event_person_obj(event_person_id:int|str, inc_person:bool=False, inc_us 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) + + event_person_obj = Event_Person_Base(**event_person_rec) + person_id = event_person_obj.person_id + user_id = event_person_obj.user_id + + if inc_event: pass + if inc_event_badge: pass + if inc_event_person_detail: pass + if inc_event_registration: pass + + if inc_person: + if person_rec := sql_select(table_name='v_person', field_name='person_id', field_value=person_id): + event_person_rec['person'] = person_rec + event_person_obj.person = person_rec + #log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(event_person_rec) + + if inc_user: + user_obj = load_user_obj(user_id=user_id) # Not including roles, contact, or organization + log.debug(user_obj) + event_person_obj.user = user_obj + + #if user_rec := sql_select(table_name='v_user', field_name='user_id', field_value=user_id): + # event_person_rec['user'] = user_rec + #log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + #log.debug(event_person_rec) + else: return False diff --git a/app/models/common_field_schema.py b/app/models/common_field_schema.py index 84c3f3b..7322d5b 100644 --- a/app/models/common_field_schema.py +++ b/app/models/common_field_schema.py @@ -35,6 +35,7 @@ base_fields['event_badge_id_random'] = xxx_id_random_field_schema base_fields['event_device_id_random'] = xxx_id_random_field_schema base_fields['event_location_id_random'] = xxx_id_random_field_schema base_fields['event_person_id_random'] = xxx_id_random_field_schema +base_fields['event_person_detail_id_random'] = xxx_id_random_field_schema base_fields['event_presentation_id_random'] = xxx_id_random_field_schema base_fields['event_presenter_id_random'] = xxx_id_random_field_schema base_fields['event_registration_id_random'] = xxx_id_random_field_schema diff --git a/app/models/event_person_detail_models.py b/app/models/event_person_detail_models.py new file mode 100644 index 0000000..d22f686 --- /dev/null +++ b/app/models/event_person_detail_models.py @@ -0,0 +1,80 @@ +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 +#from .event_presentation_models import Event_Presentation_Base +#from .event_presenter_models import Event_Presenter_Base +from .event_session_models import Event_Session_Base + + +class Event_Person_Detail_Base(BaseModel): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + id_random: Optional[str] = Field( + **base_fields['event_person_detail_id_random'], + alias='event_person_detail_id_random', + default_factory=lambda:secrets.token_urlsafe(default_num_bytes), + ) + id: Optional[int] = Field( + #alias='event_person_detail_id' + ) + event_person_id_random: Optional[str] + event_person_id: Optional[int] + + #event_abstract: Optional[Event_Abstract_Base] + #event_exhibit: Optional[Event_Exhibit_Base] + #event_file: Optional[Event_File_Base] + #event_location: Optional[Event_Location_Base] + #event_presentation: Optional[Event_Presentation_Base] + #event_presenter: Optional[Event_Presenter_Base] + event_session: Optional[Event_Session_Base] + #event_track: Optional[Event_Track_Base] + + 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_person_detail_id_random', always=True) + def event_person_detail_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_person_detail_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_person_detail') + 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 + + class Config: + underscore_attrs_are_private = True + fields = base_fields diff --git a/app/models/event_person_models.py b/app/models/event_person_models.py index df16484..177d42c 100644 --- a/app/models/event_person_models.py +++ b/app/models/event_person_models.py @@ -8,9 +8,11 @@ from ..db_sql import redis_lookup_id_random from ..lib_general import * from .common_field_schema import base_fields, default_num_bytes +from .event_models import Event_Base from .event_badge_models import Event_Badge_Base -from .person_model import Person_Base +from .event_person_detail_models import Event_Person_Detail_Base from .event_registration_models import Event_Registration_Base +from .person_model import Person_Base from .user_model import User_Base @@ -125,9 +127,6 @@ 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 @@ -137,6 +136,10 @@ class Event_Person_Base(BaseModel): 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 + event: Optional[Event_Base] = Event_Base() + event_badge: Optional[Event_Badge_Base] = Event_Badge_Base() + event_person_detail: Optional[Event_Person_Detail_Base] = Event_Person_Detail_Base() + event_registration: Optional[Event_Registration_Base] = Event_Registration_Base() person: Optional[Person_Base] = Person_Base() user: Optional[User_Base] = User_Base() diff --git a/app/models/event_session_model.py b/app/models/event_session_models.py similarity index 100% rename from app/models/event_session_model.py rename to app/models/event_session_models.py diff --git a/app/models/user_methods.py b/app/models/user_methods.py index 01303f9..23e34c3 100644 --- a/app/models/user_methods.py +++ b/app/models/user_methods.py @@ -7,12 +7,12 @@ 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 .user_model import User_Base, User_Out_Base, User_New_Base +from .user_model import User_Base, User_New_Base, User_Out_Base from .user_role_model import User_Role_Base # ### BEGIN ### API User Methods ### create_user_obj() ### -def create_user_obj(user_obj_new:User_Base) -> int|bool: +def create_user_obj(user_obj_new:User_New_Base) -> int|bool: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) diff --git a/app/routers/event_person.py b/app/routers/event_person.py index 488a8ce..d7a6f73 100644 --- a/app/routers/event_person.py +++ b/app/routers/event_person.py @@ -27,9 +27,15 @@ router = APIRouter() async def post_event_person_new( event_person_new: Event_Person_New_Base, x_account_id: str = Header(...), - return_obj: Optional[bool] = True, - by_alias: Optional[bool] = True, - exclude_unset: Optional[bool] = True, + return_obj: bool = True, + inc_event: bool = False, + inc_event_badge: bool = False, + inc_event_person_detail: bool = False, + inc_event_registration: bool = False, + inc_person: bool = False, + inc_user: bool = False, + by_alias: bool = True, + exclude_unset: bool = True, ): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) @@ -132,7 +138,15 @@ async def post_event_person_new( 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) + event_person_obj = load_event_person_obj( + event_person_id=event_person_id, + inc_event=inc_event, + inc_event_badge=inc_event_badge, + inc_event_person_detail=inc_event_person_detail, + inc_event_registration=inc_event_registration, + inc_person=inc_person, + inc_user=inc_user + ) log.debug(event_person_id) log.debug(event_person_obj) else: diff --git a/app/routers/event_person_detail.py b/app/routers/event_person_detail.py new file mode 100644 index 0000000..cc11fb4 --- /dev/null +++ b/app/routers/event_person_detail.py @@ -0,0 +1,126 @@ +import datetime +#from datetime import datetime, time, timedelta +from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, status +from pydantic import BaseModel, EmailStr, Field +from typing import Dict, List, Optional, Set, Union + +from ..lib_general import * +from ..log import * +from app.config import settings +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_detail_models import Event_Person_Detail_Base +from ..models.response_model import * + + +router = APIRouter() + + +@router.post('', response_model=Resp_Body_Base) +async def post_event_person_detail_obj( + obj: Event_Person_Detail_Base, + x_account_id: str = Header(...), + return_obj: Optional[bool] = True, + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'event_person_detail' + 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('/{obj_id}', response_model=Resp_Body_Base) +async def patch_event_person_detail_obj( + obj: Event_Person_Detail_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, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'event_person_detail' + 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('/list', response_model=Resp_Body_Base) +async def get_event_person_detail_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, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'event_person_detail' + 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('/{obj_id}', response_model=Resp_Body_Base) +async def get_event_person_detail_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, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'event_person_detail' + result = get_obj_template( + obj_type=obj_type, + obj_id=obj_id, + by_alias=True, + exclude_unset=True, + ) + return result + + +@router.delete('/{obj_id}', response_model=Resp_Body_Base) +async def delete_event_person_detail_obj( + obj_id: str = Query(..., min_length=1, max_length=22), + x_account_id: str = Header(...), + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'event_person_detail' + 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 9701ece..7032957 100644 --- a/app/routers/event_session.py +++ b/app/routers/event_session.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_session_model import Event_Session_Base +from ..models.event_session_models import Event_Session_Base from ..models.response_model import * @@ -43,8 +43,8 @@ async def post_event_session_obj( @router.patch('/{obj_id}', response_model=Resp_Body_Base) async def patch_event_session_obj( + obj: Event_Session_Base, obj_id: str = Query(..., min_length=1, max_length=22), - obj: Event_Session_Base = None, x_account_id: Optional[str] = Header(..., ), return_obj: Optional[bool] = True, by_alias: Optional[bool] = True,