API CRUD functions can now handle sorting. And headers are now handled a little better.

This commit is contained in:
Scott Idem
2023-07-25 18:29:07 -04:00
parent cb45b9774f
commit fe71a7be33
2 changed files with 46 additions and 5 deletions

View File

@@ -535,6 +535,7 @@ def sql_select(
field_value = None, field_value = None,
enabled: str|None = None, # enabled, disabled, all enabled: str|None = None, # enabled, disabled, all
hidden: str|None = None, # hidden, not_hidden, all hidden: str|None = None, # hidden, not_hidden, all
order_by_li: dict|None = None, # {"the_field_name": "DESC"}
limit: int = 9999999, limit: int = 9999999,
offset: int = 0, offset: int = 0,
sql: str|None = None, sql: str|None = None,
@@ -543,7 +544,7 @@ def sql_select(
as_dict: bool|None = True, as_dict: bool|None = True,
as_list: bool|None = False, as_list: bool|None = False,
max_count: int = 100000, max_count: int = 100000,
log_lvl: int = logging.WARNING, # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log_lvl: int = logging.DEBUG, # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
) -> None|bool|dict|list: ) -> None|bool|dict|list:
log.setLevel(log_lvl) log.setLevel(log_lvl)
@@ -553,6 +554,30 @@ def sql_select(
else: else:
sql_limit_offset = '' sql_limit_offset = ''
sql_order_by = ''
# order_by_li = {'created_on': 'DESC', 'updated_on': 'DESC'}
log.debug(order_by_li)
if order_by_li and isinstance(order_by_li, dict): # This should be a list
order_by_str_li = []
for key, value in order_by_li.items():
order_by_str_li.append(f'`{table_name}`.`{key}` {value}')
# log.debug(order_by_str_li)
# if isinstance(value, dict) or isinstance(value, list):
# data[key] = json.dumps(value)
log.debug(order_by_str_li)
order_by_string = ', '.join(order_by_str_li)
sql_order_by = f'ORDER BY {order_by_string}'
else:
sql_order_by = ''
log.debug(sql_order_by)
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# if enabled: # if enabled:
# sql_enabled = sql_enable_part(table_name=table_name, enabled=enabled) # Reasonably safe return str # sql_enabled = sql_enable_part(table_name=table_name, enabled=enabled) # Reasonably safe return str
# else: # else:
@@ -594,6 +619,7 @@ def sql_select(
f""" f"""
SELECT * SELECT *
FROM `{table_name}` FROM `{table_name}`
{sql_order_by}
{sql_limit_offset} {sql_limit_offset}
; ;
""" """
@@ -610,6 +636,7 @@ def sql_select(
SELECT * SELECT *
FROM `{table_name}` FROM `{table_name}`
WHERE `{table_name}`.id = :record_id WHERE `{table_name}`.id = :record_id
{sql_order_by}
{sql_limit_offset} {sql_limit_offset}
; ;
""" """
@@ -622,6 +649,7 @@ def sql_select(
SELECT * SELECT *
FROM `{table_name}` FROM `{table_name}`
WHERE `{table_name}`.id_random = :record_id_random WHERE `{table_name}`.id_random = :record_id_random
{sql_order_by}
{sql_limit_offset} {sql_limit_offset}
; ;
""" """
@@ -665,6 +693,7 @@ def sql_select(
WHERE `{table_name}`.{field_name} = :{field_name} WHERE `{table_name}`.{field_name} = :{field_name}
{sql_enabled} {sql_enabled}
{sql_hidden} {sql_hidden}
{sql_order_by}
{sql_limit_offset} {sql_limit_offset}
; ;
""" """
@@ -691,6 +720,7 @@ def sql_select(
SELECT * SELECT *
FROM `{table_name}` FROM `{table_name}`
WHERE {sql_where_string} WHERE {sql_where_string}
{sql_order_by}
{sql_limit_offset} {sql_limit_offset}
; ;
""" """

View File

@@ -1,4 +1,4 @@
import datetime, time import datetime, json, time
#from datetime import datetime, time, timedelta #from datetime import datetime, time, timedelta
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response, status from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response, status
from pydantic import BaseModel, EmailStr, Field from pydantic import BaseModel, EmailStr, Field
@@ -175,6 +175,12 @@ async def get_obj_li(
enabled: str = 'enabled', enabled: str = 'enabled',
hidden: str = 'not_hidden', # hidden, not_hidden, all, hidden: str = 'not_hidden', # hidden, not_hidden, all,
# order_by_li: dict = None,
order_by_li: str = Header(None),
dh_order_by_li: str = Header(None),
dh_testing: str = Header(None),
h_order_by_li: str = Header(None),
h_testing: str = Header(None),
limit: int = 10000, limit: int = 10000,
offset: int = 0, offset: int = 0,
@@ -187,9 +193,12 @@ async def get_obj_li(
response: Response = Response, response: Response = Response,
# commons: Common_Route_Params = Depends(common_route_params), # Switch to this later... sooner # commons: Common_Route_Params = Depends(common_route_params), # Switch to this later... sooner
): ):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals()) log.debug(locals())
if order_by_li:
order_by_li = json.loads(order_by_li)
debug_data = {} debug_data = {}
debug_data['obj_type_l1'] = obj_type_l1 debug_data['obj_type_l1'] = obj_type_l1
debug_data['obj_type_l2'] = obj_type_l2 debug_data['obj_type_l2'] = obj_type_l2
@@ -197,6 +206,7 @@ async def get_obj_li(
#debug_data['obj_id'] = obj_id #debug_data['obj_id'] = obj_id
debug_data['for_obj_type'] = for_obj_type debug_data['for_obj_type'] = for_obj_type
debug_data['for_obj_id'] = for_obj_id debug_data['for_obj_id'] = for_obj_id
debug_data['order_by_li'] = order_by_li
log.debug(debug_data) log.debug(debug_data)
@@ -231,12 +241,13 @@ async def get_obj_li(
field_name = f'{for_obj_type}_id' field_name = f'{for_obj_type}_id'
# NOTE: The enabled and hidden parameters are new to this endpoint and the sql_select function! -2023-07-06 # NOTE: The enabled and hidden parameters are new to this endpoint and the sql_select function! -2023-07-06
sql_result = sql_select(table_name=table_name, field_name=field_name, field_value=for_obj_id, enabled=enabled, hidden=hidden, limit=limit, offset=offset) sql_result = sql_select(table_name=table_name, field_name=field_name, field_value=for_obj_id, enabled=enabled, hidden=hidden, order_by_li=order_by_li, limit=limit, offset=offset)
else: else:
# NOTE: The enabled and hidden parameters are new to this endpoint and the sql_select function! -2023-07-06 # NOTE: The enabled and hidden parameters are new to this endpoint and the sql_select function! -2023-07-06
# NOTE: This call (without field_name, field_value, limit, offset) may need more testing. # NOTE: This call (without field_name, field_value, limit, offset) may need more testing.
sql_result = sql_select(table_name=table_name, enabled=enabled, hidden=hidden, limit=limit, offset=offset) sql_result = sql_select(table_name=table_name, enabled=enabled, hidden=hidden, order_by_li=order_by_li, limit=limit, offset=offset)
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(sql_result) log.debug(sql_result)
base_name = obj_type_li[obj_name]['base_name'] base_name = obj_type_li[obj_name]['base_name']