product management, unification of kb and so on.

This commit is contained in:
2026-02-24 20:47:52 +07:00
parent 36ffca460f
commit 035170e46f
23 changed files with 470 additions and 130 deletions

View File

@@ -1,3 +1,5 @@
from .inline_mode import router as inline_router
from .menu import router as menu_router
from .product_mgmt import router as product_router
routers = [inline_router]
routers = [inline_router, menu_router, product_router]

View File

@@ -11,7 +11,8 @@ from aiogram.utils.deep_linking import create_start_link
from sqlalchemy.ext.asyncio import AsyncSession
from misc.filters import IsVerified
from misc.kb.admins import payment_link, placeholder_kb
from misc.kb.admins import payment_link
from misc.kb.common import placeholder_kb
from misc.utils import b64_to_dict, dict_to_b64
from repositories.invoices import InvoiceRepository

31
handlers/admins/menu.py Normal file
View File

@@ -0,0 +1,31 @@
import logging
from aiogram import Router, F
from aiogram.fsm.context import FSMContext
from aiogram.types import Message, CallbackQuery
from aiogram.filters import Command
from misc.filters import IsVerified
from misc.kb.admins import main_menu
router = Router()
logger = logging.getLogger(__name__)
@router.message(IsVerified(), Command("start"))
async def admin_main_menu(
msg: Message,
state: FSMContext,
):
await state.clear()
await msg.answer("admin", reply_markup=main_menu)
@router.callback_query(IsVerified(), F.data.startswith("menu:"))
async def admin_main_menu_cb(
cb: CallbackQuery,
state: FSMContext,
):
await state.clear()
await cb.message.edit_text("admin", reply_markup=main_menu)

View File

@@ -0,0 +1,95 @@
import logging
from aiogram import Router, F
from aiogram.types import Message, CallbackQuery
from aiogram.fsm.context import FSMContext
from sqlalchemy.ext.asyncio import AsyncSession
from dto.control import EditProductContext
from misc.filters import IsVerified
from misc.kb.admins import back_to_product_kb
from misc.states import AdminControlStorage
from misc.texts import product_editing_mapping
from repositories.products import ProductRepository
logger = logging.getLogger(__name__)
router = Router()
@router.callback_query(IsVerified(), F.data.startswith("edit_product:"))
async def edit_product(cb: CallbackQuery, state: FSMContext):
await state.clear()
data = cb.data.split(":")
product_id = data[1]
mode = data[2]
if cb.message.photo:
await cb.message.delete()
msg = await cb.message.answer(
f"<b>✍️ Введите {product_editing_mapping.get(mode)}</b>",
reply_markup=back_to_product_kb(
product_id, cb_factory=lambda p: f"product:{p}"
),
)
else:
msg = cb.message
await cb.message.edit_text(
f"<b>✍️ Введите {product_editing_mapping.get(mode)}</b>",
reply_markup=back_to_product_kb(
product_id, cb_factory=lambda p: f"product:{p}"
),
)
ctx = EditProductContext(int(product_id), mode, msg)
await state.set_state(AdminControlStorage.edit_product)
await state.set_data({"ctx": ctx})
@router.message(AdminControlStorage.edit_product)
async def edit_product_query(
msg: Message,
state: FSMContext,
session: AsyncSession,
products_repo: ProductRepository,
):
data = await state.get_data()
await state.clear()
await msg.delete()
ctx: EditProductContext = data.get("ctx", EditProductContext)
kb = back_to_product_kb(ctx.product_id, cb_factory=lambda p: f"product:{p}")
try:
await ctx.msg.edit_text("")
if ctx.mode == "name":
await products_repo.update_product_name_by_id(
session, ctx.product_id, msg.text
)
elif ctx.mode == "description":
await products_repo.update_product_description_by_id(
session, ctx.product_id, msg.text
)
elif ctx.mode == "price":
if msg.text.isdigit():
await products_repo.update_product_price_by_id(
session, ctx.product_id, int(msg.text)
)
else:
await ctx.msg.edit_text(
"❌ Вы ввели не число, попробуйте ещё раз...",
reply_markup=kb,
)
await state.set_state(AdminControlStorage.edit_product)
await state.set_data({"ctx": ctx})
return
else:
await ctx.msg.edit_text("🍃", reply_markup=kb)
return
await ctx.msg.edit_text("✅ Изменения применены.", reply_markup=kb)
except Exception as e:
logger.exception(e)
await ctx.msg.edit_text(text="‼️ Что-то пошло не так.", reply_markup=kb)