Files
OSIT-AE-API-FastAPI/app/routers/order.py

195 lines
6.8 KiB
Python

import datetime
#from datetime import datetime, time, timedelta
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 ..lib_general import *
from ..log import *
from app.config import settings
from app.db_sql import *
from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from ..models.response_model import *
from ..models.order_model import Order_Base
from ..models.order_methods import load_order_obj, save_order_obj
router = APIRouter()
@router.post('', response_model=Resp_Body_Base)
async def post_order_obj(
obj: Order_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'order'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/{obj_id}', response_model=Resp_Body_Base)
async def patch_order_obj(
obj_id: str = Query(..., min_length=1, max_length=22),
obj: Order_Base = 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.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'order'
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
@router.get('/list', response_model=Resp_Body_Base)
async def get_order_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
order_status: Optional[str] = 'complete',
from_datetime: Optional[datetime.datetime] = None,
to_datetime: Optional[datetime.datetime] = None,
limit: Optional[int] = None,
inc_order_line_li: Optional[bool] = False,
inc_order_cfg: Optional[bool] = False,
inc_person_obj: Optional[bool] = False,
inc_user_obj: Optional[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())
# obj_type = 'order'
# result = get_obj_li_template(
# obj_type=obj_type,
# for_obj_type=for_obj_type,
# for_obj_id=for_obj_id,
# by_alias=True,
# exclude_unset=True,
# )
# return result
data = {}
if for_obj_type == 'account' and for_obj_id:
data['account_id'] = redis_lookup_id_random(record_id_random=for_obj_id, table_name='account')
sql_account_person_user = f"""`order`.account_id = :account_id"""
elif for_obj_type == 'person' and for_obj_id:
data['person_id'] = redis_lookup_id_random(record_id_random=for_obj_id, table_name='person')
sql_account_person_user = f"""`order`.person_id = :person_id"""
elif for_obj_type == 'user' and for_obj_id:
data['user_id'] = redis_lookup_id_random(record_id_random=for_obj_id, table_name='user')
sql_account_person_user = f"""`order`.user_id = :user_id"""
else:
sql_account_person_user = ''
if order_status in ['canceled', 'complete', 'in progress', 'started']:
data['status'] = order_status
sql_status = f"""AND `order`.status = :status"""
else:
sql_status = ''
if from_datetime and to_datetime:
data['from_datetime'] = from_datetime
data['to_datetime'] = to_datetime
sql_from_to_datetime = f"""AND `order`.created_on >= :from_datetime AND `order`.created_on <= :to_datetime"""
elif from_datetime:
data['from_datetime'] = from_datetime
sql_from_to_datetime = f"""AND `order`.created_on >= :from_datetime"""
elif to_datetime:
data['to_datetime'] = to_datetime
sql_from_to_datetime = f"""AND `order`.created_on <= :to_datetime"""
else:
sql_from_to_datetime = ''
if limit:
data['limit'] = limit
sql_limit = f"""LIMIT :limit"""
else:
sql_limit = ''
sql = f"""
SELECT `order`.id AS 'order_id', `order`.id_random AS 'order_id_random'
FROM `order` AS `order`
WHERE {sql_account_person_user}
{sql_status}
{sql_from_to_datetime}
ORDER BY `order`.created_on DESC, `order`.updated_on DESC
{sql_limit};
"""
if order_obj_li_result := sql_select(data=data, sql=sql, as_list=True):
order_obj_li = []
for order_obj in order_obj_li_result:
order_id = order_obj.get('order_id', None)
if order_obj := load_order_obj(order_id=order_id, inc_order_line_li=inc_order_line_li, inc_order_cfg=inc_order_cfg, inc_person_obj=inc_person_obj, inc_user_obj=inc_user_obj):
data = order_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset)
order_obj_li.append(data)
return mk_resp(data=order_obj_li)
else:
log.debug(order_obj_li_result)
return mk_resp(data=False, status_code=404)
@router.get('/{obj_id}', response_model=Resp_Body_Base)
async def get_order_obj(
obj_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())
obj_type = 'order'
result = get_obj_template(
obj_type=obj_type,
obj_id=obj_id,
by_alias=True,
exclude_unset=True,
)
return result
@router.delete('/{obj_id}', response_model=Resp_Body_Base)
async def delete_order_obj(
obj_id: str = Query(..., min_length=1, max_length=22),
x_account_id: str = Header(...),
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'order'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result