diff --git a/zerver/actions/create_user.py b/zerver/actions/create_user.py index eed280cc41..b623631947 100644 --- a/zerver/actions/create_user.py +++ b/zerver/actions/create_user.py @@ -406,7 +406,7 @@ def do_create_user( tos_version: Optional[str] = None, timezone: str = "", avatar_source: str = UserProfile.AVATAR_FROM_GRAVATAR, - default_language: str = "en", + default_language: Optional[str] = None, default_sending_stream: Optional[Stream] = None, default_events_register_stream: Optional[Stream] = None, default_all_public_streams: Optional[bool] = None, diff --git a/zerver/lib/bulk_create.py b/zerver/lib/bulk_create.py index 566b84d0c5..1680564335 100644 --- a/zerver/lib/bulk_create.py +++ b/zerver/lib/bulk_create.py @@ -58,6 +58,7 @@ def bulk_create_users( False, tos_version, timezone, + default_language=realm.default_language, tutorial_status=UserProfile.TUTORIAL_FINISHED, email_address_visibility=email_address_visibility, ) diff --git a/zerver/lib/create_user.py b/zerver/lib/create_user.py index ba0cad4b9e..a9b66a4ffa 100644 --- a/zerver/lib/create_user.py +++ b/zerver/lib/create_user.py @@ -7,6 +7,7 @@ from django.contrib.auth.models import UserManager from django.utils.timezone import now as timezone_now from zerver.lib.hotspots import copy_hotspots +from zerver.lib.i18n import get_default_language_for_new_user from zerver.lib.timezone import canonicalize_timezone from zerver.lib.upload import copy_avatar from zerver.models import ( @@ -92,7 +93,7 @@ def create_user_profile( is_mirror_dummy: bool, tos_version: Optional[str], timezone: str, - default_language: str = "en", + default_language: str, tutorial_status: str = UserProfile.TUTORIAL_WAITING, force_id: Optional[int] = None, force_date_joined: Optional[datetime] = None, @@ -152,7 +153,7 @@ def create_user( timezone: str = "", avatar_source: str = UserProfile.AVATAR_FROM_GRAVATAR, is_mirror_dummy: bool = False, - default_language: str = "en", + default_language: Optional[str] = None, default_sending_stream: Optional[Stream] = None, default_events_register_stream: Optional[Stream] = None, default_all_public_streams: Optional[bool] = None, @@ -174,6 +175,12 @@ def create_user( # so we hardcode them to EMAIL_ADDRESS_VISIBILITY_EVERYONE. user_email_address_visibility = UserProfile.EMAIL_ADDRESS_VISIBILITY_EVERYONE + # Users created via the API or LDAP/SAML syncing code paths will + # usually not have a default_language value, and should fall back + # to the realm default. + if default_language is None: + default_language = get_default_language_for_new_user(realm, request=None) + user_profile = create_user_profile( realm, email, diff --git a/zerver/lib/i18n.py b/zerver/lib/i18n.py index add39c2327..dc00f4b757 100644 --- a/zerver/lib/i18n.py +++ b/zerver/lib/i18n.py @@ -85,7 +85,13 @@ def get_browser_language_code(request: HttpRequest) -> Optional[str]: return None -def get_default_language_for_new_user(realm: Realm, *, request: HttpRequest) -> str: +def get_default_language_for_new_user(realm: Realm, *, request: Optional[HttpRequest]) -> str: + if request is None: + # Users created via the API or LDAP will not have a + # browser/request associated with them, and should just use + # the realm's default language. + return realm.default_language + browser_language_code = get_browser_language_code(request) if browser_language_code is not None: return browser_language_code diff --git a/zerver/tests/test_auth_backends.py b/zerver/tests/test_auth_backends.py index dbef1bf2c7..45a04e5ce4 100644 --- a/zerver/tests/test_auth_backends.py +++ b/zerver/tests/test_auth_backends.py @@ -6312,7 +6312,9 @@ class TestLDAP(ZulipLDAPTestCase): } ) def test_login_success_when_user_does_not_exist_with_valid_subdomain(self) -> None: - RealmDomain.objects.create(realm=self.backend._realm, domain="acme.com") + realm = self.backend._realm + do_set_realm_property(realm, "default_language", "ja", acting_user=None) + RealmDomain.objects.create(realm=realm, domain="acme.com") with self.settings(LDAP_APPEND_DOMAIN="acme.com"): user_profile = self.backend.authenticate( request=mock.MagicMock(), @@ -6324,6 +6326,8 @@ class TestLDAP(ZulipLDAPTestCase): self.assertEqual(user_profile.delivery_email, "newuser@acme.com") self.assertEqual(user_profile.full_name, "New LDAP fullname") self.assertEqual(user_profile.realm.string_id, "zulip") + # Verify the user got the realm's default language. + self.assertEqual(user_profile.default_language, "ja") # Verify avatar gets created self.assertEqual(user_profile.avatar_source, UserProfile.AVATAR_FROM_USER) diff --git a/zerver/tests/test_mirror_users.py b/zerver/tests/test_mirror_users.py index 2b4049434c..b310c4f80b 100644 --- a/zerver/tests/test_mirror_users.py +++ b/zerver/tests/test_mirror_users.py @@ -173,6 +173,7 @@ class MirroredMessageUsersTest(ZulipTestCase): kwargs["bot_owner"] = None kwargs["tos_version"] = None kwargs["timezone"] = timezone_now() + kwargs["default_language"] = "en" kwargs["email_address_visibility"] = UserProfile.EMAIL_ADDRESS_VISIBILITY_EVERYONE create_user_profile(**kwargs).save() raise IntegrityError diff --git a/zerver/tests/test_signup.py b/zerver/tests/test_signup.py index b508fbf40f..8545c5ac3e 100644 --- a/zerver/tests/test_signup.py +++ b/zerver/tests/test_signup.py @@ -3996,6 +3996,9 @@ class UserSignUpTest(ZulipTestCase): req.META["HTTP_ACCEPT_LANGUAGE"] = "" self.assertEqual(get_default_language_for_new_user(realm, request=req), "hi") + # Test code path for users created via the API or LDAP + self.assertEqual(get_default_language_for_new_user(realm, request=None), "hi") + class DeactivateUserTest(ZulipTestCase): def test_deactivate_user(self) -> None: diff --git a/zerver/tests/test_users.py b/zerver/tests/test_users.py index ea3770656c..0064eb5218 100644 --- a/zerver/tests/test_users.py +++ b/zerver/tests/test_users.py @@ -938,6 +938,7 @@ class AdminCreateUserTest(ZulipTestCase): realm = admin.realm self.login_user(admin) do_change_user_role(admin, UserProfile.ROLE_REALM_ADMINISTRATOR, acting_user=None) + do_set_realm_property(realm, "default_language", "ja", acting_user=None) valid_params = dict( email="romeo@zulip.net", password="xxxx", @@ -1026,6 +1027,8 @@ class AdminCreateUserTest(ZulipTestCase): self.assertEqual(new_user.full_name, "Romeo Montague") self.assertEqual(new_user.id, result["user_id"]) self.assertEqual(new_user.tos_version, UserProfile.TOS_VERSION_BEFORE_FIRST_LOGIN) + # Make sure the new user got the realm's default language + self.assertEqual(new_user.default_language, "ja") # Make sure the recipient field is set correctly. self.assertEqual(