diff --git a/app/db_sql.py b/app/db_sql.py index d866a72..ae62ffc 100644 --- a/app/db_sql.py +++ b/app/db_sql.py @@ -742,7 +742,7 @@ def redis_lookup_id_random(record_id_random:int|str, table_name:str): # ### BEGIN ### API Lib General ### lookup_id_random() ### def lookup_id_random(record_id:int, table_name:str): - #log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) data = { 'id': record_id } @@ -781,7 +781,7 @@ def lookup_id_random(record_id:int, table_name:str): # Remove the unneeded *_id_random key from the dict # This really needs to be simplified... Use a list of dicts instead. Can store as JSON in the DB. def lookup_id_random_pop(obj_data:dict): - #log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if 'account_id_random' in obj_data: diff --git a/app/methods/account_methods.py b/app/methods/account_methods.py index 2f723a4..863cd2d 100644 --- a/app/methods/account_methods.py +++ b/app/methods/account_methods.py @@ -14,6 +14,7 @@ from app.methods.contact_methods import get_contact_rec_list, load_contact_obj from app.methods.event_methods import get_event_rec_list, load_event_obj from app.methods.hosted_file_methods import get_hosted_file_rec_list, load_hosted_file_obj from app.methods.journal_methods import get_journal_rec_list, load_journal_obj +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_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 @@ -568,3 +569,269 @@ def load_account_obj( else: return account_obj # ### END ### API Account Methods ### load_account_obj() ### + + + +# ### BEGIN ### API Account Methods ### load_account_obj_membership_type() ### +# Working well as of 2021-06-11. Using as a template for other load objects. +def load_account_obj_membership_type( + account_id: int|str, + limit: int = 1000, + by_alias: bool = True, + exclude_unset: bool = True, + model_as_dict: bool = False, + enabled: str = 'enabled', # enabled, disabled, all + inc_account_cfg: bool = False, # Priority l1 + inc_address: bool = False, # Under contact + inc_contact: bool = False, + inc_membership_cfg: bool = False, + inc_membership_group_list: bool = False, # List of groups for the account + inc_membership_group_member_list: bool = False, # List of members of a group + inc_membership_member: bool = False, + inc_membership_member_list: bool = False, # Priority l1 + inc_membership_member_profile: bool = False, + inc_membership_type: bool = False, + inc_membership_type_list: bool = False, + inc_order: bool = False, + inc_order_cfg: bool = False, + inc_order_list: bool = False, # Priority l1 + inc_order_line_list: bool = False, # Priority l2 + inc_organization: bool = False, + inc_person: bool = False, + inc_product: bool = False, + inc_product_list: bool = False, # Priority l3 + inc_user: bool = False, + inc_user_list: bool = False, # Priority l2 + ) -> Account_Base|dict|bool: + 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 False + + if account_rec := sql_select(table_name='v_account', record_id=account_id): pass + else: return False + + #log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(account_rec) + + try: + account_obj = Account_Base(**account_rec) + log.debug(account_obj) + except ValidationError as e: + log.error(e.json()) + + if inc_account_cfg: + if account_cfg_dict := load_account_cfg_obj( + account_id = account_id, + model_as_dict = model_as_dict, + inc_membership_cfg = inc_membership_cfg, + ): + account_obj.account_cfg = account_cfg_dict + else: account_obj.account_cfg = None + + if inc_membership_cfg: + if membership_cfg_dict := load_membership_cfg_obj( + account_id = account_id, + model_as_dict = model_as_dict, + ): + account_obj.membership_cfg = membership_cfg_dict + else: account_obj.membership_cfg = None + + # Updated 2021-06-18 + 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: + membership_type_result_list.append( + 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_group_list = inc_membership_group_list, # per member + inc_membership_member_list = inc_membership_member_list, + inc_membership_member_profile = inc_membership_member_profile, + inc_product_list = inc_product_list, + inc_person = inc_person, + inc_user = inc_user, + ) + ) + account_obj.membership_type_list = membership_type_result_list + else: account_obj.membership_type_list = [] + + if model_as_dict: + return account_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member + else: + return account_obj +# ### END ### API Account Methods ### load_account_obj_membership_type() ### + + + + +# ### BEGIN ### API Account Methods ### load_account_obj_membership_group() ### +# Working well as of 2021-06-11. Using as a template for other load objects. +def load_account_obj_membership_group( + account_id: int|str, + limit: int = 1000, + by_alias: bool = True, + exclude_unset: bool = True, + model_as_dict: bool = False, + enabled: str = 'enabled', # enabled, disabled, all + inc_account_cfg: bool = False, # Priority l1 + inc_address: bool = False, # Under contact + inc_contact: bool = False, + inc_membership_cfg: bool = False, + # inc_membership_group_list: bool = False, # List of groups for the account + inc_membership_group_member_list: bool = False, # List of members of a group + inc_membership_member: bool = False, + # inc_membership_member_list: bool = False, # Priority l1 + inc_membership_member_profile: bool = False, + inc_membership_type: bool = False, + # inc_membership_type_list: bool = False, + # inc_order: bool = False, + # inc_order_cfg: bool = False, + # inc_order_list: bool = False, # Priority l1 + # inc_order_line_list: bool = False, # Priority l2 + inc_organization: bool = False, + inc_person: bool = False, + inc_product: bool = False, + inc_product_list: bool = False, # Priority l3 + inc_user: bool = False, + ) -> Account_Base|dict|bool: + 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 False + + if account_rec := sql_select(table_name='v_account', record_id=account_id): pass + else: return False + + #log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(account_rec) + + try: + account_obj = Account_Base(**account_rec) + log.debug(account_obj) + except ValidationError as e: + log.error(e.json()) + + if inc_account_cfg: + if account_cfg_dict := load_account_cfg_obj( + account_id = account_id, + model_as_dict = model_as_dict, + inc_membership_cfg = inc_membership_cfg, + ): + account_obj.account_cfg = account_cfg_dict + else: account_obj.account_cfg = None + + if inc_membership_cfg: + if membership_cfg_dict := load_membership_cfg_obj( + account_id = account_id, + model_as_dict = model_as_dict, + ): + account_obj.membership_cfg = membership_cfg_dict + else: account_obj.membership_cfg = None + + # Updated 2021-06-21 + if inc_membership_group_list: + 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: + membership_group_result_list.append( + load_membership_group_obj( + membership_group_id = membership_group_rec.get('membership_group_id', None), + limit = limit, + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = model_as_dict, + inc_address = inc_address, + inc_contact = inc_contact, + # inc_membership_member_list = inc_membership_member_list, + inc_membership_group_member_list = inc_membership_group_member_list, + inc_product_list = inc_product_list, + inc_person = inc_person, + inc_user = inc_user, + ) + ) + account_obj.membership_group_list = membership_group_result_list + else: account_obj.membership_group_list = [] + + # Updated 2021-06-21 + if inc_membership_member_list: + 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: + membership_member_result_list.append( + 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, + inc_address = inc_address, + inc_contact = inc_contact, + inc_membership_group_list = inc_membership_group_list, + inc_membership_member_profile = inc_membership_member_profile, + inc_membership_type = inc_membership_type, + inc_person = inc_person, + inc_user = inc_user, + ) + ) + account_obj.membership_member_list = membership_member_result_list + else: account_obj.membership_member_list = [] + + # Updated 2021-06-18 + if inc_membership_type_list: + 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: + membership_type_result_list.append( + 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_member_list = inc_membership_member_list, + # inc_membership_type_member_list = inc_membership_type_member_list, + inc_product_list = inc_product_list, + inc_person = inc_person, + inc_user = inc_user, + ) + ) + account_obj.membership_type_list = membership_type_result_list + else: account_obj.membership_type_list = [] + + if model_as_dict: + return account_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member + else: + return account_obj +# ### END ### API Account Methods ### load_account_obj_membership_group() ### diff --git a/app/methods/membership_cfg_methods.py b/app/methods/membership_cfg_methods.py index 1a882d2..74988d7 100644 --- a/app/methods/membership_cfg_methods.py +++ b/app/methods/membership_cfg_methods.py @@ -11,13 +11,14 @@ from app.models.membership_cfg_models import Membership_Cfg_Base # ### BEGIN ### API Membership Cfg Methods ### load_membership_cfg_obj() ### +# Updated 2021-06-23 def load_membership_cfg_obj( account_id: int|str, by_alias: bool = True, exclude_unset: bool = True, model_as_dict: bool = False, ) -> Membership_Cfg_Base|dict|bool: - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.DEBUG) # 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 diff --git a/app/methods/membership_group_member_methods.py b/app/methods/membership_group_member_methods.py index 13de374..8d5f36c 100644 --- a/app/methods/membership_group_member_methods.py +++ b/app/methods/membership_group_member_methods.py @@ -6,44 +6,30 @@ from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, v from app.db_sql import redis_lookup_id_random, sql_insert, sql_select, sql_update from app.lib_general import log, logging +# from app.methods.membership_member_methods import get_membership_member_rec_list, load_membership_member_obj from app.models.membership_group_member_models import Membership_Group_Member_Base -# ### BEGIN ### API Membership Group Member Methods ### create_membership_group_member_obj() ### -def create_membership_group_member_obj(membership_group_member_obj_new:Membership_Group_Member_Base) -> bool|int: - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL - log.debug(locals()) - - membership_group_member_obj_data = membership_group_member_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'created_on', 'updated_on'}) - - if membership_group_member_obj_in_result := sql_insert( - data=membership_group_member_obj_data, - table_name='membership_group_member', - rm_id_random=True, - id_random_length=8 - ): pass - else: return False - - log.debug(membership_group_member_obj_in_result) - - membership_group_member_id = membership_group_member_obj_in_result - - log.debug(f'New membership_group_member_id: {membership_group_member_id}') - return membership_group_member_id -# ### END ### API Membership Group Member Methods ### create_membership_group_member_obj() ### - - # ### BEGIN ### API Membership Group Member Methods ### load_membership_group_member_obj() ### def load_membership_group_member_obj( membership_group_member_id: int|str, - # limit: int = 1000, + limit: int = 1000, by_alias: bool = True, exclude_unset: bool = True, model_as_dict: bool = False, + enabled: str = 'enabled', # enabled, disabled, all + inc_address: bool = False, + inc_contact: bool = False, + inc_membership_group: bool = False, inc_membership_member: bool = False, + inc_membership_member_profile: bool = False, + inc_membership_type: bool = False, + inc_organization: bool = False, + inc_person: bool = False, + inc_user: bool = False, ) -> Membership_Group_Member_Base|bool: - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if membership_group_member_id := redis_lookup_id_random(record_id_random=membership_group_member_id, table_name='membership_group_member'): pass @@ -63,16 +49,27 @@ def load_membership_group_member_obj( # Updated 2021-06-21 if inc_membership_member: + from app.methods.membership_member_methods import load_membership_member_obj membership_member_id = membership_group_member_rec.get('membership_member_id', None) + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(membership_member_id) if membership_member_result := load_membership_member_obj( membership_member_id = membership_member_id, + 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_member_profile = inc_membership_member_profile, + inc_membership_type = inc_membership_type, + inc_organization = inc_organization, + inc_person = inc_person, + inc_user = inc_user, ): membership_group_member_obj.membership_member = membership_member_result - else: membership_group_member_obj.membership_group_member = None + else: membership_group_member_obj.membership_member = None log.debug(membership_member_result) if model_as_dict: @@ -82,36 +79,6 @@ def load_membership_group_member_obj( # ### END ### API Membership Group Member Methods ### load_membership_group_member_obj() ### -# ### BEGIN ### API Membership Group Member Methods ### update_membership_group_member_obj() ### -def update_membership_group_member_obj( - membership_group_member_id: int|str, # This allows for updating of the id_random value. - membership_group_member_obj_up: Membership_Group_Member_Base, - create_missing_obj: bool = False, - ) -> bool: - log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL - log.debug(locals()) - - if membership_group_member_id := redis_lookup_id_random(record_id_random=membership_group_member_id, table_name='membership_group_member'): pass - else: return False - - membership_group_member_obj_up.id = membership_group_member_id - - log.debug(membership_group_member_obj_up) - log.debug(membership_group_member_obj_up.dict(by_alias=False, exclude_unset=True)) - # log.debug(membership_group_member_obj_up.dict(by_alias=False, exclude_unset=False)) - - membership_group_member_dict_up = membership_group_member_obj_up.dict(by_alias=False, exclude_unset=True) - log.debug(membership_group_member_dict_up) - - if membership_group_member_obj_up_result := sql_update(data=membership_group_member_dict_up, table_name='membership_group_member', rm_id_random=True): - log.debug(membership_group_member_obj_up_result) - return True - else: - log.debug(membership_group_member_obj_up_result) - return False -# ### END ### API Membership Group Member Methods ### update_membership_group_member_obj() ### - - # ### BEGIN ### API Membership Group Member Methods ### get_membership_group_member_rec_list() ### def get_membership_group_member_rec_list( for_obj_type: str, @@ -154,7 +121,8 @@ def get_membership_group_member_rec_list( ORDER BY `tbl`.created_on DESC, `tbl`.updated_on DESC {sql_limit}; """ - + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(sql) if membership_group_member_rec_li_result := sql_select(data=data, sql=sql, as_list=True): membership_group_member_rec_li = membership_group_member_rec_li_result else: @@ -164,3 +132,57 @@ def get_membership_group_member_rec_list( return membership_group_member_rec_li # ### END ### API Membership Group Member Methods ### get_membership_group_member_rec_list() ### + + +# ### BEGIN ### API Membership Group Member Methods ### create_membership_group_member_obj() ### +def create_membership_group_member_obj(membership_group_member_obj_new:Membership_Group_Member_Base) -> bool|int: + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + membership_group_member_obj_data = membership_group_member_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'created_on', 'updated_on'}) + + if membership_group_member_obj_in_result := sql_insert( + data=membership_group_member_obj_data, + table_name='membership_group_member', + rm_id_random=True, + id_random_length=8 + ): pass + else: return False + + log.debug(membership_group_member_obj_in_result) + + membership_group_member_id = membership_group_member_obj_in_result + + log.debug(f'New membership_group_member_id: {membership_group_member_id}') + return membership_group_member_id +# ### END ### API Membership Group Member Methods ### create_membership_group_member_obj() ### + + +# ### BEGIN ### API Membership Group Member Methods ### update_membership_group_member_obj() ### +def update_membership_group_member_obj( + membership_group_member_id: int|str, # This allows for updating of the id_random value. + membership_group_member_obj_up: Membership_Group_Member_Base, + create_missing_obj: bool = False, + ) -> bool: + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if membership_group_member_id := redis_lookup_id_random(record_id_random=membership_group_member_id, table_name='membership_group_member'): pass + else: return False + + membership_group_member_obj_up.id = membership_group_member_id + + log.debug(membership_group_member_obj_up) + log.debug(membership_group_member_obj_up.dict(by_alias=False, exclude_unset=True)) + # log.debug(membership_group_member_obj_up.dict(by_alias=False, exclude_unset=False)) + + membership_group_member_dict_up = membership_group_member_obj_up.dict(by_alias=False, exclude_unset=True) + log.debug(membership_group_member_dict_up) + + if membership_group_member_obj_up_result := sql_update(data=membership_group_member_dict_up, table_name='membership_group_member', rm_id_random=True): + log.debug(membership_group_member_obj_up_result) + return True + else: + log.debug(membership_group_member_obj_up_result) + return False +# ### END ### API Membership Group Member Methods ### update_membership_group_member_obj() ### diff --git a/app/methods/membership_group_methods.py b/app/methods/membership_group_methods.py index 03604fe..73c9e27 100644 --- a/app/methods/membership_group_methods.py +++ b/app/methods/membership_group_methods.py @@ -7,33 +7,13 @@ from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, v from app.db_sql import redis_lookup_id_random, sql_insert, sql_select, sql_update from app.lib_general import log, logging +from app.methods.membership_cfg_methods import load_membership_cfg_obj +from app.methods.membership_group_member_methods import get_membership_group_member_rec_list, load_membership_group_member_obj +from app.methods.product_methods import get_product_rec_list, load_product_obj + from app.models.membership_group_models import Membership_Group_Base -# ### BEGIN ### API Membership Group Methods ### create_membership_group_obj() ### -def create_membership_group_obj(membership_group_obj_new:Membership_Group_Base) -> bool|int: - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL - log.debug(locals()) - - membership_group_obj_data = membership_group_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'created_on', 'updated_on'}) - - if membership_group_obj_in_result := sql_insert( - data=membership_group_obj_data, - table_name='membership_group', - rm_id_random=True, - id_random_length=8 - ): pass - else: return False - - log.debug(membership_group_obj_in_result) - - membership_group_id = membership_group_obj_in_result - - log.debug(f'New membership_group_id: {membership_group_id}') - return membership_group_id -# ### END ### API Membership Group Methods ### create_membership_group_obj() ### - - # ### BEGIN ### API Membership Group Methods ### load_membership_group_obj() ### def load_membership_group_obj( membership_group_id: int|str, @@ -46,6 +26,7 @@ def load_membership_group_obj( inc_contact: bool = False, inc_membership_cfg: bool = False, inc_membership_group_member_list: bool = False, + inc_membership_member: bool = False, inc_membership_member_profile: bool = False, # under membership_member inc_membership_type_list: bool = False, # ??? # inc_parent_membership_group: bool = False, @@ -53,7 +34,7 @@ def load_membership_group_obj( inc_product_list: bool = False, inc_user: bool = False, ) -> Membership_Group_Base|bool: - log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if membership_group_id := redis_lookup_id_random(record_id_random=membership_group_id, table_name='membership_group'): pass @@ -71,19 +52,20 @@ def load_membership_group_obj( except ValidationError as e: log.error(e.json()) - # Updated 2021-06-18 + # Updated 2021-06-23 if inc_membership_cfg: - membership_cfg_result = load_membership_cfg_obj( + if membership_cfg_obj_result := load_membership_cfg_obj( account_id = membership_group_rec.get('account_id', None), by_alias = by_alias, exclude_unset = exclude_unset, model_as_dict = model_as_dict, - ) - membership_group_rec['cfg'] = membership_cfg_result + ): + membership_group_obj.cfg = membership_cfg_obj_result + else: membership_group_obj.cfg = None - - # Updated 2021-06-18 + # Updated 2021-06-23 if inc_membership_group_member_list: + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL if membership_group_member_rec_list_result := get_membership_group_member_rec_list( for_obj_type = 'membership_group', for_obj_id = membership_group_id, @@ -92,24 +74,26 @@ def load_membership_group_obj( ): membership_group_member_result_list = [] for membership_group_member_rec in membership_group_member_rec_list_result: - membership_group_member_result_list.append( - load_membership_group_member_obj( + if load_membership_group_member_result := load_membership_group_member_obj( membership_group_member_id = membership_group_member_rec.get('membership_group_member_id', None), limit = limit, by_alias = by_alias, exclude_unset = exclude_unset, model_as_dict = model_as_dict, enabled = enabled, + inc_membership_member = inc_membership_member, # inc_membership_group_list = inc_membership_group_list, # inc_membership_group_member_profile = inc_membership_group_member_profile, # inc_organization = inc_organization, inc_person = inc_person, # inc_product = inc_product, inc_user = inc_user, - ) - ) - membership_type_obj.membership_group_member_list = membership_group_member_result_list - else: membership_type_obj.membership_group_member_list = [] + ): + membership_group_member_result_list.append(load_membership_group_member_result) + else: + membership_group_member_result_list.append(None) + membership_group_obj.membership_group_member_list = membership_group_member_result_list + else: membership_group_obj.membership_group_member_list = [] # Updated 2021-06-18 # if inc_parent_membership_group: @@ -125,7 +109,7 @@ def load_membership_group_obj( # else: membership_group_obj.parent_membership_group = None # log.debug(parent_membership_group_result) - # Updated 2021-06-18 + # Updated 2021-06-23 if inc_product_list: if product_rec_list_result := get_product_rec_list( for_obj_type = 'membership_group', @@ -153,6 +137,176 @@ def load_membership_group_obj( # ### END ### API Membership Group Methods ### load_membership_group_obj() ### +# ### BEGIN ### API Membership Group Methods ### get_membership_group_rec_list() ### +def get_membership_group_rec_list( + for_obj_type: str, + for_obj_id: str, + limit: int = 1000, + enabled: str = 'enabled', # enabled, disabled, all + ) -> list|bool: + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name='for_obj_type'): pass + else: return False + data = {} + data[f'{for_obj_type}_id'] = for_obj_id + # data['for_obj_type'] = for_obj_type + if for_obj_type == 'account': + sql_obj_type_id = f'`tbl`.{for_obj_type}_id = :{for_obj_type}_id' + + if enabled in ['enabled', 'disabled', 'all']: + if enabled == 'enabled': + data['enable'] = True + sql_enabled = f'AND `tbl`.enable = :enable' + elif enabled == 'disabled': + data['enable'] = False + sql_enabled = f'AND `tbl`.enable = :enable' + elif enabled == 'all': + sql_enabled = '' + + if limit: + data['limit'] = limit + sql_limit = f'LIMIT :limit' + else: + sql_limit = '' + + sql = f""" + SELECT `tbl`.id AS 'membership_group_id', `tbl`.id_random AS 'membership_group_id_random' + FROM `membership_group` AS `tbl` + WHERE + {sql_obj_type_id} + {sql_enabled} + ORDER BY `tbl`.created_on DESC, `tbl`.updated_on DESC + {sql_limit}; + """ + elif for_obj_type == 'membership_member': + sql_obj_type_id = f'`membership_group_member`.{for_obj_type}_id = :{for_obj_type}_id' + + if enabled in ['enabled', 'disabled', 'all']: + if enabled == 'enabled': + data['enable'] = True + sql_enabled = f'AND `membership_group_member`.enable = :enable' + elif enabled == 'disabled': + data['enable'] = False + sql_enabled = f'AND `membership_group_member`.enable = :enable' + elif enabled == 'all': + sql_enabled = '' + + if limit: + data['limit'] = limit + sql_limit = f'LIMIT :limit' + else: + sql_limit = '' + + sql = f""" + SELECT `membership_group_member`.id AS 'membership_group_id', `membership_group_member`.id_random AS 'membership_group_id_random' + FROM `membership_group_member` + INNER JOIN membership_group ON membership_group_member.membership_group_id = membership_group.id + WHERE + {sql_obj_type_id} + {sql_enabled} + + ORDER BY `membership_group_member`.created_on DESC, `membership_group_member`.updated_on DESC + {sql_limit}; + """ + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(sql) + if membership_group_rec_li_result := sql_select(data=data, sql=sql, as_list=True): + membership_group_rec_li = membership_group_rec_li_result + else: + membership_group_rec_li = [] + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(membership_group_rec_li_result) + + return membership_group_rec_li +# ### END ### API Membership Group Methods ### get_membership_group_rec_list() ### + +# ### BEGIN ### API Membership Group Methods ### load_membership_group_obj() ### +# def load_membership_group_list( +# for_obj_type: str, +# for_obj_id: str, +# limit: int = 1000, +# by_alias: bool = True, +# exclude_unset: bool = True, +# model_as_dict: bool = False, +# enabled: str = 'enabled', # enabled, disabled, all +# inc_address: bool = False, +# inc_contact: bool = False, +# inc_membership_cfg: bool = False, +# inc_membership_group_member_list: bool = False, +# inc_membership_member: bool = False, +# inc_membership_member_profile: bool = False, # under membership_member +# inc_membership_type: bool = False, # ??? +# # inc_parent_membership_group: bool = False, +# inc_organization: bool = False, +# inc_person: bool = False, +# inc_product_list: bool = False, +# inc_user: bool = False, +# ) -> Membership_Group_Base|bool: +# log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL +# log.debug(locals()) + +# if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name='for_obj_type'): pass +# else: return False + +# if membership_group_rec_list_result := get_membership_group_rec_list( +# for_obj_type = for_obj_type, +# for_obj_id = for_obj_id, +# limit = limit, +# enabled = enabled, +# ): +# membership_group_result_list = [] +# for membership_group_rec in membership_group_rec_list_result: +# membership_group_result_list.append( +# load_membership_group_obj( +# membership_group_id = membership_group_rec.get('membership_group_id', None), +# limit = limit, +# by_alias = by_alias, +# exclude_unset = exclude_unset, +# model_as_dict = model_as_dict, +# inc_address = inc_address, +# inc_contact = inc_contact, +# inc_membership_group_member_list = inc_membership_group_member_list, # List of members associated with a group +# inc_membership_member = inc_membership_member, +# inc_membership_member_profile = inc_membership_member_profile, +# inc_membership_type = inc_membership_type, +# inc_organization = inc_organization, +# inc_person = inc_person, +# inc_product_list = inc_product_list, # List of products that are linked to a membership group +# inc_user = inc_user, +# ) +# ) +# account_obj.membership_group_list = membership_group_result_list +# else: account_obj.membership_group_list = [] + + + + +# ### BEGIN ### API Membership Group Methods ### create_membership_group_obj() ### +def create_membership_group_obj(membership_group_obj_new:Membership_Group_Base) -> bool|int: + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + membership_group_obj_data = membership_group_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'created_on', 'updated_on'}) + + if membership_group_obj_in_result := sql_insert( + data=membership_group_obj_data, + table_name='membership_group', + rm_id_random=True, + id_random_length=8 + ): pass + else: return False + + log.debug(membership_group_obj_in_result) + + membership_group_id = membership_group_obj_in_result + + log.debug(f'New membership_group_id: {membership_group_id}') + return membership_group_id +# ### END ### API Membership Group Methods ### create_membership_group_obj() ### + + # ### BEGIN ### API Membership Group Methods ### update_membership_group_obj() ### def update_membership_group_obj( membership_group_id: int|str, # This allows for updating of the id_random value. @@ -180,58 +334,4 @@ def update_membership_group_obj( else: log.debug(membership_group_obj_up_result) return False -# ### END ### API Membership Group Methods ### update_membership_group_obj() ### - - -# ### BEGIN ### API Membership Group Methods ### get_membership_group_rec_list() ### -def get_membership_group_rec_list( - for_obj_type: str, - for_obj_id: str, - limit: int = 1000, - enabled: str = 'enabled', # enabled, disabled, all - ) -> list|bool: - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL - log.debug(locals()) - - if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name='for_obj_type'): pass - else: return False - data = {} - data[f'{for_obj_type}_id'] = for_obj_id - # data['for_obj_type'] = for_obj_type - sql_obj_type_id = f'`tbl`.{for_obj_type}_id = :{for_obj_type}_id' - - if enabled in ['enabled', 'disabled', 'all']: - if enabled == 'enabled': - data['enable'] = True - sql_enabled = f'AND `tbl`.enable = :enable' - elif enabled == 'disabled': - data['enable'] = False - sql_enabled = f'AND `tbl`.enable = :enable' - elif enabled == 'all': - sql_enabled = '' - - if limit: - data['limit'] = limit - sql_limit = f'LIMIT :limit' - else: - sql_limit = '' - - sql = f""" - SELECT `tbl`.id AS 'membership_group_id', `tbl`.id_random AS 'membership_group_id_random' - FROM `membership_group` AS `tbl` - WHERE - {sql_obj_type_id} - {sql_enabled} - ORDER BY `tbl`.created_on DESC, `tbl`.updated_on DESC - {sql_limit}; - """ - - if membership_group_rec_li_result := sql_select(data=data, sql=sql, as_list=True): - membership_group_rec_li = membership_group_rec_li_result - else: - membership_group_rec_li = [] - log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL - log.debug(membership_group_rec_li_result) - - return membership_group_rec_li -# ### END ### API Membership Group Methods ### get_membership_group_rec_list() ### +# ### END ### API Membership Group Methods ### update_membership_group_obj() ### \ No newline at end of file diff --git a/app/methods/membership_member_methods.py b/app/methods/membership_member_methods.py index d526b08..57c09b1 100644 --- a/app/methods/membership_member_methods.py +++ b/app/methods/membership_member_methods.py @@ -7,6 +7,7 @@ from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, v from app.lib_general import log, logging from app.db_sql import redis_lookup_id_random, sql_insert_or_update, sql_select +from app.methods.membership_group_member_methods import get_membership_group_member_rec_list, load_membership_group_member_obj from app.methods.membership_group_methods import get_membership_group_rec_list, load_membership_group_obj from app.methods.membership_member_profile_methods import get_membership_member_profile_rec_list, load_membership_member_profile_obj from app.methods.person_methods import load_person_obj @@ -205,7 +206,7 @@ def load_membership_member_obj( enabled = enabled, ): membership_group_result_list = [] - for membership_group_rec in membership_group_rec_list_result: + for membership_group_rec in membership_group_result_list: membership_group_result_list.append( load_membership_group_obj( membership_group_id = membership_group_rec.get('membership_group_id', None), diff --git a/app/methods/product_methods.py b/app/methods/product_methods.py index e67c31a..b660b81 100644 --- a/app/methods/product_methods.py +++ b/app/methods/product_methods.py @@ -41,6 +41,7 @@ def load_product_obj( # ### BEGIN ### API Product Methods ### get_product_rec_list() ### +# Updated 2021-06-23 def get_product_rec_list( for_obj_type: str, for_obj_id: str, @@ -52,36 +53,69 @@ def get_product_rec_list( if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name='for_obj_type'): pass else: return False + data = {} - data[f'{for_obj_type}_id'] = for_obj_id - # data['for_obj_type'] = for_obj_type - sql_obj_type_id = f'`tbl`.{for_obj_type}_id = :{for_obj_type}_id' + if for_obj_type == 'account': + sql_obj_type_id = f'`tbl`.{for_obj_type}_id = :{for_obj_type}_id' - if enabled in ['enabled', 'disabled', 'all']: - if enabled == 'enabled': - data['enable'] = True - sql_enabled = f'AND `tbl`.enable = :enable' - elif enabled == 'disabled': - data['enable'] = False - sql_enabled = f'AND `tbl`.enable = :enable' - elif enabled == 'all': - sql_enabled = '' + if enabled in ['enabled', 'disabled', 'all']: + if enabled == 'enabled': + data['enable'] = True + sql_enabled = f'AND `tbl`.enable = :enable' + elif enabled == 'disabled': + data['enable'] = False + sql_enabled = f'AND `tbl`.enable = :enable' + elif enabled == 'all': + sql_enabled = '' - if limit: - data['limit'] = limit - sql_limit = f'LIMIT :limit' - else: - sql_limit = '' + if limit: + data['limit'] = limit + sql_limit = f'LIMIT :limit' + else: + sql_limit = '' - sql = f""" - SELECT `tbl`.id AS 'product_id', `tbl`.id_random AS 'product_id_random' - FROM `product` AS `tbl` - WHERE - {sql_obj_type_id} - {sql_enabled} - ORDER BY `tbl`.created_on DESC, `tbl`.updated_on DESC - {sql_limit}; - """ + sql = f""" + SELECT `tbl`.id AS 'product_id', `tbl`.id_random AS 'product_id_random' + FROM `product` AS `tbl` + WHERE + {sql_obj_type_id} + {sql_enabled} + ORDER BY `tbl`.created_on DESC, `tbl`.updated_on DESC + {sql_limit}; + """ + else: # event_exhibit, event_registration, fundraising, membership_group, membership_type + data['for_obj_type'] = for_obj_type + data['for_obj_id'] = for_obj_id + + sql_obj_type_id = f'`tbl`.for_type = :for_obj_type AND `tbl`.for_id = :for_obj_id' + + if enabled in ['enabled', 'disabled', 'all']: + if enabled == 'enabled': + data['enable'] = True + sql_enabled = f'AND `tbl`.enable = :enable' + elif enabled == 'disabled': + data['enable'] = False + sql_enabled = f'AND `tbl`.enable = :enable' + elif enabled == 'all': + sql_enabled = '' + + if limit: + data['limit'] = limit + sql_limit = f'LIMIT :limit' + else: + sql_limit = '' + + sql = f""" + SELECT `tbl`.id AS 'product_id', `tbl`.id_random AS 'product_id_random' + FROM `product` AS `tbl` + WHERE + {sql_obj_type_id} + {sql_enabled} + ORDER BY `tbl`.created_on DESC, `tbl`.updated_on DESC + {sql_limit}; + """ + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(sql) if product_rec_li_result := sql_select(data=data, sql=sql, as_list=True): product_rec_li = product_rec_li_result diff --git a/app/models/response_models.py b/app/models/response_models.py index 182dcb7..1f7232f 100644 --- a/app/models/response_models.py +++ b/app/models/response_models.py @@ -48,6 +48,7 @@ def mk_resp( elif data == False: data_out = { 'result': data } elif data == True: data_out = { 'result': data } elif isinstance(data, dict): data_out = data + elif isinstance(data, list): data_out = data else: # Assuming it is still and object. This should be improved. Example model type: "" data_out = data.dict(by_alias=by_alias, exclude_unset=exclude_unset) log.debug(data_out) diff --git a/app/routers/account.py b/app/routers/account.py index 4249d7d..e2f501a 100644 --- a/app/routers/account.py +++ b/app/routers/account.py @@ -9,8 +9,9 @@ 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.account_methods import load_account_obj +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.models.account_models import Account_Base from app.models.response_models import Resp_Body_Base, mk_resp @@ -272,9 +273,30 @@ async def get_account_obj_new( # ### END ### API Account ### get_account_obj_new() ### -@router.get('/{obj_id}', response_model=Resp_Body_Base) -async def get_account_obj( - obj_id: str = Query(..., min_length=1, max_length=22), +# ### BEGIN ### API Account ### get_account_obj_membership() ### +# Working well as of 2021-06-23. Using as a template for other routes. +@router.get('/{account_id}/membership', response_model=Resp_Body_Base) +async def get_account_obj_membership( + 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, @@ -282,14 +304,161 @@ async def get_account_obj( log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) - obj_type = 'account' - result = get_obj_template( - obj_type=obj_type, - obj_id=obj_id, - by_alias=True, - exclude_unset=True, - ) - return result + 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_membership_type( + 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_contact = inc_contact, + 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_organization = inc_organization, + inc_person = inc_person, + inc_product = inc_product, + inc_product_list = inc_product_list, + inc_user = inc_user, + ): + 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 + log.info('Result is probably an object model') + response_data = account_result + log.debug(response_data) + else: + return mk_resp(data=False, status_code=400) # Bad Request + + return mk_resp(data=response_data) +# ### END ### API Account ### get_account_obj_membership() ### + + +# ### BEGIN ### API Account ### get_account_obj_membership() ### +# 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 + + # if account_result := load_membership_group_list( + # 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_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 = inc_membership_type, + # # inc_membership_type_list = inc_membership_type_list, + # # inc_order = inc_order, + # # inc_order_list = inc_order_list, + # inc_organization = inc_organization, + # inc_person = inc_person, + # # inc_product = inc_product, + # inc_product_list = inc_product_list, + # inc_user = inc_user, + # ): + # 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 + # log.info('Result is probably an object model') + # response_data = account_result + # log.debug(response_data) + else: + return mk_resp(data=False, status_code=400) # Bad Request + + return mk_resp(data=response_data) +# ### END ### API Account ### get_account_obj_membership() ### + + @router.delete('/{obj_id}', response_model=Resp_Body_Base)