From 17541ddacbbec6dc952ffdb93e6c084434a88bdd Mon Sep 17 00:00:00 2001 From: Sahil Batra Date: Wed, 3 Jul 2024 19:13:52 +0530 Subject: [PATCH] settings: Toggle dense mode if font and line height values are changed. --- zerver/actions/realm_settings.py | 15 +++++++++++++++ zerver/actions/user_settings.py | 16 +++++++++++++++- zerver/tests/test_realm.py | 27 +++++++++++++++++++++++++++ zerver/tests/test_settings.py | 26 ++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 1 deletion(-) diff --git a/zerver/actions/realm_settings.py b/zerver/actions/realm_settings.py index 6b58eee339..b93a4709fc 100644 --- a/zerver/actions/realm_settings.py +++ b/zerver/actions/realm_settings.py @@ -479,6 +479,21 @@ def do_set_realm_user_default_setting( }, ) + if name in {"web_font_size_px", "web_line_height_percent"}: + if ( + realm_user_default.web_font_size_px != RealmUserDefault.WEB_FONT_SIZE_PX_LEGACY + or realm_user_default.web_line_height_percent + != RealmUserDefault.WEB_LINE_HEIGHT_PERCENT_LEGACY + ): + expected_dense_mode = False + else: + expected_dense_mode = True + + if realm_user_default.dense_mode != expected_dense_mode: + do_set_realm_user_default_setting( + realm_user_default, "dense_mode", expected_dense_mode, acting_user=acting_user + ) + event = dict( type="realm_user_settings_defaults", op="update", diff --git a/zerver/actions/user_settings.py b/zerver/actions/user_settings.py index 1aca5c0ea4..2e1a3a9fb2 100644 --- a/zerver/actions/user_settings.py +++ b/zerver/actions/user_settings.py @@ -418,7 +418,7 @@ def update_scheduled_email_notifications_time( ) -@transaction.atomic(durable=True) +@transaction.atomic(savepoint=False) def do_change_user_setting( user_profile: UserProfile, setting_name: str, @@ -474,6 +474,20 @@ def do_change_user_setting( send_event_on_commit(user_profile.realm, event, [user_profile.id]) + if setting_name in {"web_font_size_px", "web_line_height_percent"}: + if ( + user_profile.web_font_size_px != UserProfile.WEB_FONT_SIZE_PX_LEGACY + or user_profile.web_line_height_percent != UserProfile.WEB_LINE_HEIGHT_PERCENT_LEGACY + ): + expected_dense_mode = False + else: + expected_dense_mode = True + + if user_profile.dense_mode != expected_dense_mode: + do_change_user_setting( + user_profile, "dense_mode", expected_dense_mode, acting_user=acting_user + ) + if setting_name in UserProfile.notification_settings_legacy: # This legacy event format is for backwards-compatibility with # clients that don't support the new user_settings event type. diff --git a/zerver/tests/test_realm.py b/zerver/tests/test_realm.py index a01ef1483a..684a66ab0a 100644 --- a/zerver/tests/test_realm.py +++ b/zerver/tests/test_realm.py @@ -1989,6 +1989,33 @@ class RealmAPITest(ZulipTestCase): continue self.do_test_realm_default_setting_update_api(prop) + def test_update_default_information_density_settings(self) -> None: + realm = get_realm("zulip") + realm_user_default = RealmUserDefault.objects.get(realm=realm) + self.assertEqual(realm_user_default.dense_mode, True) + self.login("iago") + + data = {"web_font_size_px": 16} + result = self.client_patch("/json/realm/user_settings_defaults", data) + self.assert_json_success(result) + realm_user_default = RealmUserDefault.objects.get(realm=realm) + self.assertEqual(realm_user_default.web_font_size_px, 16) + self.assertEqual(realm_user_default.dense_mode, False) + + data = {"web_font_size_px": 14} + result = self.client_patch("/json/realm/user_settings_defaults", data) + self.assert_json_success(result) + realm_user_default = RealmUserDefault.objects.get(realm=realm) + self.assertEqual(realm_user_default.web_font_size_px, 14) + self.assertEqual(realm_user_default.dense_mode, True) + + data = {"web_line_height_percent": 140} + result = self.client_patch("/json/realm/user_settings_defaults", data) + self.assert_json_success(result) + realm_user_default = RealmUserDefault.objects.get(realm=realm) + self.assertEqual(realm_user_default.web_line_height_percent, 140) + self.assertEqual(realm_user_default.dense_mode, False) + def test_invalid_default_notification_sound_value(self) -> None: result = self.client_patch( "/json/realm/user_settings_defaults", {"notification_sound": "invalid"} diff --git a/zerver/tests/test_settings.py b/zerver/tests/test_settings.py index 2c50c1e7dc..e9262866e2 100644 --- a/zerver/tests/test_settings.py +++ b/zerver/tests/test_settings.py @@ -501,6 +501,32 @@ class ChangeSettingsTest(ZulipTestCase): hamlet = self.example_user("hamlet") self.assertEqual(hamlet.enable_stream_desktop_notifications, True) + def test_changing_information_density_settings(self) -> None: + hamlet = self.example_user("hamlet") + self.assertEqual(hamlet.dense_mode, True) + self.login("hamlet") + + data = {"web_font_size_px": 16} + result = self.client_patch("/json/settings", data) + self.assert_json_success(result) + hamlet = self.example_user("hamlet") + self.assertEqual(hamlet.web_font_size_px, 16) + self.assertEqual(hamlet.dense_mode, False) + + data = {"web_font_size_px": 14} + result = self.client_patch("/json/settings", data) + self.assert_json_success(result) + hamlet = self.example_user("hamlet") + self.assertEqual(hamlet.web_font_size_px, 14) + self.assertEqual(hamlet.dense_mode, True) + + data = {"web_line_height_percent": 140} + result = self.client_patch("/json/settings", data) + self.assert_json_success(result) + hamlet = self.example_user("hamlet") + self.assertEqual(hamlet.web_line_height_percent, 140) + self.assertEqual(hamlet.dense_mode, False) + class UserChangesTest(ZulipTestCase): def test_update_api_key(self) -> None: