Files
OSIT-AE-API-FastAPI/app/routers/membership_person.py
2021-08-10 18:30:37 -04:00

420 lines
19 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 get_membership_person_rec_list, load_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
@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
@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) # 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=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
from_datetime: datetime.datetime = None,
to_datetime: datetime.datetime = None,
inc_address: bool = False,
inc_contact: bool = False,
inc_membership_cfg: bool = False,
# inc_membership_group: bool = False, # The primary membership group
inc_membership_group_list: bool = False, # The list of all membership groups a person is a part of
inc_membership_group_person_list: bool = False,
# inc_membership_person: bool = False, # Priority l2
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
# 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.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)
if membership_person_rec := sql_select(table_name='v_membership_person', field_name='person_id', field_value=person_id): pass
else: return False
membership_person_id = membership_person_rec.get('membership_person_id', None)
log.debug(membership_person_id)
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 = 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_result
else: return mk_resp(data=False, status_code=400) # Bad Request
return mk_resp(data=response_data)
# ### 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) # 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) # 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