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)
)
dispatcher.update.outer_middleware(TelegramUserMiddleware())
dispatcher.update.outer_middleware(TelegramUserMiddleware(i18n=i18n))
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.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)

View file

@ -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)