Files
OSIT-AE-API-FastAPI/app/routers/membership_person.py
2022-01-04 19:01:02 -05:00

561 lines
26 KiB
Python

import datetime
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, 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.membership_person_methods import create_membership_person_obj, get_membership_person_rec_list, load_membership_person_obj, update_membership_person_obj
from app.models.membership_person_models import Membership_Person_Base
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
@router.post('/membership/person', response_model=Resp_Body_Base)
async def post_membership_person_obj(
obj: Membership_Person_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
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())
obj_type = 'membership_person'
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
# ### BEGIN ### API Membership Person ### post_membership_person_obj_create() ###
# Using create_membership_person_obj()
# Updated 2022-01-04
@router.post('/membership/person/create', response_model=Resp_Body_Base)
async def post_membership_person_obj_create(
membership_person_obj: Membership_Person_Base,
create_sub_obj: bool = False,
fail_any: bool = True, # Fail if any thing goes wrong for sub objects
enabled: str = 'enabled', # For now this covers any included objects or object lists
inc_membership_group_person_list: bool = False,
inc_membership_type_person: bool = False,
inc_contact: bool = False,
return_obj: bool = True,
limit: int = 50,
by_alias: bool = True,
# include: Optional[list] = [],
# exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
# exclude_none: Optional[bool] = True,
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
person_id = membership_person_obj.person_id
person_id_random = membership_person_obj.person_id_random
log.debug(f'Person ID: {person_id}, Person ID Random: {person_id_random}')
if create_membership_person_obj_result := create_membership_person_obj(
account_id = x_account_id,
person_id = person_id,
membership_person_dict_obj = membership_person_obj,
# process_contact = process_contact,
# process_organization = process_organization,
# process_user = process_user,
): pass
else: return mk_resp(data=False, status_code=400, response=response, status_message='The membership person was not created. Check the field names and data types.')
if isinstance(create_membership_person_obj_result, int):
membership_person_id = create_membership_person_obj_result
if return_obj:
if load_membership_person_obj_result := load_membership_person_obj(
membership_person_id = membership_person_id,
enabled = enabled,
# inc_address = inc_address,
# inc_contact = inc_contact,
# inc_organization = inc_organization,
# inc_user = inc_user,
):
data = load_membership_person_obj_result
else:
data = False
return mk_resp(data=data, response=response, status_message='The membership person was probably created, but there was a problem returning the data.')
else:
membership_person_id = create_membership_person_obj_result
membership_person_id_random = get_id_random(record_id=membership_person_id, table_name='membership_person')
data = {}
data['membership_person_id'] = membership_person_id
data['membership_person_id_random'] = membership_person_id_random
return mk_resp(data=data, response=response, status_message='The membership person was created.')
else:
return mk_resp(data=False, status_code=400, response=response, status_message='The result from trying to create a membership person was unexpected.')
# ### BEGIN ### API Membership Person ### post_membership_person_obj_create() ###
@router.patch('/membership/person/{obj_id}', response_model=Resp_Body_Base)
async def patch_membership_person_obj(
obj_id: str = Query(..., min_length=1, max_length=22),
obj: Membership_Person_Base = None,
#x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
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())
obj_type = 'membership_person'
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
# ### BEGIN ### API Membership Person ### patch_membership_person_obj_update() ###
# Using update_membership_person_obj()
# Updated 2022-01-04
@router.patch('/membership/person/{membership_person_id}/update', response_model=Resp_Body_Base)
async def patch_membership_person_obj_update(
membership_person_obj: Membership_Person_Base,
membership_person_id: Optional[str] = Query(None, min_length=11, max_length=22),
create_sub_obj: bool = False,
fail_any: bool = True, # Fail if any thing goes wrong for sub objects
enabled: str = 'enabled', # For now this covers any included objects or object lists
inc_membership_group_person_list: bool = False,
inc_membership_type_person: bool = False,
inc_contact: bool = False,
return_obj: bool = True,
limit: int = 50,
by_alias: bool = True,
# include: Optional[list] = [],
# exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
# exclude_none: Optional[bool] = True,
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=x_account_id, table_name='account'): pass
else: return mk_resp(data=False, status_code=404, response=response) # Not Found
membership_person_id_random = membership_person_id # This is used later for the response data
if membership_person_id := redis_lookup_id_random(record_id_random=membership_person_id, table_name='membership_person'): pass
else: return mk_resp(data=False, status_code=404, response=response) # Not Found
log.debug(f'Membership Person ID: {membership_person_id}')
if update_membership_person_obj_result := update_membership_person_obj(
membership_person_id = membership_person_id,
membership_person_dict_obj = membership_person_obj,
# process_contact = process_contact,
# process_organization = process_organization,
# process_user = process_user,
): pass
else: return mk_resp(data=False, status_code=400, response=response, status_message='The membership person was not updated. Check the field names and data types.')
if update_membership_person_obj_result:
if return_obj:
if load_membership_person_obj_result := load_membership_person_obj(
membership_person_id = membership_person_id,
enabled = enabled,
# inc_address = inc_address,
# inc_contact = inc_contact,
# inc_organization = inc_organization,
# inc_user = inc_user,
):
data = load_membership_person_obj_result
else:
data = False
return mk_resp(data=data, response=response, status_message='The membership person was probably updated, but there was a problem returning the data.')
else:
# membership_person_id_random = get_id_random(record_id=membership_person_id, table_name='membership_person')
data = {}
data['membership_person_id'] = membership_person_id
data['membership_person_id_random'] = membership_person_id_random
return mk_resp(data=data, response=response, status_message='The membership person was updated.')
else:
return mk_resp(data=False, status_code=400, response=response, status_message='The result from trying to update a membership person was unexpected.')
# ### BEGIN ### API Membership Person ### patch_membership_person_obj_update() ###
@router.get('/membership/person/list', response_model=Resp_Body_Base)
async def get_membership_person_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,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person'
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 Membership Person ### get_account_obj_membership_person_list() ###
# Working well as of 2021-06-24. Using as a template for other routes.
@router.get('/account/{account_id}/membership/person/list', response_model=Resp_Body_Base)
async def get_account_obj_membership_person_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_person: bool = False,
# inc_membership_person_list: bool = False,
inc_membership_person_profile: bool = False,
inc_membership_person_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,
response: Response = Response,
):
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_person_rec_list_result := get_membership_person_rec_list(
for_obj_type = 'account',
for_obj_id = account_id,
limit = limit,
enabled = enabled,
):
membership_person_result_list = []
for membership_person_rec in membership_person_rec_list_result:
if load_membership_person_result := load_membership_person_obj(
membership_person_id = membership_person_rec.get('membership_person_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_person_list = inc_membership_group_person_list,
# inc_membership_person = inc_membership_person,
# inc_membership_person_list = inc_membership_person_list,
inc_membership_person_profile = inc_membership_person_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_person_result_list.append(load_membership_person_result)
else:
membership_person_result_list.append(None)
response_data = membership_person_result_list
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Membership Person ### get_account_obj_membership_person_list() ###
# ### BEGIN ### API Membership Person ### get_person_obj_membership_person() ###
# Working well as of 2021-07-09. Using as a template for other routes.
@router.get('/person/{person_id}/membership/person', response_model=Resp_Body_Base)
async def get_person_obj_membership_person(
person_id: str = Query(..., min_length=11, 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,
inc_contact: bool = False,
inc_membership_cfg: bool = False,
# inc_membership_group: bool = False, # The primary membership group for a person
inc_membership_group_list: bool = False, # The list of all membership group options a person can select
inc_membership_group_person_list: bool = False,
inc_membership_person_profile: bool = False, # Profile?
inc_membership_person_profile_cust: bool = False, # Extended profile?
inc_membership_type: bool = False, # The primary membership type for a person
inc_membership_type_list: bool = False, # The list of all membership types a person is a part of
inc_membership_type_person: bool = False,
# inc_order: bool = False,
inc_organization: bool = False,
inc_product: bool = False, # The product the person actually purchased for a member_type or member_group
inc_product_list: bool = False, # The list of products that give access to a member_type or member_group
# 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 person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass
else: return mk_resp(data=None, status_code=404, response=response)
if membership_person_rec := sql_select(table_name='v_membership_person', field_name='person_id', field_value=person_id): pass
else: return mk_resp(data=None, status_code=404, response=response)
membership_person_id = membership_person_rec.get('membership_person_id', None)
log.debug(membership_person_id)
if membership_person_rec_result := load_membership_person_obj(
membership_person_id = membership_person_id,
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = True,
enabled = enabled,
inc_address = inc_address,
inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
# inc_membership_group = inc_membership_group, # The primary membership group, if there is one.
inc_membership_group_list = inc_membership_group_list, # All membership groups they are a part of.
inc_membership_group_person_list = inc_membership_group_person_list,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_person_profile_cust = inc_membership_person_profile_cust,
inc_membership_type = inc_membership_type, # The primary membership type, if there is one.
# inc_membership_type_list = inc_membership_type_list, # All the membership types they are a part of.
inc_membership_type_person = inc_membership_type_person,
# inc_membership_type_person_list = inc_membership_type_list,
# inc_person = inc_person,
inc_product = inc_product,
# inc_product_list = inc_product_list,
# inc_user = inc_user,
):
response_data = membership_person_rec_result
elif person_rec_result is None: # Empty dict or None
log.info('No results')
return mk_resp(data=False, status_code=404, response=response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data, response=response)
# ### END ### API Membership Person ### get_person_obj_membership_person() ###
# Look up is only for account, person, or user records
@router.get('/membership/person/lookup', response_model=Resp_Body_Base)
async def lookup_membership_person_obj(
for_obj_id: Union[int,str],
for_obj_type: str = Query(..., min_length=2, max_length=50),
x_account_id: str = Header(...),
inc_membership_cfg: bool = True,
inc_membership_person_profile: bool = True,
inc_membership_person_profile_cust: bool = True,
inc_person: bool = True,
inc_user: bool = True,
by_alias: bool = True,
exclude_unset: bool = True,
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person'
base_name = Membership_Person_Base
if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name=for_obj_type): pass
else: return mk_resp(data=False, status_code=404, response=response) # Not Found
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
data = {}
as_list = False
if for_obj_type == 'account' and for_obj_id:
data['account_id'] = for_obj_id
sql_where_for_obj_type = """`membership_person`.account_id = :account_id"""
sql_limit = ''
as_list = True
elif for_obj_type == 'person' and for_obj_id:
data['person_id'] = for_obj_id
sql_where_for_obj_type = """`membership_person`.person_id = :person_id"""
sql_limit = 'LIMIT 1'
elif for_obj_type == 'user' and for_obj_id:
data['user_id'] = for_obj_id
sql_where_for_obj_type = """`membership_person`.user_id = :user_id"""
sql_limit = 'LIMIT 1'
elif for_obj_type == 'membership_person' and for_obj_id:
data['membership_person_id'] = for_obj_id
sql_where_for_obj_type = """`membership_person`.id = :membership_person_id"""
sql_limit = 'LIMIT 1'
else:
log.debug(f'Object type={for_obj_type}; Object ID={for_obj_id}')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
sql = f"""
SELECT id AS 'membership_person_id', id_random AS 'membership_person_id_random'
FROM `membership_person` AS `membership_person`
WHERE {sql_where_for_obj_type}
{sql_limit}
"""
# This will return a list if selecting by account ID
membership_person_obj_result = sql_select(data=data, sql=sql, as_list=as_list)
if isinstance(membership_person_obj_result, dict):
membership_person_id = membership_person_obj_result.get('membership_person_id', None)
membership_person_obj = load_membership_person_obj(
membership_person_id = membership_person_id,
inc_membership_cfg = inc_membership_cfg,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_person_profile_cust = inc_membership_person_profile_cust,
inc_person = inc_person,
inc_user = inc_user,
).dict(by_alias=by_alias, exclude_unset=exclude_unset)
data = membership_person_obj
elif isinstance(membership_person_obj_result, list):
membership_person_obj_li = []
for membership_person_obj in membership_person_obj_result:
membership_person_id = membership_person_obj.get('membership_person_id', None)
membership_person_obj_li.append(
load_membership_person_obj(
membership_person_id = membership_person_id,
inc_membership_cfg = inc_membership_cfg,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_person_profile_cust = inc_membership_person_profile_cust,
inc_person = inc_person,
inc_user = inc_user,
).dict(by_alias=by_alias, exclude_unset=exclude_unset)
)
data = membership_person_obj_li
else:
log.debug(membership_person_obj_result)
return mk_resp(data=None, status_code=404) # Not Found
return mk_resp(data=data)
# ### BEGIN ### API Membership Person ### get_membership_person_obj() ###
# Working well as of 2021-06-24. Using as a template for other routes.
@router.get('/membership/person/{membership_person_id}', response_model=Resp_Body_Base)
async def get_membership_person_obj(
membership_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, # Per member
inc_contact: bool = False, # Per member
inc_membership_cfg: bool = False,
inc_membership_group_list: bool = False, # List of groups per member
inc_membership_person_profile: bool = False,
inc_membership_person_profile_cust: bool = False, # Extended profile?
inc_membership_type: bool = False,
inc_membership_type_person: bool = False,
# inc_order: bool = False,
inc_organization: bool = False,
inc_person: bool = False,
inc_product: bool = False, # Per member or group member belongs to
inc_product_list: bool = False,
inc_user: bool = False, # Per member
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 membership_person_id := redis_lookup_id_random(record_id_random=membership_person_id, table_name='membership_person'): pass
else: return mk_resp(data=None, status_code=404)
if membership_person_result := load_membership_person_obj(
membership_person_id = membership_person_id,
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_person_profile = inc_membership_person_profile,
inc_membership_person_profile_cust = inc_membership_person_profile_cust,
inc_membership_type = inc_membership_type, # The primary membership type, if there is one.
# inc_membership_type_list = inc_membership_type_list, # All the membership types they are a part of.
inc_membership_type_person = inc_membership_type_person,
# inc_membership_type_person_list = inc_membership_type_list,
# 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,
):
response_data = membership_person_result
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Membership Person ### get_membership_person_obj() ###
@router.delete('/membership/person/{obj_id}', response_model=Resp_Body_Base)
async def delete_membership_person_obj(
obj_id: str = Query(..., min_length=1, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result