Skip to content

Commit

Permalink
Merge pull request #94 from Studio-Yandex-Practicum/refactoring/tasks
Browse files Browse the repository at this point in the history
Tasks pagination added
  • Loading branch information
SabMorgan authored Jul 4, 2023
2 parents 743b69d + 05040aa commit de9aed9
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 20 deletions.
41 changes: 28 additions & 13 deletions src/bot/handlers/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@
from telegram.ext import Application, CallbackContext, CallbackQueryHandler, ContextTypes

from src.bot.constants import callback_data, patterns
from src.bot.keyboards import get_back_menu, get_categories_keyboard, get_subcategories_keyboard
from src.bot.keyboards import (
get_back_menu,
get_categories_keyboard,
get_subcategories_keyboard,
view_more_tasks_keyboard,
)
from src.bot.services.category import CategoryService
from src.bot.services.task import TaskService
from src.core.logging.utils import logger_decor
Expand Down Expand Up @@ -67,24 +72,34 @@ async def back_subcategory_callback(update: Update, context: ContextTypes.DEFAUL
@logger_decor
async def view_task_callback(update: Update, context: CallbackContext, limit: int = 3):
task_service = TaskService()
tasks = await task_service.get_user_tasks(limit)
if not tasks:
await context.bot.send_message(
chat_id=update.effective_chat.id,
text="Нет доступных заданий",
parse_mode=ParseMode.HTML,
disable_web_page_preview=True,
reply_markup=await get_back_menu(),
)
for task in tasks:
tasks_to_show, offset, page_number = await task_service.get_user_tasks_by_page(
context.user_data.get("page_number", 1), limit
)

for task in tasks_to_show:
message = display_tasks(task)
await context.bot.send_message(
chat_id=update.effective_chat.id, text=message, parse_mode=ParseMode.HTML, disable_web_page_preview=True
)
await show_next_tasks(update, context, limit, offset, page_number)


async def show_next_tasks(update: Update, context: CallbackContext, limit: int, offset: int, page_number: int):
task_service = TaskService()
remaining_tasks = await task_service.get_remaining_user_tasks_count(limit, offset)

if remaining_tasks > 0:
text = f"Есть ещё задания, показать? Осталось: {remaining_tasks}"
context.user_data["page_number"] = page_number + 1
keyboard = await view_more_tasks_keyboard()
else:
text = "Заданий больше нет."
keyboard = await get_back_menu()

await context.bot.send_message(
chat_id=update.effective_chat.id,
text="### Здесь текст о наличии заданий, или возврата в меню:\n" "Есть ещё задания, показать?:",
reply_markup=await get_back_menu(),
text=text,
reply_markup=keyboard,
)


Expand Down
8 changes: 8 additions & 0 deletions src/bot/keyboards.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,14 @@ async def get_open_tasks_and_menu_keyboard() -> InlineKeyboardMarkup:
return InlineKeyboardMarkup(keyboard)


async def view_more_tasks_keyboard() -> InlineKeyboardMarkup:
keyboard = [
[InlineKeyboardButton(text="Показать ещё задания", callback_data=callback_data.VIEW_TASKS)],
[InlineKeyboardButton(text="Открыть меню", callback_data=callback_data.MENU)],
]
return InlineKeyboardMarkup(keyboard)


def get_confirm_keyboard() -> InlineKeyboardMarkup:
keyboard = [
[InlineKeyboardButton("Да", callback_data=callback_data.CONFIRM_CATEGORIES)],
Expand Down
12 changes: 10 additions & 2 deletions src/bot/services/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,15 @@ class TaskService:
def __init__(self, sessionmaker: Generator[AsyncSession, None, None] = get_session):
self._sessionmaker = contextlib.asynccontextmanager(sessionmaker)

async def get_user_tasks(self, limit: int) -> list[Task]:
async def get_user_tasks_by_page(self, page_number, limit: int) -> list[Task]:
offset = (page_number - 1) * limit
async with self._sessionmaker() as session:
repository = TaskRepository(session)
return await repository.get_user_tasks(limit)
return await repository.get_tasks_limit_for_user(limit, offset), offset, page_number

async def get_remaining_user_tasks_count(self, limit: int, offset: int) -> int:
async with self._sessionmaker() as session:
repository = TaskRepository(session)
total_tasks = await repository.get_user_tasks_count()
remaining_tasks = total_tasks - (offset + limit)
return remaining_tasks
21 changes: 16 additions & 5 deletions src/core/db/repository/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,22 @@ class TaskRepository(ContentRepository):
def __init__(self, session: AsyncSession = Depends(get_session)) -> None:
super().__init__(session, Task)

async def get_tasks_for_user(self, user_id: int) -> list[Task]:
async def get_tasks_for_user(self, user_id: int, limit: int, offset: int) -> list[Task]:
"""Получить список задач из категорий на которые подписан пользователь."""
tasks = await self._session.execute(select(Task).join(Category).where(Category.users.any(id=user_id)))
tasks = await self._session.execute(
select(Task).join(Category).where(Category.users.any(id=user_id)).limit(limit).offset(offset)
)
return tasks.scalars().all()

async def get_user_tasks(self, limit: int) -> list[Task]:
"""Получить список задач из категорий."""
return await self._session.scalars(select(Task).options(joinedload(Task.category)).limit(limit))
async def get_all_user_tasks(self) -> list[Task]:
"""Получить список задач из категорий на которые подписан пользователь."""
return await self._session.scalars(select(Task).options(joinedload(Task.category)))

async def get_tasks_limit_for_user(self, limit: int, offset: int) -> list[Task]:
"""Получить limit-выборку из списка всех задач пользователя."""
return await self._session.scalars(select(Task).options(joinedload(Task.category)).limit(limit).offset(offset))

async def get_user_tasks_count(self) -> int:
"""Получить общее количество задач для пользователя."""
tasks = await self._session.scalars(select(Task).options(joinedload(Task.category)))
return len(tasks.all())

0 comments on commit de9aed9

Please sign in to comment.