feat: admin product deletion

This commit is contained in:
2026-08-13 12:03:56 +07:00
parent 1b78f2ba36
commit 406356c240
5 changed files with 239 additions and 6 deletions

View File

@@ -13,8 +13,7 @@ from misc.kb.admins import back_to_product_kb
from misc.kb.client import get_back_to_catalogue
from misc.mapper import parse_cat_id
from misc.states import AdminControlStorage
from misc.texts import get_product_description
from misc.texts import product_editing_mapping
from misc.texts import get_product_description, product_editing_mapping
from repositories.categories import CategoriesRepository
from repositories.products import ProductRepository
@@ -210,6 +209,42 @@ async def delete_product_photo(
await cb.message.edit_reply_markup(reply_markup=reply_markup)
@router.callback_query(IsVerified(), F.data.regexp(r"^edit_product:\d+:delete$"))
async def request_product_deletion(cb: CallbackQuery, state: FSMContext):
await state.clear()
product_id = int(cb.data.split(":")[1])
await cb.message.edit_reply_markup(reply_markup=admins.confirm_product_deletion(product_id))
await cb.answer("Подтвердите удаление товара.")
@router.callback_query(IsVerified(), F.data.regexp(r"^delete_product:confirm:\d+$"))
async def delete_product(
cb: CallbackQuery,
state: FSMContext,
session: AsyncSession,
products_repo: ProductRepository,
):
await state.clear()
product_id = int(cb.data.split(":")[2])
product = await products_repo.get_product_by_id(session, product_id)
if not product:
await cb.answer("Товар уже удалён.", show_alert=True)
return
category_id = product.category_id
try:
await products_repo.delete_product(session, product_id)
except Exception:
await session.rollback()
logger.exception("Failed to delete product %s", product_id)
await cb.answer("Не удалось удалить товар: он используется в заказах.", show_alert=True)
return
await cb.message.delete()
await cb.message.answer("✅ Товар удалён.", reply_markup=get_back_to_catalogue(category_id))
await cb.answer()
@router.callback_query(F.data.startswith("edit:"))
async def edit_entry(cb: CallbackQuery, state: FSMContext):
await state.clear()