You've already forked Travel-Agent
feat: Added travel models, travel creation command, travels list command with pagination, set help message, improvements and fixes
This commit is contained in:
@@ -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"]))
|
||||
Reference in New Issue
Block a user