feat: Added travel models, travel creation command, travels list command with pagination, set help message, improvements and fixes

This commit is contained in:
ITQ
2024-03-23 02:47:05 +03:00
parent 675e5ab891
commit 1802ce81b0
15 changed files with 623 additions and 15 deletions
+135
View File
@@ -0,0 +1,135 @@
__all__ = ()
from aiogram import F, Router
from aiogram.filters import Command, StateFilter
from aiogram.fsm.context import FSMContext
from aiogram.types import Message
from app import messages, session
from app.filters.user import Registered
from app.models.travel import Travel
from app.states.travel import TravelCreationState
from app.utils.states import delete_message_from_state, handle_validation_error
router = Router(name="create_travel_command")
@router.message(Command("create_travel"), Registered(), StateFilter(None))
async def command_create_travel_handler(
message: Message,
state: FSMContext,
) -> None:
if message.from_user is None:
return
await message.answer(
messages.CREATE_TRAVEL,
)
await message.answer(
messages.INPUT_TRAVEL_TITLE,
)
await state.set_state(TravelCreationState.title)
@router.message(TravelCreationState.title, F.text)
async def name_handler(
message: Message,
state: FSMContext,
) -> None:
if message.text is None:
return
title = message.text.strip()
if title == "/cancel":
await message.answer(messages.ACTION_CANCELED)
await message.delete()
await delete_message_from_state(state, message.chat.id, message.bot)
await state.clear()
return
try:
validated_title = Travel().validate_title(key="title", value=title)
except AssertionError as e:
await handle_validation_error(message, state, e)
return
await delete_message_from_state(state, message.chat.id, message.bot)
await state.update_data(title=validated_title)
await state.set_state(TravelCreationState.description)
await message.answer(
messages.INPUT_TRAVEL_CALLBACK.format(
key="title",
value=validated_title,
),
)
await message.answer(
messages.INPUT_TRAVEL_DESCRIPTION,
)
@router.message(TravelCreationState.description, F.text)
async def description_handler(
message: Message,
state: FSMContext,
) -> None:
if message.text is None or message.from_user is None:
return
description = message.text.strip()
if description == "/cancel":
await message.answer(messages.ACTION_CANCELED)
await message.delete()
await delete_message_from_state(state, message.chat.id, message.bot)
await state.clear()
return
if description == "/skip":
await state.update_data(description=None)
await message.answer(messages.INPUT_TRAVEL_DESCRIPTION_SKIPPED)
else:
try:
validated_description = Travel().validate_description(
key="description",
value=description,
)
except AssertionError as e:
await handle_validation_error(message, state, e)
return
await state.update_data(description=validated_description)
await state.set_state(TravelCreationState.error_message_id)
await message.answer(
messages.INPUT_TRAVEL_CALLBACK.format(
key="description",
value=validated_description,
),
)
await delete_message_from_state(state, message.chat.id, message.bot)
data = await state.get_data()
await state.clear()
if "error_message_id" in data:
del data["error_message_id"]
data["author_id"] = message.from_user.id
session.add(Travel(**data))
session.commit()
await message.answer(messages.TRAVEL_CREATED.format(title=data["title"]))
+36
View File
@@ -0,0 +1,36 @@
__all__ = ()
from aiogram import Router
from aiogram.filters import Command, StateFilter
from aiogram.types import Message
from app import messages
from app.config import Config
from app.filters.user import Registered
from app.keyboards.builders import travels_keyboard
from app.models.user import User
router = Router(name="travels_command")
@router.message(Command("travels"), Registered(), StateFilter(None))
async def command_help_handler(message: Message) -> None:
page = 0
if message.from_user is None:
return
user = User().get_user_by_telegram_id(message.from_user.id)
travels = user.get_user_travels()
if not travels or travels == []:
await message.answer(messages.NO_TRAVELS)
else:
pages = (len(travels) + Config.PAGE_SIZE - 1) // Config.PAGE_SIZE
await message.answer(
messages.TRAVELS,
reply_markup=travels_keyboard(travels, page, pages),
)