From 728682a07f10d17fbfedb4e92f9d39fc8597536f Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Mon, 21 Jun 2021 17:53:04 -0400 Subject: [PATCH] Working on membership module routes, methods, and models --- app/main.py | 21 +- app/methods/account_methods.py | 85 +++++- .../membership_group_member_methods.py | 166 ++++++++++++ app/methods/membership_group_methods.py | 76 ++++-- app/methods/membership_member_methods.py | 43 ++- ...y => membership_member_profile_methods.py} | 50 ++-- ..._methods.py => membership_type_methods.py} | 85 +++--- app/models/account_cfg_models.py | 2 +- app/models/account_models.py | 5 +- app/models/common_field_schema.py | 6 +- app/models/membership_cfg_models.py | 6 +- app/models/membership_group_member_models.py | 87 ++++++ app/models/membership_group_models.py | 33 ++- app/models/membership_member_models.py | 37 +-- ...py => membership_member_profile_models.py} | 38 +-- ...ip_models.py => membership_type_models.py} | 20 +- app/routers/account.py | 14 +- app/routers/api_crud.py | 16 +- app/routers/membership_group.py | 251 ++++++++++++++++++ app/routers/membership_member.py | 251 ++++++++++++++++++ .../{membership.py => membership_type.py} | 157 +++++------ app/routers/product.py | 2 +- 22 files changed, 1184 insertions(+), 267 deletions(-) create mode 100644 app/methods/membership_group_member_methods.py rename app/methods/{membership_profile_methods.py => membership_member_profile_methods.py} (53%) rename app/methods/{membership_methods.py => membership_type_methods.py} (63%) create mode 100644 app/models/membership_group_member_models.py rename app/models/{membership_profile_models.py => membership_member_profile_models.py} (71%) rename app/models/{membership_models.py => membership_type_models.py} (88%) create mode 100644 app/routers/membership_group.py create mode 100644 app/routers/membership_member.py rename app/routers/{membership.py => membership_type.py} (61%) diff --git a/app/main.py b/app/main.py index 9cc5aab..0f2e268 100644 --- a/app/main.py +++ b/app/main.py @@ -18,7 +18,7 @@ from app.lib_general import * from app.log import log # Import the routers here first: -from app.routers import api_crud, api, account, address, archive, archive_content, contact, event, event_exhibit, event_file, event_person, event_person_detail, event_presentation, event_presenter, event_registration, event_session, flask_cfg, hosted_file, journal, journal_entry, lookup, membership, order, order_cart, organization, page, person, post, post_comment, product, site, site_domain, user, user_person, websockets # , items, journals +from app.routers import api_crud, api, account, address, archive, archive_content, contact, event, event_exhibit, event_file, event_person, event_person_detail, event_presentation, event_presenter, event_registration, event_session, flask_cfg, hosted_file, journal, journal_entry, lookup, membership_type, order, order_cart, organization, page, person, post, post_comment, product, site, site_domain, user, user_person, websockets # , items, journals from app.db_sql import db @@ -219,13 +219,20 @@ app.include_router( prefix='/lu', tags=['Lookup'], ) +# app.include_router( +# membership_group.router, +# prefix='/membership/group', +# tags=['Membership Group'], +# ) +# app.include_router( +# membership_member.router, +# prefix='/membership/member', +# tags=['Membership Member'], +# ) app.include_router( - membership.router, - prefix='/membership', - tags=['Membership'], - #dependencies=[Depends(get_token_header)], - #dependencies=[Depends(get_account_header)], - #responses={404: {'description': 'Not found'}}, + membership_type.router, + prefix='/membership/type', + tags=['Membership Type'], ) app.include_router( order.router, diff --git a/app/methods/account_methods.py b/app/methods/account_methods.py index 9414897..6b486f4 100644 --- a/app/methods/account_methods.py +++ b/app/methods/account_methods.py @@ -14,7 +14,9 @@ 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_methods import get_membership_rec_list, load_membership_obj +from app.methods.membership_group_methods import get_membership_group_rec_list, load_membership_group_obj +from app.methods.membership_member_methods import get_membership_member_rec_list, load_membership_member_obj +from app.methods.membership_type_methods import get_membership_type_rec_list, load_membership_type_obj from app.methods.order_methods import get_order_rec_list, load_order_obj # from app.methods.order_cart_methods import get_order_cart_rec_list, load_order_cart_obj from app.methods.organization_methods import get_organization_rec_list, load_organization_obj @@ -81,11 +83,13 @@ def load_account_obj( inc_hosted_file_link_list: bool = False, inc_journal_list: bool = False, # Priority l3 inc_journal_entry_list: bool = False, # Priority l3 - # inc_membership: bool = False, inc_membership_cfg: bool = False, - inc_membership_list: bool = False, + inc_membership_group_list: bool = False, 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 @@ -293,29 +297,84 @@ def load_account_obj( account_obj.journal_list = journal_dict_list else: account_obj.journal_list = [] - # Updated 2021-06-18 - if inc_membership_list: - if membership_rec_list_result := get_membership_rec_list( + # 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_result_list = [] - for membership_rec in membership_rec_list_result: - membership_result_list.append( - load_membership_obj( - membership_id = membership_rec.get('membership_id', None), + 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_membership_member_list = inc_membership_member_list, + # inc_membership_group_member_list = inc_membership_group_member_list, inc_product_list = inc_product_list, ) ) - account_obj.membership_list = membership_result_list - else: account_obj.membership_list = [] + 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_membership_group_list = inc_membership_group_list, + inc_membership_member_profile = inc_membership_member_profile, + # inc_membership_member_list = inc_membership_member_list, + # inc_membership_member_list = inc_membership_member_list, + # inc_product_list = inc_product_list, + 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, + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = model_as_dict, + inc_membership_member_list = inc_membership_member_list, + # inc_membership_type_member_list = inc_membership_type_member_list, + inc_product_list = inc_product_list, + ) + ) + account_obj.membership_type_list = membership_type_result_list + else: account_obj.membership_type_list = [] # Updated 2021-06-17 if inc_order_list: diff --git a/app/methods/membership_group_member_methods.py b/app/methods/membership_group_member_methods.py new file mode 100644 index 0000000..13de374 --- /dev/null +++ b/app/methods/membership_group_member_methods.py @@ -0,0 +1,166 @@ +from __future__ import annotations +import datetime + +from typing import Dict, List, Optional, Set, Union +from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator + +from app.db_sql import redis_lookup_id_random, sql_insert, sql_select, sql_update +from app.lib_general import log, logging + +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, + by_alias: bool = True, + exclude_unset: bool = True, + model_as_dict: bool = False, + inc_membership_member: bool = False, + ) -> Membership_Group_Member_Base|bool: + log.setLevel(logging.WARNING) # 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 + log.debug(membership_group_member_id) + + if membership_group_member_rec := sql_select(table_name='v_membership_group_member', record_id=membership_group_member_id): + log.debug(membership_group_member_rec) + else: return False + log.debug(membership_group_member_rec) + + try: + membership_group_member_obj = Membership_Group_Member_Base(**membership_group_member_rec) + log.debug(membership_group_member_obj) + except ValidationError as e: + log.error(e.json()) + + # Updated 2021-06-21 + if inc_membership_member: + membership_member_id = membership_group_member_rec.get('membership_member_id', None) + log.debug(membership_member_id) + if membership_member_result := load_membership_member_obj( + membership_member_id = membership_member_id, + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = model_as_dict, + ): + membership_group_member_obj.membership_member = membership_member_result + else: membership_group_member_obj.membership_group_member = None + log.debug(membership_member_result) + + if model_as_dict: + return membership_group_member_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member + else: + return 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, + 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_member_id', `tbl`.id_random AS 'membership_group_member_id_random' + FROM `membership_group_member` AS `tbl` + WHERE + {sql_obj_type_id} + {sql_enabled} + ORDER BY `tbl`.created_on DESC, `tbl`.updated_on DESC + {sql_limit}; + """ + + 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: + membership_group_member_rec_li = [] + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(membership_group_member_rec_li_result) + + return membership_group_member_rec_li +# ### END ### API Membership Group Member Methods ### get_membership_group_member_rec_list() ### diff --git a/app/methods/membership_group_methods.py b/app/methods/membership_group_methods.py index e902df9..c55e595 100644 --- a/app/methods/membership_group_methods.py +++ b/app/methods/membership_group_methods.py @@ -37,14 +37,23 @@ def create_membership_group_obj(membership_group_obj_new:Membership_Group_Base) # ### BEGIN ### API Membership Group Methods ### load_membership_group_obj() ### def load_membership_group_obj( membership_group_id: int|str, - # limit: int = 1000, + limit: int = 1000, by_alias: bool = True, exclude_unset: bool = True, model_as_dict: bool = False, - inc_membership: bool = False, - inc_parent_membership_group: bool = False, + enabled: str = 'enabled', # enabled, disabled, all + inc_address: bool = False, + inc_contact: bool = False, + inc_membership_cfg: bool = False, + inc_membership_member_list: bool = False, + inc_membership_member_profile: bool = False, # under membership_member + inc_membership_type_list: bool = False, # ??? + # inc_parent_membership_group: bool = False, + inc_person: bool = False, + inc_product_list: bool = False, + inc_user: bool = False, ) -> Membership_Group_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_id := redis_lookup_id_random(record_id_random=membership_group_id, table_name='membership_group'): pass @@ -63,18 +72,49 @@ def load_membership_group_obj( log.error(e.json()) # Updated 2021-06-18 - if inc_parent_membership_group: - membership_group_id = membership_group_rec.get('membership_group_id', None) - log.debug(membership_group_id) - if membership_group_result := load_membership_group_obj( - membership_group_id = membership_group_id, - by_alias = by_alias, - exclude_unset = exclude_unset, - model_as_dict = model_as_dict, + if inc_membership_cfg: + membership_cfg_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 + + # Updated 2021-06-18 + # if inc_parent_membership_group: + # parent_membership_group_id = membership_group_rec.get('parent_membership_group_id', None) + # log.debug(parent_membership_group_id) + # if parent_membership_group_result := load_membership_group_obj( + # membership_group_id = parent_membership_group_id, + # by_alias = by_alias, + # exclude_unset = exclude_unset, + # model_as_dict = model_as_dict, + # ): + # membership_group_obj.parent_membership_group = parent_membership_group_result + # else: membership_group_obj.parent_membership_group = None + # log.debug(parent_membership_group_result) + + # Updated 2021-06-18 + if inc_product_list: + if product_rec_list_result := get_product_rec_list( + for_obj_type = 'membership_group', + for_obj_id = membership_group_id, + limit = limit, + enabled = enabled, ): - membership_group_obj.membership_group = membership_group_result - else: membership_group_obj.membership_group = None - log.debug(membership_group_result) + product_result_list = [] + for product_rec in product_rec_list_result: + product_result_list.append( + load_product_obj( + product_id = product_rec.get('product_id', None), + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = model_as_dict, + ) + ) + membership_group_obj.product_list = product_result_list + else: membership_group_obj.product_list = [] if model_as_dict: return membership_group_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member @@ -101,10 +141,10 @@ def update_membership_group_obj( log.debug(membership_group_obj_up.dict(by_alias=False, exclude_unset=True)) # log.debug(membership_group_obj_up.dict(by_alias=False, exclude_unset=False)) - journal_dict_up = membership_group_obj_up.dict(by_alias=False, exclude_unset=True) - log.debug(journal_dict_up) + membership_group_dict_up = membership_group_obj_up.dict(by_alias=False, exclude_unset=True) + log.debug(membership_group_dict_up) - if membership_group_obj_up_result := sql_update(data=journal_dict_up, table_name='membership_group', rm_id_random=True): + if membership_group_obj_up_result := sql_update(data=membership_group_dict_up, table_name='membership_group', rm_id_random=True): log.debug(membership_group_obj_up_result) return True else: diff --git a/app/methods/membership_member_methods.py b/app/methods/membership_member_methods.py index b44ce6e..8f558e7 100644 --- a/app/methods/membership_member_methods.py +++ b/app/methods/membership_member_methods.py @@ -8,7 +8,7 @@ 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_methods import get_membership_group_rec_list, load_membership_group_obj -from app.methods.membership_profile_methods import get_membership_profile_rec_list, load_membership_profile_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 from app.methods.user_methods import load_user_obj @@ -174,8 +174,9 @@ def load_membership_member_obj( inc_contact: bool = False, inc_membership_cfg: bool = False, inc_membership_group_list: bool = False, - inc_membership_profile: bool = False, - # inc_membership_profile_cust: bool = False, + inc_membership_member_profile: bool = False, + inc_membership_type: bool = False, + # inc_membership_member_profile_cust: bool = False, inc_organization: bool = False, inc_person: bool = False, inc_user: bool = False, @@ -218,12 +219,12 @@ def load_membership_member_obj( membership_member_obj.membership_group_list = membership_group_result_list else: membership_member_obj.membership_group_list = [] - # Updated 2021-06-18 - if inc_membership_profile: - membership_profile_id = membership_member_rec.get('membership_profile_id', None) - log.debug(membership_profile_id) - if membership_profile_result := load_membership_profile_obj( - membership_profile_id = membership_profile_id, + # Updated 2021-06-21 + if inc_membership_member_profile: + membership_member_profile_id = membership_member_rec.get('membership_member_profile_id', None) + log.debug(membership_member_profile_id) + if membership_member_profile_result := load_membership_member_profile_obj( + membership_member_profile_id = membership_member_profile_id, by_alias = by_alias, exclude_unset = exclude_unset, model_as_dict = model_as_dict, @@ -232,9 +233,27 @@ def load_membership_member_obj( # inc_membership = inc_membership, # inc_organization = inc_organization, ): - membership_member_obj.membership_profile = membership_profile_result - else: membership_member_obj.membership_profile = None - log.debug(membership_profile_result) + membership_member_obj.membership_member_profile = membership_member_profile_result + else: membership_member_obj.membership_member_profile = None + log.debug(membership_member_profile_result) + + # Updated 2021-06-18 + if inc_membership_type: + membership_type_id = membership_member_rec.get('membership_type_id', None) + log.debug(membership_type_id) + if membership_type_result := load_membership_type_obj( + membership_type_id = membership_type_id, + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = model_as_dict, + inc_address = inc_address, + inc_contact = inc_contact, + # inc_membership = inc_membership, + # inc_organization = inc_organization, + ): + membership_member_obj.membership_type = membership_type_result + else: membership_member_obj.membership_type = None + log.debug(membership_type_result) # Updated 2021-06-18 if inc_person: diff --git a/app/methods/membership_profile_methods.py b/app/methods/membership_member_profile_methods.py similarity index 53% rename from app/methods/membership_profile_methods.py rename to app/methods/membership_member_profile_methods.py index d5f4ff9..f6abed5 100644 --- a/app/methods/membership_profile_methods.py +++ b/app/methods/membership_member_profile_methods.py @@ -7,45 +7,45 @@ from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, v from app.db_sql import redis_lookup_id_random, sql_select from app.lib_general import log, logging -from app.models.membership_profile_models import Membership_Profile_Base +from app.models.membership_member_profile_models import Membership_Member_Profile_Base -# ### BEGIN ### API Membership Profile Methods ### load_membership_profile_obj() ### -def load_membership_profile_obj( - membership_profile_id: int|str, +# ### BEGIN ### API Membership Member Profile Methods ### load_membership_member_profile_obj() ### +def load_membership_member_profile_obj( + membership_member_profile_id: int|str, by_alias: bool = True, exclude_unset: bool = True, model_as_dict: bool = False, inc_contact: bool = False, inc_organization: bool = False, - ) -> Membership_Profile_Base|dict|bool: + ) -> Membership_Member_Profile_Base|dict|bool: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) - if membership_profile_id := redis_lookup_id_random(record_id_random=membership_profile_id, table_name='membership_profile'): pass + if membership_member_profile_id := redis_lookup_id_random(record_id_random=membership_member_profile_id, table_name='membership_member_profile'): pass else: return False - if membership_profile_rec := sql_select( - table_name='v_membership_profile', - record_id=membership_profile_id, + if membership_member_profile_rec := sql_select( + table_name='v_membership_member_profile', + record_id=membership_member_profile_id, ): pass else: return False - log.debug(membership_profile_rec) + log.debug(membership_member_profile_rec) try: - membership_profile_obj = Membership_Profile_Base(**membership_profile_rec) - log.debug(membership_profile_obj) + membership_member_profile_obj = Membership_Member_Profile_Base(**membership_member_profile_rec) + log.debug(membership_member_profile_obj) except ValidationError as e: log.error(e.json()) if model_as_dict: - return membership_profile_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member + return membership_member_profile_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member else: - return membership_profile_obj -# ### END ### API Membership Profile Methods ### load_membership_profile_obj() ### + return membership_member_profile_obj +# ### END ### API Membership Member Profile Methods ### load_membership_member_profile_obj() ### -# ### BEGIN ### API Membership Profile Methods ### get_membership_profile_rec_list() ### -def get_membership_profile_rec_list( +# ### BEGIN ### API Membership Member Profile Methods ### get_membership_member_profile_rec_list() ### +def get_membership_member_profile_rec_list( for_obj_type: str, for_obj_id: str, limit: int = 1000, @@ -78,8 +78,8 @@ def get_membership_profile_rec_list( sql_limit = '' sql = f""" - SELECT `tbl`.id AS 'membership_profile_id', `tbl`.id_random AS 'membership_profile_id_random' - FROM `membership_profile` AS `tbl` + SELECT `tbl`.id AS 'membership_member_profile_id', `tbl`.id_random AS 'membership_member_profile_id_random' + FROM `membership_member_profile` AS `tbl` WHERE {sql_obj_type_id} {sql_enabled} @@ -87,12 +87,12 @@ def get_membership_profile_rec_list( {sql_limit}; """ - if membership_profile_rec_li_result := sql_select(data=data, sql=sql, as_list=True): - membership_profile_rec_li = membership_profile_rec_li_result + if membership_member_profile_rec_li_result := sql_select(data=data, sql=sql, as_list=True): + membership_member_profile_rec_li = membership_member_profile_rec_li_result else: - membership_profile_rec_li = [] + membership_member_profile_rec_li = [] log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL - log.debug(membership_profile_rec_li_result) + log.debug(membership_member_profile_rec_li_result) - return membership_profile_rec_li -# ### END ### API Membership Profile Methods ### get_membership_profile_rec_list() ### + return membership_member_profile_rec_li +# ### END ### API Membership Member Profile Methods ### get_membership_member_profile_rec_list() ### diff --git a/app/methods/membership_methods.py b/app/methods/membership_type_methods.py similarity index 63% rename from app/methods/membership_methods.py rename to app/methods/membership_type_methods.py index 0545b6f..f8de66e 100644 --- a/app/methods/membership_methods.py +++ b/app/methods/membership_type_methods.py @@ -11,21 +11,21 @@ from app.methods.membership_cfg_methods import load_membership_cfg_obj from app.methods.membership_member_methods import get_membership_member_rec_list, load_membership_member_obj from app.methods.product_methods import get_product_rec_list, load_product_obj -from app.models.membership_models import Membership_Base +from app.models.membership_type_models import Membership_Type_Base -# ### BEGIN ### API Membership Methods ### save_membership_obj() ### -def save_membership_obj(membership_obj_new:Membership_Base): +# ### BEGIN ### API Membership Type Methods ### save_membership_type_obj() ### +def save_membership_type_obj(membership_type_obj_new:Membership_Type_Base): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) - return membership_id -# ### END ### API Membership Methods ### save_membership_obj() ### + return membership_type_id +# ### END ### API Membership Type Methods ### save_membership_type_obj() ### -# ### BEGIN ### API Membership Methods ### load_membership_obj() ### -def load_membership_obj( - membership_id:int|str, +# ### BEGIN ### API Membership Type Methods ### load_membership_type_obj() ### +def load_membership_type_obj( + membership_type_id:int|str, limit: int = 1000, by_alias: bool = True, exclude_unset: bool = True, @@ -34,48 +34,47 @@ def load_membership_obj( inc_address: bool = False, inc_contact: bool = False, inc_membership_cfg: bool = False, - inc_membership_group_list: bool = False, + inc_membership_group_list: bool = False, # under membership_member inc_membership_member_list: bool = False, - inc_membership_profile: bool = False, + inc_membership_member_profile: bool = False, # under membership_member inc_organization: bool = False, inc_person: bool = False, - inc_product: bool = False, + inc_product: bool = False, # is this needed? inc_product_list: bool = False, inc_user: bool = False, - ) -> Membership_Base: + ) -> Membership_Type_Base: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) - if membership_id := redis_lookup_id_random(record_id_random=membership_id, table_name='membership'): pass + if membership_type_id := redis_lookup_id_random(record_id_random=membership_type_id, table_name='membership_type'): pass else: return False - if membership_rec := sql_select(table_name='v_membership', record_id=membership_id): pass + if membership_type_rec := sql_select(table_name='v_membership_type', record_id=membership_type_id): pass else: return False - log.debug(membership_rec) + log.debug(membership_type_rec) try: - membership_obj = Membership_Base(**membership_rec) - log.debug(membership_obj) + membership_type_obj = Membership_Type_Base(**membership_type_rec) + log.debug(membership_type_obj) except ValidationError as e: log.error(e.json()) # Updated 2021-06-18 if inc_membership_cfg: membership_cfg_result = load_membership_cfg_obj( - account_id = membership_rec.get('account_id', None), + account_id = membership_type_rec.get('account_id', None), by_alias = by_alias, exclude_unset = exclude_unset, model_as_dict = model_as_dict, - enabled = enabled, ) - membership_rec['cfg'] = membership_cfg_result + membership_type_rec['cfg'] = membership_cfg_result # Updated 2021-06-18 if inc_membership_member_list: if membership_member_rec_list_result := get_membership_member_rec_list( - for_obj_type = 'membership', - for_obj_id = membership_id, + for_obj_type = 'membership_type', + for_obj_id = membership_type_id, limit = limit, enabled = enabled, ): @@ -90,21 +89,21 @@ def load_membership_obj( model_as_dict = model_as_dict, enabled = enabled, inc_membership_group_list = inc_membership_group_list, - inc_membership_profile = inc_membership_profile, + inc_membership_member_profile = inc_membership_member_profile, inc_organization = inc_organization, inc_person = inc_person, - inc_product = inc_product, + # inc_product = inc_product, inc_user = inc_user, ) ) - membership_obj.membership_member_list = membership_member_result_list - else: membership_obj.membership_member_list = [] + membership_type_obj.membership_member_list = membership_member_result_list + else: membership_type_obj.membership_member_list = [] # Updated 2021-06-18 if inc_product_list: if product_rec_list_result := get_product_rec_list( - for_obj_type = 'membership', - for_obj_id = membership_id, + for_obj_type = 'membership_type', + for_obj_id = membership_type_id, limit = limit, enabled = enabled, ): @@ -118,17 +117,17 @@ def load_membership_obj( model_as_dict = model_as_dict, ) ) - membership_obj.product_list = product_result_list - else: membership_obj.product_list = [] + membership_type_obj.product_list = product_result_list + else: membership_type_obj.product_list = [] if model_as_dict: - return membership_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member + return membership_type_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member else: - return membership_obj -# ### END ### API Membership Methods ### load_membership_obj() ### + return membership_type_obj +# ### END ### API Membership Type Methods ### load_membership_type_obj() ### -# ### BEGIN ### API Membership Methods ### get_membership_rec_list() ### -def get_membership_rec_list( +# ### BEGIN ### API Membership Type Methods ### get_membership_type_rec_list() ### +def get_membership_type_rec_list( for_obj_type: str, for_obj_id: str, limit: int = 1000, @@ -161,8 +160,8 @@ def get_membership_rec_list( sql_limit = '' sql = f""" - SELECT `tbl`.id AS 'membership_id', `tbl`.id_random AS 'membership_id_random' - FROM `membership` AS `tbl` + SELECT `tbl`.id AS 'membership_type_id', `tbl`.id_random AS 'membership_type_id_random' + FROM `membership_type` AS `tbl` WHERE {sql_obj_type_id} {sql_enabled} @@ -170,12 +169,12 @@ def get_membership_rec_list( {sql_limit}; """ - if membership_rec_li_result := sql_select(data=data, sql=sql, as_list=True): - membership_rec_li = membership_rec_li_result + if membership_type_rec_li_result := sql_select(data=data, sql=sql, as_list=True): + membership_type_rec_li = membership_type_rec_li_result else: - membership_rec_li = [] + membership_type_rec_li = [] log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL - log.debug(membership_rec_li_result) + log.debug(membership_type_rec_li_result) - return membership_rec_li -# ### END ### API Membership Methods ### get_membership_rec_list() ### + return membership_type_rec_li +# ### END ### API Membership Type Methods ### get_membership_type_rec_list() ### diff --git a/app/models/account_cfg_models.py b/app/models/account_cfg_models.py index 8e02281..d8c4478 100644 --- a/app/models/account_cfg_models.py +++ b/app/models/account_cfg_models.py @@ -9,7 +9,7 @@ from app.lib_general import * from app.models.common_field_schema import base_fields, default_num_bytes from app.models.fundraising_cfg_models import Fundraising_Cfg_Base -from app.models.membership_models import Membership_Cfg_Base +from app.models.membership_cfg_models import Membership_Cfg_Base class Account_Cfg_Base(BaseModel): diff --git a/app/models/account_models.py b/app/models/account_models.py index f93fa7a..143c690 100644 --- a/app/models/account_models.py +++ b/app/models/account_models.py @@ -13,7 +13,7 @@ from app.models.account_cfg_models import Account_Cfg_Base # from app.models.contact_models import Contact_Base # from app.models.event_models import Event_Base from app.models.fundraising_cfg_models import Fundraising_Cfg_Base -from app.models.membership_models import Membership_Cfg_Base +from app.models.membership_cfg_models import Membership_Cfg_Base # from app.models.person_models import Person_Base # from app.models.user_models import User_Base @@ -58,6 +58,9 @@ class Account_Base(BaseModel): hosted_file_list: Optional[list] # Hosted_File_Base() # Priority l2 journal_list: Optional[list] # Journal_Base() # Priority l3 membership_cfg: Optional[Membership_Cfg_Base] # Priority l2 + membership_group_list: Optional[list] # Membership_Group_Base() # Priority l2 + membership_member_list: Optional[list] # Membership_Member_Base() # Priority l2 + membership_type_list: Optional[list] # Membership_Type_Base() # Priority l2 order_list: Optional[list] # Order_Base() # Priority l2 organization_list: Optional[list] # Organization_Base() # Priority l3 page_list: Optional[list] # Page_Base() # Priority l3 diff --git a/app/models/common_field_schema.py b/app/models/common_field_schema.py index 517e2b4..43e3bae 100644 --- a/app/models/common_field_schema.py +++ b/app/models/common_field_schema.py @@ -48,11 +48,13 @@ base_fields['fundraising_cfg_id_random'] = xxx_id_random_field_schema base_fields['hosted_file_id_random'] = xxx_id_random_field_schema base_fields['journal_id_random'] = xxx_id_random_field_schema base_fields['journal_entry_id_random'] = xxx_id_random_field_schema -base_fields['membership_id_random'] = xxx_id_random_field_schema +# base_fields['membership_id_random'] = xxx_id_random_field_schema # renamed to membership_type base_fields['membership_cfg_id_random'] = xxx_id_random_field_schema base_fields['membership_group_id_random'] = xxx_id_random_field_schema +base_fields['membership_group_member_id_random'] = xxx_id_random_field_schema base_fields['membership_member_id_random'] = xxx_id_random_field_schema -base_fields['membership_profile_id_random'] = xxx_id_random_field_schema +base_fields['membership_member_profile_id_random'] = xxx_id_random_field_schema +base_fields['membership_type_id_random'] = xxx_id_random_field_schema base_fields['order_cart_id_random'] = xxx_id_random_field_schema base_fields['order_cart_line_id_random'] = xxx_id_random_field_schema base_fields['order_id_random'] = xxx_id_random_field_schema diff --git a/app/models/membership_cfg_models.py b/app/models/membership_cfg_models.py index a5b31b3..25f449a 100644 --- a/app/models/membership_cfg_models.py +++ b/app/models/membership_cfg_models.py @@ -39,8 +39,8 @@ class Membership_Cfg_Base(BaseModel): confirm_name: Optional[str] # Including JSON data - # extended_membership_profile: Optional[str] # list of dicts outlining extended (custom) membership profile fields for client - # extended_membership_profile: Optional[Json] = '[]' # list of dicts outlining extended (custom) membership profile fields for client - extended_membership_profile: Optional[Json] # list of dicts outlining extended (custom) membership profile fields for client + # extended_membership_member_profile: Optional[str] # list of dicts outlining extended (custom) membership profile fields for client + # extended_membership_member_profile: Optional[Json] = '[]' # list of dicts outlining extended (custom) membership profile fields for client + extended_membership_member_profile: Optional[Json] # list of dicts outlining extended (custom) membership profile fields for client Membership_Cfg_Base.update_forward_refs() diff --git a/app/models/membership_group_member_models.py b/app/models/membership_group_member_models.py new file mode 100644 index 0000000..6cb79f8 --- /dev/null +++ b/app/models/membership_group_member_models.py @@ -0,0 +1,87 @@ +from __future__ import annotations +import datetime, hashlib, logging, os, pytz, redis, secrets + +from typing import Dict, List, Optional, Set, Union +from pydantic import BaseModel, EmailStr, Field, Json, PrivateAttr, ValidationError, validator + +from app.db_sql import redis_lookup_id_random +from app.lib_general import log, logging + +from app.models.common_field_schema import base_fields, default_num_bytes +from app.models.membership_group_models import Membership_Group_Base +from app.models.membership_member_models import Membership_Member_Base + + +class Membership_Group_Member_Base(BaseModel): + log.setLevel(logging.WARNING) + log.debug(locals()) + + id_random: Optional[str] = Field( + **base_fields['membership_group_member_id_random'], + alias='membership_group_member_id_random', + default_factory=lambda:secrets.token_urlsafe(default_num_bytes), + ) + id: Optional[int] = Field( + #alias='membership_group_member_id' + ) + + membership_group_id_random: Optional[str] + membership_group_id: Optional[int] + membership_member_id_random: Optional[str] + membership_member_id: Optional[int] + + flag: Optional[bool] + flag_message: Optional[str] + + notes: Optional[str] + + created_on: Optional[datetime.datetime] = None + updated_on: Optional[datetime.datetime] = None + + # Including other related objects + membership_group: Optional[Membership_Group_Base] + membership_member: Optional[Membership_Member_Base] + + _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) + + #@validator('membership_group_member_id_random', always=True) + def membership_group_member_id_random_copy(cls, v, values, **kwargs): + log.setLevel(logging.WARNING) + log.debug(locals()) + + if values['id_random']: + return values['id_random'] + return None + + @validator('id', always=True) + def membership_group_member_id_lookup(cls, v, values, **kwargs): + log.setLevel(logging.WARNING) + log.debug(locals()) + + if values['id_random']: + return redis_lookup_id_random(record_id_random=values['id_random'], table_name='membership_group_member') + return None + + @validator('membership_group_id', always=True) + def membership_group_id_lookup(cls, v, values, **kwargs): + log.setLevel(logging.WARNING) + log.debug(locals()) + + if values['membership_group_id_random']: + return redis_lookup_id_random(record_id_random=values['membership_group_id_random'], table_name='membership_group') + return None + + @validator('membership_member_id', always=True) + def membership_member_id_lookup(cls, v, values, **kwargs): + log.setLevel(logging.WARNING) + log.debug(locals()) + + if values['membership_member_id_random']: + return redis_lookup_id_random(record_id_random=values['membership_member_id_random'], table_name='membership_member') + return None + + class Config: + underscore_attrs_are_private = True + fields = base_fields + +# Membership_Base.update_forward_refs() diff --git a/app/models/membership_group_models.py b/app/models/membership_group_models.py index d62c538..ea7c030 100644 --- a/app/models/membership_group_models.py +++ b/app/models/membership_group_models.py @@ -8,7 +8,8 @@ from app.db_sql import redis_lookup_id_random from app.lib_general import log, logging from app.models.common_field_schema import base_fields, default_num_bytes -from app.models.membership_models import Membership_Base +from app.models.membership_cfg_models import Membership_Cfg_Base +# from app.models.membership_type_models import Membership_Type_Base class Membership_Group_Base(BaseModel): @@ -23,8 +24,10 @@ class Membership_Group_Base(BaseModel): id: Optional[int] = Field( #alias='membership_group_id' ) - membership_id_random: Optional[str] - membership_id: Optional[int] + account_id_random: Optional[str] + account_id: Optional[int] + membership_type_id_random: Optional[str] + membership_type_id: Optional[int] parent_membership_group_id_random: Optional[str] parent_membership_group_id: Optional[int] @@ -32,13 +35,18 @@ class Membership_Group_Base(BaseModel): overview: Optional[str] description: Optional[str] + expire_in_days: Optional[int] + notes: Optional[str] created_on: Optional[datetime.datetime] = None updated_on: Optional[datetime.datetime] = None # Including other related objects - membership: Optional[Membership_Base] # The membership option they currently have - parent_membership_group: Optional[Membership_Group_Base] + cfg: Optional[Membership_Cfg_Base] + # membership_type: Optional[Membership_Type_Base] # The membership option/type they currently have + membership_group_member_list: Optional[list] # Membership_Group_Member_Base + # parent_membership_group: Optional[Membership_Group_Base] + product_list: Optional[list] # Product_Base() List of products (for_type and for_id) that get this membership option _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) @@ -61,13 +69,22 @@ class Membership_Group_Base(BaseModel): return redis_lookup_id_random(record_id_random=values['id_random'], table_name='membership_group') return None - @validator('membership_id', always=True) + @validator('account_id', always=True) + def account_id_lookup(cls, v, values, **kwargs): + log.setLevel(logging.WARNING) + log.debug(locals()) + + if values['account_id_random']: + return redis_lookup_id_random(record_id_random=values['account_id_random'], table_name='account') + return None + + @validator('membership_type_id', always=True) def membership_lookup(cls, v, values, **kwargs): log.setLevel(logging.WARNING) log.debug(locals()) - if values['membership_id_random']: - return redis_lookup_id_random(record_id_random=values['membership_id_random'], table_name='membership') + if values['membership_type_id_random']: + return redis_lookup_id_random(record_id_random=values['membership_type_id_random'], table_name='membership_type') return None @validator('parent_membership_group_id', always=True) diff --git a/app/models/membership_member_models.py b/app/models/membership_member_models.py index 3365bc5..163fc6d 100644 --- a/app/models/membership_member_models.py +++ b/app/models/membership_member_models.py @@ -8,9 +8,9 @@ from app.db_sql import redis_lookup_id_random from app.lib_general import log, logging from app.models.common_field_schema import base_fields, default_num_bytes -from app.models.membership_models import Membership_Base from app.models.membership_cfg_models import Membership_Cfg_Base -from app.models.membership_profile_models import Membership_Profile_Base +from app.models.membership_member_profile_models import Membership_Member_Profile_Base +from app.models.membership_type_models import Membership_Type_Base from app.models.person_models import Person_Base from app.models.user_models import User_Base @@ -30,8 +30,8 @@ class Membership_Member_Base(BaseModel): account_id_random: Optional[str] account_id: Optional[int] - membership_id_random: Optional[str] - membership_id: Optional[int] # NOTE: This is not optional + membership_type_id_random: Optional[str] + membership_type_id: Optional[int] # NOTE: This is not optional person_id_random: Optional[str] person_id: Optional[int] product_id_random: Optional[str] @@ -64,11 +64,12 @@ class Membership_Member_Base(BaseModel): updated_on: Optional[datetime.datetime] = None # Including other related objects - membership: Optional[Membership_Base] # The membership option they currently have - membership_cfg: Optional[Membership_Cfg_Base] + membership_type: Optional[Membership_Type_Base] # The membership option they currently have + cfg: Optional[Membership_Cfg_Base] membership_group_list: Optional[list] # Membership_Group_Base() The membership groups they are a part of - membership_profile: Optional[Membership_Profile_Base] + membership_member_profile: Optional[Membership_Member_Profile_Base] person: Optional[Person_Base] + # product: Optional[Product_Base] # The product used to become a member? user: Optional[User_Base] extended_member_profile: Optional[dict] = {} @@ -102,13 +103,13 @@ class Membership_Member_Base(BaseModel): return redis_lookup_id_random(record_id_random=values['account_id_random'], table_name='account') return None - @validator('membership_id', always=True) - def membership_id_lookup(cls, v, values, **kwargs): + @validator('membership_type_id', always=True) + def membership_type_id_lookup(cls, v, values, **kwargs): log.setLevel(logging.WARNING) log.debug(locals()) - if values['membership_id_random']: - return redis_lookup_id_random(record_id_random=values['membership_id_random'], table_name='membership') + if values['membership_type_id_random']: + return redis_lookup_id_random(record_id_random=values['membership_type_id_random'], table_name='membership_type') return None @validator('person_id', always=True) @@ -120,14 +121,14 @@ class Membership_Member_Base(BaseModel): return redis_lookup_id_random(record_id_random=values['person_id_random'], table_name='person') return None - @validator('product_id', always=True) - def product_id_lookup(cls, v, values, **kwargs): - log.setLevel(logging.WARNING) - log.debug(locals()) + # @validator('product_id', always=True) + # def product_id_lookup(cls, v, values, **kwargs): + # log.setLevel(logging.WARNING) + # log.debug(locals()) - if values['product_id_random']: - return redis_lookup_id_random(record_id_random=values['product_id_random'], table_name='product') - return None + # if values['product_id_random']: + # return redis_lookup_id_random(record_id_random=values['product_id_random'], table_name='product') + # return None @validator('user_id', always=True) def user_id_lookup(cls, v, values, **kwargs): diff --git a/app/models/membership_profile_models.py b/app/models/membership_member_profile_models.py similarity index 71% rename from app/models/membership_profile_models.py rename to app/models/membership_member_profile_models.py index 8045e31..49e1ff6 100644 --- a/app/models/membership_profile_models.py +++ b/app/models/membership_member_profile_models.py @@ -9,26 +9,26 @@ from app.lib_general import log, logging from app.models.common_field_schema import base_fields, default_num_bytes from app.models.contact_models import Contact_Base -from app.models.membership_models import Membership_Base +from app.models.membership_type_models import Membership_Type_Base from app.models.organization_models import Organization_Base -class Membership_Profile_Base(BaseModel): +class Membership_Member_Profile_Base(BaseModel): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) id_random: Optional[str] = Field( - **base_fields['membership_profile_id_random'], - alias='membership_profile_id_random', + **base_fields['membership_member_profile_id_random'], + alias='membership_member_profile_id_random', default_factory=lambda:secrets.token_urlsafe(default_num_bytes), ) id: Optional[int] = Field( - #alias='membership_profile_id' + #alias='membership_member_profile_id' ) contact_id_random: Optional[str] contact_id: Optional[int] - membership_id_random: Optional[str] - membership_id: Optional[int] + # membership_type_id_random: Optional[str] + # membership_type_id: Optional[int] organization_id_random: Optional[str] organization_id: Optional[int] @@ -49,12 +49,12 @@ class Membership_Profile_Base(BaseModel): # Including other related objects contact: Optional[Contact_Base] - organization: Optional[Organization_Base] = Organization_Base() + organization: Optional[Organization_Base] _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) - #@validator('membership_profile_id_random', always=True) - def membership_profile_id_random_copy(cls, v, values, **kwargs): + #@validator('membership_member_profile_id_random', always=True) + def membership_member_profile_id_random_copy(cls, v, values, **kwargs): log.setLevel(logging.WARNING) log.debug(locals()) @@ -63,23 +63,23 @@ class Membership_Profile_Base(BaseModel): return None @validator('id', always=True) - def membership_profile_id_lookup(cls, v, values, **kwargs): + def membership_member_profile_id_lookup(cls, v, values, **kwargs): log.setLevel(logging.WARNING) log.debug(locals()) if values['id_random']: log.debug(values['id_random']) - return redis_lookup_id_random(record_id_random=values['id_random'], table_name='membership_profile') + return redis_lookup_id_random(record_id_random=values['id_random'], table_name='membership_member_profile') return None - @validator('membership_id', always=True) - def membership_lookup(cls, v, values, **kwargs): - log.setLevel(logging.WARNING) - log.debug(locals()) + # @validator('membership_type_id', always=True) + # def membership_lookup(cls, v, values, **kwargs): + # log.setLevel(logging.WARNING) + # log.debug(locals()) - if values['membership_id_random']: - return redis_lookup_id_random(record_id_random=values['membership_id_random'], table_name='membership') - return None + # if values['membership_type_id_random']: + # return redis_lookup_id_random(record_id_random=values['membership_type_id_random'], table_name='membership_type') + # return None @validator('contact_id', always=True) def contact_id_lookup(cls, v, values, **kwargs): diff --git a/app/models/membership_models.py b/app/models/membership_type_models.py similarity index 88% rename from app/models/membership_models.py rename to app/models/membership_type_models.py index bcaba02..9e61a7d 100644 --- a/app/models/membership_models.py +++ b/app/models/membership_type_models.py @@ -11,17 +11,17 @@ from app.models.common_field_schema import base_fields, default_num_bytes from app.models.membership_cfg_models import Membership_Cfg_Base -class Membership_Base(BaseModel): +class Membership_Type_Base(BaseModel): log.setLevel(logging.WARNING) log.debug(locals()) id_random: Optional[str] = Field( - **base_fields['membership_id_random'], - alias='membership_id_random', + **base_fields['membership_type_id_random'], + alias='membership_type_id_random', default_factory=lambda:secrets.token_urlsafe(default_num_bytes), ) id: Optional[int] = Field( - #alias='membership_id' + #alias='membership_type_id' ) account_id_random: Optional[str] @@ -69,14 +69,14 @@ class Membership_Base(BaseModel): # additional_terms_conditions: Optional[dict] = {} # Is this useful? # Including other related objects - cfg: Optional[Membership_Cfg_Base] = Membership_Cfg_Base() + cfg: Optional[Membership_Cfg_Base] membership_member_list: Optional[list] # Membership_Member_Base() List of membership members product_list: Optional[list] # Product_Base() List of products (for_type and for_id) that get this membership option _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) - #@validator('membership_id_random', always=True) - def membership_id_random_copy(cls, v, values, **kwargs): + #@validator('membership_type_id_random', always=True) + def membership_type_id_random_copy(cls, v, values, **kwargs): log.setLevel(logging.WARNING) log.debug(locals()) @@ -85,12 +85,12 @@ class Membership_Base(BaseModel): return None @validator('id', always=True) - def membership_id_lookup(cls, v, values, **kwargs): + def membership_type_id_lookup(cls, v, values, **kwargs): log.setLevel(logging.WARNING) log.debug(locals()) if values['id_random']: - return redis_lookup_id_random(record_id_random=values['id_random'], table_name='membership') + return redis_lookup_id_random(record_id_random=values['id_random'], table_name='membership_type') return None # @validator('account_id', always=True) @@ -102,4 +102,4 @@ class Membership_Base(BaseModel): # return redis_lookup_id_random(record_id_random=values['account_id_random'], table_name='account') # return None -# Membership_Base.update_forward_refs() +# Membership_Type_Base.update_forward_refs() diff --git a/app/routers/account.py b/app/routers/account.py index 03c7f27..4249d7d 100644 --- a/app/routers/account.py +++ b/app/routers/account.py @@ -141,10 +141,14 @@ async def get_account_obj_new( inc_hosted_file_link_list: bool = False, inc_journal_list: bool = False, inc_journal_entry_list: bool = False, - # inc_membership: bool = False, inc_membership_cfg: bool = False, - inc_membership_list: bool = False, + # inc_membership_group: bool = False, + inc_membership_group_list: bool = False, + inc_membership_member: bool = False, inc_membership_member_list: bool = False, + inc_membership_member_profile: bool = False, + # inc_membership_type: bool = False, + inc_membership_type_list: bool = False, # inc_order: bool = False, inc_order_list: bool = False, # inc_order_cart: bool = False, @@ -212,10 +216,12 @@ async def get_account_obj_new( inc_hosted_file_link_list = inc_hosted_file_link_list, inc_journal_list = inc_journal_list, inc_journal_entry_list = inc_journal_entry_list, - # inc_membership = inc_membership, inc_membership_cfg = inc_membership_cfg, - inc_membership_list = inc_membership_list, + inc_membership_group_list = inc_membership_group_list, + inc_membership_member = inc_membership_member, inc_membership_member_list = inc_membership_member_list, + inc_membership_member_profile = inc_membership_member_profile, + inc_membership_type_list = inc_membership_type_list, # inc_order = inc_order, inc_order_list = inc_order_list, # inc_order_cart = inc_order_cart, diff --git a/app/routers/api_crud.py b/app/routers/api_crud.py index 008f01d..c4a9208 100644 --- a/app/routers/api_crud.py +++ b/app/routers/api_crud.py @@ -31,7 +31,11 @@ from app.models.event_track_models import * from app.models.hosted_file_models import * from app.models.journal_models import * from app.models.journal_entry_models import * -from app.models.membership_models import * +from app.models.membership_cfg_models import * +from app.models.membership_group_models import * +from app.models.membership_group_member_models import * +from app.models.membership_member_models import * +from app.models.membership_type_models import * from app.models.order_models import * from app.models.order_cart_models import * from app.models.organization_models import * @@ -82,8 +86,12 @@ obj_type_li['journal'] = {'table_name': 'v_journal', 'base_name': Journal_Base} obj_type_li['journal_entry'] = {'table_name': 'v_journal_entry', 'base_name': Journal_Entry_Base} #obj_type_li['log'] = {'table_name': 'log', 'base_name': Log_Base} #'v_log' #obj_type_li['log_client_viewing'] = {'table_name': 'log_client_viewing', 'base_name': Log_Client_Viewing_Base} -obj_type_li['membership'] = {'table_name': 'v_membership', 'base_name': Membership_Base} obj_type_li['membership_cfg'] = {'table_name': 'v_membership_cfg', 'base_name': Membership_Cfg_Base} +obj_type_li['membership_group'] = {'table_name': 'v_membership_group', 'base_name': Membership_Group_Base} +obj_type_li['membership_group_member'] = {'table_name': 'v_membership_group_member', 'base_name': Membership_Group_Member_Base} +obj_type_li['membership_member'] = {'table_name': 'v_membership_member', 'base_name': Membership_Member_Base} +obj_type_li['membership_member_profile'] = {'table_name': 'v_membership_member_profile', 'base_name': Membership_Member_Profile_Base} +obj_type_li['membership_type'] = {'table_name': 'v_membership_type', 'base_name': Membership_Type_Base} #obj_type_li['message'] = {'table_name': 'message', 'base_name': Message_Base} #'v_message' obj_type_li['order'] = {'table_name': 'v_order', 'base_name': Order_Base} obj_type_li['order_cart'] = {'table_name': 'v_order_cart', 'base_name': Order_Cart_Base} @@ -124,8 +132,8 @@ obj_type_li['user_role'] = {'table_name': 'v_user_role', 'base_name': User_Role_ #obj_type_li['stripe_customer'] = {'table_name': 'stripe_customer', 'base_name': Stripe_Customer_Base} #obj_type_li['stripe_log'] = {'table_name': 'stripe_log', 'base_name': Stipe_Log_Base} -# obj_type_li['c_idda_membership_profile'] = {'table_name': 'c_idda_membership_profile', 'base_name': C_Idda_Membership_Profile_Base} -# obj_type_li['c_osit_demo_membership_profile'] = {'table_name': 'c_osit_demo_membership_profile', 'base_name': C_Osit_Demo_Membership_Profile_Base} +# obj_type_li['c_idda_membership_member_profile'] = {'table_name': 'c_idda_membership_member_profile', 'base_name': C_Idda_membership_member_profile_Base} +# obj_type_li['c_osit_demo_membership_member_profile'] = {'table_name': 'c_osit_demo_membership_member_profile', 'base_name': C_Osit_Demo_membership_member_profile_Base} router = APIRouter() diff --git a/app/routers/membership_group.py b/app/routers/membership_group.py new file mode 100644 index 0000000..1c9daf5 --- /dev/null +++ b/app/routers/membership_group.py @@ -0,0 +1,251 @@ +import datetime +from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, status +from pydantic import BaseModel, EmailStr, Field +from typing import Dict, List, Optional, Set, Union + +from app.lib_general import log, logging +from app.config import settings +from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, sql_delete, redis_lookup_id_random + +from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template + +from app.methods.membership_group_methods import load_membership_group_obj + +from app.models.membership_group_models import Membership_Group_Base +from app.models.response_models import Resp_Body_Base, mk_resp + + +router = APIRouter() + + +@router.post('', response_model=Resp_Body_Base) +async def post_membership_group_obj( + obj: Membership_Group_Base, + x_account_id: str = Header(...), + return_obj: Optional[bool] = True, + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'membership_group' + obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) + result = post_obj_template( + obj_type=obj_type, + data=obj_data_dict, + return_obj=True, + by_alias=True, + exclude_unset=True, + ) + return result + + +@router.patch('/{obj_id}', response_model=Resp_Body_Base) +async def patch_membership_group_obj( + obj_id: str = Query(..., min_length=1, max_length=22), + obj: Membership_Group_Base = None, + #x_account_id: Optional[str] = Header(..., ), + return_obj: Optional[bool] = True, + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + ): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'membership_group' + obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) + obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type) + obj_data_dict['id_random'] = obj_id + result = patch_obj_template( + obj_type=obj_type, + data=obj_data_dict, + obj_id=obj_id, + return_obj=True, + by_alias=True, + exclude_unset=True, + ) + return result + + +@router.get('/list', response_model=Resp_Body_Base) +async def get_membership_group_obj_li( + for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50), + for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22), + x_account_id: str = Header(...), + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'membership_group' + 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 + + +# Look up is only for account, person, or user records +@router.get('/lookup', response_model=Resp_Body_Base) +async def lookup_membership_group_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_member_profile: bool = True, + inc_membership_cfg: bool = True, + inc_extended_profile: bool = True, + inc_person: bool = True, + inc_user: bool = True, + by_alias: bool = True, + exclude_unset: bool = True, + ): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'membership_group' + base_name = Membership_Group_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) # 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_group`.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_group`.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_group`.user_id = :user_id""" + sql_limit = 'LIMIT 1' + elif for_obj_type == 'membership_group' and for_obj_id: + data['membership_group_id'] = for_obj_id + sql_where_for_obj_type = """`membership_group`.id = :membership_group_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_group_id', id_random AS 'membership_group_id_random' + FROM `membership_group` AS `membership_group` + WHERE {sql_where_for_obj_type} + {sql_limit} + """ + + # This will return a list if selecting by account ID + membership_group_obj_result = sql_select(data=data, sql=sql, as_list=as_list) + if isinstance(membership_group_obj_result, dict): + membership_group_id = membership_group_obj_result.get('membership_group_id', None) + membership_group_obj = load_membership_group_obj( + membership_group_id = membership_group_id, + inc_membership_member_profile = inc_membership_member_profile, + inc_membership_cfg = inc_membership_cfg, + inc_extended_profile = inc_extended_profile, + inc_person = inc_person, + inc_user = inc_user, + ).dict(by_alias=by_alias, exclude_unset=exclude_unset) + data = membership_group_obj + elif isinstance(membership_group_obj_result, list): + membership_group_obj_li = [] + for membership_group_obj in membership_group_obj_result: + membership_group_id = membership_group_obj.get('membership_group_id', None) + membership_group_obj_li.append( + load_membership_group_obj( + membership_group_id = membership_group_id, + inc_membership_member_profile = inc_membership_member_profile, + inc_membership_cfg = inc_membership_cfg, + inc_extended_profile = inc_extended_profile, + inc_person = inc_person, + inc_user = inc_user, + ).dict(by_alias=by_alias, exclude_unset=exclude_unset) + ) + data = membership_group_obj_li + else: + log.debug(membership_group_obj_result) + return mk_resp(data=None, status_code=404) # Not Found + return mk_resp(data=data) + + + +# ### BEGIN ### API Membership Group ### get_membership_group_obj() ### +# Working well as of 2021-06-21. Using as a template for other routes. +@router.get('/{membership_group_id}', response_model=Resp_Body_Base) +async def get_membership_group_obj( + membership_group_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_group_member_list: bool = False, # List of members belonging to this group + inc_membership_member_profile: bool = False, # Per member + inc_organization: bool = False, # Per member + inc_person: bool = False, # Per member + inc_product: bool = False, # Per member + 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, + ): + log.setLevel(logging.DEBUG) # 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 + else: + return mk_resp(data=None, status_code=404) + + if membership_group_result := load_membership_group_result( + membership_group_id = membership_group_id, + limit = limit, + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = model_as_dict, # NOTE: returning model as a dict + enabled = enabled, + inc_address = inc_address, + inc_contact = inc_contact, + inc_membership_cfg = inc_membership_cfg, + inc_membership_group_list = inc_membership_group_list, + inc_membership_group_member_list = inc_membership_group_member_list, + inc_membership_member_profile = inc_membership_member_profile, + inc_organization = inc_organization, + inc_person = inc_person, + inc_product = inc_product, + inc_product_list = inc_product_list, + inc_user = inc_user, + ): + pass + else: + return mk_resp(data=False, status_code=400) # Bad Request + + return mk_resp(data=membership_group_result) +# ### END ### API Membership ### get_membership_group_obj() ### + + +@router.delete('/{obj_id}', response_model=Resp_Body_Base) +async def delete_membership_group_obj( + obj_id: str = Query(..., min_length=1, max_length=22), + x_account_id: str = Header(...), + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'membership_group' + result = delete_obj_template( + obj_type=obj_type, + obj_id=obj_id, + ) + return result \ No newline at end of file diff --git a/app/routers/membership_member.py b/app/routers/membership_member.py new file mode 100644 index 0000000..7f76ebb --- /dev/null +++ b/app/routers/membership_member.py @@ -0,0 +1,251 @@ +import datetime +from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, status +from pydantic import BaseModel, EmailStr, Field +from typing import Dict, List, Optional, Set, Union + +from app.lib_general import log, logging +from app.config import settings +from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, sql_delete, redis_lookup_id_random + +from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template + +from app.methods.membership_member_methods import load_membership_member_obj + +from app.models.membership_member_models import Membership_Member_Base +from app.models.response_models import Resp_Body_Base, mk_resp + + +router = APIRouter() + + +@router.post('', response_model=Resp_Body_Base) +async def post_membership_member_obj( + obj: Membership_Member_Base, + x_account_id: str = Header(...), + return_obj: Optional[bool] = True, + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'membership_member' + obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) + result = post_obj_template( + obj_type=obj_type, + data=obj_data_dict, + return_obj=True, + by_alias=True, + exclude_unset=True, + ) + return result + + +@router.patch('/{obj_id}', response_model=Resp_Body_Base) +async def patch_membership_member_obj( + obj_id: str = Query(..., min_length=1, max_length=22), + obj: Membership_Member_Base = None, + #x_account_id: Optional[str] = Header(..., ), + return_obj: Optional[bool] = True, + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + ): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'membership_member' + obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) + obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type) + obj_data_dict['id_random'] = obj_id + result = patch_obj_template( + obj_type=obj_type, + data=obj_data_dict, + obj_id=obj_id, + return_obj=True, + by_alias=True, + exclude_unset=True, + ) + return result + + +@router.get('/list', response_model=Resp_Body_Base) +async def get_membership_member_obj_li( + for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50), + for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22), + x_account_id: str = Header(...), + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'membership_member' + 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 + + +# Look up is only for account, person, or user records +@router.get('/lookup', response_model=Resp_Body_Base) +async def lookup_membership_member_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_member_profile: bool = True, + inc_membership_cfg: bool = True, + inc_extended_profile: bool = True, + inc_person: bool = True, + inc_user: bool = True, + by_alias: bool = True, + exclude_unset: bool = True, + ): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'membership_member' + base_name = Membership_Member_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) # 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_member`.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_member`.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_member`.user_id = :user_id""" + sql_limit = 'LIMIT 1' + elif for_obj_type == 'membership_member' and for_obj_id: + data['membership_member_id'] = for_obj_id + sql_where_for_obj_type = """`membership_member`.id = :membership_member_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_member_id', id_random AS 'membership_member_id_random' + FROM `membership_member` AS `membership_member` + WHERE {sql_where_for_obj_type} + {sql_limit} + """ + + # This will return a list if selecting by account ID + membership_member_obj_result = sql_select(data=data, sql=sql, as_list=as_list) + if isinstance(membership_member_obj_result, dict): + membership_member_id = membership_member_obj_result.get('membership_member_id', None) + membership_member_obj = load_membership_member_obj( + membership_member_id = membership_member_id, + inc_membership_member_profile = inc_membership_member_profile, + inc_membership_cfg = inc_membership_cfg, + inc_extended_profile = inc_extended_profile, + inc_person = inc_person, + inc_user = inc_user, + ).dict(by_alias=by_alias, exclude_unset=exclude_unset) + data = membership_member_obj + elif isinstance(membership_member_obj_result, list): + membership_member_obj_li = [] + for membership_member_obj in membership_member_obj_result: + membership_member_id = membership_member_obj.get('membership_member_id', None) + membership_member_obj_li.append( + load_membership_member_obj( + membership_member_id = membership_member_id, + inc_membership_member_profile = inc_membership_member_profile, + inc_membership_cfg = inc_membership_cfg, + inc_extended_profile = inc_extended_profile, + inc_person = inc_person, + inc_user = inc_user, + ).dict(by_alias=by_alias, exclude_unset=exclude_unset) + ) + data = membership_member_obj_li + else: + log.debug(membership_member_obj_result) + return mk_resp(data=None, status_code=404) # Not Found + return mk_resp(data=data) + + + +# ### BEGIN ### API Membership Group ### get_membership_member_obj() ### +# Working well as of 2021-06-21. Using as a template for other routes. +@router.get('/{membership_member_id}', response_model=Resp_Body_Base) +async def get_membership_member_obj( + membership_member_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_member_list: bool = False, # List of groups per member + inc_membership_type_list: bool = False, # List of membership types belonging to this member + inc_membership_member_profile: bool = False, + inc_organization: bool = False, + inc_person: bool = False, + # inc_product: bool = False, + # 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, + ): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if membership_member_id := redis_lookup_id_random(record_id_random=membership_member_id, table_name='membership_member'): pass + else: + return mk_resp(data=None, status_code=404) + + if membership_member_result := load_membership_member_result( + membership_member_id = membership_member_id, + limit = limit, + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = model_as_dict, # NOTE: returning model as a dict + enabled = enabled, + inc_address = inc_address, + inc_contact = inc_contact, + inc_membership_cfg = inc_membership_cfg, + inc_membership_member_list = inc_membership_member_list, + inc_membership_member_member_list = inc_membership_member_member_list, + inc_membership_member_profile = inc_membership_member_profile, + inc_organization = inc_organization, + inc_person = inc_person, + inc_product = inc_product, + inc_product_list = inc_product_list, + inc_user = inc_user, + ): + pass + else: + return mk_resp(data=False, status_code=400) # Bad Request + + return mk_resp(data=membership_member_result) +# ### END ### API Membership ### get_membership_member_obj() ### + + +@router.delete('/{obj_id}', response_model=Resp_Body_Base) +async def delete_membership_member_obj( + obj_id: str = Query(..., min_length=1, max_length=22), + x_account_id: str = Header(...), + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + obj_type = 'membership_member' + result = delete_obj_template( + obj_type=obj_type, + obj_id=obj_id, + ) + return result \ No newline at end of file diff --git a/app/routers/membership.py b/app/routers/membership_type.py similarity index 61% rename from app/routers/membership.py rename to app/routers/membership_type.py index 89f6263..1fc06cb 100644 --- a/app/routers/membership.py +++ b/app/routers/membership_type.py @@ -9,9 +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.membership_methods import load_membership_obj +from app.methods.membership_type_methods import load_membership_type_obj -from app.models.membership_models import Membership_Base +from app.models.membership_type_models import Membership_Type_Base from app.models.response_models import Resp_Body_Base, mk_resp @@ -19,8 +19,8 @@ router = APIRouter() @router.post('', response_model=Resp_Body_Base) -async def post_membership_obj( - obj: Membership_Base, +async def post_membership_type_obj( + obj: Membership_Type_Base, x_account_id: str = Header(...), return_obj: Optional[bool] = True, by_alias: Optional[bool] = True, @@ -29,7 +29,7 @@ async def post_membership_obj( log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) - obj_type = 'membership' + obj_type = 'membership_type' obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) result = post_obj_template( obj_type=obj_type, @@ -42,9 +42,9 @@ async def post_membership_obj( @router.patch('/{obj_id}', response_model=Resp_Body_Base) -async def patch_membership_obj( +async def patch_membership_type_obj( obj_id: str = Query(..., min_length=1, max_length=22), - obj: Membership_Base = None, + obj: Membership_Type_Base = None, #x_account_id: Optional[str] = Header(..., ), return_obj: Optional[bool] = True, by_alias: Optional[bool] = True, @@ -53,7 +53,7 @@ async def patch_membership_obj( log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) - obj_type = 'membership' + obj_type = 'membership_type' 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 @@ -69,7 +69,7 @@ async def patch_membership_obj( @router.get('/list', response_model=Resp_Body_Base) -async def get_membership_obj_li( +async def get_membership_type_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(...), @@ -79,7 +79,7 @@ async def get_membership_obj_li( log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) - obj_type = 'membership' + obj_type = 'membership_type' result = get_obj_li_template( obj_type=obj_type, for_obj_type=for_obj_type, @@ -92,11 +92,11 @@ async def get_membership_obj_li( # Look up is only for account, person, or user records @router.get('/lookup', response_model=Resp_Body_Base) -async def lookup_membership_obj( +async def lookup_membership_type_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_profile: bool = True, + inc_membership_member_profile: bool = True, inc_membership_cfg: bool = True, inc_extended_profile: bool = True, inc_person: bool = True, @@ -107,8 +107,8 @@ async def lookup_membership_obj( log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) - obj_type = 'membership' - base_name = Membership_Base + obj_type = 'membership_type' + base_name = Membership_Type_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) # Not Found @@ -118,72 +118,72 @@ async def lookup_membership_obj( as_list = False if for_obj_type == 'account' and for_obj_id: data['account_id'] = for_obj_id - sql_where_for_obj_type = """`membership`.account_id = :account_id""" + sql_where_for_obj_type = """`membership_type`.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_id = :person_id""" + sql_where_for_obj_type = """`membership_type`.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`.user_id = :user_id""" + sql_where_for_obj_type = """`membership_type`.user_id = :user_id""" sql_limit = 'LIMIT 1' - elif for_obj_type == 'membership' and for_obj_id: - data['membership_id'] = for_obj_id - sql_where_for_obj_type = """`membership`.id = :membership_id""" + elif for_obj_type == 'membership_type' and for_obj_id: + data['membership_type_id'] = for_obj_id + sql_where_for_obj_type = """`membership_type`.id = :membership_type_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_id', id_random AS 'membership_id_random' - FROM `membership` AS `membership` + SELECT id AS 'membership_type_id', id_random AS 'membership_type_id_random' + FROM `membership_type` AS `membership_type` WHERE {sql_where_for_obj_type} {sql_limit} """ # This will return a list if selecting by account ID - membership_obj_result = sql_select(data=data, sql=sql, as_list=as_list) - if isinstance(membership_obj_result, dict): - membership_id = membership_obj_result.get('membership_id', None) - membership_obj = load_membership_obj( - membership_id=membership_id, - inc_membership_profile=inc_membership_profile, - inc_membership_cfg=inc_membership_cfg, - inc_extended_profile=inc_extended_profile, - inc_person=inc_person, - inc_user=inc_user, + membership_type_obj_result = sql_select(data=data, sql=sql, as_list=as_list) + if isinstance(membership_type_obj_result, dict): + membership_type_id = membership_type_obj_result.get('membership_type_id', None) + membership_type_obj = load_membership_type_obj( + membership_type_id = membership_type_id, + inc_membership_member_profile = inc_membership_member_profile, + inc_membership_cfg = inc_membership_cfg, + inc_extended_profile = inc_extended_profile, + inc_person = inc_person, + inc_user = inc_user, ).dict(by_alias=by_alias, exclude_unset=exclude_unset) - data = membership_obj - elif isinstance(membership_obj_result, list): - membership_obj_li = [] - for membership_obj in membership_obj_result: - membership_id = membership_obj.get('membership_id', None) - membership_obj_li.append( - load_membership_obj( - membership_id=membership_id, - inc_membership_profile=inc_membership_profile, - inc_membership_cfg=inc_membership_cfg, - inc_extended_profile=inc_extended_profile, - inc_person=inc_person, - inc_user=inc_user, + data = membership_type_obj + elif isinstance(membership_type_obj_result, list): + membership_type_obj_li = [] + for membership_type_obj in membership_type_obj_result: + membership_type_id = membership_type_obj.get('membership_type_id', None) + membership_type_obj_li.append( + load_membership_type_obj( + membership_type_id = membership_type_id, + inc_membership_member_profile = inc_membership_member_profile, + inc_membership_cfg = inc_membership_cfg, + inc_extended_profile = inc_extended_profile, + inc_person = inc_person, + inc_user = inc_user, ).dict(by_alias=by_alias, exclude_unset=exclude_unset) ) - data = membership_obj_li + data = membership_type_obj_li else: - log.debug(membership_obj_result) + log.debug(membership_type_obj_result) return mk_resp(data=None, status_code=404) # Not Found return mk_resp(data=data) -# ### BEGIN ### API Membership ### get_membership_obj() ### -# Working well as of 2021-06-04. Using as a template for other routes. -@router.get('/{membership_id}', response_model=Resp_Body_Base) -async def get_membership_obj( - membership_id: str = Query(..., min_length=1, max_length=22), +# ### BEGIN ### API Membership Type ### get_membership_type_obj() ### +# Working well as of 2021-06-21. Using as a template for other routes. +@router.get('/{membership_type_id}', response_model=Resp_Body_Base) +async def get_membership_type_obj( + membership_type_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 @@ -191,7 +191,7 @@ async def get_membership_obj( inc_membership_cfg: bool = False, inc_membership_group_list: bool = False, # Per member inc_membership_member_list: bool = False, - inc_membership_profile: bool = False, # Per member + inc_membership_member_profile: bool = False, # Per member inc_organization: bool = False, # Per member inc_person: bool = False, # Per member inc_product: bool = False, # Per member @@ -204,38 +204,39 @@ async def get_membership_obj( log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) - if membership_id := redis_lookup_id_random(record_id_random=membership_id, table_name='membership'): pass + if membership_type_id := redis_lookup_id_random(record_id_random=membership_type_id, table_name='membership_type'): pass else: return mk_resp(data=None, status_code=404) - if membership_obj := load_membership_obj( - membership_id = membership_id, - enabled = enabled, - # model_as_dict = model_as_dict, - limit = limit, - 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_list = inc_membership_member_list, - inc_membership_profile = inc_membership_profile, - inc_organization = inc_organization, - inc_person = inc_person, - inc_product = inc_product, - inc_product_list = inc_product_list, - inc_user = inc_user, - ): - # membership_dict = membership_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) + if membership_type_result := load_membership_type_obj( + membership_type_id = membership_type_id, + limit = limit, + by_alias = by_alias, + exclude_unset = exclude_unset, + # model_as_dict = model_as_dict, # NOTE: returning model as a 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_member_list = inc_membership_member_list, + inc_membership_member_profile = inc_membership_member_profile, + inc_organization = inc_organization, + inc_person = inc_person, + inc_product = inc_product, + inc_product_list = inc_product_list, + inc_user = inc_user, + ): pass else: return mk_resp(data=False, status_code=400) # Bad Request - return mk_resp(data=membership_obj) -# ### END ### API Membership ### get_membership_obj() ### + return mk_resp(data=membership_type_result) +# ### END ### API Membership ### get_membership_type_obj() ### @router.get('/{obj_id}', response_model=Resp_Body_Base) -async def get_membership_obj_old( +async def get_membership_type_obj_old( obj_id: str = Query(..., min_length=1, max_length=22), x_account_id: str = Header(...), by_alias: Optional[bool] = True, @@ -244,7 +245,7 @@ async def get_membership_obj_old( log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) - obj_type = 'membership' + obj_type = 'membership_type' result = get_obj_template( obj_type=obj_type, obj_id=obj_id, @@ -255,14 +256,14 @@ async def get_membership_obj_old( @router.delete('/{obj_id}', response_model=Resp_Body_Base) -async def delete_membership_obj( +async def delete_membership_type_obj( obj_id: str = Query(..., min_length=1, max_length=22), x_account_id: str = Header(...), ): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) - obj_type = 'membership' + obj_type = 'membership_type' result = delete_obj_template( obj_type=obj_type, obj_id=obj_id, diff --git a/app/routers/product.py b/app/routers/product.py index 0023894..c51d4ab 100644 --- a/app/routers/product.py +++ b/app/routers/product.py @@ -104,7 +104,7 @@ async def get_product_obj_li( sql_for_obj_type = f"""`product`.for_type = :for_obj_type AND `product`.for_id = :for_obj_id""" else: sql_for_obj_type = '' - if prod_type in ['event', 'event_option', 'membership', 'fundraising']: + if prod_type in ['event', 'event_option', 'event_registration', 'fundraising', 'membership_group', 'membership_type']: data['type_name'] = prod_type sql_product_type = f"""AND product.type_name = :type_name"""