generated from geekiot/python-template
Fix: fix unsupported database user locale
This commit is contained in:
parent
5de97f3ceb
commit
e19e444fd1
3 changed files with 26 additions and 7 deletions
|
|
@ -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())
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue