You've already forked Travel-Agent
chore: Code refactoring and improvements
This commit is contained in:
+17
-81
@@ -8,11 +8,15 @@ from aiogram.fsm.context import FSMContext
|
|||||||
from aiogram.types import CallbackQuery, Message, ReplyKeyboardRemove
|
from aiogram.types import CallbackQuery, Message, ReplyKeyboardRemove
|
||||||
|
|
||||||
from app import messages, session
|
from app import messages, session
|
||||||
from app.filters.user_filter import Registered, RegisteredCallback
|
from app.filters.user import Registered, RegisteredCallback
|
||||||
from app.keyboards.builders import profile
|
from app.keyboards.builders import sex_keyboard
|
||||||
from app.keyboards.profile import get
|
from app.keyboards.profile import get
|
||||||
from app.models.user import User
|
from app.models.user import User
|
||||||
from app.utils.states import delete_message_from_state, UserAltering
|
from app.states.user import UserAltering
|
||||||
|
from app.utils.states import (
|
||||||
|
delete_message_from_state,
|
||||||
|
handle_validation_error,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
router = Router(name="profile_callback")
|
router = Router(name="profile_callback")
|
||||||
@@ -47,7 +51,7 @@ async def profile_change_callback(
|
|||||||
elif column == "sex":
|
elif column == "sex":
|
||||||
message = await callback.message.answer(
|
message = await callback.message.answer(
|
||||||
f"{messages.INPUT_SEX}\n{messages.CANCEL_CHANGE}",
|
f"{messages.INPUT_SEX}\n{messages.CANCEL_CHANGE}",
|
||||||
reply_markup=profile(["Male", "Female"]),
|
reply_markup=sex_keyboard(["Male", "Female"]),
|
||||||
)
|
)
|
||||||
elif column == "location":
|
elif column == "location":
|
||||||
message = await callback.message.answer(
|
message = await callback.message.answer(
|
||||||
@@ -93,17 +97,7 @@ async def profile_change_entered(message: Message, state: FSMContext) -> None:
|
|||||||
value=value,
|
value=value,
|
||||||
)
|
)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
await message.delete()
|
await handle_validation_error(message, state, e)
|
||||||
await delete_message_from_state(
|
|
||||||
state,
|
|
||||||
message.chat.id,
|
|
||||||
message.bot,
|
|
||||||
)
|
|
||||||
|
|
||||||
error_message = await message.answer(str(e))
|
|
||||||
await state.update_data(
|
|
||||||
previous_message_id=error_message.message_id,
|
|
||||||
)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -112,17 +106,7 @@ async def profile_change_entered(message: Message, state: FSMContext) -> None:
|
|||||||
try:
|
try:
|
||||||
validated_age = User().validate_age(key="age", value=value)
|
validated_age = User().validate_age(key="age", value=value)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
await message.delete()
|
await handle_validation_error(message, state, e)
|
||||||
await delete_message_from_state(
|
|
||||||
state,
|
|
||||||
message.chat.id,
|
|
||||||
message.bot,
|
|
||||||
)
|
|
||||||
|
|
||||||
error_message = await message.answer(str(e))
|
|
||||||
await state.update_data(
|
|
||||||
previous_message_id=error_message.message_id,
|
|
||||||
)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -139,17 +123,7 @@ async def profile_change_entered(message: Message, state: FSMContext) -> None:
|
|||||||
try:
|
try:
|
||||||
validated_bio = User().validate_bio(key="bio", value=value)
|
validated_bio = User().validate_bio(key="bio", value=value)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
await message.delete()
|
await handle_validation_error(message, state, e)
|
||||||
await delete_message_from_state(
|
|
||||||
state,
|
|
||||||
message.chat.id,
|
|
||||||
message.bot,
|
|
||||||
)
|
|
||||||
|
|
||||||
error_message = await message.answer(str(e))
|
|
||||||
await state.update_data(
|
|
||||||
previous_message_id=error_message.message_id,
|
|
||||||
)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -160,17 +134,7 @@ async def profile_change_entered(message: Message, state: FSMContext) -> None:
|
|||||||
try:
|
try:
|
||||||
validated_sex = User().validate_sex(key="sex", value=value)
|
validated_sex = User().validate_sex(key="sex", value=value)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
await message.delete()
|
await handle_validation_error(message, state, e)
|
||||||
await delete_message_from_state(
|
|
||||||
state,
|
|
||||||
message.chat.id,
|
|
||||||
message.bot,
|
|
||||||
)
|
|
||||||
|
|
||||||
error_message = await message.answer(str(e))
|
|
||||||
await state.update_data(
|
|
||||||
previous_message_id=error_message.message_id,
|
|
||||||
)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -179,18 +143,10 @@ async def profile_change_entered(message: Message, state: FSMContext) -> None:
|
|||||||
location = value.split(", ")
|
location = value.split(", ")
|
||||||
|
|
||||||
if len(location) != 2:
|
if len(location) != 2:
|
||||||
await message.delete()
|
await handle_validation_error(
|
||||||
await delete_message_from_state(
|
message,
|
||||||
state,
|
state,
|
||||||
message.chat.id,
|
messages.VALIDATION_ERROR,
|
||||||
message.bot,
|
|
||||||
)
|
|
||||||
|
|
||||||
error_message = await message.answer(
|
|
||||||
messages.VALIDATION_ERROR_MESSAGE,
|
|
||||||
)
|
|
||||||
await state.update_data(
|
|
||||||
previous_message_id=error_message.message_id,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -203,17 +159,7 @@ async def profile_change_entered(message: Message, state: FSMContext) -> None:
|
|||||||
value=country,
|
value=country,
|
||||||
)
|
)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
await message.delete()
|
await handle_validation_error(message, state, e)
|
||||||
await delete_message_from_state(
|
|
||||||
state,
|
|
||||||
message.chat.id,
|
|
||||||
message.bot,
|
|
||||||
)
|
|
||||||
|
|
||||||
error_message = await message.answer(str(e))
|
|
||||||
await state.update_data(
|
|
||||||
previous_message_id=error_message.message_id,
|
|
||||||
)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -223,17 +169,7 @@ async def profile_change_entered(message: Message, state: FSMContext) -> None:
|
|||||||
country=validated_country,
|
country=validated_country,
|
||||||
)
|
)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
await message.delete()
|
await handle_validation_error(message, state, e)
|
||||||
await delete_message_from_state(
|
|
||||||
state,
|
|
||||||
message.chat.id,
|
|
||||||
message.bot,
|
|
||||||
)
|
|
||||||
|
|
||||||
error_message = await message.answer(str(e))
|
|
||||||
await state.update_data(
|
|
||||||
previous_message_id=error_message.message_id,
|
|
||||||
)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from aiogram.filters import Command
|
|||||||
from aiogram.types import Message
|
from aiogram.types import Message
|
||||||
|
|
||||||
from app import messages
|
from app import messages
|
||||||
from app.filters.user_filter import Registered
|
from app.filters.user import Registered
|
||||||
|
|
||||||
|
|
||||||
router = Router(name="help_command")
|
router = Router(name="help_command")
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from aiogram.filters import Command
|
|||||||
from aiogram.types import Message
|
from aiogram.types import Message
|
||||||
|
|
||||||
from app import messages
|
from app import messages
|
||||||
from app.filters.user_filter import Registered
|
from app.filters.user import Registered
|
||||||
from app.keyboards.profile import get
|
from app.keyboards.profile import get
|
||||||
from app.models.user import User
|
from app.models.user import User
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,13 @@ from aiogram.fsm.context import FSMContext
|
|||||||
from aiogram.types import Message, ReplyKeyboardRemove
|
from aiogram.types import Message, ReplyKeyboardRemove
|
||||||
|
|
||||||
from app import messages, session
|
from app import messages, session
|
||||||
from app.keyboards.builders import profile
|
from app.keyboards.builders import sex_keyboard
|
||||||
from app.models.user import User
|
from app.models.user import User
|
||||||
from app.utils.states import delete_message_from_state, RegistrationForm
|
from app.states.user import RegistrationForm
|
||||||
|
from app.utils.states import (
|
||||||
|
delete_message_from_state,
|
||||||
|
handle_validation_error,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
router = Router(name="start_command")
|
router = Router(name="start_command")
|
||||||
@@ -51,11 +55,7 @@ async def username_handler(message: Message, state: FSMContext) -> None:
|
|||||||
value=username,
|
value=username,
|
||||||
)
|
)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
await message.delete()
|
await handle_validation_error(message, state, e)
|
||||||
await delete_message_from_state(state, message.chat.id, message.bot)
|
|
||||||
|
|
||||||
error_message = await message.answer(str(e))
|
|
||||||
await state.update_data(previous_message_id=error_message.message_id)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -83,11 +83,7 @@ async def age_handler(message: Message, state: FSMContext) -> None:
|
|||||||
try:
|
try:
|
||||||
validated_age = User().validate_age(key="age", value=age)
|
validated_age = User().validate_age(key="age", value=age)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
await message.delete()
|
await handle_validation_error(message, state, e)
|
||||||
await delete_message_from_state(state, message.chat.id, message.bot)
|
|
||||||
|
|
||||||
error_message = await message.answer(str(e))
|
|
||||||
await state.update_data(previous_message_id=error_message.message_id)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -101,7 +97,7 @@ async def age_handler(message: Message, state: FSMContext) -> None:
|
|||||||
)
|
)
|
||||||
await message.answer(
|
await message.answer(
|
||||||
messages.INPUT_SEX,
|
messages.INPUT_SEX,
|
||||||
reply_markup=profile(["Male", "Female"]),
|
reply_markup=sex_keyboard(["Male", "Female"]),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -115,11 +111,7 @@ async def sex_handler(message: Message, state: FSMContext) -> None:
|
|||||||
try:
|
try:
|
||||||
validated_sex = User().validate_sex(key="sex", value=sex)
|
validated_sex = User().validate_sex(key="sex", value=sex)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
await message.delete()
|
await handle_validation_error(message, state, e)
|
||||||
await delete_message_from_state(state, message.chat.id, message.bot)
|
|
||||||
|
|
||||||
error_message = await message.answer(str(e))
|
|
||||||
await state.update_data(previous_message_id=error_message.message_id)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -154,17 +146,7 @@ async def bio_handler(message: Message, state: FSMContext) -> None:
|
|||||||
try:
|
try:
|
||||||
validated_bio = User().validate_bio(key="bio", value=bio)
|
validated_bio = User().validate_bio(key="bio", value=bio)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
await message.delete()
|
await handle_validation_error(message, state, e)
|
||||||
await delete_message_from_state(
|
|
||||||
state,
|
|
||||||
message.chat.id,
|
|
||||||
message.bot,
|
|
||||||
)
|
|
||||||
|
|
||||||
error_message = await message.answer(str(e))
|
|
||||||
await state.update_data(
|
|
||||||
previous_message_id=error_message.message_id,
|
|
||||||
)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -187,11 +169,11 @@ async def location_handler(message: Message, state: FSMContext) -> None:
|
|||||||
location = message.text.strip().split(", ")
|
location = message.text.strip().split(", ")
|
||||||
|
|
||||||
if len(location) != 2:
|
if len(location) != 2:
|
||||||
await message.delete()
|
await handle_validation_error(
|
||||||
await delete_message_from_state(state, message.chat.id, message.bot)
|
message,
|
||||||
|
state,
|
||||||
error_message = await message.answer(messages.VALIDATION_ERROR_MESSAGE)
|
messages.VALIDATION_ERROR,
|
||||||
await state.update_data(previous_message_id=error_message.message_id)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -203,11 +185,7 @@ async def location_handler(message: Message, state: FSMContext) -> None:
|
|||||||
value=country,
|
value=country,
|
||||||
)
|
)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
await message.delete()
|
await handle_validation_error(message, state, e)
|
||||||
await delete_message_from_state(state, message.chat.id, message.bot)
|
|
||||||
|
|
||||||
error_message = await message.answer(str(e))
|
|
||||||
await state.update_data(previous_message_id=error_message.message_id)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -217,11 +195,7 @@ async def location_handler(message: Message, state: FSMContext) -> None:
|
|||||||
country=validated_country,
|
country=validated_country,
|
||||||
)
|
)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
await message.delete()
|
await handle_validation_error(message, state, e)
|
||||||
await delete_message_from_state(state, message.chat.id, message.bot)
|
|
||||||
|
|
||||||
error_message = await message.answer(str(e))
|
|
||||||
await state.update_data(previous_message_id=error_message.message_id)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
__all__ = ("profile",)
|
__all__ = ("sex_keyboard",)
|
||||||
|
|
||||||
from aiogram.utils.keyboard import ReplyKeyboardBuilder
|
from aiogram.utils.keyboard import ReplyKeyboardBuilder
|
||||||
|
|
||||||
|
|
||||||
def profile(text: str | list):
|
def sex_keyboard(text: str | list):
|
||||||
builder = ReplyKeyboardBuilder()
|
builder = ReplyKeyboardBuilder()
|
||||||
|
|
||||||
if isinstance(text, str):
|
if isinstance(text, str):
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@ INPUT_BIO = "Enter your bio (enter /skip if you want to skip this step):\n<i>Max
|
|||||||
INPUT_BIO_SKIPPED = "Sure. You can always fill it later."
|
INPUT_BIO_SKIPPED = "Sure. You can always fill it later."
|
||||||
INPUT_LOCATION = "Enter your location in this format:\n<i>Format: country, city</i>\n<i>Example: Russia, Moscow</i>"
|
INPUT_LOCATION = "Enter your location in this format:\n<i>Format: country, city</i>\n<i>Example: Russia, Moscow</i>"
|
||||||
INPUT_CALLBACK = "All right, your <b>{key}</b> is set to: <b>{value}</b>"
|
INPUT_CALLBACK = "All right, your <b>{key}</b> is set to: <b>{value}</b>"
|
||||||
VALIDATION_ERROR_MESSAGE = "Invalid input. Please try again."
|
VALIDATION_ERROR = "Invalid input. Please try again."
|
||||||
CANCEL_CHANGE = "<i>Enter /cancel to cancel change.</i>"
|
CANCEL_CHANGE = "<i>Enter /cancel to cancel change.</i>"
|
||||||
|
|
||||||
PROFILE = (
|
PROFILE = (
|
||||||
|
|||||||
+1
-1
@@ -29,7 +29,7 @@ class User(Base):
|
|||||||
def validate_username(self, key, value):
|
def validate_username(self, key, value):
|
||||||
regex_pattern = re.compile(r"^[a-zA-Z0-9_]{5,20}$")
|
regex_pattern = re.compile(r"^[a-zA-Z0-9_]{5,20}$")
|
||||||
|
|
||||||
assert len(value) <= 32, "Username must be 20 characters or fewer."
|
assert len(value) <= 32, "Username must be 32 characters or fewer."
|
||||||
assert len(value) >= 5, "Username must be at least 5 characters."
|
assert len(value) >= 5, "Username must be at least 5 characters."
|
||||||
assert (
|
assert (
|
||||||
re.match(regex_pattern, value) is not None
|
re.match(regex_pattern, value) is not None
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
__all__ = ("RegistrationForm", "UserAltering")
|
||||||
|
|
||||||
|
from aiogram.fsm.state import State, StatesGroup
|
||||||
|
|
||||||
|
|
||||||
|
class RegistrationForm(StatesGroup):
|
||||||
|
previous_message_id = State()
|
||||||
|
username = State()
|
||||||
|
age = State()
|
||||||
|
bio = State()
|
||||||
|
sex = State()
|
||||||
|
location = State()
|
||||||
|
|
||||||
|
|
||||||
|
class UserAltering(StatesGroup):
|
||||||
|
column = State()
|
||||||
|
value = State()
|
||||||
|
message_id = State()
|
||||||
|
input_message_id = State()
|
||||||
|
previous_message_id = State()
|
||||||
|
successfully = State()
|
||||||
+20
-20
@@ -1,27 +1,9 @@
|
|||||||
__all__ = ("RegistrationForm",)
|
__all__ = ("delete_message_from_state", "handle_validation_error")
|
||||||
|
|
||||||
from aiogram import Bot
|
from aiogram import Bot
|
||||||
from aiogram.exceptions import TelegramBadRequest
|
from aiogram.exceptions import TelegramBadRequest
|
||||||
from aiogram.fsm.context import FSMContext
|
from aiogram.fsm.context import FSMContext
|
||||||
from aiogram.fsm.state import State, StatesGroup
|
from aiogram.types import Message
|
||||||
|
|
||||||
|
|
||||||
class RegistrationForm(StatesGroup):
|
|
||||||
previous_message_id = State()
|
|
||||||
username = State()
|
|
||||||
age = State()
|
|
||||||
bio = State()
|
|
||||||
sex = State()
|
|
||||||
location = State()
|
|
||||||
|
|
||||||
|
|
||||||
class UserAltering(StatesGroup):
|
|
||||||
column = State()
|
|
||||||
value = State()
|
|
||||||
message_id = State()
|
|
||||||
input_message_id = State()
|
|
||||||
previous_message_id = State()
|
|
||||||
successfully = State()
|
|
||||||
|
|
||||||
|
|
||||||
async def delete_message_from_state(
|
async def delete_message_from_state(
|
||||||
@@ -63,3 +45,21 @@ async def delete_message_from_state(
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
await state.update_data(input_message_id=None)
|
await state.update_data(input_message_id=None)
|
||||||
|
|
||||||
|
|
||||||
|
async def handle_validation_error(
|
||||||
|
message: Message,
|
||||||
|
state: FSMContext,
|
||||||
|
e: AssertionError | str,
|
||||||
|
) -> None:
|
||||||
|
await message.delete()
|
||||||
|
await delete_message_from_state(
|
||||||
|
state,
|
||||||
|
message.chat.id,
|
||||||
|
message.bot,
|
||||||
|
)
|
||||||
|
|
||||||
|
error_message = await message.answer(str(e))
|
||||||
|
await state.update_data(
|
||||||
|
previous_message_id=error_message.message_id,
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user