From e19e444fd19996f5a78a4ee69c56ef3394d571b1 Mon Sep 17 00:00:00 2001 From: geekiot Date: Thu, 13 Nov 2025 21:44:08 +0500 Subject: [PATCH] Fix: fix unsupported database user locale --- src/bot/middlewares/__init__.py | 2 +- src/bot/middlewares/telegram_user.py | 19 ++++++++++++++++++- src/bot/services/user.py | 12 +++++++----- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/bot/middlewares/__init__.py b/src/bot/middlewares/__init__.py index 1b98447..2d0508a 100644 --- a/src/bot/middlewares/__init__.py +++ b/src/bot/middlewares/__init__.py @@ -35,7 +35,7 @@ def connect_middlewares( DatabaseSessionMiddleware(session_maker=session_maker) ) - dispatcher.update.outer_middleware(TelegramUserMiddleware()) + dispatcher.update.outer_middleware(TelegramUserMiddleware(i18n=i18n)) dispatcher.update.outer_middleware(RegistrationMiddleware()) diff --git a/src/bot/middlewares/telegram_user.py b/src/bot/middlewares/telegram_user.py index 05cc4f4..88715b0 100644 --- a/src/bot/middlewares/telegram_user.py +++ b/src/bot/middlewares/telegram_user.py @@ -8,6 +8,7 @@ from typing import Any, Awaitable, Callable, Dict, Optional from aiogram import BaseMiddleware from aiogram.types import TelegramObject from aiogram.types import User as AiogramUser +from aiogram.utils.i18n import I18n from bot.services import get_or_create_user @@ -15,6 +16,10 @@ from bot.services import get_or_create_user class TelegramUserMiddleware(BaseMiddleware): """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__( self, handler: Callable[ @@ -44,7 +49,19 @@ class TelegramUserMiddleware(BaseMiddleware): 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 return await handler(event, data) diff --git a/src/bot/services/user.py b/src/bot/services/user.py index 88ed41a..a17cb64 100644 --- a/src/bot/services/user.py +++ b/src/bot/services/user.py @@ -11,7 +11,8 @@ from database.models import TelegramUser async def get_or_create_user( session: AsyncSession, - aiogram_user: AiogramUser, + user_id: int, + lang: str, ) -> TelegramUser: """ Gets a user from database by TG ID, @@ -19,19 +20,20 @@ async def get_or_create_user( Args: session (AsyncSession): Database session. - aiogram_user (AiogramUser): User object from Aiogram. + user_id (int): Telegram user id. + lang (str): Telegram user language code. Returns: 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: return user user = TelegramUser( - id=aiogram_user.id, - lang=aiogram_user.language_code, + id=user_id, + lang=lang, ) session.add(user)