Add page coupons
This commit is contained in:
+28
-11
@@ -114,35 +114,52 @@ async def create_coupon(
|
||||
raise
|
||||
|
||||
|
||||
async def get_all_coupons(session: Any):
|
||||
async def get_all_coupons(session: Any, page: int = 1, per_page: int = 10):
|
||||
"""
|
||||
Получает список всех купонов из базы данных.
|
||||
Получает список купонов из базы данных с пагинацией.
|
||||
|
||||
Args:
|
||||
session (Any): Сессия базы данных для выполнения запроса
|
||||
page (int): Номер страницы (по умолчанию 1)
|
||||
per_page (int): Количество купонов на странице (по умолчанию 10)
|
||||
|
||||
Returns:
|
||||
list: Список словарей с информацией о купонах, каждый словарь содержит:
|
||||
- code (str): Код купона
|
||||
- amount (int): Сумма купона
|
||||
- usage_limit (int): Максимальное количество использований
|
||||
- usage_count (int): Текущее количество использований купона
|
||||
dict: Словарь с информацией о купонах и пагинации:
|
||||
- coupons (list): Список словарей с информацией о купонах
|
||||
- total (int): Общее количество купонов
|
||||
- pages (int): Общее количество страниц
|
||||
- current_page (int): Текущая страница
|
||||
|
||||
Raises:
|
||||
Exception: В случае ошибки при получении данных из базы
|
||||
"""
|
||||
try:
|
||||
offset = (page - 1) * per_page
|
||||
coupons = await session.fetch(
|
||||
"""
|
||||
SELECT code, amount, usage_limit, usage_count
|
||||
FROM coupons
|
||||
"""
|
||||
ORDER BY id
|
||||
LIMIT $1 OFFSET $2
|
||||
""",
|
||||
per_page, offset
|
||||
)
|
||||
|
||||
logger.info(f"Успешно получено {len(coupons)} купонов из базы данных")
|
||||
total_count = await session.fetchval("SELECT COUNT(*) FROM coupons")
|
||||
total_pages = -(-total_count // per_page) # Округление вверх
|
||||
|
||||
return coupons
|
||||
logger.info(f"Успешно получено {len(coupons)} купонов из базы данных (страница {page})")
|
||||
|
||||
return {
|
||||
"coupons": coupons,
|
||||
"total": total_count,
|
||||
"pages": total_pages,
|
||||
"current_page": page
|
||||
}
|
||||
except Exception as e:
|
||||
logger.error(f"Критическая ошибка при получении списка купонов: {e}")
|
||||
logger.exception("Трассировка стека ошибки получения купонов")
|
||||
return []
|
||||
return {"coupons": [], "total": 0, "pages": 0, "current_page": page}
|
||||
|
||||
|
||||
async def delete_coupon_from_db(coupon_code: str, session: Any):
|
||||
|
||||
@@ -27,31 +27,33 @@ async def show_coupon_management_menu(
|
||||
builder.row(
|
||||
InlineKeyboardButton(text="➕ Создать купон", callback_data="create_coupon")
|
||||
)
|
||||
builder.row(InlineKeyboardButton(text="Купоны", callback_data="coupons"))
|
||||
builder.row(InlineKeyboardButton(text="🎟️ Купоны", callback_data="coupons"))
|
||||
builder.row(InlineKeyboardButton(text="🔙 Назад", callback_data="admin"))
|
||||
await callback_query.message.answer(
|
||||
"🛠 Меню управления купонами:", reply_markup=builder.as_markup()
|
||||
)
|
||||
|
||||
|
||||
@router.callback_query(F.data == "coupons", IsAdminFilter())
|
||||
@router.callback_query(F.data.startswith("coupons"), IsAdminFilter())
|
||||
async def show_coupon_list(callback_query: types.CallbackQuery, session: Any):
|
||||
try:
|
||||
coupons = await get_all_coupons(session)
|
||||
page = int(callback_query.data.split(':')[1]) if ':' in callback_query.data else 1
|
||||
per_page = 10
|
||||
result = await get_all_coupons(session, page, per_page)
|
||||
coupons = result["coupons"]
|
||||
total_pages = result["pages"]
|
||||
current_page = result["current_page"]
|
||||
|
||||
if not coupons:
|
||||
builder = InlineKeyboardBuilder()
|
||||
builder.row(
|
||||
InlineKeyboardButton(text="🔙 Назад", callback_data="coupons_editor")
|
||||
)
|
||||
|
||||
builder.row(InlineKeyboardButton(text="🔙 Назад", callback_data="coupons_editor"))
|
||||
await callback_query.message.answer(
|
||||
"❌ На данный момент нет доступных купонов. 🚫\nВы можете вернуться в меню управления. 🔙",
|
||||
reply_markup=builder.as_markup(),
|
||||
)
|
||||
return
|
||||
|
||||
coupon_list = "📜 Список всех купонов:\n\n"
|
||||
coupon_list = f"📜 Список купонов (страница {current_page} из {total_pages}):\n\n"
|
||||
builder = InlineKeyboardBuilder()
|
||||
|
||||
for coupon in coupons:
|
||||
@@ -61,23 +63,22 @@ async def show_coupon_list(callback_query: types.CallbackQuery, session: Any):
|
||||
f"🔢 <b>Лимит использования:</b> {coupon['usage_limit']} раз\n"
|
||||
f"✅ <b>Использовано:</b> {coupon['usage_count']} раз\n\n"
|
||||
)
|
||||
builder.row(InlineKeyboardButton(
|
||||
text=f"❌ Удалить {coupon['code']}",
|
||||
callback_data=f"delete_coupon_{coupon['code']}"
|
||||
))
|
||||
|
||||
builder.row(
|
||||
InlineKeyboardButton(
|
||||
text=f"❌ Удалить {coupon['code']}",
|
||||
callback_data=f"delete_coupon_{coupon['code']}",
|
||||
)
|
||||
)
|
||||
|
||||
builder.row(
|
||||
InlineKeyboardButton(text="🔙 Назад", callback_data="coupons_editor")
|
||||
)
|
||||
await callback_query.message.answer(
|
||||
coupon_list, reply_markup=builder.as_markup()
|
||||
)
|
||||
if current_page > 1:
|
||||
builder.row(InlineKeyboardButton(text="⬅️ Предыдущая", callback_data=f"coupons:{current_page-1}"))
|
||||
if current_page < total_pages:
|
||||
builder.row(InlineKeyboardButton(text="➡️ Следующая", callback_data=f"coupons:{current_page+1}"))
|
||||
|
||||
builder.row(InlineKeyboardButton(text="🔙 Назад", callback_data="coupons_editor"))
|
||||
await callback_query.message.answer(coupon_list, reply_markup=builder.as_markup())
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка при получении списка купонов: {e}")
|
||||
await callback_query.message.answer("Произошла ошибка при получении списка купонов.")
|
||||
|
||||
|
||||
@router.callback_query(F.data.startswith("delete_coupon_"), IsAdminFilter())
|
||||
|
||||
Reference in New Issue
Block a user