chore: Code refactoring and improvements

This commit is contained in:
ITQ
2024-03-22 00:16:12 +03:00
parent b32add6d07
commit 013d04261b
10 changed files with 82 additions and 151 deletions
+17 -81
View File
@@ -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
+1 -1
View File
@@ -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")
+1 -1
View File
@@ -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
+18 -44
View File
@@ -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
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
+21
View File
@@ -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
View File
@@ -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,
)