diff --git a/static/js/stream_create.js b/static/js/stream_create.js index af009bc922..61e12497c9 100644 --- a/static/js/stream_create.js +++ b/static/js/stream_create.js @@ -165,13 +165,8 @@ function create_stream() { data.invite_only = JSON.stringify(invite_only); data.history_public_to_subscribers = JSON.stringify(history_public_to_subscribers); - let stream_post_policy = parseInt($('#stream_creation_form input[name=stream-post-policy]:checked').val(), 10); + const stream_post_policy = parseInt($('#stream_creation_form input[name=stream-post-policy]:checked').val(), 10); - // Because the stream_post_policy field is hidden when non-administrators create streams, - // we need to set the default value here. - if (isNaN(stream_post_policy)) { - stream_post_policy = stream_data.stream_post_policy_values.everyone.code; - } data.stream_post_policy = JSON.stringify(stream_post_policy); const announce = stream_data.realm_has_notifications_stream() && diff --git a/static/templates/stream_types.hbs b/static/templates/stream_types.hbs index 0a88c0b916..f0fc7d8414 100644 --- a/static/templates/stream_types.hbs +++ b/static/templates/stream_types.hbs @@ -22,19 +22,17 @@ {{t 'Private, protected history: must be invited by a member; new members can only see messages sent after they join; hidden from non-administrator users' }} - {{#if is_admin}} -

{{t 'Who can post to the stream?'}} - - - -

- {{#each stream_post_policy_values}} -
  • - -
  • - {{/each}} - {{/if}} +

    {{t 'Who can post to the stream?'}} + + + +

    + {{#each stream_post_policy_values}} +
  • + +
  • + {{/each}} diff --git a/zerver/lib/streams.py b/zerver/lib/streams.py index a74a8e44b6..a534dd3926 100644 --- a/zerver/lib/streams.py +++ b/zerver/lib/streams.py @@ -415,22 +415,10 @@ def list_to_streams(streams_raw: Iterable[Mapping[str, Any]], missing_stream_dicts: List[Mapping[str, Any]] = [] existing_stream_map = bulk_get_streams(user_profile.realm, stream_set) - member_creating_announcement_only_stream = False - for stream_dict in streams_raw: stream_name = stream_dict["name"] stream = existing_stream_map.get(stream_name.lower()) if stream is None: - # Non admins cannot create STREAM_POST_POLICY_ADMINS streams. - if ((stream_dict.get("stream_post_policy", False) == - Stream.STREAM_POST_POLICY_ADMINS) and not user_profile.is_realm_admin): - member_creating_announcement_only_stream = True - # New members cannot create STREAM_POST_POLICY_RESTRICT_NEW_MEMBERS streams, - # unless they are admins who are also new members of the organization. - if ((stream_dict.get("stream_post_policy", False) == - Stream.STREAM_POST_POLICY_RESTRICT_NEW_MEMBERS) and user_profile.is_new_member): - if not user_profile.is_realm_admin: - member_creating_announcement_only_stream = True missing_stream_dicts.append(stream_dict) else: existing_streams.append(stream) @@ -446,8 +434,6 @@ def list_to_streams(streams_raw: Iterable[Mapping[str, Any]], elif not autocreate: raise JsonableError(_("Stream(s) (%s) do not exist") % ", ".join( stream_dict["name"] for stream_dict in missing_stream_dicts)) - elif member_creating_announcement_only_stream: - raise JsonableError(_('User cannot create a stream with these settings.')) # We already filtered out existing streams, so dup_streams # will normally be an empty list below, but we protect against somebody diff --git a/zerver/tests/test_subs.py b/zerver/tests/test_subs.py index 9512aac185..e3a4465f8e 100644 --- a/zerver/tests/test_subs.py +++ b/zerver/tests/test_subs.py @@ -65,6 +65,7 @@ from zerver.lib.actions import ( can_access_stream_user_ids, validate_user_access_to_subscribers_helper, get_average_weekly_stream_traffic, round_to_2_significant_digits, + do_change_stream_post_policy, ) from zerver.views.streams import ( @@ -2594,75 +2595,36 @@ class SubscriptionAPITest(ZulipTestCase): def test_subscribe_to_stream_post_policy_admins_stream(self) -> None: """ Members can subscribe to streams where only admins can post - but not create those streams, only realm admins can """ member = self.example_user("AARON") - result = self.common_subscribe_to_streams(member, ["general"]) + stream = self.make_stream('stream1') + do_change_stream_post_policy(stream, Stream.STREAM_POST_POLICY_ADMINS) + result = self.common_subscribe_to_streams(member, ["stream1"]) self.assert_json_success(result) - streams_raw = [{ - 'name': 'new_stream', - 'stream_post_policy': Stream.STREAM_POST_POLICY_ADMINS, - }] - with self.assertRaisesRegex( - JsonableError, "User cannot create a stream with these settings."): - list_to_streams(streams_raw, member, autocreate=True) - - admin = self.example_user("iago") - result = list_to_streams(streams_raw, admin, autocreate=True) - self.assert_length(result[0], 0) - self.assert_length(result[1], 1) - self.assertEqual(result[1][0].name, 'new_stream') - self.assertTrue(result[1][0].stream_post_policy == Stream.STREAM_POST_POLICY_ADMINS) + json = result.json() + self.assertEqual(json["subscribed"], {member.email: ["stream1"]}) + self.assertEqual(json["already_subscribed"], {}) def test_subscribe_to_stream_post_policy_restrict_new_members_stream(self) -> None: """ - New members can subscribe to streams where they can neither post - nor create those streams, only realm admins can can. + New members can subscribe to streams where they can not post """ new_member_email = self.nonreg_email('test') self.register(new_member_email, "test") new_member = self.nonreg_user('test') do_set_realm_property(new_member.realm, 'waiting_period_threshold', 10) - streams_raw = [{ - 'name': 'new_stream', - 'stream_post_policy': Stream.STREAM_POST_POLICY_RESTRICT_NEW_MEMBERS, - }] - - # new members cannot create STREAM_POST_POLICY_RESTRICT_NEW_MEMBERS streams. self.assertTrue(new_member.is_new_member) - with self.assertRaisesRegex( - JsonableError, "User cannot create a stream with these settings."): - list_to_streams(streams_raw, new_member, autocreate=True) - # Non admins can create STREAM_POST_POLICY_RESTRICT_NEW_MEMBERS streams. - # However, they must not be a new user. - non_admin = self.example_user("AARON") - non_admin.date_joined = timezone_now() - timedelta(days=11) - non_admin.save() - self.assertFalse(non_admin.is_new_member) - self.assertFalse(non_admin.is_realm_admin) - result = list_to_streams(streams_raw, non_admin, autocreate=True) - self.assert_length(result[0], 0) - self.assert_length(result[1], 1) - self.assertEqual(result[1][0].name, 'new_stream') - self.assertTrue(result[1][0].stream_post_policy == Stream.STREAM_POST_POLICY_RESTRICT_NEW_MEMBERS) + stream = self.make_stream('stream1') + do_change_stream_post_policy(stream, Stream.STREAM_POST_POLICY_RESTRICT_NEW_MEMBERS) + result = self.common_subscribe_to_streams(new_member, ["stream1"]) + self.assert_json_success(result) - streams_raw = [{ - 'name': 'newer_stream', - 'stream_post_policy': Stream.STREAM_POST_POLICY_RESTRICT_NEW_MEMBERS, - }] - - # Admins can create STREAM_POST_POLICY_RESTRICT_NEW_MEMBERS streams, - # irrespective of whether they are new members or not. - admin = self.example_user("iago") - self.assertTrue(admin.is_realm_admin) - result = list_to_streams(streams_raw, admin, autocreate=True) - self.assert_length(result[0], 0) - self.assert_length(result[1], 1) - self.assertEqual(result[1][0].name, 'newer_stream') - self.assertTrue(result[1][0].stream_post_policy == Stream.STREAM_POST_POLICY_RESTRICT_NEW_MEMBERS) + json = result.json() + self.assertEqual(json["subscribed"], {new_member.email: ["stream1"]}) + self.assertEqual(json["already_subscribed"], {}) def test_guest_user_subscribe(self) -> None: """Guest users cannot subscribe themselves to anything"""