Added page routes and related methods and updated model. Also general clean up.

This commit is contained in:
Scott Idem
2021-08-20 12:53:21 -04:00
parent 09891b5d83
commit 5bed9aadb4
10 changed files with 209 additions and 16 deletions

151
app/methods/page_methods.py Normal file
View File

@@ -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() ###

View File

@@ -241,7 +241,6 @@ def load_person_obj(
person_obj.user = user_result person_obj.user = user_result
else: person_obj.user = None else: person_obj.user = None
print(person_obj)
if model_as_dict: if model_as_dict:
return person_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member return person_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member
else: else:
@@ -305,6 +304,7 @@ def get_person_rec_list(
# ### BEGIN ### API Person Methods ### get_person_rec_w_external_id() ### # ### BEGIN ### API Person Methods ### get_person_rec_w_external_id() ###
# Updated 2021-08-19
def get_person_rec_w_external_id( def get_person_rec_w_external_id(
account_id: str, account_id: str,
external_id: str, external_id: str,

View File

@@ -50,7 +50,7 @@ def get_product_rec_list(
limit: int = 1000, limit: int = 1000,
enabled: str = 'enabled', # enabled, disabled, all enabled: str = 'enabled', # enabled, disabled, all
) -> list|bool: ) -> 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()) log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass

View File

@@ -7,7 +7,7 @@ from pydantic import BaseModel, EmailStr, Field, Json, PrivateAttr, ValidationEr
from app.db_sql import redis_lookup_id_random from app.db_sql import redis_lookup_id_random
from app.lib_general import log, logging 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): class Event_Badge_Base(BaseModel):

View File

@@ -7,7 +7,7 @@ from pydantic import BaseModel, EmailStr, Field, Json, PrivateAttr, ValidationEr
from app.db_sql import redis_lookup_id_random from app.db_sql import redis_lookup_id_random
from app.lib_general import * 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): class Page_Base(BaseModel):
@@ -66,6 +66,7 @@ class Page_Base(BaseModel):
class Config: class Config:
underscore_attrs_are_private = True underscore_attrs_are_private = True
allow_population_by_field_name = True
fields = base_fields fields = base_fields
Page_Base.update_forward_refs() Page_Base.update_forward_refs()

View File

@@ -165,6 +165,4 @@ class Person_Base(BaseModel):
allow_population_by_field_name = True allow_population_by_field_name = True
fields = base_fields fields = base_fields
#from .supporting_core_models import Address_Base, Contact_Base, Organization_Base, User_Base
Person_Base.update_forward_refs() Person_Base.update_forward_refs()

View File

@@ -41,7 +41,7 @@ def mk_resp(
exclude_unset: bool = True, exclude_unset: bool = True,
response: Response = None 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()) log.debug(locals())
if data is None: data_out = { 'result': data } if data is None: data_out = { 'result': data }

View File

@@ -101,6 +101,7 @@ class Site_Base(BaseModel):
class Config: class Config:
underscore_attrs_are_private = True underscore_attrs_are_private = True
allow_population_by_field_name = True
fields = base_fields fields = base_fields
Site_Base.update_forward_refs() Site_Base.update_forward_refs()

View File

@@ -4,15 +4,16 @@ from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Resp
from pydantic import BaseModel, EmailStr, Field from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union from typing import Dict, List, Optional, Set, Union
from app.lib_general import * from app.lib_general import log, logging
from ..log import *
from app.config import settings 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.page_models import Page_Base
from app.models.response_models import * from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter() router = APIRouter()
@@ -93,6 +94,48 @@ async def get_page_obj_li(
return result 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) @router.get('/{obj_id}', response_model=Resp_Body_Base)
async def get_page_obj( async def get_page_obj(
obj_id: str = Query(..., min_length=1, max_length=22), obj_id: str = Query(..., min_length=1, max_length=22),

View File

@@ -4,12 +4,11 @@ from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Resp
from pydantic import BaseModel, EmailStr, Field from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union from typing import Dict, List, Optional, Set, Union
from app.lib_general import * from app.lib_general import log, logging
from ..log import *
from app.config import settings 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.response_models import *
from app.models.site_models import Site_Base from app.models.site_models import Site_Base