fix: preserve account language on telegram auth
This commit is contained in:
@@ -1203,7 +1203,7 @@ def _apply_telegram_profile_to_user(
|
|||||||
settings: Settings,
|
settings: Settings,
|
||||||
) -> None:
|
) -> None:
|
||||||
language_code = _normalize_language(
|
language_code = _normalize_language(
|
||||||
telegram_user.get("language_code") or user.language_code or settings.DEFAULT_LANGUAGE
|
user.language_code or telegram_user.get("language_code") or settings.DEFAULT_LANGUAGE
|
||||||
)
|
)
|
||||||
|
|
||||||
user.telegram_id = int(telegram_user["id"])
|
user.telegram_id = int(telegram_user["id"])
|
||||||
@@ -1251,8 +1251,8 @@ async def _link_telegram_to_user(
|
|||||||
|
|
||||||
if not existing_telegram_user and int(current_user.user_id) < 0:
|
if not existing_telegram_user and int(current_user.user_id) < 0:
|
||||||
language_code = _normalize_language(
|
language_code = _normalize_language(
|
||||||
telegram_user.get("language_code")
|
current_user.language_code
|
||||||
or current_user.language_code
|
or telegram_user.get("language_code")
|
||||||
or settings.DEFAULT_LANGUAGE
|
or settings.DEFAULT_LANGUAGE
|
||||||
)
|
)
|
||||||
target_user, _ = await user_dal.create_user(
|
target_user, _ = await user_dal.create_user(
|
||||||
@@ -1400,20 +1400,19 @@ async def _ensure_user_from_telegram(
|
|||||||
referral_param: Optional[str] = None,
|
referral_param: Optional[str] = None,
|
||||||
) -> User:
|
) -> User:
|
||||||
user_id = int(telegram_user["id"])
|
user_id = int(telegram_user["id"])
|
||||||
language_code = _normalize_language(
|
telegram_language_code = _normalize_language(
|
||||||
telegram_user.get("language_code") or settings.DEFAULT_LANGUAGE
|
telegram_user.get("language_code") or settings.DEFAULT_LANGUAGE
|
||||||
)
|
)
|
||||||
|
|
||||||
update_data = {
|
profile_data = {
|
||||||
"telegram_id": user_id,
|
"telegram_id": user_id,
|
||||||
"username": sanitize_username(telegram_user.get("username")),
|
"username": sanitize_username(telegram_user.get("username")),
|
||||||
"first_name": sanitize_display_name(telegram_user.get("first_name")),
|
"first_name": sanitize_display_name(telegram_user.get("first_name")),
|
||||||
"last_name": sanitize_display_name(telegram_user.get("last_name")),
|
"last_name": sanitize_display_name(telegram_user.get("last_name")),
|
||||||
"language_code": language_code,
|
|
||||||
}
|
}
|
||||||
telegram_photo_url = _telegram_photo_url_value(telegram_user)
|
telegram_photo_url = _telegram_photo_url_value(telegram_user)
|
||||||
if telegram_photo_url:
|
if telegram_photo_url:
|
||||||
update_data["telegram_photo_url"] = telegram_photo_url
|
profile_data["telegram_photo_url"] = telegram_photo_url
|
||||||
|
|
||||||
db_user = await user_dal.get_user_by_telegram_id(session, user_id)
|
db_user = await user_dal.get_user_by_telegram_id(session, user_id)
|
||||||
if not db_user:
|
if not db_user:
|
||||||
@@ -1428,7 +1427,8 @@ async def _ensure_user_from_telegram(
|
|||||||
session,
|
session,
|
||||||
{
|
{
|
||||||
"user_id": user_id,
|
"user_id": user_id,
|
||||||
**update_data,
|
**profile_data,
|
||||||
|
"language_code": telegram_language_code,
|
||||||
"referred_by_id": referred_by_id,
|
"referred_by_id": referred_by_id,
|
||||||
"registration_date": datetime.now(timezone.utc),
|
"registration_date": datetime.now(timezone.utc),
|
||||||
},
|
},
|
||||||
@@ -1436,6 +1436,10 @@ async def _ensure_user_from_telegram(
|
|||||||
setattr(db_user, "_webapp_created", bool(created))
|
setattr(db_user, "_webapp_created", bool(created))
|
||||||
return db_user
|
return db_user
|
||||||
|
|
||||||
|
update_data = {
|
||||||
|
**profile_data,
|
||||||
|
"language_code": _normalize_language(db_user.language_code or telegram_language_code),
|
||||||
|
}
|
||||||
changed = {key: value for key, value in update_data.items() if getattr(db_user, key) != value}
|
changed = {key: value for key, value in update_data.items() if getattr(db_user, key) != value}
|
||||||
if changed:
|
if changed:
|
||||||
db_user = await user_dal.update_user(session, db_user.user_id, changed) or db_user
|
db_user = await user_dal.update_user(session, db_user.user_id, changed) or db_user
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ from unittest.mock import AsyncMock, patch
|
|||||||
from bot.app.web import subscription_webapp # noqa: F401
|
from bot.app.web import subscription_webapp # noqa: F401
|
||||||
from bot.app.web.webapp import account as account_routes
|
from bot.app.web.webapp import account as account_routes
|
||||||
from bot.app.web.webapp.auth import (
|
from bot.app.web.webapp.auth import (
|
||||||
|
_apply_telegram_profile_to_user,
|
||||||
|
_ensure_user_from_telegram,
|
||||||
_link_telegram_to_user,
|
_link_telegram_to_user,
|
||||||
_panel_description_for_user,
|
_panel_description_for_user,
|
||||||
_sync_merged_panel_identity_for_user,
|
_sync_merged_panel_identity_for_user,
|
||||||
@@ -97,6 +99,70 @@ class AccountLinkingPanelTests(unittest.IsolatedAsyncioTestCase):
|
|||||||
|
|
||||||
self.assertEqual(_panel_description_for_user(user), "alice??\nSmith")
|
self.assertEqual(_panel_description_for_user(user), "alice??\nSmith")
|
||||||
|
|
||||||
|
def test_telegram_profile_update_preserves_existing_language(self):
|
||||||
|
user = SimpleNamespace(
|
||||||
|
telegram_id=None,
|
||||||
|
username=None,
|
||||||
|
first_name=None,
|
||||||
|
last_name=None,
|
||||||
|
language_code="ru",
|
||||||
|
telegram_photo_url=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
_apply_telegram_profile_to_user(
|
||||||
|
user,
|
||||||
|
{
|
||||||
|
"id": 42,
|
||||||
|
"username": "alice",
|
||||||
|
"first_name": "Alice",
|
||||||
|
"last_name": "",
|
||||||
|
"language_code": "en",
|
||||||
|
},
|
||||||
|
SimpleNamespace(DEFAULT_LANGUAGE="en"),
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(user.language_code, "ru")
|
||||||
|
self.assertEqual(user.username, "alice")
|
||||||
|
|
||||||
|
async def test_telegram_login_preserves_existing_language(self):
|
||||||
|
user = SimpleNamespace(
|
||||||
|
user_id=42,
|
||||||
|
telegram_id=42,
|
||||||
|
username="old",
|
||||||
|
first_name="Old",
|
||||||
|
last_name=None,
|
||||||
|
language_code="ru",
|
||||||
|
telegram_photo_url=None,
|
||||||
|
)
|
||||||
|
update_user = AsyncMock(return_value=user)
|
||||||
|
|
||||||
|
with (
|
||||||
|
patch(
|
||||||
|
"bot.app.web.webapp.auth.user_dal.get_user_by_telegram_id",
|
||||||
|
AsyncMock(return_value=user),
|
||||||
|
),
|
||||||
|
patch(
|
||||||
|
"bot.app.web.webapp.auth.user_dal.get_user_by_id",
|
||||||
|
AsyncMock(return_value=None),
|
||||||
|
),
|
||||||
|
patch("bot.app.web.webapp.auth.user_dal.update_user", update_user),
|
||||||
|
):
|
||||||
|
result = await _ensure_user_from_telegram(
|
||||||
|
SimpleNamespace(),
|
||||||
|
{
|
||||||
|
"id": 42,
|
||||||
|
"username": "alice",
|
||||||
|
"first_name": "Alice",
|
||||||
|
"last_name": "",
|
||||||
|
"language_code": "en",
|
||||||
|
},
|
||||||
|
SimpleNamespace(DEFAULT_LANGUAGE="en"),
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertIs(result, user)
|
||||||
|
changed = update_user.await_args.args[2]
|
||||||
|
self.assertNotEqual(changed.get("language_code"), "en")
|
||||||
|
|
||||||
async def test_merged_panel_identity_deletes_source_before_updating_target(self):
|
async def test_merged_panel_identity_deletes_source_before_updating_target(self):
|
||||||
calls = []
|
calls = []
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user