bugs: add pagination with inline navigation buttons

parent 60b1f1fe
from telegrinder import InlineKeyboard, InlineButton
def bugs_nav_kb(maintainer: str, offset: int, total: int, per_page: int = 10):
kb = InlineKeyboard()
nav_buttons = []
if offset > 0:
nav_buttons.append(InlineButton(
text="← Назад",
callback_data=f"bugs/{maintainer}/{offset - per_page}",
))
if offset + per_page < total:
nav_buttons.append(InlineButton(
text="Вперёд →",
callback_data=f"bugs/{maintainer}/{offset + per_page}",
))
if nav_buttons:
for btn in nav_buttons:
kb.add(btn)
kb.row()
kb.add(InlineButton(
"Полный список",
url=f"https://packages.altlinux.org/ru/sisyphus/maintainers/{maintainer}/bugs",
))
return kb.get_markup()
def bugs_more_kb(maintainer: str):
kb = InlineKeyboard()
kb.add(
......
from telegrinder import Dispatch, Message
from telegrinder.rules import Command, Argument, Text, IsPrivate
from telegrinder import Dispatch, Message, CallbackQuery
from telegrinder.rules import Command, Argument, Text, IsPrivate, CallbackDataMarkup
from telegrinder.tools.formatting import HTMLFormatter
from altrepo import altrepo
from config import BUGS_URL
from database.models import User
from data.keyboards import bugs_keyboards
from services.utils import _bold, resolve_maintainer
from services.bugs import bugs as bugs_service
from services.bugs import bugs
PER_PAGE = 10
dp = Dispatch()
async def fetch_unresolved_bugs(maintainer: str):
bugs_data = await altrepo.api.bug.bugzilla_by_maintainer(maintainer)
if not bugs_data:
return []
return [bug for bug in bugs_data.bugs if bug.status not in ["RESOLVED", "CLOSED"]]
def format_bugs_page(bugs, offset: int, total: int):
message = _bold("Ошибки:\n\n")
for bug in bugs:
message += HTMLFormatter(f"<a href='{BUGS_URL}{bug.id}'>#{bug.id}</a>") + \
f" | {bug.product} - {bug.component} | {bug.severity}\n"
message += bug.summary + "\n\n"
message += f"Баги {offset + 1}–{offset + len(bugs)} из {total}"
return message
@dp.message(Command("bugs", Argument("maintainer", optional=True)))
@dp.message(Text(["bugs", "ошибки"], ignore_case=True), IsPrivate())
async def bugs_handler(m: Message, user: User | None, maintainer: str | None = None) -> None:
await bugs(
user, m.chat_id, maintainer
resolved = await resolve_maintainer(maintainer, user, m.chat_id)
if not resolved:
return
nickname = resolved.nickname
bugs = await fetch_unresolved_bugs(nickname)
if not bugs:
await m.answer("Нет открытых багов.")
return
total = len(bugs)
page = bugs[:PER_PAGE]
await m.answer(
format_bugs_page(page, 0, total),
reply_markup=bugs_keyboards.bugs_nav_kb(nickname, 0, total, PER_PAGE),
)
@dp.callback_query(CallbackDataMarkup("bugs/<maintainer>/<offset:int>"))
async def bugs_page_handler(
cb: CallbackQuery, maintainer: str, offset: int,
) -> None:
bugs = await fetch_unresolved_bugs(maintainer)
if not bugs:
await cb.answer("Нет открытых багов.")
return
total = len(bugs)
page = bugs[offset:offset + PER_PAGE]
await cb.edit_text(
format_bugs_page(page, offset, total),
reply_markup=bugs_keyboards.bugs_nav_kb(maintainer, offset, total, PER_PAGE),
)
await cb.answer()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment