From 3cfc8a69dc73f4108ddb45abd6b0c94c2a446fd6 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Tue, 4 Jan 2022 19:01:02 -0500 Subject: [PATCH] Work on membership related --- app/db_sql.py | 2 +- app/methods/membership_person_methods.py | 206 ++++++++++++++++-- app/methods/membership_type_person_methods.py | 54 +++-- app/routers/membership_person.py | 141 +++++++++++- 4 files changed, 364 insertions(+), 39 deletions(-) diff --git a/app/db_sql.py b/app/db_sql.py index 661cd7c..1dc60bc 100644 --- a/app/db_sql.py +++ b/app/db_sql.py @@ -179,7 +179,7 @@ def sql_update( rm_id_random: bool = False, id_random_length: None|int = None ): - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if sql: diff --git a/app/methods/membership_person_methods.py b/app/methods/membership_person_methods.py index 58cb2f7..77bff71 100644 --- a/app/methods/membership_person_methods.py +++ b/app/methods/membership_person_methods.py @@ -5,12 +5,13 @@ from typing import Dict, List, Optional, Set, Union from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator from app.lib_general import log, logging -from app.db_sql import redis_lookup_id_random, sql_insert_or_update, sql_select +from app.db_sql import redis_lookup_id_random, sql_insert, sql_insert_or_update, sql_select, sql_update from app.methods.membership_cfg_methods import load_membership_cfg_obj from app.methods.membership_group_methods import get_membership_group_rec_list, load_membership_group_obj from app.methods.membership_group_person_methods import get_membership_group_person_rec_list, load_membership_group_person_obj from app.methods.membership_person_profile_methods import get_membership_person_profile_rec_list, load_membership_person_profile_obj +from app.methods.membership_type_person_methods import create_membership_type_person_obj, update_membership_type_person_obj from app.methods.person_methods import load_person_obj from app.methods.product_methods import load_product_obj from app.methods.user_methods import load_user_obj @@ -381,12 +382,173 @@ def get_membership_person_rec_list( # ### END ### API Membership Person Methods ### get_membership_person_rec_list() ### +# ### BEGIN ### API Membership Person Methods ### create_membership_person_obj() ### +# Updated 2022-01-04 +def create_membership_person_obj( + account_id: int|str, + person_id: int|str, + membership_person_dict_obj: Membership_Person_Base|dict, + create_sub_obj: bool = False, + fail_any: bool = False, # Fail if any thing goes wrong for sub objects + return_outline: bool = False, + ) -> int|bool: + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + log.info('Checking requirements...') + if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass + else: + log.error('Missing or invalid Account ID passed. Failed requirement.') + log.info(f'Person ID: {account_id}') + if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass + else: + log.error('Missing or invalid Person ID passed. Failed requirement.') + log.info(f'Person ID: {person_id}') + + log.debug(type(membership_person_dict_obj)) + if isinstance(membership_person_dict_obj, dict): + try: + membership_person_obj = Membership_Person_Base(**membership_person_dict_obj) + log.debug(membership_person_obj) + except ValidationError as e: + log.error(e.json()) + return False + else: + membership_person_obj = membership_person_dict_obj # Assume it is an object model + + membership_person_dict = membership_person_dict_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'membership_cfg', 'membership_group', 'membership_group_list', 'membership_group_person_list', 'profile', 'membership_person_profile', 'membership_type', 'membership_type_list', 'membership_type_person', 'person', 'product', 'user', 'created_on', 'updated_on'}) + log.debug(membership_person_dict) + membership_person_dict['account_id'] = account_id + + if membership_person_dict_in_result := sql_insert(data=membership_person_dict, table_name='membership_person', rm_id_random=True, id_random_length=8): pass + else: + log.warning(f'Membership Person not created.') + log.debug(membership_person_dict_in_result) + return False + + membership_person_id = membership_person_dict_in_result + + membership_person_outline = {} + membership_person_outline['membership_person_id'] = membership_person_id + membership_person_outline['account_id'] = account_id + membership_person_outline['person_id'] = person_id + + membership_person_outline['membership_group_list'] = [] + membership_person_outline['membership_type'] = {} + membership_person_outline['membership_type_id'] = None + membership_person_outline['membership_person_profile'] = {} + membership_person_outline['membership_person_profile_id'] = None + + if return_outline: + log.debug(f'Returning the Membership Person Outline: {membership_person_outline}') + return membership_person_outline + else: + log.debug(f'Returning the Membership Person ID: {membership_person_id}') + return membership_person_id +# ### END ### API Membership Person Methods ### create_update_membership_person_obj() ### + + +# ### BEGIN ### API Membership Person Methods ### update_membership_person_obj() ### +# Updated 2022-01-04 +def update_membership_person_obj( + membership_person_id: int|str, + membership_person_dict_obj: Membership_Person_Base|dict, + create_sub_obj: bool = False, + fail_any: bool = False, # Fail if any thing goes wrong for sub objects + return_outline: bool = False, + ) -> int|bool: + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + log.info('Checking requirements...') + if membership_person_id := redis_lookup_id_random(record_id_random=membership_person_id, table_name='membership_person'): pass + else: + log.error('Membership Person ID passed but is invalid. Failed requirement.') + return False + + log.debug(type(membership_person_dict_obj)) + if isinstance(membership_person_dict_obj, dict): + try: + membership_person_obj = Membership_Person_Base(**membership_person_dict_obj) + # membership_person_obj.id = membership_person_id + log.debug(membership_person_obj) + except ValidationError as e: + log.error(e.json()) + return False + else: + membership_person_obj = membership_person_dict_obj # Assume it is an object model + + membership_person_dict = membership_person_dict_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'membership_cfg', 'membership_group', 'membership_group_list', 'membership_group_person_list', 'profile', 'membership_person_profile', 'membership_type', 'membership_type_list', 'membership_type_person', 'person', 'product', 'user', 'created_on', 'updated_on'}) + log.debug(membership_person_dict) + + if membership_person_dict_up_result := sql_update(data=membership_person_dict, table_name='membership_person', rm_id_random=True, id_random_length=8): pass + else: + log.warning(f'Membership Person not updated.') + log.debug(membership_person_dict_up_result) + return False + + membership_person_outline = {} + membership_person_outline['membership_person_id'] = membership_person_id + membership_person_outline['account_id'] = membership_person_obj.account_id_random + membership_person_outline['person_id'] = membership_person_obj.person_id_random + + membership_person_outline['membership_group_list'] = [] + membership_person_outline['membership_type'] = {} + membership_person_outline['membership_type_id'] = None + membership_person_outline['membership_person_profile'] = {} + membership_person_outline['membership_person_profile_id'] = None + + # NOTE: Use object model version because of better type checking and validations + if membership_person_obj.membership_type_person: + membership_person_outline['membership_type_person_id'] = None + membership_type_person_obj = membership_person_obj.membership_type_person + if membership_type_person_id := membership_person_obj.membership_type_person_id: pass + elif membership_type_person_id := membership_type_person_obj.id: pass + else: membership_type_person_id = None + + membership_type_person_obj.membership_type_id = 6 + + if membership_type_person_id: + update_membership_type_person_obj_result = update_membership_type_person_obj( + membership_type_person_dict_obj = membership_type_person_obj, + membership_type_person_id = membership_type_person_id, + fail_any = fail_any, + return_outline = return_outline, + ) + if update_membership_type_person_obj_result: + membership_person_outline['membership_type_person_id'] = membership_type_person_id + pass + else: + pass + else: + create_membership_type_person_obj_result = create_membership_type_person_obj( + membership_type_person_dict_obj = membership_type_person_obj, + membership_person_id = membership_person_id, + fail_any = fail_any, + return_outline = return_outline, + ) + if isinstance(create_membership_type_person_obj_result, int): + membership_type_person_id = create_membership_type_person_obj_result + membership_person_outline['membership_type_person_id'] = membership_type_person_id + else: + pass + + if return_outline: + log.debug(f'Returning the Membership Person Outline: {membership_person_outline}') + return membership_person_outline + else: + log.debug(f'Returning the Membership Person ID: {membership_person_id}') + return membership_person_id +# ### END ### API Membership Person Methods ### create_update_membership_person_obj() ### + + # ### BEGIN ### API Membership Person Methods ### create_update_membership_person_obj() ### # Updated 2021-08-25 def create_update_membership_person_obj( membership_person_dict_obj: Membership_Person_Base|dict, + person_id: int|str, + account_id: int|str = None, membership_person_id: int|str = None, - person_id: int|str = None, create_sub_obj: bool = False, fail_any: bool = False, # Fail if any thing goes wrong for sub objects return_outline: bool = False, @@ -403,32 +565,32 @@ def create_update_membership_person_obj( log.error('Membership Person ID passed but is invalid. Failed requirement.') return False - if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='event'): pass + if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass else: - log.error('Missing or invalid Event ID passed. Not required. Ignoring.') - log.info(f'Event ID: {person_id}') + log.error('Missing or invalid Person ID passed. Not required. Ignoring.') + log.info(f'Person ID: {person_id}') - log.info('Attempting to get Event ID from related object.') - from app.methods.event_methods import get_person_id_w_for_type_id - if person_id := get_person_id_w_for_type_id(for_type='event_session', for_id=event_session_id): pass - elif person_id := get_person_id_w_for_type_id(for_type='event_presentation', for_id=event_presentation_id): pass - elif person_id := get_person_id_w_for_type_id(for_type='membership_person', for_id=membership_person_id): pass - else: - log.error('Unable to get Event ID from related object.') - False + # log.info('Attempting to get Person ID from related object.') + # from app.methods.person_methods import get_person_id_w_for_type_id + # if person_id := get_person_id_w_for_type_id(for_type='person_session', for_id=person_session_id): pass + # elif person_id := get_person_id_w_for_type_id(for_type='person_presentation', for_id=person_presentation_id): pass + # elif person_id := get_person_id_w_for_type_id(for_type='membership_person', for_id=membership_person_id): pass + # else: + # log.error('Unable to get Person ID from related object.') + # False else: - log.info('No Membership Person ID passed. Create new Membership Person. Required: Account ID, Event ID') + log.info('No Membership Person ID passed. Create new Membership Person. Required: Account ID, Person ID') - if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='event'): pass + if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass else: - log.error('Missing or invalid Event ID passed. Failed requirement.') - log.info(f'Event ID: {person_id}') + log.error('Missing or invalid Person ID passed. Failed requirement.') + log.info(f'Person ID: {person_id}') - log.info('Attempting to get Event ID from related object.') - from app.methods.event_methods import get_person_id_w_for_type_id - if person_id := get_person_id_w_for_type_id(for_type='event_session', for_id=event_session_id): pass - elif person_id := get_person_id_w_for_type_id(for_type='event_presentation', for_id=event_presentation_id): pass + log.info('Attempting to get Person ID from related object.') + from app.methods.person_methods import get_person_id_w_for_type_id + if person_id := get_person_id_w_for_type_id(for_type='person_session', for_id=person_session_id): pass + elif person_id := get_person_id_w_for_type_id(for_type='person_presentation', for_id=person_presentation_id): pass else: - log.error('Unable to get Event ID from related object.') + log.error('Unable to get Person ID from related object.') False # ### END ### API Membership Person Methods ### create_update_membership_person_obj() ### diff --git a/app/methods/membership_type_person_methods.py b/app/methods/membership_type_person_methods.py index 923043f..be322cd 100644 --- a/app/methods/membership_type_person_methods.py +++ b/app/methods/membership_type_person_methods.py @@ -185,17 +185,35 @@ def get_membership_type_person_rec_list( # ### BEGIN ### API Membership Type Person Methods ### create_membership_type_person_obj() ### -def create_membership_type_person_obj(membership_type_person_obj_new:Membership_Type_Person_Base) -> bool|int: +def create_membership_type_person_obj( + membership_person_id: int|str, + membership_type_person_dict_obj: Membership_Type_Person_Base, + fail_any: bool = False, # Fail if any thing goes wrong for sub objects + return_outline: bool = False, + ) -> bool|int: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) - membership_type_person_obj_data = membership_type_person_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'created_on', 'updated_on'}) + log.info('Checking requirements...') + if membership_person_id := redis_lookup_id_random(record_id_random=membership_person_id, table_name='membership_person'): pass + else: + log.error('Missing or invalid Membership Person ID passed. Failed requirement.') + log.info(f'Membership Person ID: {membership_person_id}') + return False + + membership_type_person_obj = membership_type_person_dict_obj + + # Stuff goes here + + membership_type_person_obj_data = membership_type_person_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'created_on', 'updated_on'}) + + membership_type_person_obj_data['membership_person_id'] = membership_person_id if membership_type_person_obj_in_result := sql_insert( - data=membership_type_person_obj_data, - table_name='membership_type_person', - rm_id_random=True, - id_random_length=8 + data = membership_type_person_obj_data, + table_name = 'membership_type_person', + rm_id_random = True, + id_random_length = 8 ): pass else: return False @@ -211,8 +229,9 @@ def create_membership_type_person_obj(membership_type_person_obj_new:Membership_ # ### BEGIN ### API Membership Type Person Methods ### update_membership_type_person_obj() ### def update_membership_type_person_obj( membership_type_person_id: int|str, # This allows for updating of the id_random value. - membership_type_person_obj_up: Membership_Type_Person_Base, - create_sub_obj: bool = False, + membership_type_person_dict_obj: Membership_Type_Person_Base, + fail_any: bool = False, # Fail if any thing goes wrong for sub objects + return_outline: bool = False, ) -> bool: log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) @@ -220,16 +239,21 @@ def update_membership_type_person_obj( if membership_type_person_id := redis_lookup_id_random(record_id_random=membership_type_person_id, table_name='membership_type_person'): pass else: return False - membership_type_person_obj_up.id = membership_type_person_id + # Stuff goes here - log.debug(membership_type_person_obj_up) - log.debug(membership_type_person_obj_up.dict(by_alias=False, exclude_unset=True)) - # log.debug(membership_type_person_obj_up.dict(by_alias=False, exclude_unset=False)) + membership_type_person_dict_obj.id = membership_type_person_id - membership_type_person_dict_up = membership_type_person_obj_up.dict(by_alias=False, exclude_unset=True) - log.debug(membership_type_person_dict_up) - if membership_type_person_obj_up_result := sql_update(data=membership_type_person_dict_up, table_name='membership_type_person', rm_id_random=True): + membership_type_person_obj = membership_type_person_dict_obj + + log.debug(membership_type_person_obj) + log.debug(membership_type_person_obj.dict(by_alias=False, exclude_unset=True)) + # log.debug(membership_type_person_obj.dict(by_alias=False, exclude_unset=False)) + + membership_type_person_dict = membership_type_person_obj.dict(by_alias=False, exclude_unset=True) + log.debug(membership_type_person_dict) + + if membership_type_person_obj_up_result := sql_update(data=membership_type_person_dict, table_name='membership_type_person', rm_id_random=True): log.debug(membership_type_person_obj_up_result) return True else: diff --git a/app/routers/membership_person.py b/app/routers/membership_person.py index 498fc0d..9ec183f 100644 --- a/app/routers/membership_person.py +++ b/app/routers/membership_person.py @@ -9,7 +9,7 @@ from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, 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.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 @@ -42,6 +42,74 @@ async def post_membership_person_obj( 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), @@ -70,6 +138,77 @@ async def patch_membership_person_obj( 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),