создание, правка, удаление, скрытие инструмента
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -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
@@ -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
|
||||
|
||||
Binary file not shown.
@@ -1,5 +1,5 @@
|
||||
from datetime import datetime
|
||||
from sqlalchemy import Column, DateTime, ForeignKey, Integer, String, Text
|
||||
from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, Text
|
||||
from sqlalchemy.dialects.postgresql import JSONB
|
||||
from sqlalchemy.orm import relationship
|
||||
from db import Base, CRUD
|
||||
@@ -25,6 +25,7 @@ class Toolkit(Base):
|
||||
quantity_min = Column(Integer, nullable=True)
|
||||
quantity_min_extra = Column(Integer, nullable=True)
|
||||
external_link = Column(String, nullable=True)
|
||||
hidden = Column(Boolean, default=False)
|
||||
created_at = Column(DateTime, default=datetime.now)
|
||||
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
|
||||
refilled_at = Column(DateTime, default=datetime.now)
|
||||
|
||||
Reference in New Issue
Block a user