From 6f8e18750c6e790a44273311c6faed058c508e1d Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Tue, 13 Jul 2021 18:19:36 -0400 Subject: [PATCH] Work on Svelte integration --- app/main.py | 15 +++- app/methods/membership_cfg_methods.py | 2 +- .../membership_person_profile_methods.py | 37 +++++++-- app/models/membership_cfg_models.py | 9 ++- .../membership_person_profile_models.py | 31 +++++++- app/routers/membership_cfg.py | 45 +++++++++++ app/routers/membership_person.py | 2 +- app/routers/membership_person_profile.py | 75 +++++++++++++++++++ 8 files changed, 203 insertions(+), 13 deletions(-) create mode 100644 app/routers/membership_cfg.py create mode 100644 app/routers/membership_person_profile.py diff --git a/app/main.py b/app/main.py index b9f1114..17b7b29 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_group, membership_person, 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_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.db_sql import db @@ -164,16 +164,27 @@ app.include_router( prefix='/lu', tags=['Lookup'], ) +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_person_profile.router, + # prefix='/membership/person/profile', + tags=['Membership Person Profile'], +) app.include_router( membership_person.router, - # prefix='/membership/member', + # prefix='/membership/person', tags=['Membership Person'], ) + app.include_router( membership_type.router, # prefix='/membership/type', diff --git a/app/methods/membership_cfg_methods.py b/app/methods/membership_cfg_methods.py index 8f70567..bd217a0 100644 --- a/app/methods/membership_cfg_methods.py +++ b/app/methods/membership_cfg_methods.py @@ -18,7 +18,7 @@ def load_membership_cfg_obj( exclude_unset: bool = True, model_as_dict: bool = False, ) -> Membership_Cfg_Base|dict|bool: - log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass diff --git a/app/methods/membership_person_profile_methods.py b/app/methods/membership_person_profile_methods.py index b2d865f..3d9cb71 100644 --- a/app/methods/membership_person_profile_methods.py +++ b/app/methods/membership_person_profile_methods.py @@ -6,31 +6,43 @@ 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.methods.membership_cfg_methods import load_membership_cfg_obj from app.models.membership_person_profile_models import Membership_Person_Profile_Base # ### BEGIN ### API Membership Person Profile Methods ### load_membership_person_profile_obj() ### +# Updated 2021-07-13 def load_membership_person_profile_obj( - membership_person_profile_id: int|str, + membership_person_profile_id: int|str|None = None, + membership_person_id: int|str|None = None, by_alias: bool = True, exclude_unset: bool = True, model_as_dict: bool = False, inc_address: bool = False, inc_contact: bool = False, + inc_membership_cfg: bool = False, inc_organization: bool = False, ) -> Membership_Person_Profile_Base|dict|bool: log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if membership_person_profile_id := redis_lookup_id_random(record_id_random=membership_person_profile_id, table_name='membership_person_profile'): pass - else: return False + if membership_person_id := redis_lookup_id_random(record_id_random=membership_person_id, table_name='membership_person'): pass - if membership_person_profile_rec := sql_select( - table_name='v_membership_person_profile', - record_id=membership_person_profile_id, - ): pass - else: return False + if membership_person_profile_id: + if membership_person_profile_rec := sql_select( + table_name = 'v_membership_person_profile', + record_id = membership_person_profile_id, + ): pass + else: return False + elif membership_person_id: + if membership_person_profile_rec := sql_select( + table_name = 'v_membership_person_profile', + field_name = 'membership_person_id', + field_value = membership_person_id, + ): pass + else: return False log.debug(membership_person_profile_rec) try: membership_person_profile_obj = Membership_Person_Profile_Base(**membership_person_profile_rec) @@ -38,6 +50,17 @@ def load_membership_person_profile_obj( except ValidationError as e: log.error(e.json()) + # Updated 2021-07-13 + if inc_membership_cfg: + if membership_cfg_obj_result := load_membership_cfg_obj( + account_id = membership_person_profile_rec.get('account_id', None), + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = model_as_dict, + ): + membership_person_profile_obj.membership_cfg = membership_cfg_obj_result + else: membership_person_profile_obj.membership_cfg = None + if model_as_dict: return membership_person_profile_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member else: diff --git a/app/models/membership_cfg_models.py b/app/models/membership_cfg_models.py index 54465c8..3767fb4 100644 --- a/app/models/membership_cfg_models.py +++ b/app/models/membership_cfg_models.py @@ -42,6 +42,13 @@ class Membership_Cfg_Base(BaseModel): # extended_membership_person_profile: Optional[str] # list of dicts outlining extended (custom) membership profile fields for client # extended_membership_person_profile: Optional[Json] = '[]' # list of dicts outlining extended (custom) membership profile fields for client # extended_membership_person_profile: Optional[Json] # list of dicts outlining extended (custom) membership profile fields for client - extended_membership_person_profile: Optional[str] # list of dicts outlining extended (custom) membership profile fields for client + extended_membership_person_profile: Optional[Json] = Field( + alias = 'extended_profile' + ) # list of dicts outlining extended (custom) membership profile fields for client + + class Config: + underscore_attrs_are_private = True + allow_population_by_field_name = True + fields = base_fields Membership_Cfg_Base.update_forward_refs() diff --git a/app/models/membership_person_profile_models.py b/app/models/membership_person_profile_models.py index 1b50da4..9c9be5c 100644 --- a/app/models/membership_person_profile_models.py +++ b/app/models/membership_person_profile_models.py @@ -9,11 +9,12 @@ 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_cfg_models import Membership_Cfg_Base from app.models.organization_models import Organization_Base class Membership_Person_Profile_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( @@ -25,6 +26,9 @@ class Membership_Person_Profile_Base(BaseModel): alias = 'membership_person_profile_id' ) + account_id_random: Optional[str] + account_id: Optional[int] + contact_id_random: Optional[str] contact_id: Optional[int] @@ -46,8 +50,14 @@ class Membership_Person_Profile_Base(BaseModel): created_on: Optional[datetime.datetime] = None updated_on: Optional[datetime.datetime] = None + # Including JSON data + extended_json: Optional[Json] + # Including other related objects contact: Optional[Contact_Base] + membership_cfg: Optional[Membership_Cfg_Base] = Field( + alias = 'cfg', + ) organization: Optional[Organization_Base] _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) @@ -71,6 +81,15 @@ class Membership_Person_Profile_Base(BaseModel): return redis_lookup_id_random(record_id_random=values['id_random'], table_name='membership_person_profile') return None + @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('contact_id', always=True) def contact_id_lookup(cls, v, values, **kwargs): log.setLevel(logging.WARNING) @@ -91,4 +110,14 @@ class Membership_Person_Profile_Base(BaseModel): class Config: underscore_attrs_are_private = True + allow_population_by_field_name = True fields = base_fields + + +class Membership_Person_Profile_Base_Up(Membership_Person_Profile_Base): + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + + # Including JSON data + extended_json: Optional[str] diff --git a/app/routers/membership_cfg.py b/app/routers/membership_cfg.py new file mode 100644 index 0000000..12e3fa3 --- /dev/null +++ b/app/routers/membership_cfg.py @@ -0,0 +1,45 @@ +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 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_cfg_methods import load_membership_cfg_obj + +from app.models.response_models import Resp_Body_Base, mk_resp + + +router = APIRouter() + + +# ### BEGIN ### API Membership Cfg ### get_account_obj_membership_cfg() ### +# Updated 2021-07-13 +@router.get('/account/{account_id}/membership/cfg', response_model=Resp_Body_Base) +async def get_account_obj_membership_cfg( + account_id: str = Query(..., 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()) + + if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass + else: return mk_resp(data=None, status_code=404) + + if membership_cfg_result := load_membership_cfg_obj( + account_id = account_id, + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = True, + ): + response_data = membership_cfg_result + else: return mk_resp(data=False, status_code=400) # Bad Request + + return mk_resp(data=response_data) +# ### END ### API Membership Cfg ### get_account_obj_membership_cfg() ### diff --git a/app/routers/membership_person.py b/app/routers/membership_person.py index 337389e..e5dabd1 100644 --- a/app/routers/membership_person.py +++ b/app/routers/membership_person.py @@ -174,7 +174,7 @@ async def get_account_obj_membership_person_list( # ### BEGIN ### API Membership Person ### get_person_obj_membership_person() ### # Working well as of 2021-07-09. Using as a template for other routes. -@router.get('/person/{person_id}/membership_person', response_model=Resp_Body_Base) +@router.get('/person/{person_id}/membership/person', response_model=Resp_Body_Base) async def get_person_obj_membership_person( person_id: str = Query(..., min_length=1, max_length=22), limit: int = 500, # For now this covers any included objects or object lists diff --git a/app/routers/membership_person_profile.py b/app/routers/membership_person_profile.py new file mode 100644 index 0000000..3e6e1b8 --- /dev/null +++ b/app/routers/membership_person_profile.py @@ -0,0 +1,75 @@ +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 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_person_profile_methods import load_membership_person_profile_obj + +from app.models.membership_person_profile_models import Membership_Person_Profile_Base, Membership_Person_Profile_Base_Up +from app.models.response_models import Resp_Body_Base, mk_resp + + +router = APIRouter() + + +@router.patch('/membership/person/profile/{obj_id}', response_model=Resp_Body_Base) +async def patch_membership_person_profile_obj( + obj_id: str = Query(..., min_length=1, max_length=22), + obj: Membership_Person_Profile_Base_Up = 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_person_profile' + 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 Profile ### get_membership_person_obj_profile() ### +# Updated 2021-07-13 +@router.get('/membership/person/{membership_person_id}/profile', response_model=Resp_Body_Base) +async def get_membership_person_obj_profile( + membership_person_id: str = Query(..., min_length=1, max_length=22), + inc_membership_cfg: bool = False, + x_account_id: str = Header(...), + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if membership_person_id := redis_lookup_id_random(record_id_random=membership_person_id, table_name='membership_person'): pass + else: return mk_resp(data=None, status_code=404) + + if membership_person_profile_result := load_membership_person_profile_obj( + membership_person_id = membership_person_id, + inc_membership_cfg = inc_membership_cfg, + by_alias = by_alias, + exclude_unset = exclude_unset, + model_as_dict = True, + ): + response_data = membership_person_profile_result + else: return mk_resp(data=False, status_code=400) # Bad Request + + return mk_resp(data=response_data) +# ### END ### API Membership Profile ### get_membership_person_obj_profile() ###