Files
toolbox/api/routers/toolkit.py
T

254 lines
9.9 KiB
Python

from fastapi import APIRouter, Depends
from sqlalchemy import select
from db import CRUD
from db.handlers.actions import StocksActions
from db.handlers.categories import CategoryHandler
from db.handlers.stock import PlacementHandler, StockHandler
from db.handlers.toolbox import ToolboxHandler
from db.handlers.toolkit import ToolkitHandler
from db.schemas.stock import Placement
from utils import requestDict, logger
router = APIRouter()
def handleResult(result: dict, response: dict) -> dict:
if "errorMessage" in result.keys():
response["message"] = result["errorMessage"]
else:
response["status"] = "ok"
return response
@router.get("/", summary="Получение инструмента")
async def get_toolkit(reqData: dict = Depends(requestDict)):
logger.info(f"Получение инструмента")
response = {"status": "error"}
toolkitId = reqData.get("query").get("toolkitId")
if toolkitId:
toolkit = await ToolkitHandler.get(int(toolkitId))
if toolkit:
response["status"] = "ok"
response["data"] = toolkit
return response
@router.post("/", summary="Запрос остатка инструмента")
async def toolkit_request(
reqData: dict = Depends(requestDict),
):
response = {"status": "error", "data": {}}
toolkitId = reqData.get("body").get("toolkitId")
logger.info(f"Получение запроса остатка инструмента #{toolkitId}")
stocks = await StockHandler.getByToolkitId(toolkitId)
if not stocks:
return response
userId = reqData.get("body").get("userId")
allToolboxes = reqData.get("body").get("allToolboxes")
toolboxes = (
await ToolboxHandler.getByOwner(userId)
if not allToolboxes
else await ToolboxHandler.getAll()
)
if not toolboxes:
return response
toolboxesTitles = {toolbox["id"]: toolbox["title"] for toolbox in toolboxes}
toolboxesOwners = {toolbox["id"]: toolbox["owner_id"] for toolbox in toolboxes}
stocksData = {"count": 0, "toolboxes": {}}
for stock in stocks:
toolboxTitle = toolboxesTitles.get(stock["toolbox_id"], None)
if not toolboxTitle:
continue
stocksData["count"] += stock["quantity"]
if toolboxTitle not in stocksData["toolboxes"]:
stocksData["toolboxes"][toolboxTitle] = {
"count": stock["quantity"],
"placement": stock["placement"],
}
if not toolboxesOwners.get(stock["toolbox_id"]):
stocksData["toolboxes"][toolboxTitle]["id"] = stock["toolbox_id"]
stocksData["toolboxes"][toolboxTitle]["totalCost"] = (
stock["price"] * stock["quantity"]
)
else:
stocksData["toolboxes"][toolboxTitle]["count"] += stock["quantity"]
if not toolboxesOwners.get(stock["toolbox_id"]):
stocksData["toolboxes"][toolboxTitle]["totalCost"] += (
stock["price"] * stock["quantity"]
)
response["status"] = "ok"
response["data"] = stocksData
return response
@router.post("/comment", summary="Добавление комментария")
async def add_comment(reqData: dict = Depends(requestDict)):
logger.info(f"Добавление комментария")
response = {"status": "error"}
try:
logger.info(f"Добавление комментария")
logger.info(reqData.get("body"))
toolkitId = int(reqData.get("body").get("toolkitId"))
comment = reqData.get("body").get("commentText")
userId = int(reqData.get("body").get("userId"))
result = await ToolkitHandler.addComment(toolkitId, userId, comment)
response = handleResult(result, response)
except Exception as e:
logger.error(e)
finally:
return response
@router.post("/fill_prepare", summary="Подготовка заполнения ящика")
async def fill_toolbox():
logger.info(f"Подготовка заполнения ящика")
response = {"status": "error"}
toolkits = await ToolkitHandler.getAll()
categories = await CategoryHandler.getAll()
placements = await PlacementHandler.getAll()
if toolkits and categories:
response["status"] = "ok"
response["data"] = {
"toolkits": sorted(toolkits, key=lambda toolkit: toolkit["title"]),
"categories": sorted(categories, key=lambda category: category["title"]),
"placements": [placement.toDict() for placement in placements],
}
return response
@router.post("/categories_batch", summary="Управление категориями")
async def categories_batch(reqData: dict = Depends(requestDict)):
logger.info(f"Управление категориями")
response = {"status": "error"}
userId = reqData.get("body").get("userId")
changesData = reqData.get("body").get("changes")
success = True
for newCategoryData in changesData.get("create", []):
logger.info(f"Добавление категории: {newCategoryData.get('title')}")
result = await CategoryHandler.add(newCategoryData, userId)
if not result:
success = False
for updateCategoryData in changesData.get("update", []):
logger.info(f"Обновление категории: {updateCategoryData.get('title')}")
result = await CategoryHandler.edit(updateCategoryData, userId)
if not result:
success = False
for deleteCategoryId in changesData.get("delete", []):
logger.info(f"Удаление категории: {deleteCategoryId}")
result = await CategoryHandler.delete(deleteCategoryId, userId)
if not result:
success = False
if success:
response["status"] = "ok"
return response
@router.get("/categories", summary="Получение категорий")
async def get_categories():
logger.info(f"Получение категорий")
response = {"status": "error"}
categories = await CategoryHandler.getAll()
if categories:
categoriesDict = {
category["id"]: {
"id": category["id"],
"title": category["title"],
"description": category["description"],
}
for category in categories
}
response["status"] = "ok"
response["data"] = categoriesDict
return response
@router.post("/hide", summary="Скрытие инструмента")
async def hide_toolkit(reqData: dict = Depends(requestDict)):
logger.info(f"Скрытие/отображение инструмента")
response = {"status": "error"}
toolkitId = int(reqData.get("body").get("toolkitId"))
userId = reqData.get("body").get("userId")
hidden = reqData.get("body").get("hidden")
result = await ToolkitHandler.hideToolkit(userId, toolkitId, hidden)
response = handleResult(result, response)
return response
@router.post("/manage", summary="Управление инструментами")
async def manage_toolkit(reqData: dict = Depends(requestDict)):
logger.info(f"Управление инструментами")
response = {"status": "error"}
action = reqData.get("body").get("action")
userId = reqData.get("body").get("userId")
toolkitData = reqData.get("body").get("formData")
if "category_id" in toolkitData:
toolkitData["category_id"] = int(toolkitData.get("category_id"))
if "image" in toolkitData:
if (
not toolkitData.get("image").get("main")
or toolkitData.get("image").get("main") == ""
):
if len(toolkitData.get("image").get("additional")) == 0:
toolkitData.pop("image")
match action:
case "create":
toolkit = await ToolkitHandler.add(toolkitData, userId)
response = handleResult(toolkit, response)
case "copy":
toolkitData.pop("id")
toolkit = await ToolkitHandler.add(toolkitData, userId)
response = handleResult(toolkit, response)
case "update":
toolkit = await ToolkitHandler.edit(userId, **toolkitData)
response = handleResult(toolkit, response)
case "delete":
toolkit = await ToolkitHandler.delete(toolkitData.get("id"), userId)
response = handleResult(toolkit, response)
case _:
pass
logger.info(
f"Управление инструментами ({action}) прошло {'успешно' if response.get('status') == 'ok' else 'неуспешно'}"
)
return response
@router.post("/quick_action", summary="Быстрое действие")
async def quick_action(reqData: dict = Depends(requestDict)):
logger.info(f"Быстрое действие")
response = {"status": "error"}
action = reqData.get("body").get("action")
toolboxId = int(reqData.get("body").get("toolboxId"))
toolkitId = int(reqData.get("body").get("toolkitId"))
userId = reqData.get("body").get("userId")
data = reqData.get("body").get("data")
match action:
case "fill":
toolkit = await StocksActions.registration(
toolkitId,
toolboxId,
userId,
int(data.get("amount")),
float(data.get("price")),
"",
data.get("reason"),
)
response = handleResult(toolkit, response)
case "move":
try:
placement = await CRUD.read(
select(Placement).where(
Placement.toolkit_id == toolkitId,
Placement.toolbox_id == toolboxId,
)
)
await placement.edit(data.get("location"))
response["status"] = "ok"
except Exception as e:
logger.error(e)
case _:
pass
return response