From ae1cd473eda324e7f6bc1caeb6413db5aee4dc6d Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Tue, 27 Jul 2021 15:39:47 -0400 Subject: [PATCH] Working on membership and related modules --- app/db_sql.py | 12 +- app/main.py | 16 +-- app/models/membership_person_models.py | 82 +++++++------- app/models/membership_type_person_models.py | 15 +-- app/routers/membership_group_person.py | 119 ++++++++++++++++++++ app/routers/membership_person.py | 16 ++- app/routers/membership_type_person.py | 119 ++++++++++++++++++++ 7 files changed, 318 insertions(+), 61 deletions(-) create mode 100644 app/routers/membership_group_person.py create mode 100644 app/routers/membership_type_person.py diff --git a/app/db_sql.py b/app/db_sql.py index 316334b..a68fa63 100644 --- a/app/db_sql.py +++ b/app/db_sql.py @@ -671,13 +671,13 @@ def sql_delete( # If not success and there is a table_name then check the database table passed # If found in database table then store in Redis and return the ID number def redis_lookup_id_random(record_id_random:int|str, table_name:str): - #log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + # log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if isinstance(record_id_random, str) and len(record_id_random) >= 11 and len(record_id_random) <= 22: pass elif isinstance(record_id_random, int): return record_id_random else: - log.warning(f'Unexpected data type or string format: {str(type(record_id_random))} Expected type is a string 11 or 22 characters long.') + log.info(f'Unexpected data type or string format: {str(type(record_id_random))} Expected type is a string 11 or 22 characters long.') return False if record_id_random and table_name: @@ -884,6 +884,10 @@ def lookup_id_random_pop(obj_data:dict): obj_data['membership_group_id'] = redis_lookup_id_random(record_id_random=obj_data.get('membership_group_id_random', None), table_name='membership_group') obj_data.pop('membership_group_id_random') + if 'membership_group_person_id_random' in obj_data: + obj_data['membership_group_person_id'] = redis_lookup_id_random(record_id_random=obj_data.get('membership_group_person_id_random', None), table_name='membership_group_person') + obj_data.pop('membership_group_person_id_random') + if 'membership_person_id_random' in obj_data: obj_data['membership_person_id'] = redis_lookup_id_random(record_id_random=obj_data.get('membership_person_id_random', None), table_name='membership_person') obj_data.pop('membership_person_id_random') @@ -892,6 +896,10 @@ def lookup_id_random_pop(obj_data:dict): obj_data['membership_type_id'] = redis_lookup_id_random(record_id_random=obj_data.get('membership_type_id_random', None), table_name='membership_type') obj_data.pop('membership_type_id_random') + if 'membership_type_person_id_random' in obj_data: + obj_data['membership_type_person_id'] = redis_lookup_id_random(record_id_random=obj_data.get('membership_type_person_id_random', None), table_name='membership_type_person') + obj_data.pop('membership_type_person_id_random') + if 'order_id_random' in obj_data: obj_data['order_id'] = redis_lookup_id_random(record_id_random=obj_data.get('order_id_random', None), table_name='order') obj_data.pop('order_id_random') diff --git a/app/main.py b/app/main.py index e4df7d1..c178d17 100644 --- a/app/main.py +++ b/app/main.py @@ -18,7 +18,7 @@ from app.lib_general import log, logging 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, log_client_viewing, lookup, membership_cfg, membership_group, membership_person, membership_person_profile, membership_type, 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, log_client_viewing, lookup, membership_cfg, membership_group, membership_group_person, membership_person, membership_person_profile, membership_type, membership_type_person, 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 @@ -166,30 +166,32 @@ app.include_router( ) app.include_router( membership_cfg.router, - # prefix='/membership/cfg', tags=['Membership Config'], ) app.include_router( membership_group.router, - # prefix='/membership/group', tags=['Membership Group'], ) +app.include_router( + membership_group_person.router, + tags=['Membership Group Person'], +) app.include_router( membership_person_profile.router, - # prefix='/membership/person/profile', tags=['Membership Person Profile'], ) app.include_router( membership_person.router, - # prefix='/membership/person', tags=['Membership Person'], ) - app.include_router( membership_type.router, - # prefix='/membership/type', tags=['Membership Type'], ) +app.include_router( + membership_type_person.router, + tags=['Membership Type Person'], +) app.include_router( order.router, prefix='/order', diff --git a/app/models/membership_person_models.py b/app/models/membership_person_models.py index 1518c60..1a6dd8e 100644 --- a/app/models/membership_person_models.py +++ b/app/models/membership_person_models.py @@ -20,7 +20,7 @@ from app.models.product_models import Product_Base class Membership_Person_Base(BaseModel): - log.setLevel(logging.WARNING) + log.setLevel(logging.DEBUG) log.debug(locals()) id_random: Optional[str] = Field( @@ -42,15 +42,15 @@ class Membership_Person_Base(BaseModel): alias = 'status_name' ) - membership_group_id_random: Optional[str] = Field( - alias = 'group_id_random', - ) # NOTE: This is not optional - membership_group_id: Optional[int] = Field( - alias = 'group_id', - ) # NOTE: This is not optional - membership_group_name: Optional[str] = Field( - alias = 'group_name', - ) + # membership_group_id_random: Optional[str] = Field( + # alias = 'group_id_random', + # ) # NOTE: This is not optional + # membership_group_id: Optional[int] = Field( + # alias = 'group_id', + # ) # NOTE: This is not optional + # membership_group_name: Optional[str] = Field( + # alias = 'group_name', + # ) membership_group_person_id_random: Optional[str] = Field( alias = 'group_person_id_random', @@ -62,15 +62,15 @@ class Membership_Person_Base(BaseModel): alias = 'group_person_name', ) - membership_type_id_random: Optional[str] = Field( - alias = 'type_id_random', - ) # NOTE: This is not optional - membership_type_id: Optional[int] = Field( - alias = 'type_id', - ) # NOTE: This is not optional - membership_type_name: Optional[str] = Field( - alias = 'type_name', - ) + # membership_type_id_random: Optional[str] = Field( + # alias = 'type_id_random', + # ) # NOTE: This is not optional + # membership_type_id: Optional[int] = Field( + # alias = 'type_id', + # ) # NOTE: This is not optional + # membership_type_name: Optional[str] = Field( + # alias = 'type_name', + # ) membership_type_person_id_random: Optional[str] = Field( alias = 'type_person_id_random', @@ -103,13 +103,15 @@ class Membership_Person_Base(BaseModel): level: Optional[int] = Field(0, ge=0, lt=150) - application_start_on: Optional[datetime.datetime] = None - approved_on: Optional[datetime.datetime] = None - first_start_on: Optional[datetime.datetime] = None - start_buffer_on: Optional[datetime.datetime] = None - start_on: Optional[datetime.datetime] = None - end_on: Optional[datetime.datetime] = None - end_buffer_on: Optional[datetime.datetime] = None + first_application_start_on: Optional[datetime.datetime] + # application_start_on: Optional[datetime.datetime] + first_approved_on: Optional[datetime.datetime] + first_start_on: Optional[datetime.datetime] + start_buffer_on: Optional[datetime.datetime] + start_on: Optional[datetime.datetime] + end_on: Optional[datetime.datetime] + end_buffer_on: Optional[datetime.datetime] + last_end_on: Optional[datetime.datetime] flag: Optional[bool] flag_message: Optional[str] @@ -183,14 +185,14 @@ class Membership_Person_Base(BaseModel): return redis_lookup_id_random(record_id_random=values['account_id_random'], table_name='account') return None - @validator('membership_group_id', always=True) - def membership_group_id_lookup(cls, v, values, **kwargs): - log.setLevel(logging.WARNING) - log.debug(locals()) + # @validator('membership_group_id', always=True) + # def membership_group_id_lookup(cls, v, values, **kwargs): + # log.setLevel(logging.DEBUG) + # 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 + # if values.get('membership_group_id_random', None): + # return redis_lookup_id_random(record_id_random=values['membership_group_id_random'], table_name='membership_group') + # return None @validator('membership_group_person_id', always=True) def membership_group_person_id_lookup(cls, v, values, **kwargs): @@ -201,14 +203,14 @@ class Membership_Person_Base(BaseModel): return redis_lookup_id_random(record_id_random=values['membership_group_person_id_random'], table_name='membership_group_person') return None - @validator('membership_type_id', always=True) - def membership_type_id_lookup(cls, v, values, **kwargs): - log.setLevel(logging.WARNING) - log.debug(locals()) + # @validator('membership_type_id', always=True) + # def membership_type_id_lookup(cls, v, values, **kwargs): + # log.setLevel(logging.DEBUG) + # log.debug(locals()) - 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 + # if values.get('membership_type_id_random', None): + # return redis_lookup_id_random(record_id_random=values['membership_type_id_random'], table_name='membership_type') + # return None @validator('membership_type_person_id', always=True) def membership_type_person_id_lookup(cls, v, values, **kwargs): diff --git a/app/models/membership_type_person_models.py b/app/models/membership_type_person_models.py index e3225be..f2cc0d9 100644 --- a/app/models/membership_type_person_models.py +++ b/app/models/membership_type_person_models.py @@ -54,13 +54,14 @@ class Membership_Type_Person_Base(BaseModel): level: Optional[int] = Field(0, ge=0, lt=150) - application_start_on: Optional[datetime.datetime] = None - approved_on: Optional[datetime.datetime] = None - first_start_on: Optional[datetime.datetime] = None - start_buffer_on: Optional[datetime.datetime] = None - start_on: Optional[datetime.datetime] = None - end_on: Optional[datetime.datetime] = None - end_buffer_on: Optional[datetime.datetime] = None + application_start_on: Optional[datetime.datetime] + approved_on: Optional[datetime.datetime] + first_start_on: Optional[datetime.datetime] + start_buffer_on: Optional[datetime.datetime] + start_on: Optional[datetime.datetime] + end_on: Optional[datetime.datetime] + end_buffer_on: Optional[datetime.datetime] + last_end_on: Optional[datetime.datetime] flag: Optional[bool] flag_message: Optional[str] diff --git a/app/routers/membership_group_person.py b/app/routers/membership_group_person.py new file mode 100644 index 0000000..42df866 --- /dev/null +++ b/app/routers/membership_group_person.py @@ -0,0 +1,119 @@ +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_person_methods import get_membership_group_person_rec_list, load_membership_group_person_obj + +from app.models.membership_group_person_models import Membership_Group_Person_Base +from app.models.response_models import Resp_Body_Base, mk_resp + + +router = APIRouter() + + +@router.post('/membership/group/person', response_model=Resp_Body_Base) +async def post_membership_group_person_obj( + obj: Membership_Group_Person_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_person' + obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) + result = post_obj_template( + obj_type=obj_type, + data=obj_data_dict, + return_obj=True, + by_alias=True, + exclude_unset=True, + ) + return result + + +@router.patch('/membership/group/person/{obj_id}', response_model=Resp_Body_Base) +async def patch_membership_group_person_obj( + obj_id: str = Query(..., min_length=1, max_length=22), + obj: Membership_Group_Person_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_person' + obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) + obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type) + obj_data_dict['id_random'] = obj_id + result = patch_obj_template( + obj_type=obj_type, + data=obj_data_dict, + obj_id=obj_id, + return_obj=True, + by_alias=True, + exclude_unset=True, + ) + return result + + +# ### BEGIN ### API Membership Type Person ### get_membership_group_person_obj() ### +# Updated 2021-07-27 +@router.get('/membership/group/person/{membership_group_person_id}', response_model=Resp_Body_Base) +async def get_membership_group_person_obj( + membership_group_person_id: str = Query(..., min_length=1, max_length=22), + enabled: str = 'enabled', # For now this covers any included objects or object lists + limit: int = 500, # For now this covers any included objects or object lists + inc_product: bool = False, # Per member or group member belongs to + x_account_id: str = Header(...), + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if membership_group_person_id := redis_lookup_id_random(record_id_random=membership_group_person_id, table_name='membership_group_person'): pass + else: return mk_resp(data=None, status_code=404) + + if membership_group_person_result := load_membership_group_person_obj( + membership_group_person_id = membership_group_person_id, + limit = limit, + by_alias = by_alias, + exclude_unset = exclude_unset, + # model_as_dict = model_as_dict, + enabled = enabled, + inc_product = inc_product, + ): + response_data = membership_group_person_result + else: + return mk_resp(data=False, status_code=400) # Bad Request + + return mk_resp(data=response_data) +# ### END ### API Membership Type Person ### get_membership_group_person_obj() ### + + +@router.delete('/membership/group/person/{obj_id}', response_model=Resp_Body_Base) +async def delete_membership_group_person_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_person' + 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_person.py b/app/routers/membership_person.py index 783f76a..471cf36 100644 --- a/app/routers/membership_person.py +++ b/app/routers/membership_person.py @@ -332,7 +332,7 @@ async def lookup_membership_person_obj( return mk_resp(data=data) -# ### BEGIN ### API Membership Group ### get_membership_person_obj() ### +# ### BEGIN ### API Membership Person ### get_membership_person_obj() ### # Working well as of 2021-06-24. Using as a template for other routes. @router.get('/membership/person/{membership_person_id}', response_model=Resp_Body_Base) async def get_membership_person_obj( @@ -344,7 +344,9 @@ async def get_membership_person_obj( inc_membership_cfg: bool = False, inc_membership_group_list: bool = False, # List of groups per member inc_membership_person_profile: bool = False, + inc_membership_person_profile_cust: bool = False, # Extended profile? inc_membership_type: bool = False, + inc_membership_type_person: bool = False, # inc_order: bool = False, inc_organization: bool = False, inc_person: bool = False, @@ -373,7 +375,11 @@ async def get_membership_person_obj( inc_membership_cfg = inc_membership_cfg, inc_membership_group_list = inc_membership_group_list, inc_membership_person_profile = inc_membership_person_profile, - inc_membership_type = inc_membership_type, + inc_membership_person_profile_cust = inc_membership_person_profile_cust, + inc_membership_type = inc_membership_type, # The primary membership type, if there is one. + # inc_membership_type_list = inc_membership_type_list, # All the membership types they are a part of. + inc_membership_type_person = inc_membership_type_person, + # inc_membership_type_person_list = inc_membership_type_list, # inc_order = inc_order, inc_organization = inc_organization, inc_person = inc_person, @@ -381,12 +387,12 @@ async def get_membership_person_obj( inc_product_list = inc_product_list, inc_user = inc_user, ): - pass + response_data = membership_person_result else: return mk_resp(data=False, status_code=400) # Bad Request - return mk_resp(data=membership_person_result) -# ### END ### API Membership ### get_membership_person_obj() ### + return mk_resp(data=response_data) +# ### END ### API Membership Person ### get_membership_person_obj() ### @router.delete('/membership/person/{obj_id}', response_model=Resp_Body_Base) diff --git a/app/routers/membership_type_person.py b/app/routers/membership_type_person.py new file mode 100644 index 0000000..3ff65ca --- /dev/null +++ b/app/routers/membership_type_person.py @@ -0,0 +1,119 @@ +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_type_person_methods import get_membership_type_person_rec_list, load_membership_type_person_obj + +from app.models.membership_type_person_models import Membership_Type_Person_Base +from app.models.response_models import Resp_Body_Base, mk_resp + + +router = APIRouter() + + +@router.post('/membership/type/person', response_model=Resp_Body_Base) +async def post_membership_type_person_obj( + obj: Membership_Type_Person_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_type_person' + obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) + result = post_obj_template( + obj_type=obj_type, + data=obj_data_dict, + return_obj=True, + by_alias=True, + exclude_unset=True, + ) + return result + + +@router.patch('/membership/type/person/{obj_id}', response_model=Resp_Body_Base) +async def patch_membership_type_person_obj( + obj_id: str = Query(..., min_length=1, max_length=22), + obj: Membership_Type_Person_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_type_person' + obj_data_dict = obj.dict(by_alias=False, exclude_unset=True) + obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type) + obj_data_dict['id_random'] = obj_id + result = patch_obj_template( + obj_type=obj_type, + data=obj_data_dict, + obj_id=obj_id, + return_obj=True, + by_alias=True, + exclude_unset=True, + ) + return result + + +# ### BEGIN ### API Membership Type Person ### get_membership_type_person_obj() ### +# Updated 2021-07-27 +@router.get('/membership/type/person/{membership_type_person_id}', response_model=Resp_Body_Base) +async def get_membership_type_person_obj( + membership_type_person_id: str = Query(..., min_length=1, max_length=22), + enabled: str = 'enabled', # For now this covers any included objects or object lists + limit: int = 500, # For now this covers any included objects or object lists + inc_product: bool = False, # Per member or group member belongs to + x_account_id: str = Header(...), + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if membership_type_person_id := redis_lookup_id_random(record_id_random=membership_type_person_id, table_name='membership_type_person'): pass + else: return mk_resp(data=None, status_code=404) + + if membership_type_person_result := load_membership_type_person_obj( + membership_type_person_id = membership_type_person_id, + limit = limit, + by_alias = by_alias, + exclude_unset = exclude_unset, + # model_as_dict = model_as_dict, + enabled = enabled, + inc_product = inc_product, + ): + response_data = membership_type_person_result + else: + return mk_resp(data=False, status_code=400) # Bad Request + + return mk_resp(data=response_data) +# ### END ### API Membership Type Person ### get_membership_type_person_obj() ### + + +@router.delete('/membership/type/person/{obj_id}', response_model=Resp_Body_Base) +async def delete_membership_type_person_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_type_person' + result = delete_obj_template( + obj_type=obj_type, + obj_id=obj_id, + ) + return result \ No newline at end of file