From 828759d2ba40d2fbebe170f2901624970f0d9689 Mon Sep 17 00:00:00 2001 From: sahil839 Date: Wed, 26 May 2021 15:51:37 +0530 Subject: [PATCH] models: Replace allow_community_topic_editing with edit_topic_policy. This commit replaces the allow_community_topic_editing boolean with integer field edit_topic_policy and includes both frontend and backend changes. We also update settings_ui.disable_sub_settings_onchange to not change the color of label as we did previously when the setting was a checkbox. But now as the setting is dropdown we keep the label as it is and we don't do anything with label when disabling dropdowns. Also, this function was used only here so we can safely change this. --- frontend_tests/node_tests/message_edit.js | 13 ++++-- frontend_tests/node_tests/settings_org.js | 20 ++++---- static/js/admin.js | 4 -- static/js/message_edit.js | 6 ++- static/js/server_events_dispatch.js | 2 +- static/js/settings_config.js | 13 ++++++ static/js/settings_org.js | 10 ++-- static/js/settings_ui.js | 6 --- .../organization_permissions_admin.hbs | 11 +++-- templates/zerver/api/changelog.md | 5 ++ version.py | 2 +- zerver/lib/actions.py | 12 ++--- zerver/lib/event_schema.py | 2 +- zerver/lib/events.py | 4 +- .../0327_realm_edit_topic_policy.py | 18 ++++++++ .../0328_migrate_to_edit_topic_policy.py | 46 +++++++++++++++++++ ...ove_realm_allow_community_topic_editing.py | 17 +++++++ zerver/models.py | 14 ++++-- zerver/openapi/zulip.yaml | 28 +++++++---- zerver/tests/test_audit_log.py | 9 ++-- zerver/tests/test_events.py | 2 +- zerver/tests/test_home.py | 2 +- zerver/tests/test_message_edit.py | 36 +++++++-------- zerver/tests/test_realm.py | 20 +++++--- zerver/views/realm.py | 17 ++++--- 25 files changed, 219 insertions(+), 100 deletions(-) create mode 100644 zerver/migrations/0327_realm_edit_topic_policy.py create mode 100644 zerver/migrations/0328_migrate_to_edit_topic_policy.py create mode 100644 zerver/migrations/0329_remove_realm_allow_community_topic_editing.py diff --git a/frontend_tests/node_tests/message_edit.js b/frontend_tests/node_tests/message_edit.js index 4bfcf6b925..95b1941f67 100644 --- a/frontend_tests/node_tests/message_edit.js +++ b/frontend_tests/node_tests/message_edit.js @@ -9,6 +9,7 @@ const {page_params} = require("../zjsunit/zpage_params"); page_params.realm_community_topic_editing_limit_seconds = 259200; const message_edit = zrequire("message_edit"); +const settings_config = zrequire("settings_config"); const get_editability = message_edit.get_editability; const editability_types = message_edit.editability_types; @@ -81,7 +82,8 @@ run_test("get_editability", () => { sent_by_me: false, type: "stream", }; - page_params.realm_allow_community_topic_editing = true; + page_params.realm_edit_topic_policy = + settings_config.common_message_policy_values.by_everyone.code; page_params.realm_allow_message_editing = true; page_params.realm_message_content_edit_limit_seconds = 0; page_params.realm_community_topic_editing_limit_seconds = 259200; @@ -93,15 +95,18 @@ run_test("get_editability", () => { assert.equal(message_edit.is_topic_editable(message), true); message.sent_by_me = true; - page_params.realm_allow_community_topic_editing = false; + page_params.realm_edit_topic_policy = + settings_config.common_message_policy_values.by_admins_only.code; assert.equal(message_edit.is_topic_editable(message), true); message.sent_by_me = false; - page_params.realm_allow_community_topic_editing = false; + page_params.realm_edit_topic_policy = + settings_config.common_message_policy_values.by_admins_only.code; assert.equal(message_edit.is_topic_editable(message), false); message.sent_by_me = false; - page_params.realm_allow_community_topic_editing = false; + page_params.realm_edit_topic_policy = + settings_config.common_message_policy_values.by_admins_only.code; page_params.is_admin = true; assert.equal(message_edit.is_topic_editable(message), true); diff --git a/frontend_tests/node_tests/settings_org.js b/frontend_tests/node_tests/settings_org.js index 093e0b97a3..63e82b7dd6 100644 --- a/frontend_tests/node_tests/settings_org.js +++ b/frontend_tests/node_tests/settings_org.js @@ -583,16 +583,16 @@ function test_discard_changes_button(discard_changes) { }; page_params.realm_allow_edit_history = true; - page_params.realm_allow_community_topic_editing = true; + page_params.realm_edit_topic_policy = + settings_config.common_message_policy_values.by_everyone.code; page_params.realm_allow_message_editing = true; page_params.realm_message_content_edit_limit_seconds = 3600; page_params.realm_allow_message_deleting = true; page_params.realm_message_content_delete_limit_seconds = 120; const allow_edit_history = $("#id_realm_allow_edit_history").prop("checked", false); - const allow_community_topic_editing = $("#id_realm_allow_community_topic_editing").prop( - "checked", - true, + const edit_topic_policy = $("#id_realm_edit_topic_policy").val( + settings_config.common_message_policy_values.by_admins_only.code, ); const msg_edit_limit_setting = $("#id_realm_msg_edit_limit_setting").val("custom_limit"); const message_content_edit_limit_minutes = $( @@ -606,7 +606,7 @@ function test_discard_changes_button(discard_changes) { allow_edit_history.attr("id", "id_realm_allow_edit_history"); msg_edit_limit_setting.attr("id", "id_realm_msg_edit_limit_setting"); msg_delete_limit_setting.attr("id", "id_realm_msg_delete_limit_setting"); - allow_community_topic_editing.attr("id", "id_realm_allow_community_topic_editing"); + edit_topic_policy.attr("id", "id_realm_edit_topic_policy"); message_content_edit_limit_minutes.attr("id", "id_realm_message_content_edit_limit_minutes"); message_content_delete_limit_minutes.attr( "id", @@ -618,7 +618,7 @@ function test_discard_changes_button(discard_changes) { allow_edit_history, msg_edit_limit_setting, msg_delete_limit_setting, - allow_community_topic_editing, + edit_topic_policy, message_content_edit_limit_minutes, message_content_delete_limit_minutes, ]; @@ -633,7 +633,10 @@ function test_discard_changes_button(discard_changes) { discard_changes(ev); assert.equal(allow_edit_history.prop("checked"), true); - assert.equal(allow_community_topic_editing.prop("checked"), true); + assert.equal( + edit_topic_policy.val(), + settings_config.common_message_policy_values.by_everyone.code, + ); assert.equal(msg_edit_limit_setting.val(), "upto_one_hour"); assert.equal(message_content_edit_limit_minutes.val(), "60"); assert.equal(msg_delete_limit_setting.val(), "upto_two_min"); @@ -685,9 +688,6 @@ test("set_up", ({override}) => { const waiting_period_parent_elem = $.create("waiting-period-parent-stub"); $("#id_realm_waiting_period_threshold").set_parent(waiting_period_parent_elem); - const allow_topic_edit_label_parent = $.create("allow-topic-edit-label-parent"); - $("#id_realm_allow_community_topic_editing_label").set_parent(allow_topic_edit_label_parent); - // TEST set_up() here, but this mostly just allows us to // get access to the click handlers. override(settings_org, "maybe_disable_widgets", noop); diff --git a/static/js/admin.js b/static/js/admin.js index ba940b3fbc..1c7fefc45b 100644 --- a/static/js/admin.js +++ b/static/js/admin.js @@ -18,9 +18,6 @@ import * as settings_toggle from "./settings_toggle"; const admin_settings_label = { // Organization settings - realm_allow_community_topic_editing: $t({ - defaultMessage: "Users can edit the topic of any message", - }), realm_allow_edit_history: $t({defaultMessage: "Enable message edit history"}), realm_mandatory_topics: $t({defaultMessage: "Require topics in stream messages"}), realm_notifications_stream: $t({defaultMessage: "New stream notifications:"}), @@ -82,7 +79,6 @@ export function build_page() { realm_avatar_changes_disabled: page_params.realm_avatar_changes_disabled, realm_add_emoji_by_admins_only: page_params.realm_add_emoji_by_admins_only, can_add_emojis: settings_emoji.can_add_emoji(), - realm_allow_community_topic_editing: page_params.realm_allow_community_topic_editing, realm_message_content_edit_limit_minutes: settings_org.get_realm_time_limits_in_minutes( "realm_message_content_edit_limit_seconds", ), diff --git a/static/js/message_edit.js b/static/js/message_edit.js index f95797d8a5..4e9e094405 100644 --- a/static/js/message_edit.js +++ b/static/js/message_edit.js @@ -24,6 +24,7 @@ import * as overlays from "./overlays"; import {page_params} from "./page_params"; import * as resize from "./resize"; import * as rows from "./rows"; +import * as settings_config from "./settings_config"; import * as settings_data from "./settings_data"; import * as stream_bar from "./stream_bar"; import * as stream_data from "./stream_data"; @@ -68,7 +69,10 @@ export function is_topic_editable(message, edit_limit_seconds_buffer = 0) { return true; } - if (!page_params.realm_allow_community_topic_editing) { + if ( + page_params.realm_edit_topic_policy === + settings_config.common_message_policy_values.by_admins_only.code + ) { // If you're another non-admin user, you need community topic editing enabled. return false; } diff --git a/static/js/server_events_dispatch.js b/static/js/server_events_dispatch.js index 83e8afdb9b..4462fa0b16 100644 --- a/static/js/server_events_dispatch.js +++ b/static/js/server_events_dispatch.js @@ -179,7 +179,7 @@ export function dispatch_normal_event(event) { allow_edit_history: noop, allow_message_deleting: noop, allow_message_editing: noop, - allow_community_topic_editing: noop, + edit_topic_policy: noop, user_group_edit_policy: noop, avatar_changes_disabled: settings_account.update_avatar_change_display, bot_creation_policy: settings_bots.update_bot_permissions_ui, diff --git a/static/js/settings_config.js b/static/js/settings_config.js index ed5578a393..6cd4f62b26 100644 --- a/static/js/settings_config.js +++ b/static/js/settings_config.js @@ -198,6 +198,19 @@ export const wildcard_mention_policy_values = { }, }; +export const common_message_policy_values = { + by_everyone: { + order: 1, + code: 5, + description: $t({defaultMessage: "Admins, members and guests"}), + }, + by_admins_only: { + order: 2, + code: 2, + description: $t({defaultMessage: "Admins only"}), + }, +}; + const time_limit_dropdown_values = new Map([ [ "any_time", diff --git a/static/js/settings_org.js b/static/js/settings_org.js index c3566d79be..ea4e371570 100644 --- a/static/js/settings_org.js +++ b/static/js/settings_org.js @@ -104,6 +104,9 @@ export function get_organization_settings_options() { options.wildcard_mention_policy_values = get_sorted_options_list( settings_config.wildcard_mention_policy_values, ); + options.common_message_policy_values = get_sorted_options_list( + settings_config.common_message_policy_values, + ); return options; } @@ -207,6 +210,7 @@ const simple_dropdown_properties = [ "realm_invite_to_realm_policy", "realm_wildcard_mention_policy", "realm_move_messages_between_streams_policy", + "realm_edit_topic_policy", ]; function set_property_dropdown_value(property_name) { @@ -248,11 +252,7 @@ function set_msg_edit_limit_dropdown() { "id_realm_message_content_edit_limit_minutes", value === "custom_limit", ); - settings_ui.disable_sub_setting_onchange( - value !== "never", - "id_realm_allow_community_topic_editing", - true, - ); + settings_ui.disable_sub_setting_onchange(value !== "never", "id_realm_edit_topic_policy", true); } function set_msg_delete_limit_dropdown() { diff --git a/static/js/settings_ui.js b/static/js/settings_ui.js index 10952281ee..91e96f7d65 100644 --- a/static/js/settings_ui.js +++ b/static/js/settings_ui.js @@ -76,13 +76,7 @@ export function do_settings_change( export function disable_sub_setting_onchange(is_checked, sub_setting_id, disable_on_uncheck) { if ((is_checked && disable_on_uncheck) || (!is_checked && !disable_on_uncheck)) { $(`#${CSS.escape(sub_setting_id)}`).prop("disabled", false); - $(`#${CSS.escape(sub_setting_id)}_label`) - .parent() - .removeClass("control-label-disabled"); } else if ((is_checked && !disable_on_uncheck) || (!is_checked && disable_on_uncheck)) { $(`#${CSS.escape(sub_setting_id)}`).prop("disabled", true); - $(`#${CSS.escape(sub_setting_id)}_label`) - .parent() - .addClass("control-label-disabled"); } } diff --git a/static/templates/settings/organization_permissions_admin.hbs b/static/templates/settings/organization_permissions_admin.hbs index 87d9964a65..fcbdada2bb 100644 --- a/static/templates/settings/organization_permissions_admin.hbs +++ b/static/templates/settings/organization_permissions_admin.hbs @@ -143,11 +143,12 @@ - {{> settings_checkbox - setting_name="realm_allow_community_topic_editing" - prefix="id_" - is_checked=realm_allow_community_topic_editing - label=admin_settings_label.realm_allow_community_topic_editing}} +
+ + +
{{> settings_checkbox setting_name="realm_allow_edit_history" diff --git a/templates/zerver/api/changelog.md b/templates/zerver/api/changelog.md index f669059a8e..e3e8bd02a1 100644 --- a/templates/zerver/api/changelog.md +++ b/templates/zerver/api/changelog.md @@ -11,6 +11,11 @@ below features are supported. ## Changes in Zulip 5.0 +**Feature level 75** + +* [`POST /register`](/api/register-queue), `PATCH /realm`: Replaced `allow_community_topic_editing` + field with an integer field `edit_topic_policy`. + **Feature level 74** * [`POST /register`](/api/register-queue): Added `server_needs_upgrade` diff --git a/version.py b/version.py index 183e0a4328..a4614dea0e 100644 --- a/version.py +++ b/version.py @@ -33,7 +33,7 @@ DESKTOP_WARNING_VERSION = "5.4.3" # Changes should be accompanied by documentation explaining what the # new level means in templates/zerver/api/changelog.md, as well as # "**Changes**" entries in the endpoint's documentation in `zulip.yaml`. -API_FEATURE_LEVEL = 74 +API_FEATURE_LEVEL = 75 # Bump the minor PROVISION_VERSION to indicate that folks should provision # only when going from an old version of the code to a newer version. Bump diff --git a/zerver/lib/actions.py b/zerver/lib/actions.py index fb1bc0be54..f327a850e1 100644 --- a/zerver/lib/actions.py +++ b/zerver/lib/actions.py @@ -874,25 +874,25 @@ def do_set_realm_message_editing( realm: Realm, allow_message_editing: bool, message_content_edit_limit_seconds: int, - allow_community_topic_editing: bool, + edit_topic_policy: int, *, acting_user: Optional[UserProfile], ) -> None: old_values = dict( allow_message_editing=realm.allow_message_editing, message_content_edit_limit_seconds=realm.message_content_edit_limit_seconds, - allow_community_topic_editing=realm.allow_community_topic_editing, + edit_topic_policy=realm.edit_topic_policy, ) realm.allow_message_editing = allow_message_editing realm.message_content_edit_limit_seconds = message_content_edit_limit_seconds - realm.allow_community_topic_editing = allow_community_topic_editing + realm.edit_topic_policy = edit_topic_policy event_time = timezone_now() updated_properties = dict( allow_message_editing=allow_message_editing, message_content_edit_limit_seconds=message_content_edit_limit_seconds, - allow_community_topic_editing=allow_community_topic_editing, + edit_topic_policy=edit_topic_policy, ) for updated_property, updated_value in updated_properties.items(): @@ -2823,8 +2823,8 @@ def can_edit_content_or_topic( if user_profile.is_realm_admin: return True - # The community_topic_editing setting controls normal users editing topics. - if user_profile.realm.allow_community_topic_editing: + # The edit_topic_policy setting controls which users can edit topics. + if user_profile.realm.edit_topic_policy == Realm.POLICY_EVERYONE: return True return False diff --git a/zerver/lib/event_schema.py b/zerver/lib/event_schema.py index 6df982bb01..6ac4fa9247 100644 --- a/zerver/lib/event_schema.py +++ b/zerver/lib/event_schema.py @@ -931,7 +931,7 @@ message_edit_data = DictType( required_keys=[ ("allow_message_editing", bool), ("message_content_edit_limit_seconds", int), - ("allow_community_topic_editing", bool), + ("edit_topic_policy", int), ] ) diff --git a/zerver/lib/events.py b/zerver/lib/events.py index c9cdc740f8..c3d296d5d3 100644 --- a/zerver/lib/events.py +++ b/zerver/lib/events.py @@ -218,8 +218,8 @@ def fetch_initial_state_data( state["realm_allow_message_editing"] = ( False if user_profile is None else realm.allow_message_editing ) - state["realm_allow_community_topic_editing"] = ( - False if user_profile is None else realm.allow_community_topic_editing + state["realm_edit_topic_policy"] = ( + Realm.POLICY_ADMINS_ONLY if user_profile is None else realm.edit_topic_policy ) state["realm_allow_message_deleting"] = ( False if user_profile is None else realm.allow_message_deleting diff --git a/zerver/migrations/0327_realm_edit_topic_policy.py b/zerver/migrations/0327_realm_edit_topic_policy.py new file mode 100644 index 0000000000..c1803c8383 --- /dev/null +++ b/zerver/migrations/0327_realm_edit_topic_policy.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.2 on 2021-05-26 09:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("zerver", "0326_alter_realm_authentication_methods"), + ] + + operations = [ + migrations.AddField( + model_name="realm", + name="edit_topic_policy", + field=models.PositiveSmallIntegerField(default=5), + ), + ] diff --git a/zerver/migrations/0328_migrate_to_edit_topic_policy.py b/zerver/migrations/0328_migrate_to_edit_topic_policy.py new file mode 100644 index 0000000000..8ed74de769 --- /dev/null +++ b/zerver/migrations/0328_migrate_to_edit_topic_policy.py @@ -0,0 +1,46 @@ +# Generated by Django 3.2.2 on 2021-05-26 09:43 + +from django.db import migrations +from django.db.backends.postgresql.schema import DatabaseSchemaEditor +from django.db.migrations.state import StateApps + + +def migrate_to_edit_topic_policy(apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None: + Realm = apps.get_model("zerver", "Realm") + Realm.POLICY_EVERYONE = 5 + Realm.POLICY_ADMINS_ONLY = 2 + Realm.objects.filter(allow_community_topic_editing=False).update( + edit_topic_policy=Realm.POLICY_ADMINS_ONLY + ) + Realm.objects.filter(allow_community_topic_editing=True).update( + edit_topic_policy=Realm.POLICY_EVERYONE + ) + + +def reverse_migrate_to_edit_topic_policy( + apps: StateApps, schema_editor: DatabaseSchemaEditor +) -> None: + Realm = apps.get_model("zerver", "Realm") + Realm.POLICY_EVERYONE = 5 + Realm.POLICY_ADMINS_ONLY = 2 + Realm.objects.filter(edit_topic_policy=Realm.POLICY_ADMINS_ONLY).update( + allow_community_topic_editing=False + ) + Realm.objects.filter(edit_topic_policy=Realm.POLICY_EVERYONE).update( + allow_community_topic_editing=True + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ("zerver", "0327_realm_edit_topic_policy"), + ] + + operations = [ + migrations.RunPython( + migrate_to_edit_topic_policy, + reverse_code=reverse_migrate_to_edit_topic_policy, + elidable=True, + ), + ] diff --git a/zerver/migrations/0329_remove_realm_allow_community_topic_editing.py b/zerver/migrations/0329_remove_realm_allow_community_topic_editing.py new file mode 100644 index 0000000000..0346634703 --- /dev/null +++ b/zerver/migrations/0329_remove_realm_allow_community_topic_editing.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.2 on 2021-05-26 09:48 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("zerver", "0328_migrate_to_edit_topic_policy"), + ] + + operations = [ + migrations.RemoveField( + model_name="realm", + name="allow_community_topic_editing", + ), + ] diff --git a/zerver/models.py b/zerver/models.py index e5511acef2..7c7591251d 100644 --- a/zerver/models.py +++ b/zerver/models.py @@ -254,6 +254,7 @@ class Realm(models.Model): POLICY_ADMINS_ONLY = 2 POLICY_FULL_MEMBERS_ONLY = 3 POLICY_MODERATORS_ONLY = 4 + POLICY_EVERYONE = 5 COMMON_POLICY_TYPES = [ POLICY_MEMBERS_ONLY, @@ -262,9 +263,19 @@ class Realm(models.Model): POLICY_MODERATORS_ONLY, ] + COMMON_MESSAGE_POLICY_TYPES = [ + POLICY_ADMINS_ONLY, + POLICY_EVERYONE, + ] + + DEFAULT_COMMUNITY_TOPIC_EDITING_LIMIT_SECONDS = 259200 + # Who in the organization is allowed to create streams. create_stream_policy: int = models.PositiveSmallIntegerField(default=POLICY_MEMBERS_ONLY) + # Who in the organization is allowed to edit topics of any message. + edit_topic_policy: int = models.PositiveSmallIntegerField(default=POLICY_EVERYONE) + # Who in the organization is allowed to invite other users to organization. invite_to_realm_policy: int = models.PositiveSmallIntegerField(default=POLICY_MEMBERS_ONLY) @@ -362,9 +373,6 @@ class Realm(models.Model): # Whether users have access to message edit history allow_edit_history: bool = models.BooleanField(default=True) - DEFAULT_COMMUNITY_TOPIC_EDITING_LIMIT_SECONDS = 259200 - allow_community_topic_editing: bool = models.BooleanField(default=True) - # Defaults for new users default_twenty_four_hour_time: bool = models.BooleanField(default=False) default_language: str = models.CharField(default="en", max_length=MAX_LANGUAGE_ID_LENGTH) diff --git a/zerver/openapi/zulip.yaml b/zerver/openapi/zulip.yaml index 2082e3f794..51ba8a3ab2 100644 --- a/zerver/openapi/zulip.yaml +++ b/zerver/openapi/zulip.yaml @@ -3483,11 +3483,16 @@ paths: description: | Whether this organizations [message edit policy](/help/configure-message-editing-and-deletion) allows editing the content of messages. - allow_community_topic_editing: - type: boolean + edit_topic_policy: + type: integer description: | - Whether [community topic editing](/help/community-topic-edits) is enabled - in this organization. + The policy for which users can edit topics of any message. + + * 2 = admins only + * 5 = everyone + + **Changes**: New in Zulip 5.0 (feature level 75), replacing the + previous `allow_community_topic_editing` boolean. message_content_edit_limit_seconds: type: integer description: | @@ -3780,7 +3785,7 @@ paths: { "allow_message_editing": false, "message_content_edit_limit_seconds": 0, - "allow_community_topic_editing": false, + "edit_topic_policy": 2, }, "id": 0, } @@ -8733,13 +8738,18 @@ paths: Whether this organizations [message edit policy](/help/configure-message-editing-and-deletion) allows editing the content of messages. - realm_allow_community_topic_editing: - type: boolean + realm_edit_topic_policy: + type: integer description: | Present if `realm` is present in `fetch_event_types`. - Whether [community topic editing](/help/community-topic-edits) is enabled - in this organization. + The policy for which users can edit topics of any message. + + * 2 = admins only + * 5 = everyone + + **Changes**: New in Zulip 5.0 (feature level 75), replacing the + previous `allow_community_topic_editing` boolean. realm_message_content_edit_limit_seconds: type: integer description: | diff --git a/zerver/tests/test_audit_log.py b/zerver/tests/test_audit_log.py index 1813383481..0fb3933dc7 100644 --- a/zerver/tests/test_audit_log.py +++ b/zerver/tests/test_audit_log.py @@ -41,6 +41,7 @@ from zerver.lib.streams import create_stream_if_needed from zerver.lib.test_classes import ZulipTestCase from zerver.models import ( Message, + Realm, RealmAuditLog, Recipient, Subscription, @@ -412,13 +413,13 @@ class TestRealmAuditLog(ZulipTestCase): RealmAuditLog.NEW_VALUE: 1000, }, { - "property": "allow_community_topic_editing", - RealmAuditLog.OLD_VALUE: True, - RealmAuditLog.NEW_VALUE: False, + "property": "edit_topic_policy", + RealmAuditLog.OLD_VALUE: Realm.POLICY_EVERYONE, + RealmAuditLog.NEW_VALUE: Realm.POLICY_ADMINS_ONLY, }, ] - do_set_realm_message_editing(realm, True, 1000, False, acting_user=user) + do_set_realm_message_editing(realm, True, 1000, Realm.POLICY_ADMINS_ONLY, acting_user=user) realm_audit_logs = RealmAuditLog.objects.filter( realm=realm, event_type=RealmAuditLog.REALM_PROPERTY_CHANGED, diff --git a/zerver/tests/test_events.py b/zerver/tests/test_events.py index 44f7726d57..0a46b97133 100644 --- a/zerver/tests/test_events.py +++ b/zerver/tests/test_events.py @@ -1241,7 +1241,7 @@ class NormalActionsTest(BaseAction): self.user_profile.realm, allow_message_editing, message_content_edit_limit_seconds, - False, + Realm.POLICY_ADMINS_ONLY, acting_user=None, ) ) diff --git a/zerver/tests/test_home.py b/zerver/tests/test_home.py index 3d354e0945..fb7f349cc6 100644 --- a/zerver/tests/test_home.py +++ b/zerver/tests/test_home.py @@ -138,7 +138,6 @@ class HomeTest(ZulipTestCase): "prompt_for_invites", "queue_id", "realm_add_emoji_by_admins_only", - "realm_allow_community_topic_editing", "realm_allow_edit_history", "realm_allow_message_deleting", "realm_allow_message_editing", @@ -161,6 +160,7 @@ class HomeTest(ZulipTestCase): "realm_digest_weekday", "realm_disallow_disposable_email_addresses", "realm_domains", + "realm_edit_topic_policy", "realm_email_address_visibility", "realm_email_auth_enabled", "realm_email_changes_disabled", diff --git a/zerver/tests/test_message_edit.py b/zerver/tests/test_message_edit.py index 58e18856c2..288fd090e6 100644 --- a/zerver/tests/test_message_edit.py +++ b/zerver/tests/test_message_edit.py @@ -722,16 +722,14 @@ class EditMessageTest(EditMessageTestCase): def set_message_editing_params( allow_message_editing: bool, message_content_edit_limit_seconds: int, - allow_community_topic_editing: bool, + edit_topic_policy: int, ) -> None: result = self.client_patch( "/json/realm", { "allow_message_editing": orjson.dumps(allow_message_editing).decode(), "message_content_edit_limit_seconds": message_content_edit_limit_seconds, - "allow_community_topic_editing": orjson.dumps( - allow_community_topic_editing - ).decode(), + "edit_topic_policy": edit_topic_policy, }, ) self.assert_json_success(result) @@ -781,46 +779,44 @@ class EditMessageTest(EditMessageTestCase): # test the various possible message editing settings # high enough time limit, all edits allowed - set_message_editing_params(True, 240, False) + set_message_editing_params(True, 240, Realm.POLICY_ADMINS_ONLY) do_edit_message_assert_success(id_, "A") # out of time, only topic editing allowed - set_message_editing_params(True, 120, False) + set_message_editing_params(True, 120, Realm.POLICY_ADMINS_ONLY) do_edit_message_assert_success(id_, "B", True) do_edit_message_assert_error(id_, "C", "The time limit for editing this message has passed") # infinite time, all edits allowed - set_message_editing_params(True, 0, False) + set_message_editing_params(True, 0, Realm.POLICY_ADMINS_ONLY) do_edit_message_assert_success(id_, "D") # without allow_message_editing, nothing is allowed - set_message_editing_params(False, 240, False) + set_message_editing_params(False, 240, Realm.POLICY_ADMINS_ONLY) do_edit_message_assert_error( id_, "E", "Your organization has turned off message editing", True ) - set_message_editing_params(False, 120, False) + set_message_editing_params(False, 120, Realm.POLICY_ADMINS_ONLY) do_edit_message_assert_error( id_, "F", "Your organization has turned off message editing", True ) - set_message_editing_params(False, 0, False) + set_message_editing_params(False, 0, Realm.POLICY_ADMINS_ONLY) do_edit_message_assert_error( id_, "G", "Your organization has turned off message editing", True ) - def test_allow_community_topic_editing(self) -> None: + def test_edit_topic_policy(self) -> None: def set_message_editing_params( allow_message_editing: bool, message_content_edit_limit_seconds: int, - allow_community_topic_editing: bool, + edit_topic_policy: int, ) -> None: result = self.client_patch( "/json/realm", { "allow_message_editing": orjson.dumps(allow_message_editing).decode(), "message_content_edit_limit_seconds": message_content_edit_limit_seconds, - "allow_community_topic_editing": orjson.dumps( - allow_community_topic_editing - ).decode(), + "edit_topic_policy": edit_topic_policy, }, ) self.assert_json_success(result) @@ -855,21 +851,21 @@ class EditMessageTest(EditMessageTestCase): message.save() # any user can edit the topic of a message - set_message_editing_params(True, 0, True) + set_message_editing_params(True, 0, Realm.POLICY_EVERYONE) # log in as a new user self.login("cordelia") do_edit_message_assert_success(id_, "A") # only admins can edit the topics of messages self.login("iago") - set_message_editing_params(True, 0, False) + set_message_editing_params(True, 0, Realm.POLICY_ADMINS_ONLY) do_edit_message_assert_success(id_, "B") self.login("cordelia") do_edit_message_assert_error(id_, "C", "You don't have permission to edit this message") # users cannot edit topics if allow_message_editing is False self.login("iago") - set_message_editing_params(False, 0, True) + set_message_editing_params(False, 0, Realm.POLICY_EVERYONE) self.login("cordelia") do_edit_message_assert_error(id_, "D", "Your organization has turned off message editing") @@ -877,7 +873,7 @@ class EditMessageTest(EditMessageTestCase): message.date_sent = message.date_sent - datetime.timedelta(seconds=290000) message.save() self.login("iago") - set_message_editing_params(True, 0, True) + set_message_editing_params(True, 0, Realm.POLICY_EVERYONE) do_edit_message_assert_success(id_, "E") self.login("cordelia") do_edit_message_assert_error( @@ -1537,7 +1533,7 @@ class EditMessageTest(EditMessageTestCase): ) realm = user_profile.realm - realm.allow_community_topic_editing = False + realm.edit_topic_policy = Realm.POLICY_ADMINS_ONLY realm.save() self.login("cordelia") diff --git a/zerver/tests/test_realm.py b/zerver/tests/test_realm.py index cf3bad953a..6c04a24c4b 100644 --- a/zerver/tests/test_realm.py +++ b/zerver/tests/test_realm.py @@ -910,25 +910,31 @@ class RealmAPITest(ZulipTestCase): """Tests updating the realm property 'allow_message_editing'.""" self.set_up_db("allow_message_editing", False) self.set_up_db("message_content_edit_limit_seconds", 0) - self.set_up_db("allow_community_topic_editing", False) + self.set_up_db("edit_topic_policy", Realm.POLICY_ADMINS_ONLY) realm = self.update_with_api("allow_message_editing", True) realm = self.update_with_api("message_content_edit_limit_seconds", 100) - realm = self.update_with_api("allow_community_topic_editing", True) + realm = self.update_with_api("edit_topic_policy", Realm.POLICY_EVERYONE) self.assertEqual(realm.allow_message_editing, True) self.assertEqual(realm.message_content_edit_limit_seconds, 100) - self.assertEqual(realm.allow_community_topic_editing, True) + self.assertEqual(realm.edit_topic_policy, Realm.POLICY_EVERYONE) realm = self.update_with_api("allow_message_editing", False) self.assertEqual(realm.allow_message_editing, False) self.assertEqual(realm.message_content_edit_limit_seconds, 100) - self.assertEqual(realm.allow_community_topic_editing, True) + self.assertEqual(realm.edit_topic_policy, Realm.POLICY_EVERYONE) realm = self.update_with_api("message_content_edit_limit_seconds", 200) self.assertEqual(realm.allow_message_editing, False) self.assertEqual(realm.message_content_edit_limit_seconds, 200) - self.assertEqual(realm.allow_community_topic_editing, True) - realm = self.update_with_api("allow_community_topic_editing", False) + self.assertEqual(realm.edit_topic_policy, Realm.POLICY_EVERYONE) + realm = self.update_with_api("edit_topic_policy", Realm.POLICY_ADMINS_ONLY) self.assertEqual(realm.allow_message_editing, False) self.assertEqual(realm.message_content_edit_limit_seconds, 200) - self.assertEqual(realm.allow_community_topic_editing, False) + self.assertEqual(realm.edit_topic_policy, Realm.POLICY_ADMINS_ONLY) + + # Test an invalid value for edit_topic_policy + invalid_edit_topic_policy_value = 10 + req = {"edit_topic_policy": orjson.dumps(invalid_edit_topic_policy_value).decode()} + result = self.client_patch("/json/realm", req) + self.assert_json_error(result, "Invalid edit_topic_policy") def test_update_realm_allow_message_deleting(self) -> None: """Tests updating the realm property 'allow_message_deleting'.""" diff --git a/zerver/views/realm.py b/zerver/views/realm.py index cd77971989..db4a922f52 100644 --- a/zerver/views/realm.py +++ b/zerver/views/realm.py @@ -66,7 +66,9 @@ def update_realm( converter=to_non_negative_int, default=None ), allow_message_editing: Optional[bool] = REQ(json_validator=check_bool, default=None), - allow_community_topic_editing: Optional[bool] = REQ(json_validator=check_bool, default=None), + edit_topic_policy: Optional[int] = REQ( + json_validator=check_int_in(Realm.COMMON_MESSAGE_POLICY_TYPES), default=None + ), mandatory_topics: Optional[bool] = REQ(json_validator=check_bool, default=None), message_content_edit_limit_seconds: Optional[int] = REQ( converter=to_non_negative_int, default=None @@ -181,27 +183,24 @@ def update_realm( message_content_edit_limit_seconds is not None and realm.message_content_edit_limit_seconds != message_content_edit_limit_seconds ) - or ( - allow_community_topic_editing is not None - and realm.allow_community_topic_editing != allow_community_topic_editing - ) + or (edit_topic_policy is not None and realm.edit_topic_policy != edit_topic_policy) ): if allow_message_editing is None: allow_message_editing = realm.allow_message_editing if message_content_edit_limit_seconds is None: message_content_edit_limit_seconds = realm.message_content_edit_limit_seconds - if allow_community_topic_editing is None: - allow_community_topic_editing = realm.allow_community_topic_editing + if edit_topic_policy is None: + edit_topic_policy = realm.edit_topic_policy do_set_realm_message_editing( realm, allow_message_editing, message_content_edit_limit_seconds, - allow_community_topic_editing, + edit_topic_policy, acting_user=user_profile, ) data["allow_message_editing"] = allow_message_editing data["message_content_edit_limit_seconds"] = message_content_edit_limit_seconds - data["allow_community_topic_editing"] = allow_community_topic_editing + data["edit_topic_policy"] = edit_topic_policy # Realm.notifications_stream and Realm.signup_notifications_stream are not boolean, # str or integer field, and thus doesn't fit into the do_set_realm_property framework.