Files
OSIT-AE-API-FastAPI/app/routers/account.py
2021-06-24 14:17:29 -04:00

554 lines
24 KiB
Python

import datetime
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 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, 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.account_methods import load_account_obj, load_account_obj_membership_type
from app.methods.account_cfg_methods import load_account_cfg_obj
from app.methods.membership_group_methods import get_membership_group_rec_list, load_membership_group_obj
from app.methods.membership_member_methods import get_membership_member_rec_list, load_membership_member_obj
from app.methods.membership_type_methods import get_membership_type_rec_list, load_membership_type_obj
from app.models.account_models import Account_Base
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
@router.post('', response_model=Resp_Body_Base)
async def post_account_obj(
obj: Account_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 = 'account'
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_account_obj(
obj: Account_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 = 'account'
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_account_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 = 'account'
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
# ### BEGIN ### API Account ### get_account_obj_new() ###
# Working well as of 2021-06-11. Using as a template for other routes.
@router.get('/{account_id}', response_model=Resp_Body_Base)
async def get_account_obj_new(
account_id: str = Query(..., min_length=1, 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_account_cfg: bool = False, # Priority l1
inc_address: bool = False, # Under contact
inc_address_list: bool = False,
# inc_archive: bool = False,
inc_archive_list: bool = False, # Priority l1
# inc_archive_content: bool = False,
inc_archive_content_list: bool = False, # Priority l2
inc_contact: bool = False,
inc_contact_list: bool = False,
inc_event: bool = False,
inc_event_list: bool = False, # Priority l1
# inc_event_abstract: bool = False,
# inc_event_abstract_list: bool = False,
# inc_event_badge: bool = False,
# inc_event_badge_list: bool = False,
inc_event_cfg: bool = False,
# inc_event_device: bool = False,
# inc_event_device_list: bool = False,
# inc_event_exhibit: bool = False,
inc_event_exhibit_list: bool = False,
# inc_event_file: bool = False,
inc_event_file_list: bool = False,
# inc_event_location: bool = False, # For event_session child object
inc_event_location_list: bool = False,
# inc_event_person: bool = False,
inc_event_person_list: bool = False,
# inc_event_presentation: bool = False,
inc_event_presentation_list: bool = False,
# inc_event_presenter_cat: bool = False, # For event_session child object
# inc_event_presenter: bool = False,
inc_event_presenter_list: bool = False,
# inc_event_registration: bool = False,
inc_event_registration_cfg: bool = False,
inc_event_registration_list: bool = False,
# inc_event_session: bool = False,
inc_event_session_list: bool = False,
# inc_event_track: bool = False, # For event_session child object
inc_event_track_list: bool = False,
inc_fundraising_cfg: bool = False,
inc_hosted_file_list: bool = False,
inc_hosted_file_link_list: bool = False,
inc_journal_list: bool = False,
inc_journal_entry_list: bool = False,
inc_membership_cfg: bool = False,
# inc_membership_group: bool = False,
inc_membership_group_list: bool = False,
inc_membership_member: bool = False,
inc_membership_member_list: bool = False,
inc_membership_member_profile: bool = False,
# inc_membership_type: bool = False,
inc_membership_type_list: bool = False,
# inc_order: bool = False,
inc_order_list: bool = False,
# inc_order_cart: bool = False,
inc_order_cart_list: bool = False,
inc_organization: bool = False,
inc_organization_list: bool = False,
inc_person: bool = False,
inc_person_list: bool = False,
# inc_post: bool = False,
inc_post_list: bool = False, # Priority l1
# inc_post_comment: bool = False,
inc_post_comment_list: bool = False,
# inc_product: bool = False,
inc_product_list: bool = False,
# inc_site: bool = False,
inc_site_list: bool = False,
inc_site_domain_list: bool = False,
inc_user: bool = False,
inc_user_list: bool = False,
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())
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)
if account_result := load_account_obj(
account_id = account_id,
enabled = enabled,
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
model_as_dict = False, # NOTE: returning model as a dict
inc_account_cfg = inc_account_cfg,
inc_address = inc_address,
inc_address_list = inc_address_list,
# inc_archive = inc_archive,
inc_archive_list = inc_archive_list,
# inc_archive_content = inc_archive_content,
inc_archive_content_list = inc_archive_content_list,
inc_contact = inc_contact,
inc_contact_list = inc_contact_list,
inc_event = inc_event,
inc_event_list = inc_event_list,
# inc_event_abstract_list = inc_event_abstract_list,
# inc_event_badge_list = inc_event_badge_list,
# inc_event_device_list = inc_event_device_list,
inc_event_file_list = inc_event_file_list,
# inc_event_location = inc_event_location,
# inc_event_person = inc_event_person,
inc_event_person_list = inc_event_person_list,
inc_event_presentation_list = inc_event_presentation_list,
# inc_event_presenter_cat = inc_event_presenter_cat,
inc_event_presenter_list = inc_event_presenter_list,
inc_event_registration_list = inc_event_registration_list,
inc_event_session_list = inc_event_session_list,
# inc_event_track = inc_event_track,
inc_event_track_list = inc_event_track_list,
inc_fundraising_cfg = inc_fundraising_cfg,
inc_hosted_file_list = inc_hosted_file_list,
inc_hosted_file_link_list = inc_hosted_file_link_list,
inc_journal_list = inc_journal_list,
inc_journal_entry_list = inc_journal_entry_list,
inc_membership_cfg = inc_membership_cfg,
inc_membership_group_list = inc_membership_group_list,
inc_membership_member = inc_membership_member,
inc_membership_member_list = inc_membership_member_list,
inc_membership_member_profile = inc_membership_member_profile,
inc_membership_type_list = inc_membership_type_list,
# inc_order = inc_order,
inc_order_list = inc_order_list,
# inc_order_cart = inc_order_cart,
inc_order_cart_list = inc_order_cart_list,
inc_organization = inc_organization,
inc_organization_list = inc_organization_list,
inc_person = inc_person,
inc_person_list = inc_person_list,
# inc_post = inc_post,
inc_post_list = inc_post_list,
# inc_post_comment = inc_post_comment,
inc_post_comment_list = inc_post_comment_list,
# inc_product = inc_product,
inc_product_list = inc_product_list,
# inc_site = inc_site,
inc_site_list = inc_site_list,
inc_site_domain_list = inc_site_domain_list,
inc_user = inc_user,
inc_user_list = inc_user_list,
):
if isinstance(account_result, dict):
# log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.info('Result is a dict')
response_data = account_result
log.debug(response_data)
else:
# log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# print('---------------------------')
log.info('Result is probably an object model')
response_data = account_result
# print('---------------------------')
log.debug(response_data)
# log.debug(response_data.__fields_set__)
# response_data.testing = 'this is a test'
# log.debug(response_data.__fields_set__)
# print('---------------------------')
# log.debug(account_result.dict())
# print('---------------------------')
# # log.debug(account_result.dict(by_alias=False, exclude_unset=True)) # pylint: disable=no-member
# log.debug(account_result.dict(by_alias=True, exclude_unset=False)) # pylint: disable=no-member
# print('---------------------------')
# log.debug(account_result.dict(by_alias=True, exclude_unset=True)) # pylint: disable=no-member
# print('---------------------------')
else:
return mk_resp(data=False, status_code=400) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Account ### get_account_obj_new() ###
# ### BEGIN ### API Account ### get_account_obj_membership_member_list() ###
# Working well as of 2021-06-24. Using as a template for other routes.
@router.get('/{account_id}/membership_member_list', response_model=Resp_Body_Base)
async def get_account_obj_membership_member_list(
account_id: str = Query(..., min_length=1, 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_account_cfg: bool = False,
inc_address: bool = False, # Under contact
inc_contact: bool = False,
inc_membership_cfg: bool = False,
# inc_membership_group: bool = False,
inc_membership_group_list: bool = False,
# inc_membership_member: bool = False,
# inc_membership_member_list: bool = False,
inc_membership_member_profile: bool = False,
inc_membership_member_profile_cust: bool = False,
inc_membership_type: bool = False,
# inc_membership_type_list: bool = False,
# inc_order: bool = False,
inc_organization: bool = False,
inc_person: bool = False,
inc_product: bool = False,
inc_product_list: bool = False,
inc_user: bool = False,
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())
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)
response_data = None
# log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# Updated 2021-06-23
if membership_member_rec_list_result := get_membership_member_rec_list(
for_obj_type = 'account',
for_obj_id = account_id,
limit = limit,
enabled = enabled,
):
membership_member_result_list = []
for membership_member_rec in membership_member_rec_list_result:
if load_membership_member_result := load_membership_member_obj(
membership_member_id = membership_member_rec.get('membership_member_id', None),
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
enabled = enabled,
inc_address = inc_address,
inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
inc_membership_group_list = inc_membership_group_list,
# inc_membership_group_member_list = inc_membership_group_member_list,
# inc_membership_member = inc_membership_member,
# inc_membership_member_list = inc_membership_member_list,
inc_membership_member_profile = inc_membership_member_profile,
inc_membership_type = inc_membership_type,
# inc_order = inc_order,
inc_organization = inc_organization,
inc_person = inc_person,
inc_product = inc_product,
# inc_product_list = inc_product_list,
inc_user = inc_user,
):
membership_member_result_list.append(load_membership_member_result)
else:
membership_member_result_list.append(None)
response_data = membership_member_result_list
else:
return mk_resp(data=False, status_code=400) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Account ### get_account_obj_membership_member_list() ###
# ### BEGIN ### API Account ### get_account_obj_membership_group_list() ###
# Working well as of 2021-06-23. Using as a template for other routes.
@router.get('/{account_id}/membership_group_list', response_model=Resp_Body_Base)
async def get_account_obj_membership_group_list(
account_id: str = Query(..., min_length=1, 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_account_cfg: bool = False,
inc_address: bool = False, # Under contact
inc_contact: bool = False,
inc_membership_cfg: bool = False,
inc_membership_group_member_list: bool = False, # per membership group
inc_membership_member: bool = False,
inc_membership_member_profile: bool = False,
inc_membership_type: bool = False,
# inc_membership_type_list: bool = False,
# inc_order: bool = False,
inc_organization: bool = False,
inc_person: bool = False,
# inc_product: bool = False,
inc_product_list: bool = False,
inc_user: bool = False,
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())
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)
response_data = None
# Updated 2021-06-23
if membership_group_rec_list_result := get_membership_group_rec_list(
for_obj_type = 'account',
for_obj_id = account_id,
limit = limit,
enabled = enabled,
):
membership_group_result_list = []
for membership_group_rec in membership_group_rec_list_result:
if load_membership_group_result := load_membership_group_obj(
membership_group_id = membership_group_rec.get('membership_group_id', None),
limit = limit,
enabled = enabled,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
inc_address = inc_address,
inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
# inc_membership_group_member_list = inc_membership_group_member_list,
inc_membership_member = inc_membership_member,
inc_membership_member_profile = inc_membership_member_profile,
# inc_membership_type_list = inc_membership_type_list,
# inc_membership_member_list = inc_membership_member_list,
# inc_membership_group_member_list = inc_membership_group_member_list,
inc_person = inc_person,
inc_product_list = inc_product_list,
inc_user = inc_user,
):
membership_group_result_list.append(load_membership_group_result)
else:
membership_group_result_list.append(None)
response_data = membership_group_result_list
else:
return mk_resp(data=False, status_code=400) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Account ### get_account_obj_membership_group_list() ###
# ### BEGIN ### API Account ### get_account_obj_membership_type_list() ###
# Working well as of 2021-06-23. Using as a template for other routes.
@router.get('/{account_id}/membership_type_list', response_model=Resp_Body_Base)
async def get_account_obj_membership_type_list(
account_id: str = Query(..., min_length=1, 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_account_cfg: bool = False,
inc_address: bool = False, # Under contact
inc_contact: bool = False,
inc_membership_cfg: bool = False,
# inc_membership_group: bool = False,
inc_membership_group_list: bool = False,
inc_membership_member: bool = False,
inc_membership_member_list: bool = False,
inc_membership_member_profile: bool = False,
# inc_membership_type: bool = False,
# inc_membership_type_list: bool = False,
# inc_order: bool = False,
inc_organization: bool = False,
inc_person: bool = False,
# inc_product: bool = False,
inc_product_list: bool = False,
inc_user: bool = False,
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())
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)
response_data = None
# log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# Updated 2021-06-23
if membership_type_rec_list_result := get_membership_type_rec_list(
for_obj_type = 'account',
for_obj_id = account_id,
limit = limit,
enabled = enabled,
):
membership_type_result_list = []
for membership_type_rec in membership_type_rec_list_result:
if load_membership_type_result := load_membership_type_obj(
membership_type_id = membership_type_rec.get('membership_type_id', None),
limit = limit,
enabled = enabled,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
inc_address = inc_address,
inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
inc_membership_group_list = inc_membership_group_list,
# inc_membership_group_member_list = inc_membership_group_member_list,
# inc_membership_member = inc_membership_member,
inc_membership_member_list = inc_membership_member_list,
inc_membership_member_profile = inc_membership_member_profile,
inc_person = inc_person,
inc_product_list = inc_product_list,
inc_user = inc_user,
):
membership_type_result_list.append(load_membership_type_result)
else:
membership_type_result_list.append(None)
response_data = membership_type_result_list
else:
return mk_resp(data=False, status_code=400) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Account ### get_account_obj_membership_type_list() ###
@router.delete('/{obj_id}', response_model=Resp_Body_Base)
async def delete_account_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 = 'account'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result
@router.get('/{account_id}/cfg', response_model=Resp_Body_Base)
async def get_account_cfg_obj(
account_id: str = Query(..., min_length=1, max_length=22),
sys_module: Optional[str] = None, # event, fundraising, membership
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())
if sys_module:
if sys_module == 'membership':
membership_cfg_obj = load_account_cfg_obj(account_id=account_id, inc_membership_cfg=True).dict(by_alias=by_alias, exclude_unset=exclude_unset)
data = membership_cfg_obj
return mk_resp(data=data)
else:
obj_type = 'account_cfg'
result = get_obj_template(
obj_type=obj_type,
obj_id=account_id,
by_alias=True,
exclude_unset=True,
)
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(result)
return result