создание, правка, удаление, скрытие инструмента

This commit is contained in:
2025-12-12 23:50:38 +03:00
parent 8b38d69980
commit f85ca7d002
19 changed files with 1607 additions and 162 deletions
Binary file not shown.
Binary file not shown.
+7
View File
@@ -138,6 +138,13 @@ class StockHandler:
stocks = await CRUD.read(query, True)
return await filterQuantity(stocks, filtered)
async def checkToolkitExists(toolkitId: int) -> bool:
from db import CRUD
query = select(Stock).where(Stock.toolkit_id == toolkitId)
stocks = await CRUD.read(query)
return True if stocks else False
async def getByToolboxIdAndToolkitId(
toolboxId: int, toolkitId: int, filtered: bool = True
) -> list[dict]:
+73 -47
View File
@@ -1,15 +1,24 @@
from datetime import datetime
from utils import logger, saveImage, safeFilename, deleteImage
from db.handlers.stock import StockHandler
from utils import logger, saveImage, safeFilename
from db import CRUD
from db.schemas.toolkit import Toolkit
from sqlalchemy import select
from db.handlers.records import ServiceRecordsHandler
from utils.image import deleteImage
def handleToolkitImage(imageData, title: str):
import base64
title = safeFilename(title)
fileName = f"tools/{title}.png"
if not saveImage(imageData, fileName):
fileName = f"static/images/tools/{title}.png"
if imageData.startswith("data:image"):
header, encoded = imageData.split(",", 1)
else:
encoded = imageData
file_bytes = base64.b64decode(encoded)
if not saveImage(file_bytes, fileName):
return None
return fileName
@@ -19,22 +28,20 @@ class ToolkitHandler:
title = toolkitData.get("title", None)
if not title:
logger.error("Не указано название инструмента")
return {}
return {"errorMessage": "Не указано название инструмента"}
query = select(Toolkit).where(Toolkit.title == title)
toolkit = await CRUD.read(query)
if toolkit:
logger.error("Инструмент с таким названием уже существует")
return {}
return {"errorMessage": "Инструмент с таким названием уже существует"}
try:
imageDict = {"main": "static/images/tools/default.png", "additional": []}
if "image" in toolkitData:
imageData = toolkitData.pop("image")
mainImage = imageData.get("main")
if isinstance(mainImage, str) and mainImage.startswith(
"static/images/"
):
if mainImage.startswith("static/images/"):
imageDict["main"] = mainImage
else:
imageFileName = handleToolkitImage(mainImage, title)
@@ -43,9 +50,7 @@ class ToolkitHandler:
additionalImages = imageData.get("additional", [])
if len(additionalImages) > 0:
for image in additionalImages:
if isinstance(image, str) and image.startswith(
"static/images/"
):
if image.startswith("static/images/"):
imageDict["additional"].append(image)
else:
imageFileName = handleToolkitImage(image, title)
@@ -55,18 +60,22 @@ class ToolkitHandler:
newToolkit = await Toolkit(**toolkitData).save()
except Exception as e:
logger.error(f"Ошибка сохранения инструмента: {str(e)}")
return {}
return {"errorMessage": f"Ошибка сохранения инструмента: {str(e)}"}
if not newToolkit:
logger.error("Инструмент не сохранен")
return {}
return {"errorMessage": "Инструмент не сохранен"}
logger.info(f"Инструмент {newToolkit.title} успешно создан")
await ServiceRecordsHandler.add(user_id, {"Добавлен инструмент": toolkitData})
return newToolkit
return newToolkit.toDict()
async def updateMovindDate(toolkitId: int):
editedToolkit = await ToolkitHandler.edit(toolkitId, moved_at=datetime.now())
toolkit = await CRUD.read(select(Toolkit).where(Toolkit.id == toolkitId))
if not toolkit:
logger.error("Инструмент не найден")
return False
editedToolkit = await toolkit.edit(moved_at=datetime.now())
if not editedToolkit:
logger.error("Инструмент не обновлен")
return False
@@ -74,65 +83,78 @@ class ToolkitHandler:
async def updateRefillDate(toolkitId: int):
logger.info(f"Обновление даты пополнения инструмента {toolkitId}...")
editedToolkit = await ToolkitHandler.edit(toolkitId, refilled_at=datetime.now())
toolkit = await CRUD.read(select(Toolkit).where(Toolkit.id == toolkitId))
if not toolkit:
logger.error("Инструмент не найден")
return False
editedToolkit = await toolkit.edit(refilled_at=datetime.now())
if not editedToolkit:
logger.error("Инструмент не обновлен")
return False
return True
async def edit(toolkitId: int, **kwargs):
async def hideToolkit(userId: int, toolkitId: int, hidden: bool = True):
logger.info(
f"{'Скрытие' if hidden else 'Отображение'} инструмента {toolkitId}..."
)
return await ToolkitHandler.edit(userId, id=toolkitId, hidden=hidden)
async def edit(user_id: int, **kwargs):
title = kwargs.get("title", None)
toolkitId = kwargs.pop("id")
if title:
query = select(Toolkit).where(Toolkit.title == title)
toolkit = await CRUD.read(query)
if toolkit:
if toolkit.id != toolkitId:
logger.error("Инструмент с таким названием уже существует")
return {
"errorMessage": "Инструмент с таким названием уже существует"
}
query = select(Toolkit).where(Toolkit.id == toolkitId)
toolkit = await CRUD.read(query)
if not toolkit:
logger.error("Инструмент не найден")
return {}
return {"errorMessage": "Инструмент не найден"}
try:
if "image" in kwargs:
title = kwargs.get("title", toolkit.title)
imageData = kwargs.pop("image")
imageDict = {"main": "", "additional": []}
existImagesList = [toolkit.image.get("main")]
existImagesList.extend(toolkit.image.get("additional"))
if imageData.get("main").startswith("static/images/"):
imageDict["main"] = imageData.get("main")
else:
imageFileName = handleToolkitImage(imageData.get("main"), title)
if imageFileName:
imageDict["main"] = imageFileName
deleteImage(toolkit.image.get("main"))
newImagesList = [imageData.get("main")]
newImagesList.extend(imageData.get("additional"))
for existImage in existImagesList:
if existImage not in newImagesList:
deleteImage(existImage)
if toolkit.image.get("main") != imageData.get("main"):
if imageData.get("main") in existImagesList:
imageDict["main"] = imageData.get("main")
for image in imageData.get("additional"):
if image.startswith("static/images/"):
imageDict["additional"].append(image)
else:
imageFileName = handleToolkitImage(imageData.get("main"), title)
if imageFileName:
imageDict["main"] = imageFileName
else:
imageDict["main"] = "images/tools/default.png"
imageDict["additional"].extend(imageData.get("additional"))
uploadList = imageData.get("upload", [])
if len(uploadList) > 0:
for image in uploadList:
imageFileName = handleToolkitImage(image, title)
if imageFileName:
imageDict["additional"].append(imageFileName)
for existImage in toolkit.image.get("additional"):
if existImage not in imageDict.get("additional"):
deleteImage(existImage)
kwargs["image"] = imageDict
user_id = kwargs.pop("user_id", None)
logger.debug(f"Обновление инструмента {toolkit.title}...")
editedToolkit = await toolkit.edit(**kwargs)
except Exception as e:
logger.error(f"Ошибка обновления инструмента: {str(e)}")
return {}
return {"errorMessage": f"Ошибка обновления инструмента: {str(e)}"}
if not editedToolkit:
logger.error("Инструмент не обновлен")
return {}
return {"errorMessage": "Инструмент не обновлен"}
logger.info(
f"Инструмент {editedToolkit.title} успешно обновлен, изменены данные: {kwargs.keys()}"
@@ -166,24 +188,28 @@ class ToolkitHandler:
return True if toolkit else False
async def delete(toolkitId: int, user_id: int = None):
movements = await StockHandler.checkToolkitExists(toolkitId)
if movements:
logger.error("По инструменту было движение")
return {"errorMessage": "По инструменту было движение"}
query = select(Toolkit).where(Toolkit.id == toolkitId)
toolkit = await CRUD.read(query)
if not toolkit:
logger.error("Инструмент не найден")
return False
return {"errorMessage": "Инструмент не найден"}
try:
toolkitTitle = toolkit.title
result = await CRUD.delete(toolkit)
except Exception as e:
logger.error(f"Ошибка удаления инструмента: {str(e)}")
return False
return {"errorMessage": f"Ошибка удаления инструмента: {str(e)}"}
logger.info(
f"Инструмент {toolkitTitle} {'успешно удален' if result else 'не удален'}"
)
await ServiceRecordsHandler.add(
user_id, {"Удален инструмент": f"Название: {toolkitTitle}"}
)
return result
return {"status": "ok"} if result else {"errorMessage": "Инструмент не удален"}
async def initialize():
from .categories import CategoryHandler