From a0514b5179cb61103b37d807bfddd1c66a97de86 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Mon, 28 Jun 2021 14:23:06 -0400 Subject: [PATCH] Working on membership, person, user, and order --- app/methods/address_methods.py | 2 +- app/methods/contact_methods.py | 2 +- app/methods/order_methods.py | 38 ++++----- app/models/address_models.py | 4 +- app/models/contact_models.py | 2 +- app/models/person_models.py | 8 +- app/routers/person.py | 137 +++++++++++++++++++++++++++++++++ app/routers/user.py | 81 +++++++++++++------ 8 files changed, 225 insertions(+), 49 deletions(-) diff --git a/app/methods/address_methods.py b/app/methods/address_methods.py index 719c7e3..65aca57 100644 --- a/app/methods/address_methods.py +++ b/app/methods/address_methods.py @@ -167,7 +167,7 @@ def create_update_address_obj( address_obj.id = address_id else: # Insert record now and update later - address_dict_in = address_obj.dict(by_alias=False, exclude_unset=True, exclude={'address', 'organization', 'user'}) + address_dict_in = address_obj.dict(by_alias=False, exclude_unset=True) log.debug(address_dict_in) address_in_result = sql_insert( data = address_dict_in, diff --git a/app/methods/contact_methods.py b/app/methods/contact_methods.py index fdd75a5..48db73e 100644 --- a/app/methods/contact_methods.py +++ b/app/methods/contact_methods.py @@ -233,7 +233,7 @@ def create_update_contact_obj( contact_obj.id = contact_id else: # Insert record now and update later - contact_dict_in = contact_obj.dict(by_alias=False, exclude_unset=True, exclude={'contact', 'organization', 'user'}) + contact_dict_in = contact_obj.dict(by_alias=False, exclude_unset=True, exclude={'address', 'contact', 'organization', 'user'}) log.debug(contact_dict_in) contact_in_result = sql_insert( data = contact_dict_in, diff --git a/app/methods/order_methods.py b/app/methods/order_methods.py index 061b375..1c7f5c4 100644 --- a/app/methods/order_methods.py +++ b/app/methods/order_methods.py @@ -193,6 +193,18 @@ def load_order_obj( except ValidationError as e: log.error(e.json()) + if inc_order_cfg: + if order_cfg_result := load_order_cfg_obj( + order_cfg_id = order_rec.get('order_cfg_id', None), + limit = limit, + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = model_as_dict, + enabled = enabled, + ): + order_obj.order_cfg = order_cfg_result + else: order_obj.order_cfg = None + # Updated 2021-06-18 if inc_order_line_list: if order_line_rec_list_result := get_order_line_rec_list( @@ -214,24 +226,12 @@ def load_order_obj( order_obj.order_line_list = order_line_result_list else: order_obj.order_line_list = [] - if inc_order_line_list: - order_line_data = {} - order_line_data['order_id'] = order_id - if order_line_rec_li := sql_select(table_name='v_order_line', data=order_line_data, as_list=True):#, field_name='order_id', field_value=order_id): - log.debug(order_line_rec_li) - order_rec['order_line_li'] = order_line_rec_li - - if inc_order_cfg: - if order_cfg_result := load_order_cfg_obj( - order_cfg_id = order_rec.get('order_cfg_id', None), - limit = limit, - by_alias = by_alias, - exclude_unset = exclude_unset, - model_as_dict = model_as_dict, - enabled = enabled, - ): - order_obj.order_cfg = order_cfg_result - else: order_obj.order_cfg = None + # if inc_order_line_list: + # order_line_data = {} + # order_line_data['order_id'] = order_id + # if order_line_rec_li := sql_select(table_name='v_order_line', data=order_line_data, as_list=True):#, field_name='order_id', field_value=order_id): + # log.debug(order_line_rec_li) + # order_rec['order_line_li'] = order_line_rec_li # Updated 2021-06-22 if inc_person: @@ -276,6 +276,8 @@ def get_order_rec_list( for_obj_id: str, limit: int = 1000, enabled: str = 'enabled', # enabled, disabled, all + from_datetime: datetime.datetime = None, + to_datetime: datetime.datetime = None, status: str = 'complete', # started, in progress, complete, all balance_gt: int = 0, # $0 to $99999 ) -> list|bool: diff --git a/app/models/address_models.py b/app/models/address_models.py index 44ebed7..81a949b 100644 --- a/app/models/address_models.py +++ b/app/models/address_models.py @@ -84,7 +84,7 @@ class Address_Base(BaseModel): log.setLevel(logging.WARNING) log.debug(locals()) - if values['id_random']: + if values.get('id_random', None): # values['id_random']: log.debug(values['id_random']) return redis_lookup_id_random(record_id_random=values['id_random'], table_name='address') return None @@ -103,7 +103,7 @@ class Address_Base(BaseModel): log.setLevel(logging.WARNING) log.debug(locals()) - if values['contact_id_random']: + if values.get('contact_id_random', None): # values['contact_id_random']: return redis_lookup_id_random(record_id_random=values['contact_id_random'], table_name='contact') return None diff --git a/app/models/contact_models.py b/app/models/contact_models.py index 1840cd1..934534f 100644 --- a/app/models/contact_models.py +++ b/app/models/contact_models.py @@ -90,7 +90,7 @@ class Contact_Base(BaseModel): log.setLevel(logging.WARNING) log.debug(locals()) - if values['id_random']: + if values.get('id_random', None): # values['id_random']: log.debug(values['id_random']) return redis_lookup_id_random(record_id_random=values['id_random'], table_name='contact') return None diff --git a/app/models/person_models.py b/app/models/person_models.py index fdb37aa..6998756 100644 --- a/app/models/person_models.py +++ b/app/models/person_models.py @@ -16,7 +16,7 @@ from app.models.organization_models import Organization_Base class Person_Base(BaseModel): - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) id_random: Optional[str] = Field( @@ -87,7 +87,7 @@ class Person_Base(BaseModel): log.setLevel(logging.WARNING) log.debug(locals()) - if values['id_random']: + if values.get('id_random', None): # 'id_random' in values and values['id_random']: log.debug(values['id_random']) return redis_lookup_id_random(record_id_random=values['id_random'], table_name='person') return None @@ -101,13 +101,12 @@ class Person_Base(BaseModel): return redis_lookup_id_random(record_id_random=values['account_id_random'], table_name='account') return None - @validator('contact_id', always=True) def contact_id_lookup(cls, v, values, **kwargs): log.setLevel(logging.WARNING) log.debug(locals()) - if values['contact_id_random']: + if values.get('contact_id_random', None): # values['contact_id_random']: return redis_lookup_id_random(record_id_random=values['contact_id_random'], table_name='contact') return None @@ -131,6 +130,7 @@ class Person_Base(BaseModel): class Config: underscore_attrs_are_private = True + allow_population_by_field_name = True fields = base_fields #from .supporting_core_models import Address_Base, Contact_Base, Organization_Base, User_Base diff --git a/app/routers/person.py b/app/routers/person.py index e23e608..d661c69 100644 --- a/app/routers/person.py +++ b/app/routers/person.py @@ -9,6 +9,8 @@ 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_member_methods import get_membership_member_rec_list, load_membership_member_obj +from app.methods.order_methods import get_order_rec_list, load_order_obj from app.methods.person_methods import create_update_person_obj, load_person_obj, update_person_obj from app.models.person_models import Person_Base @@ -241,6 +243,141 @@ async def get_person_obj( # ### END ### API Person ### get_person_obj() ### +# ### BEGIN ### API Person ### get_person_obj_order_list() ### +# Working well as of 2021-06-28. Using as a template for other routes. +@router.get('/{person_id}/membership_member', response_model=Resp_Body_Base) +async def get_person_obj_membership_member( + person_id: str = Query(..., min_length=1, max_length=22), + limit: int = 500, # For now this covers any included objects or object lists + enabled: str = 'enabled', # For now this covers any included objects or object lists + from_datetime: datetime.datetime = None, + to_datetime: datetime.datetime = None, + inc_address: bool = False, + inc_contact: bool = False, + inc_membership_cfg: bool = False, + inc_membership_group_list: bool = False, # Per member + inc_membership_member_list: bool = False, + inc_membership_member_profile: bool = False, # Per member + inc_membership_member_profile_cust: bool = False, # Extended profile? + inc_membership_type: bool = False, # The member_type the member is + # inc_order: bool = False, + inc_organization: bool = False, + inc_product: bool = False, # The product the person actually purchased for a member_type or member_group + inc_product_list: bool = False, # The list of products that give access to a member_type or member_group + inc_user: bool = False, + x_account_id: str = Header(...), + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + ): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass + else: + return mk_resp(data=None, status_code=404) + + # Updated 2021-06-28 + if membership_member_rec_list_result := get_membership_member_rec_list( + for_obj_type = 'person', + for_obj_id = person_id, + limit = limit, + enabled = enabled, + ): + membership_member_result_list = [] + for membership_member_rec in membership_member_rec_list_result: + if load_membership_member_result := load_membership_member_obj( + membership_member_id = membership_member_rec.get('membership_member_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_list = inc_membership_group_list, + inc_membership_member_profile = inc_membership_member_profile, + inc_membership_member_profile_cust = inc_membership_member_profile_cust, + inc_membership_type = inc_membership_type, + # inc_order = inc_order, + inc_organization = inc_organization, + # inc_person = inc_person, + inc_product = inc_product, + inc_product_list = inc_product_list, + inc_user = inc_user, + ): + membership_member_result_list.append(load_membership_member_result) + else: + membership_member_result_list.append(None) + response_data = membership_member_result_list + else: + return mk_resp(data=False, status_code=400) # Bad Request + + return mk_resp(data=response_data) +# ### END ### API Person ### get_person_obj_order_list() ### + + +# ### BEGIN ### API Person ### get_person_obj_order_list() ### +# Working well as of 2021-06-28. Using as a template for other routes. +@router.get('/{person_id}/order_list', response_model=Resp_Body_Base) +async def get_person_obj_order_list( + person_id: str = Query(..., min_length=1, max_length=22), + limit: int = 500, # For now this covers any included objects or object lists + enabled: str = 'enabled', # For now this covers any included objects or object lists + from_datetime: datetime.datetime = None, + to_datetime: datetime.datetime = None, + # inc_address: bool = False, + # inc_contact: bool = False, + inc_order_cfg: bool = False, + inc_order_line_list: bool = False, + status: str = 'complete', + # inc_order_list: bool = False, + # inc_order_cart_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.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass + else: + return mk_resp(data=None, status_code=404) + + # Updated 2021-06-28 + if order_rec_list_result := get_order_rec_list( + for_obj_type = 'person', + for_obj_id = person_id, + limit = limit, + enabled = enabled, + from_datetime = from_datetime, + to_datetime = to_datetime, + status = status, + ): + order_result_list = [] + for order_rec in order_rec_list_result: + if load_order_result := load_order_obj( + order_id = order_rec.get('order_id', None), + limit = limit, + enabled = enabled, + by_alias = by_alias, + exclude_unset = exclude_unset, + # model_as_dict = model_as_dict, + inc_order_cfg = inc_order_cfg, + inc_order_line_list = inc_order_line_list, + ): + order_result_list.append(load_order_result) + else: + order_result_list.append(None) + response_data = order_result_list + else: + return mk_resp(data=False, status_code=400) # Bad Request + + return mk_resp(data=response_data) +# ### END ### API Person ### get_person_obj_order_list() ### + + @router.delete('/{obj_id}', response_model=Resp_Body_Base) async def delete_person_obj( obj_id: str = Query(..., min_length=1, max_length=22), diff --git a/app/routers/user.py b/app/routers/user.py index f02bb90..463acf4 100644 --- a/app/routers/user.py +++ b/app/routers/user.py @@ -9,6 +9,7 @@ from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template +from app.methods.order_methods import get_order_rec_list, load_order_obj from app.methods.user_methods import load_user_obj from app.models.common_field_schema import default_num_bytes @@ -628,29 +629,65 @@ async def get_user_obj( # ### END ### API User ### get_user_obj() ### -# @router.get('/{user_id}', response_model=Resp_Body_Base) -# async def get_user_obj( -# user_id: str = Query(..., min_length=1, max_length=22), -# x_account_id: str = Header(...), -# inc_roles: bool = False, -# inc_contact: bool = False, -# inc_organization: bool = False, -# inc_person: bool = False, -# by_alias: bool = True, -# exclude_unset: bool = True, -# ): -# log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL -# log.debug(locals()) +# ### BEGIN ### API User ### get_user_obj_order_list() ### +# Working well as of 2021-06-28. Using as a template for other routes. +@router.get('/{user_id}/order_list', response_model=Resp_Body_Base) +async def get_user_obj_order_list( + user_id: str = Query(..., min_length=1, max_length=22), + limit: int = 500, # For now this covers any included objects or object lists + enabled: str = 'enabled', # For now this covers any included objects or object lists + from_datetime: datetime.datetime = None, + to_datetime: datetime.datetime = None, + # inc_address: bool = False, + # inc_contact: bool = False, + inc_order_cfg: bool = False, + inc_order_line_list: bool = False, + status: str = 'complete', + # inc_person: bool = False, + # inc_order_list: bool = False, + # inc_order_cart_list: bool = False, + 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()) -# user_obj = load_user_obj( -# user_id=user_id, -# inc_roles=inc_roles, -# inc_contact=inc_contact, -# inc_organization=inc_organization, -# inc_person=inc_person -# ).dict(by_alias=by_alias, exclude_unset=exclude_unset) -# data = user_obj -# return mk_resp(data=data) + if user_id := redis_lookup_id_random(record_id_random=user_id, table_name='user'): pass + else: + return mk_resp(data=None, status_code=404) + + # Updated 2021-06-28 + if order_rec_list_result := get_order_rec_list( + for_obj_type = 'user', + for_obj_id = user_id, + limit = limit, + enabled = enabled, + from_datetime = from_datetime, + to_datetime = to_datetime, + status = status, + ): + order_result_list = [] + for order_rec in order_rec_list_result: + if load_order_result := load_order_obj( + order_id = order_rec.get('order_id', None), + limit = limit, + enabled = enabled, + by_alias = by_alias, + exclude_unset = exclude_unset, + # model_as_dict = model_as_dict, + inc_order_cfg = inc_order_cfg, + inc_order_line_list = inc_order_line_list, + ): + order_result_list.append(load_order_result) + else: + order_result_list.append(None) + response_data = order_result_list + else: + return mk_resp(data=False, status_code=400) # Bad Request + + return mk_resp(data=response_data) +# ### END ### API User ### get_user_obj_order_list() ### @router.delete('/{obj_id}', response_model=Resp_Body_Base)