Clean up and I think I fixed a weird bug with Pydantic models and the list object type. It seems to try for a dict conversion first if Union[dict,list] is used.

This commit is contained in:
Scott Idem
2021-06-29 18:12:52 -04:00
parent 2d988fc405
commit 830b9ee608
6 changed files with 70 additions and 25 deletions

View File

@@ -288,16 +288,17 @@ def sql_insert_or_update(
# The catch all SQL SELECT function - STI 2021-02-17 # The catch all SQL SELECT function - STI 2021-02-17
# This one does it all for SQL SELECT queries # This one does it all for SQL SELECT queries
def sql_select( def sql_select(
table_name:str|None=None, table_name: str|None = None,
record_id:int|None=None, record_id: int|None = None,
record_id_random:str|None=None, record_id_random: str|None = None,
field_name:str|None=None, field_name: str|None = None,
field_value=None, field_value = None,
sql:str|None=None, sql: str|None = None,
data:dict|None=None, data: dict|None = None,
rm_id_random:bool=False, rm_id_random: bool = False,
as_dict:bool|None=True, as_dict: bool|None = True,
as_list:bool|None=False as_list: bool|None = False,
max_count: int = 100000
): ):
#log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL #log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals()) log.debug(locals())

View File

@@ -22,7 +22,7 @@ class Resp_Body_Base(BaseModel):
# alias = 'test_prop_alias' # alias = 'test_prop_alias'
# ) # )
data: Union[dict, list] data: Union[list, dict]
meta: Optional[dict] meta: Optional[dict]
# ### END ### API Response Model ### Resp_Body_Base() ### # ### END ### API Response Model ### Resp_Body_Base() ###
@@ -41,17 +41,22 @@ def mk_resp(
exclude_unset: bool = True, exclude_unset: bool = True,
response = None response = None
): ):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL # log.setLevel(logging.DEBUG) # 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 }
elif data == False: data_out = { 'result': data } elif data == False: data_out = { 'result': data }
elif data == True: data_out = { 'result': data } elif data == True: data_out = { 'result': data }
elif isinstance(data, dict): data_out = data elif isinstance(data, dict):
elif isinstance(data, list): data_out = data log.info('Data type is a dict')
data_out = data
elif isinstance(data, list):
log.info('Data type is a list')
data_out = data
else: # Assuming it is still and object. This should be improved. Example model type: "<class 'app.models.account_models.Account_Base'>" else: # Assuming it is still and object. This should be improved. Example model type: "<class 'app.models.account_models.Account_Base'>"
log.info('Data type is other')
data_out = data.dict(by_alias=by_alias, exclude_unset=exclude_unset) data_out = data.dict(by_alias=by_alias, exclude_unset=exclude_unset)
log.debug(data_out) # log.debug(data_out)
resp_body = {} resp_body = {}
resp_body['data'] = data_out resp_body['data'] = data_out
@@ -90,11 +95,15 @@ def mk_resp(
elif status_code == 503: response.status_code = status.HTTP_503_SERVICE_UNAVAILABLE elif status_code == 503: response.status_code = status.HTTP_503_SERVICE_UNAVAILABLE
elif status_code == 504: response.status_code = status.HTTP_504_GATEWAY_TIMEOUT elif status_code == 504: response.status_code = status.HTTP_504_GATEWAY_TIMEOUT
# log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(type(resp_body['data'])) # log.debug(resp_body)
# log.debug(type(resp_body['data']))
# import json
# with open('data.txt', 'w') as outfile:
# json.dump(resp_body['data'], outfile)
resp_body_obj = Resp_Body_Base(**resp_body) resp_body_obj = Resp_Body_Base(**resp_body)
# resp_body_obj.test_prop = 'my value'
log.debug(resp_body_obj) log.debug(resp_body_obj)
resp_body_dict = resp_body_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) resp_body_dict = resp_body_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset)
log.debug(resp_body_dict) log.debug(resp_body_dict)

View File

@@ -1,5 +1,4 @@
import datetime import datetime
#from datetime import datetime, time, timedelta
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, status from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, status
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
@@ -12,7 +11,7 @@ from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_
from app.methods.lu_post_topic_methods import get_lu_post_topic_rec_list from app.methods.lu_post_topic_methods import get_lu_post_topic_rec_list
from app.models.response_models import * from app.models.response_models import Resp_Body_Base, mk_resp
#from app.models.lookup_models import Lookup_Base #from app.models.lookup_models import Lookup_Base
@@ -31,7 +30,7 @@ async def get_lookup_li(
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals()) log.debug(locals())
allowed_lookup_tables = ['country', 'country_subdivision', 'event_session_type', 'file_purpose', 'membership_member_status', 'order_status', 'post_topic', 'user_status'] allowed_lookup_tables = ['country', 'country_subdivision', 'event_session_type', 'file_purpose', 'membership_member_status', 'order_status', 'post_topic', 'time_zone', 'user_status']
if for_lookup_name in allowed_lookup_tables: pass if for_lookup_name in allowed_lookup_tables: pass
else: else:
@@ -48,12 +47,46 @@ async def get_lookup_li(
response_data = lu_post_topic_rec_list_result response_data = lu_post_topic_rec_list_result
else: else:
return mk_resp(data=False, status_code=400) # Bad Request return mk_resp(data=False, status_code=400) # Bad Request
elif for_lookup_name == 'time_zone':
table_name = f'v_lu_{for_lookup_name}'
lu_time_zone_result = sql_select(table_name=table_name)
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(lu_time_zone_result)
log.debug(type(lu_time_zone_result))
lu_time_zone_result = lu_time_zone_result[0:10]
# fake_li = []
# import secrets
# for time_zone in lu_time_zone_result:
# fake = {}
# # fake['id'] = time_zone['id']
# # fake['name'] = time_zone['name']
# fake['xxx'] = secrets.token_urlsafe(8)
# fake['yyy'] = secrets.token_urlsafe(8)
# fake_li.append(fake)
# # time_zone['name'] = 'asdf'
response_data = lu_time_zone_result
# response_data = fake_li
else: else:
table_name = f'lu_{for_lookup_name}' table_name = f'lu_{for_lookup_name}'
lu_list_result = sql_select(table_name=table_name) lu_list_result = sql_select(table_name=table_name)
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(lu_list_result)
response_data = lu_list_result response_data = lu_list_result
# fake_li = []
# import secrets
# for list_item in lu_list_result:
# fake = {}
# # fake['id'] = time_zone['id']
# # fake['name'] = time_zone['name']
# fake['xxx'] = secrets.token_urlsafe(8)
# fake['yyy'] = secrets.token_urlsafe(8)
# fake_li.append(fake)
# response_data = fake_li
# log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(response_data)
response_data = response_data
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(response_data)
return mk_resp(data=response_data) return mk_resp(data=response_data)

View File

@@ -408,7 +408,7 @@ async def lookup_user_obj(
return mk_resp(data=data) return mk_resp(data=data)
# Look up a user with an email addresss for an account # Look up a user with an email address for an account
@router.get('/lookup_email', response_model=Resp_Body_Base) @router.get('/lookup_email', response_model=Resp_Body_Base)
async def lookup_email( async def lookup_email(
account_id: Union[int,str], account_id: Union[int,str],

1
country.txt Normal file

File diff suppressed because one or more lines are too long

1
time_zone.txt Normal file

File diff suppressed because one or more lines are too long