91 lines
2.3 KiB
Python
91 lines
2.3 KiB
Python
from aiogram import Router, F
|
|
from aiogram.types import CallbackQuery, Message
|
|
from aiogram.filters import Command
|
|
from aiogram.fsm.context import FSMContext
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from config import PAGE_SIZE
|
|
from misc.kb.client import render_cart
|
|
from misc.kb.common import return_menu
|
|
from services.orders import OrderService
|
|
|
|
router = Router()
|
|
|
|
|
|
@router.callback_query(F.data == "cart")
|
|
async def cart_init(
|
|
cb: CallbackQuery,
|
|
state: FSMContext,
|
|
session: AsyncSession,
|
|
order_service: OrderService,
|
|
):
|
|
await state.clear()
|
|
|
|
cart = await order_service.build_pagination_cart_dto(
|
|
session, customer=cb.from_user.id
|
|
)
|
|
if not len(cart.items):
|
|
await cb.message.edit_text("🛒 Корзина пуста.", reply_markup=return_menu)
|
|
return
|
|
|
|
await cb.message.edit_text(
|
|
f"total: {cart.total}₽ | {len(cart.items)}",
|
|
reply_markup=render_cart(
|
|
cart.items[:PAGE_SIZE],
|
|
show_next=len(cart.items) > PAGE_SIZE,
|
|
show_purchase=bool(len(cart.items)),
|
|
),
|
|
)
|
|
|
|
|
|
@router.message(Command("cart"))
|
|
async def cart_cmd(
|
|
msg: Message,
|
|
state: FSMContext,
|
|
session: AsyncSession,
|
|
order_service: OrderService,
|
|
):
|
|
await state.clear()
|
|
|
|
cart = await order_service.build_pagination_cart_dto(
|
|
session, customer=msg.from_user.id
|
|
)
|
|
|
|
if not len(cart.items):
|
|
await msg.answer("🛒 Корзина пуста.", reply_markup=return_menu)
|
|
return
|
|
|
|
await msg.answer(
|
|
f"total: {cart.total}₽",
|
|
reply_markup=render_cart(
|
|
cart.items[:PAGE_SIZE],
|
|
show_next=len(cart.items) > PAGE_SIZE,
|
|
show_purchase=bool(len(cart.items)),
|
|
),
|
|
)
|
|
|
|
|
|
@router.callback_query(F.data.startswith("cart:"))
|
|
async def cart_pagination(
|
|
cb: CallbackQuery,
|
|
state: FSMContext,
|
|
session: AsyncSession,
|
|
order_service: OrderService,
|
|
):
|
|
await state.clear()
|
|
|
|
page = int(cb.data.split(":")[1])
|
|
|
|
cart = await order_service.build_pagination_cart_dto(
|
|
session, customer=cb.from_user.id, offset=page * PAGE_SIZE
|
|
)
|
|
|
|
await cb.message.edit_reply_markup(
|
|
reply_markup=render_cart(
|
|
cart.items[:PAGE_SIZE],
|
|
page=page,
|
|
show_next=len(cart.items) > PAGE_SIZE,
|
|
show_prev=page > 0,
|
|
),
|
|
)
|