From 5bed9aadb4393b904511682873823ecce483d90f Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Fri, 20 Aug 2021 12:53:21 -0400 Subject: [PATCH] Added page routes and related methods and updated model. Also general clean up. --- app/methods/page_methods.py | 151 +++++++++++++++++++++++++++++++ app/methods/person_methods.py | 2 +- app/methods/product_methods.py | 2 +- app/models/event_badge_models.py | 2 +- app/models/page_models.py | 3 +- app/models/person_models.py | 2 - app/models/response_models.py | 2 +- app/models/site_models.py | 1 + app/routers/page.py | 53 ++++++++++- app/routers/site.py | 7 +- 10 files changed, 209 insertions(+), 16 deletions(-) create mode 100644 app/methods/page_methods.py diff --git a/app/methods/page_methods.py b/app/methods/page_methods.py new file mode 100644 index 0000000..9361ccd --- /dev/null +++ b/app/methods/page_methods.py @@ -0,0 +1,151 @@ +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_insert_or_update, sql_select, sql_update +from app.lib_general import log, logging + +# from app.methods.address_methods import load_address_obj +from app.methods.contact_methods import create_contact_obj, create_update_contact_obj, load_contact_obj, update_contact_obj +from app.methods.order_methods import load_order_obj, get_order_rec_list +from app.methods.organization_methods import create_update_organization_obj, load_organization_obj, update_organization_obj +# from app.methods.user_methods import create_user_obj, load_user_obj, update_user_obj + +from app.models.common_field_schema import default_num_bytes +from app.models.page_models import Page_Base + + +# ### BEGIN ### API Page Methods ### load_page_obj() ### +# Updated 2021-08-20 +def load_page_obj( + page_id: int|str, + by_alias: bool = True, + exclude_unset: bool = True, + model_as_dict: bool = False, + enabled: str = 'enabled', # enabled, disabled, all + ) -> Page_Base|dict|bool: + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if page_id := redis_lookup_id_random(record_id_random=page_id, table_name='page'): pass + else: return False + + if page_rec := sql_select(table_name='page', record_id=page_id): pass + else: return False + + log.debug(page_rec) + + try: + page_obj = Page_Base(**page_rec) + log.debug(page_obj) + except ValidationError as e: + log.error(e.json()) + return False + + if model_as_dict: + return page_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member + else: + return page_obj +# ### END ### API Page Methods ### load_page_obj() ### + + +# ### BEGIN ### API Page Methods ### get_page_rec_list() ### +# Partially updated 2021-08-20 +def get_page_rec_list( + for_obj_type: str, + for_obj_id: str, + limit: int = 1000, + enabled: str = 'enabled', # enabled, disabled, all + ) -> list|bool: + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name=for_obj_type): pass + else: return False + data = {} + data[f'{for_obj_type}_id'] = for_obj_id + # data['for_obj_type'] = for_obj_type + sql_obj_type_id = f'`page`.{for_obj_type}_id = :{for_obj_type}_id' + + if enabled in ['enabled', 'disabled', 'all']: + if enabled == 'enabled': + data['enable'] = True + sql_enabled = f'AND `page`.enable = :enable' + elif enabled == 'disabled': + data['enable'] = False + sql_enabled = f'AND `page`.enable = :enable' + elif enabled == 'all': + sql_enabled = '' + + if limit: + data['limit'] = limit + sql_limit = f'LIMIT :limit' + else: + sql_limit = '' + + sql = f""" + SELECT `page`.id AS 'page_id', `page`.id_random AS 'page_id_random' + FROM `page` AS `page` + WHERE + {sql_obj_type_id} + {sql_enabled} + ORDER BY `page`.created_on DESC, `page`.updated_on DESC + {sql_limit}; + """ + + if page_rec_li_result := sql_select(data=data, sql=sql, as_list=True): + page_rec_li = page_rec_li_result + else: + page_rec_li = [] + # log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(page_rec_li_result) + + return page_rec_li +# ### END ### API Page Methods ### get_page_rec_list() ### + + +# ### BEGIN ### API Page Methods ### get_page_rec_w_alias() ### +# Updated 2021-08-19 +def get_page_rec_w_alias( + account_id: str, + alias: str, + enabled: str = 'enabled', # enabled, disabled, all + ) -> dict|bool: + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass + else: return False + + data = {} + data['account_id'] = account_id + data['alias'] = alias + if enabled in ['enabled', 'disabled', 'all']: + if enabled == 'enabled': + data['enable'] = True + sql_enabled = f'AND `page`.enable = :enable' + elif enabled == 'disabled': + data['enable'] = False + sql_enabled = f'AND `page`.enable = :enable' + elif enabled == 'all': + sql_enabled = '' + + sql = f""" + SELECT `page`.id AS 'page_id', `page`.id_random AS 'page_id_random' + FROM `page` AS `page` + WHERE page.account_id = :account_id + AND page.alias = :alias + {sql_enabled} + LIMIT 1; + """ + + if page_rec_result := sql_select(data=data, sql=sql): + page_rec = page_rec_result + else: + page_rec = None + log.debug(page_rec_result) + + return page_rec +# ### END ### API Page Methods ### get_page_rec_w_alias() ### diff --git a/app/methods/person_methods.py b/app/methods/person_methods.py index 0fc2b9f..4c41fd4 100644 --- a/app/methods/person_methods.py +++ b/app/methods/person_methods.py @@ -241,7 +241,6 @@ def load_person_obj( person_obj.user = user_result else: person_obj.user = None - print(person_obj) if model_as_dict: return person_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member else: @@ -305,6 +304,7 @@ def get_person_rec_list( # ### BEGIN ### API Person Methods ### get_person_rec_w_external_id() ### +# Updated 2021-08-19 def get_person_rec_w_external_id( account_id: str, external_id: str, diff --git a/app/methods/product_methods.py b/app/methods/product_methods.py index dee636b..0246ba1 100644 --- a/app/methods/product_methods.py +++ b/app/methods/product_methods.py @@ -50,7 +50,7 @@ def get_product_rec_list( limit: int = 1000, enabled: str = 'enabled', # enabled, disabled, all ) -> list|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/models/event_badge_models.py b/app/models/event_badge_models.py index a41d757..451210c 100644 --- a/app/models/event_badge_models.py +++ b/app/models/event_badge_models.py @@ -7,7 +7,7 @@ from pydantic import BaseModel, EmailStr, Field, Json, PrivateAttr, ValidationEr from app.db_sql import redis_lookup_id_random from app.lib_general import log, logging -from .common_field_schema import base_fields, default_num_bytes +from app.models.common_field_schema import base_fields, default_num_bytes class Event_Badge_Base(BaseModel): diff --git a/app/models/page_models.py b/app/models/page_models.py index f9339f4..fd0af6c 100644 --- a/app/models/page_models.py +++ b/app/models/page_models.py @@ -7,7 +7,7 @@ from pydantic import BaseModel, EmailStr, Field, Json, PrivateAttr, ValidationEr from app.db_sql import redis_lookup_id_random from app.lib_general import * -from .common_field_schema import base_fields, default_num_bytes +from app.models.common_field_schema import base_fields, default_num_bytes class Page_Base(BaseModel): @@ -66,6 +66,7 @@ class Page_Base(BaseModel): class Config: underscore_attrs_are_private = True + allow_population_by_field_name = True fields = base_fields Page_Base.update_forward_refs() diff --git a/app/models/person_models.py b/app/models/person_models.py index 753ffd4..e07b4f9 100644 --- a/app/models/person_models.py +++ b/app/models/person_models.py @@ -165,6 +165,4 @@ class Person_Base(BaseModel): allow_population_by_field_name = True fields = base_fields -#from .supporting_core_models import Address_Base, Contact_Base, Organization_Base, User_Base - Person_Base.update_forward_refs() diff --git a/app/models/response_models.py b/app/models/response_models.py index aba2407..ccaab8c 100644 --- a/app/models/response_models.py +++ b/app/models/response_models.py @@ -41,7 +41,7 @@ def mk_resp( exclude_unset: bool = True, response: Response = None ): - log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if data is None: data_out = { 'result': data } diff --git a/app/models/site_models.py b/app/models/site_models.py index da9af22..6ae078c 100644 --- a/app/models/site_models.py +++ b/app/models/site_models.py @@ -101,6 +101,7 @@ class Site_Base(BaseModel): class Config: underscore_attrs_are_private = True + allow_population_by_field_name = True fields = base_fields Site_Base.update_forward_refs() diff --git a/app/routers/page.py b/app/routers/page.py index 9b5dd27..57886d8 100644 --- a/app/routers/page.py +++ b/app/routers/page.py @@ -4,15 +4,16 @@ from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Resp from pydantic import BaseModel, EmailStr, Field from typing import Dict, List, Optional, Set, Union -from app.lib_general import * -from ..log import * +from app.lib_general import log, logging from app.config import settings -from app.db_sql import * +from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, sql_delete, redis_lookup_id_random -from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template +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.page_methods import get_page_rec_w_alias, load_page_obj from app.models.page_models import Page_Base -from app.models.response_models import * +from app.models.response_models import Resp_Body_Base, mk_resp router = APIRouter() @@ -93,6 +94,48 @@ async def get_page_obj_li( return result +# ### BEGIN ### API Page ### get_page_obj_alias() ### +# Updated 2021-08-20 +@router.get('/alias/{alias}', response_model=Resp_Body_Base) +async def get_page_obj_alias( + account_id: str = Query(..., min_length=1, max_length=22), + alias: str = Query(..., min_length=1, max_length=255), + enabled: str = 'enabled', + x_account_id: str = Header(...), + by_alias: Optional[bool] = True, + exclude_unset: Optional[bool] = True, + response: Response = Response, + ): + log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass + else: return mk_resp(data=None, status_code=404, response=response) + + data = {} + data['account_id'] = account_id + data['alias'] = alias + + if page_data := get_page_rec_w_alias(account_id=account_id, alias=alias): pass + else: return mk_resp(data=None, status_code=404, response=response) + page_id = page_data.get('page_id', None) + + if page_dict := load_page_obj( + page_id = page_id, + model_as_dict = True, # NOTE: returning model as a dict + enabled = enabled, + ): + if isinstance(page_dict, dict): + response_data = page_dict + else: + response_data = page_dict + else: + return mk_resp(data=False, status_code=400, response=response) # Bad Request + + return mk_resp(data=response_data) +# ### END ### API Page ### get_page_obj_alias() ### + + @router.get('/{obj_id}', response_model=Resp_Body_Base) async def get_page_obj( obj_id: str = Query(..., min_length=1, max_length=22), diff --git a/app/routers/site.py b/app/routers/site.py index e9fd2a2..dd0cbb0 100644 --- a/app/routers/site.py +++ b/app/routers/site.py @@ -4,12 +4,11 @@ from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Resp from pydantic import BaseModel, EmailStr, Field from typing import Dict, List, Optional, Set, Union -from app.lib_general import * -from ..log import * +from app.lib_general import log, logging from app.config import settings -from app.db_sql import * +from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, sql_delete, redis_lookup_id_random -from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template +from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template from app.models.response_models import * from app.models.site_models import Site_Base