Files
OSIT-AE-API-FastAPI/app/routers/event_person.py
2021-08-25 10:58:39 -04:00

492 lines
21 KiB
Python

import datetime, secrets
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 app.config import settings
from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, sql_delete, get_id_random, redis_lookup_id_random
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_methods import create_event_person_obj, get_event_person_rec_list, load_event_person_obj, update_event_person_obj, update_event_person_obj_v3
from app.methods.person_methods import create_person_obj_v3, load_person_obj, update_person_obj
from app.methods.user_methods import create_user_obj, load_user_obj, update_user_obj
# from app.methods.user_load_methods import load_user_obj
from app.models.common_field_schema import default_num_bytes
from app.models.event_person_models import Event_Person_New_Base, Event_Person_Base
from app.models.person_models import Person_Base
from app.models.response_models import Resp_Body_Base, mk_resp
from app.models.user_models import User_New_Base, User_Base
router = APIRouter()
# ### BEGIN ### API Event Person ### post_event_person_obj_new_v3() ###
# Updated 2021-08-24
@router.post('/new_v3', response_model=Resp_Body_Base)
async def post_event_person_obj_new_v3(
event_person_obj: Event_Person_Base,
create_sub_obj: bool = False,
fail_any: bool = True, # Fail if any thing goes wrong for sub objects
x_account_id: str = Header(...),
return_obj: bool = True,
by_alias: bool = True,
exclude_unset: bool = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# There should probably be a check for the event ID before calling the create function?
if create_event_person_obj_result := create_event_person_obj(
event_id = event_person_obj.event_id,
event_person_obj_new = event_person_obj,
create_sub_obj = create_sub_obj,
fail_any = fail_any
): pass
else: return mk_resp(data=False, status_code=400, response=response, status_message='The event person was not created. Check the field names and data types.')
if isinstance(create_event_person_obj_result, int):
event_person_id = create_event_person_obj_result
if return_obj:
if load_event_person_obj_result := load_event_person_obj(event_person_id=event_person_id):
data = load_event_person_obj_result
else:
data = False
else:
event_person_id = create_event_person_obj_result
event_person_id_random = get_id_random(record_id=event_person_id, table_name='event_person')
data = {}
data['event_person_id'] = event_person_id
data['event_person_id_random'] = event_person_id_random
return mk_resp(data=data, response=response, status_message='The event person was created.')
else:
return mk_resp(data=False, status_code=400, response=response, status_message='The result from trying to create an event person was unexpected.')
# ### BEGIN ### API Event Person ### post_event_person_obj_new_v3() ###
# ### BEGIN ### API Event Person ### patch_event_person_obj_exist_v3() ###
# Updated 2021-08-24
@router.patch('/{event_person_id}/exist_v3', response_model=Resp_Body_Base)
async def patch_event_person_obj_exist_v3(
event_person_obj: Event_Person_Base,
event_person_id: str = Query(..., min_length=11, max_length=22),
create_sub_obj: bool = False,
fail_any: bool = True, # Fail if any thing goes wrong for sub objects
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # 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 mk_resp(data=None, status_code=404)
if update_event_person_obj_result := update_event_person_obj_v3(
event_person_id = event_person_id,
event_person_obj_exist = event_person_obj,
create_sub_obj = create_sub_obj,
fail_any = fail_any,
): pass
else: return mk_resp(data=False, status_code=400, response=response, status_message='The event person was not created. Check the field names and data types.')
if update_event_person_obj_result:
if return_obj:
if load_event_person_obj_result := load_event_person_obj(event_person_id=event_person_id):
data = load_event_person_obj_result
else:
data = False
else:
event_person_id_random = get_id_random(record_id=event_person_id, table_name='event_person')
data = {}
data['event_person_id'] = event_person_id
data['event_person_id_random'] = event_person_id_random
return mk_resp(data=data, response=response, status_message='The event person was created.')
else:
return mk_resp(data=False, status_code=400, response=response, status_message='The result from trying to create an event person was unexpected.')
# ### END ### API Event Person ### patch_event_person_obj_exist_v3() ###
# ### BEGIN ### API Event Person Route ### post_event_person_new() ###
# Initialize/create a new event person
# Create a person record (with a contact record and an address for the contact record)
# Create a user record
# Create an event_person record with the new person and user IDs
@router.post('/event/person/new', response_model=Resp_Body_Base)
async def post_event_person_new(
event_person_new_init: Event_Person_New_Base,
x_account_id: str = Header(...),
return_obj: bool = True,
inc_event: bool = False, # Not ready yet. Placeholder.
inc_event_badge: bool = False, # Not ready yet. Placeholder.
inc_event_person_detail: bool = False, # Not ready yet. Placeholder.
inc_event_registration: bool = False, # Not ready yet. Placeholder.
inc_person: bool = False,
inc_user: bool = False,
by_alias: bool = True,
exclude_unset: bool = True,
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
log.debug(event_person_new_init)
log.debug(vars(event_person_new_init))
log.debug(dir(event_person_new_init))
account_id_random = event_person_new_init.account_id_random
event_id_random = event_person_new_init.event_id_random
given_name = event_person_new_init.person_given_name
family_name = event_person_new_init.person_family_name
if full_name := event_person_new_init.person_full_name:
pass
elif given_name and family_name:
full_name = f'{given_name} {family_name}'
elif given_name:
full_name = f'{given_name}'
display_name = event_person_new_init.person_display_name
email = event_person_new_init.email
if new_password := event_person_new_init.new_password:
pass
else:
new_password = secrets.token_urlsafe(default_num_bytes)
organization_name = event_person_new_init.organization_name
# New person
person_new = {}
person_new['account_id_random'] = account_id_random
person_new['given_name'] = given_name
person_new['family_name'] = family_name
person_new['full_name'] = full_name
person_new['display_name'] = display_name
person_new['organization_name'] = organization_name
# New person contact
person_new['contact'] = {}
person_new['contact']['account_id_random'] = account_id_random
person_new['contact']['email'] = email
person_new['contact']['name'] = full_name
# New person contact address
person_new['contact']['address'] = {}
person_new['contact']['address']['account_id_random'] = account_id_random
person_new['contact']['address']['name'] = full_name
person_obj_new = Person_Base(**person_new)
log.debug(person_obj_new)
return mk_resp(data=False, status_code=401, response=response) # TESTING TESTING TESTING
create_person_obj_result = create_person_obj_v3(account_id=account_id_random, person_obj_new=person_obj_new)
if isinstance(create_person_obj_result, int):
person_id = create_person_obj_result
person_obj = load_person_obj(
person_id = person_id,
inc_contact = True,
inc_address = True,
inc_organization = True,
)
# log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(person_obj)
else:
log.debug('A new person was not created')
return mk_resp(data=False)
# New user
user_new = {}
user_new['account_id_random'] = account_id_random
user_new['name'] = full_name
user_new['username'] = email
user_new['email'] = email
user_new['new_password'] = new_password # The string will be turned into a secure hash and stored in user.password.
# user_new['contact_id_random'] = person_obj.contact.id_random # REMOVE: No longer used
# user_new['person_id_random'] = person_obj.id_random # REMOVE: No longer used
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(user_new)
user_obj_new = User_New_Base(**user_new)
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(user_obj_new)
user_id = None
user_obj = None
create_user_obj_result = create_user_obj(user_obj_new=user_obj_new)
if isinstance(create_user_obj_result, bool):
log.debug('Returning False since multiple users were found with the same username.')
return mk_resp(data=False)
elif isinstance(create_user_obj_result, int):
user_id = create_user_obj_result
user_obj = load_user_obj(user_id=user_id) # Not including roles, contact, or organization
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(user_obj)
else:
log.debug('A new user was not created')
return mk_resp(data=False)
# Update person with new user ID
person_data_update = {}
# person_data_update['user_id'] = user_id
person_data_update['user_id_random'] = user_obj.id_random
person_obj_update = Person_Base(**person_data_update)
log.debug(person_obj_update)
person_obj_update_result = update_person_obj(
person_id = person_id,
person_obj_up = person_obj_update
)
if person_obj_update_result:
log.debug('The new person was updated with the user ID')
# person_id = person_obj_update_result
# person_obj = load_person_obj(
# person_id = person_id,
# inc_contact = True,
# inc_address = True,
# inc_organization = True,
# )
log.debug(person_obj_update_result)
else:
log.debug('A new person was not updated')
return mk_resp(data=False)
# New event person
event_person_new = {}
event_person_new['account_id_random'] = account_id_random
event_person_new['event_id_random'] = event_id_random
event_person_new['person_id_random'] = person_obj.id_random
event_person_new['user_id_random'] = user_obj.id_random
event_person_obj_new = Event_Person_Base(**event_person_new)
log.debug(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,
# inc_event=inc_event, # Not ready yet. Placeholder.
inc_event_badge=inc_event_badge, # Not ready yet. Placeholder.
# inc_event_person_detail=inc_event_person_detail, # Not ready yet. Placeholder.
inc_event_registration=inc_event_registration, # Not ready yet. Placeholder.
inc_person=False, # Already loaded above
inc_user=False, # Already loaded above
)
log.debug(event_person_id)
log.debug(event_person_obj)
event_person_obj.person = person_obj
event_person_obj.user = user_obj
log.debug(event_person_obj)
event_person_dict = event_person_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset)
pass
else:
log.debug('A new event_person was not created')
return mk_resp(data=False)
return mk_resp(data=event_person_dict)
#return mk_resp(data=event_person_obj)
# ### BEGIN ### API Event Person Route ### post_event_person_new() ###
# ### BEGIN ### API Event Person ### patch_event_person_json() ###
@router.patch('/event/person/{event_person_id}/json', response_model=Resp_Body_Base)
async def patch_event_person_json(
event_person_obj: Event_Person_Base,
event_person_id: str = Query(..., min_length=1, max_length=22),
create_sub_obj: bool = False,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
include: Optional[list] = [],
exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # 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 mk_resp(data=None, status_code=404)
if event_person_obj_up_result := update_event_person_obj(
event_person_id=event_person_id,
event_person_obj_up=event_person_obj,
create_sub_obj=create_sub_obj,
):
log.debug(event_person_obj_up_result)
if return_obj:
event_person_obj = load_event_person_obj(event_person_id=event_person_id)
event_person_dict = event_person_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset)
return mk_resp(data=event_person_dict)
else:
return mk_resp(data=event_person_obj_up_result)
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
# ### END ### API Event Person ### patch_event_person_json() ###
# ### BEGIN ### API Event Person ### get_event_person_obj() ###
# Working well as of 2021-06-04. Using as a template for other routes.
@router.get('/event/person/{event_person_id}', response_model=Resp_Body_Base)
async def get_event_person_obj(
event_person_id: str = Query(..., min_length=1, max_length=22),
enabled: str = 'enabled', # For now this covers any included objects or object lists
limit: int = 500, # For now this covers any included objects or object lists
inc_address: bool = False, # Under contact
inc_contact: bool = False, # Under person
inc_event_abstract_list: bool = False,
inc_event_badge: bool = False,
#inc_event_device_list: bool = False,
#inc_event_exhibit_list: bool = False,
inc_event_file_list: bool = False,
#inc_event_location_list: bool = False,
#inc_event_person_list: bool = False,
inc_event_presentation_list: bool = False,
#inc_event_presenter_list: bool = False,
inc_event_registration: bool = False,
#inc_event_track: bool = False,
inc_person: bool = False,
inc_user: 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_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)
if event_person_obj := load_event_person_obj(
event_person_id=event_person_id,
enabled=enabled,
limit=limit,
inc_address=inc_address,
inc_contact=inc_contact,
inc_event_abstract_list=inc_event_abstract_list,
inc_event_badge=inc_event_badge,
#inc_event_device_list=inc_event_device_list,
#inc_event_exhibit_list=inc_event_exhibit_list,
inc_event_file_list=inc_event_file_list,
#inc_event_location=inc_event_location,
#inc_event_person_list=inc_event_person_list,
inc_event_presentation_list=inc_event_presentation_list,
#inc_event_presenter_list=inc_event_presenter_list,
inc_event_registration=inc_event_registration,
#inc_event_track=inc_event_track,
inc_person=inc_person,
inc_user=inc_user,
):
# event_dict = event_person_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset)
pass
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=event_person_obj)
# ### END ### API Event ### get_event_person_obj() ###
# ### BEGIN ### API Event Person Methods ### get_event_registration_event_person_obj_li() ###
# Similar to event_registration.py: /event/registration/<id> inc_event_person_list
# Updated 2021-08-17
@router.get('/event/registration/{event_registration_id}/event/person/list', response_model=Resp_Body_Base)
async def get_event_registration_event_person_obj_li(
event_registration_id: str = Query(..., min_length=1, max_length=22),
enabled: str = 'enabled',
limit: int = 1000,
inc_address: bool = False,
inc_contact: bool = False,
inc_event_badge: bool = False,
inc_person: bool = False,
# inc_user: bool = False,
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())
if event_registration_id := redis_lookup_id_random(record_id_random=event_registration_id, table_name='event_registration'): pass
else: return mk_resp(data=None, status_code=404)
if event_person_rec_list_result := get_event_person_rec_list(
for_obj_type = 'event_registration',
for_obj_id = event_registration_id,
limit = limit,
enabled = enabled,
):
event_person_result_list = []
for event_person_rec in event_person_rec_list_result:
if load_event_person_result := load_event_person_obj(
event_person_id = event_person_rec.get('event_person_id', None),
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
enabled = enabled,
inc_person = inc_person,
# inc_user = inc_user,
):
event_person_result_list.append(load_event_person_result)
else: event_person_result_list.append(None)
return mk_resp(data=event_person_result_list)
else: return mk_resp(data=None, status_code=404, response=response) # Not Found
# ### END ### API Event Person Methods ### get_event_registration_event_person_obj_li() ###
# ### BEGIN ### API Event Person Methods ### get_person_event_person_obj_li() ###
# Updated 2021-07-12
# NOT FINISHED YET
@router.get('/person/{person_id}/event/person/list', response_model=Resp_Body_Base)
async def get_person_event_person_obj_li(
person_id: str = Query(..., min_length=1, max_length=22),
enabled: str = 'enabled',
limit: int = 1000,
inc_address: bool = False,
inc_contact: bool = False,
# inc_event: bool = False,
inc_event_abstract_list: bool = False,
inc_event_badge: bool = False,
inc_event_exhibit_list: bool = False,
inc_event_file_list: bool = False,
inc_event_presentation_list: bool = False,
inc_event_presenter_list: bool = False,
inc_event_registration: bool = False,
inc_event_session_list: bool = False,
inc_event_track_list: bool = False,
inc_user: bool = False,
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())
if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass
else: return mk_resp(data=None, status_code=404)
return mk_resp(data=response_data)
# ### END ### API Event Person Methods ### get_person_event_person_obj_li() ###