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"]))