settings: Add new setting for controlling who can move msgs to stream.

This commit adds a new setting 'move_messages_between_streams_policy`
for controlling who can move messages from one stream to other.
This commit is contained in:
sahil839 2021-04-08 22:54:01 +05:30 committed by Tim Abbott
parent 5f0211285e
commit 2dc99aa90f
9 changed files with 81 additions and 1 deletions

View File

@ -10,6 +10,12 @@ below features are supported.
## Changes in Zulip 4.0 ## Changes in Zulip 4.0
**Feature level 56**
* [`POST /register`](/api/register-queue): Added a new setting
`move_messages_between_streams_policy` for controlling who can
move messages between streams.
**Feature level 55** **Feature level 55**
* [`POST /register`](/api/register-queue): Added `realm_giphy_rating` * [`POST /register`](/api/register-queue): Added `realm_giphy_rating`

View File

@ -30,7 +30,7 @@ DESKTOP_WARNING_VERSION = "5.2.0"
# #
# Changes should be accompanied by documentation explaining what the # Changes should be accompanied by documentation explaining what the
# new level means in templates/zerver/api/changelog.md. # new level means in templates/zerver/api/changelog.md.
API_FEATURE_LEVEL = 55 API_FEATURE_LEVEL = 56
# Bump the minor PROVISION_VERSION to indicate that folks should provision # 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 # only when going from an old version of the code to a newer version. Bump

View File

@ -0,0 +1,18 @@
# Generated by Django 3.1.7 on 2021-04-09 14:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("zerver", "0319_realm_giphy_rating"),
]
operations = [
migrations.AddField(
model_name="realm",
name="move_messages_between_streams_policy",
field=models.PositiveSmallIntegerField(default=2),
),
]

View File

@ -272,6 +272,11 @@ class Realm(models.Model):
# Who in the organization is allowed to invite other users to streams. # Who in the organization is allowed to invite other users to streams.
invite_to_stream_policy: int = models.PositiveSmallIntegerField(default=POLICY_MEMBERS_ONLY) invite_to_stream_policy: int = models.PositiveSmallIntegerField(default=POLICY_MEMBERS_ONLY)
# Who in the organization is allowed to move messages between streams.
move_messages_between_streams_policy: int = models.PositiveSmallIntegerField(
default=POLICY_ADMINS_ONLY
)
USER_GROUP_EDIT_POLICY_MEMBERS = 1 USER_GROUP_EDIT_POLICY_MEMBERS = 1
USER_GROUP_EDIT_POLICY_ADMINS = 2 USER_GROUP_EDIT_POLICY_ADMINS = 2
user_group_edit_policy: int = models.PositiveSmallIntegerField( user_group_edit_policy: int = models.PositiveSmallIntegerField(
@ -492,6 +497,7 @@ class Realm(models.Model):
bot_creation_policy=int, bot_creation_policy=int,
create_stream_policy=int, create_stream_policy=int,
invite_to_stream_policy=int, invite_to_stream_policy=int,
move_messages_between_streams_policy=int,
default_language=str, default_language=str,
default_twenty_four_hour_time=bool, default_twenty_four_hour_time=bool,
description=str, description=str,

View File

@ -3024,6 +3024,17 @@ paths:
description: | description: |
The policy for which users can add other users to streams in this The policy for which users can add other users to streams in this
organization. organization.
move_messages_between_streams_policy:
type: integer
description: |
The policy for which users can move messages from one stream to another.
* 1 = Members only
* 2 = Administrators only
* 3 = Full members only
* 4 = Moderators only
**Changes**: New in Zulip 4.0 (feature level 56)
wildcard_mention_policy: wildcard_mention_policy:
type: integer type: integer
description: | description: |
@ -7960,6 +7971,19 @@ paths:
**Changes**: New in Zulip 4.0 (feature level 50) replacing the **Changes**: New in Zulip 4.0 (feature level 50) replacing the
previous `realm_invite_by_admins_only` boolean. previous `realm_invite_by_admins_only` boolean.
realm_move_messages_between_streams_policy:
type: integer
description: |
Present if `realm` is present in `fetch_event_types`.
The policy for which users can move messages from one stream to another.
* 1 = Members only
* 2 = Administrators only
* 3 = Full members only
* 4 = Moderators only
**Changes**: New in Zulip 4.0 (feature level 56)
realm_inline_image_preview: realm_inline_image_preview:
type: boolean type: boolean
description: | description: |

View File

@ -1899,6 +1899,7 @@ class RealmPropertyActionTest(BaseAction):
default_code_block_language=["python", "javascript"], default_code_block_language=["python", "javascript"],
message_content_delete_limit_seconds=[1000, 1100, 1200], message_content_delete_limit_seconds=[1000, 1100, 1200],
invite_to_realm_policy=[4, 3, 2, 1], invite_to_realm_policy=[4, 3, 2, 1],
move_messages_between_streams_policy=[4, 3, 2, 1],
) )
vals = test_values.get(name) vals = test_values.get(name)

View File

@ -177,6 +177,7 @@ class HomeTest(ZulipTestCase):
"realm_message_content_delete_limit_seconds", "realm_message_content_delete_limit_seconds",
"realm_message_content_edit_limit_seconds", "realm_message_content_edit_limit_seconds",
"realm_message_retention_days", "realm_message_retention_days",
"realm_move_messages_between_streams_policy",
"realm_name", "realm_name",
"realm_name_changes_disabled", "realm_name_changes_disabled",
"realm_name_in_notifications", "realm_name_in_notifications",

View File

@ -563,6 +563,20 @@ class RealmTest(ZulipTestCase):
result = self.client_patch("/json/realm", req) result = self.client_patch("/json/realm", req)
self.assert_json_error(result, "Invalid invite_to_realm_policy") self.assert_json_error(result, "Invalid invite_to_realm_policy")
def test_change_move_messages_between_streams_policy(self) -> None:
# We need an admin user.
self.login("iago")
req = dict(
move_messages_between_streams_policy=orjson.dumps(Realm.POLICY_ADMINS_ONLY).decode()
)
result = self.client_patch("/json/realm", req)
self.assert_json_success(result)
invalid_value = 10
req = dict(move_messages_between_streams_policy=orjson.dumps(invalid_value).decode())
result = self.client_patch("/json/realm", req)
self.assert_json_error(result, "Invalid move_messages_between_streams_policy")
def test_user_group_edit_policy(self) -> None: def test_user_group_edit_policy(self) -> None:
# We need an admin user. # We need an admin user.
self.login("iago") self.login("iago")
@ -624,6 +638,7 @@ class RealmTest(ZulipTestCase):
message_content_delete_limit_seconds=-10, message_content_delete_limit_seconds=-10,
wildcard_mention_policy=10, wildcard_mention_policy=10,
invite_to_realm_policy=10, invite_to_realm_policy=10,
move_messages_between_streams_policy=10,
) )
# We need an admin user. # We need an admin user.
@ -902,6 +917,12 @@ class RealmAPITest(ZulipTestCase):
Realm.POLICY_FULL_MEMBERS_ONLY, Realm.POLICY_FULL_MEMBERS_ONLY,
Realm.POLICY_MODERATORS_ONLY, Realm.POLICY_MODERATORS_ONLY,
], ],
move_messages_between_streams_policy=[
Realm.POLICY_ADMINS_ONLY,
Realm.POLICY_MEMBERS_ONLY,
Realm.POLICY_FULL_MEMBERS_ONLY,
Realm.POLICY_MODERATORS_ONLY,
],
) )
vals = test_values.get(name) vals = test_values.get(name)

View File

@ -96,6 +96,9 @@ def update_realm(
invite_to_stream_policy: Optional[int] = REQ( invite_to_stream_policy: Optional[int] = REQ(
json_validator=check_int_in(Realm.COMMON_POLICY_TYPES), default=None json_validator=check_int_in(Realm.COMMON_POLICY_TYPES), default=None
), ),
move_messages_between_streams_policy: Optional[int] = REQ(
json_validator=check_int_in(Realm.COMMON_POLICY_TYPES), default=None
),
user_group_edit_policy: Optional[int] = REQ( user_group_edit_policy: Optional[int] = REQ(
json_validator=check_int_in(Realm.USER_GROUP_EDIT_POLICY_TYPES), default=None json_validator=check_int_in(Realm.USER_GROUP_EDIT_POLICY_TYPES), default=None
), ),