Некоторые запросы к бд:
def read_cart_by_user_id(user_id: int) -> list[dict]:
stmt = select(Order).where(Order.user_id == user_id).where(Order.status == OrderStatus.cart)
with Session() as db:
cart = db.scalars(stmt).first()
return OrderSchema.from_orm(cart).__dict__
def read_active_orders(user_id: int) -> list[dict]:
stmt = (
select(Order)
.where(Order.user_id == user_id)
.where(
Order.status == Order.status.created
or Order.status == Order.status.confirmed
or Order.status == Order.status.shipped
)
)
with Session() as db:
orders = db.scalars(stmt).all()
return [OrderSchema.from_orm(order).__dict__ for order in orders]
def read_order_by_id(id: int) -> dict | None:
stmt = select(Order).where(Order.id == id)
with Session() as db:
order = db.scalars(stmt).first()
if not order:
return None
return OrderSchema.from_orm(order).__dict__
Описание некоторых хэндлеров бота:
@router.callback_query(F.data == "order_view")
async def order_view(callback: types.CallbackQuery, state: FSMContext):
await callback.message.edit_reply_markup(reply_markup=None)
await callback.message.answer("Выберите действие для заказа", reply_markup=seller_kb.order_action())
@router.callback_query(F.data == "approve")
async def approve(callback: types.CallbackQuery, state: FSMContext):
orders = order.read_created_orders()
if orders:
await callback.message.answer("Выберите заказ для подтверждения", reply_markup=seller_kb.orders(orders,'apv:'))
else:
await callback.message.answer("Нет созданных заказов", reply_markup=seller_kb.sellermenu())
@router.callback_query(F.data.startswith("apv:"))
async def approve_by_id(callback: types.CallbackQuery, state: FSMContext):
id = callback.data[4:]
if order.update_order_status(int(id), "confirmed"): # order.update_order_status
await callback.message.answer("Заказ подтвержден", reply_markup=seller_kb.sellermenu())
else:
await callback.message.answer("Ошибка подтверждения, повторите попытку", reply_markup=seller_kb.sellermenu())
await state.set_state(sellerstate.menu)
@router.callback_query(F.data == "delete_product")
async def delete_product(callback: types.CallbackQuery, state: FSMContext):
await callback.message.answer("Введите id товара для удаления", reply_markup=None)
await state.set_state(sellerstate.enter_id)
@router.message(sellerstate.enter_id)
async def enter_id(message: types.Message, state: FSMContext):
product_to_delete = product.read_product_by_id(int(message.text))
if product_to_delete == None:
await message.answer("Такого товара не существует, повторите попытку")
else:
await message.answer(f"Подтвердите удаление товара:\nID: {product_to_delete['id']}\nНазвание: {product_to_delete['name']}\nЦена: {product_to_delete['price']}", reply_markup=seller_kb.yes_or_no(product_to_delete['id']))
await state.set_state(sellerstate.menu)
@router.callback_query(F.data.startswith("delid:"))
async def delete_product(callback: types.CallbackQuery, state: FSMContext):
await callback.message.edit_reply_markup(reply_markup=None)
id = callback.data[6:]
if product.delete_product(int(id)):
await callback.message.answer("Товар успешно удален", reply_markup=seller_kb.sellermenu())
await state.set_state(sellerstate.menu)
else:
await callback.message.answer("Ошибка удаления, повторите попытку", reply_markup=seller_kb.sellermenu())
await state.set_state(sellerstate.menu)
Общая логика работы UI представлена ниже
Рис. 5. Блок-схема идентификации
Рис. 6. Блок-схема работы покупателей
Рис. 5. Блок-схема работы продавцов
Некоторые примеры обработки запросов:
