Fix: fix unsupported database user locale

This commit is contained in:
Kirill Samoylenkov 2025-11-13 21:44:08 +05:00
parent 5de97f3ceb
commit e19e444fd1
3 changed files with 26 additions and 7 deletions

View file

@ -35,7 +35,7 @@ def connect_middlewares(
DatabaseSessionMiddleware(session_maker=session_maker) DatabaseSessionMiddleware(session_maker=session_maker)
) )
dispatcher.update.outer_middleware(TelegramUserMiddleware()) dispatcher.update.outer_middleware(TelegramUserMiddleware(i18n=i18n))
dispatcher.update.outer_middleware(RegistrationMiddleware()) dispatcher.update.outer_middleware(RegistrationMiddleware())

View file

@ -8,6 +8,7 @@ from typing import Any, Awaitable, Callable, Dict, Optional
from aiogram import BaseMiddleware from aiogram import BaseMiddleware
from aiogram.types import TelegramObject from aiogram.types import TelegramObject
from aiogram.types import User as AiogramUser from aiogram.types import User as AiogramUser
from aiogram.utils.i18n import I18n
from bot.services import get_or_create_user from bot.services import get_or_create_user
@ -15,6 +16,10 @@ from bot.services import get_or_create_user
class TelegramUserMiddleware(BaseMiddleware): class TelegramUserMiddleware(BaseMiddleware):
"""Middleware for providing a telegram user object in handlers.""" """Middleware for providing a telegram user object in handlers."""
def __init__(self, i18n: I18n):
self.supported_locales = tuple(i18n.locales.keys())
self.default_locale = i18n.default_locale
async def __call__( async def __call__(
self, self,
handler: Callable[ handler: Callable[
@ -44,7 +49,19 @@ class TelegramUserMiddleware(BaseMiddleware):
session = data["session"] session = data["session"]
telegram_user = await get_or_create_user(session, aiogram_user) if (
aiogram_user.language_code is not None
and aiogram_user.language_code in self.supported_locales
):
lang = aiogram_user.language_code
else:
lang = self.default_locale
telegram_user = await get_or_create_user(
session=session,
user_id=aiogram_user.id,
lang=lang,
)
data["telegram_user"] = telegram_user data["telegram_user"] = telegram_user
return await handler(event, data) return await handler(event, data)

View file

@ -11,7 +11,8 @@ from database.models import TelegramUser
async def get_or_create_user( async def get_or_create_user(
session: AsyncSession, session: AsyncSession,
aiogram_user: AiogramUser, user_id: int,
lang: str,
) -> TelegramUser: ) -> TelegramUser:
""" """
Gets a user from database by TG ID, Gets a user from database by TG ID,
@ -19,19 +20,20 @@ async def get_or_create_user(
Args: Args:
session (AsyncSession): Database session. session (AsyncSession): Database session.
aiogram_user (AiogramUser): User object from Aiogram. user_id (int): Telegram user id.
lang (str): Telegram user language code.
Returns: Returns:
TelegramUser: The SQLAlchemy model instance for the user. TelegramUser: The SQLAlchemy model instance for the user.
""" """
user = await session.get(TelegramUser, aiogram_user.id) user = await session.get(TelegramUser, user_id)
if user is not None: if user is not None:
return user return user
user = TelegramUser( user = TelegramUser(
id=aiogram_user.id, id=user_id,
lang=aiogram_user.language_code, lang=lang,
) )
session.add(user) session.add(user)