diff --git a/zerver/lib/actions.py b/zerver/lib/actions.py index aff12d0ee2..73aefd7431 100644 --- a/zerver/lib/actions.py +++ b/zerver/lib/actions.py @@ -1102,6 +1102,20 @@ def do_change_full_name(user_profile, full_name, log=True): users=active_user_ids(user_profile.realm)) tornado_callbacks.send_notification(notice) +def do_make_stream_public(user_profile, realm, stream_name): + stream_name = stream_name.strip() + stream = get_stream(stream_name, realm) + + if not stream: + raise JsonableError('Unknown stream "%s"' % (stream_name,)) + + if not subscribed_to_stream(user_profile, stream): + raise JsonableError('You are not invited to this stream.') + + stream.invite_only = False + stream.save(update_fields=['invite_only']) + return {} + def do_rename_stream(realm, old_name, new_name, log=True): old_name = old_name.strip() new_name = new_name.strip() diff --git a/zerver/tests.py b/zerver/tests.py index 745fc880c2..b3aff70b80 100644 --- a/zerver/tests.py +++ b/zerver/tests.py @@ -508,6 +508,32 @@ class AuthedTestCase(TestCase): return msg +class StreamAdminTest(AuthedTestCase): + def test_make_stream_public(self): + email = 'hamlet@zulip.com' + self.login(email) + user_profile = get_user_profile_by_email(email) + realm = user_profile.realm + stream, _ = create_stream_if_needed(realm, 'private_stream', invite_only=True) + + assign_perm('administer', user_profile, realm) + params = { + 'stream_name': 'private_stream' + } + result = self.client.post("/json/make_stream_public", params) + self.assert_json_error(result, 'You are not invited to this stream.') + + do_add_subscription(user_profile, stream) + + assign_perm('administer', user_profile, realm) + params = { + 'stream_name': 'private_stream' + } + result = self.client.post("/json/make_stream_public", params) + self.assert_json_success(result) + stream = Stream.objects.get(name='private_stream', realm=realm) + self.assertFalse(stream.invite_only) + class PermissionTest(TestCase): def test_get_admin_users(self): user_profile = get_user_profile_by_email('hamlet@zulip.com') diff --git a/zerver/views/__init__.py b/zerver/views/__init__.py index cde9c4e764..95fd1f4b95 100644 --- a/zerver/views/__init__.py +++ b/zerver/views/__init__.py @@ -40,7 +40,7 @@ from zerver.lib.actions import bulk_remove_subscriptions, \ do_add_alert_words, do_remove_alert_words, do_set_alert_words, get_subscriber_emails, \ do_set_muted_topics, do_rename_stream, clear_followup_emails_queue, \ notify_for_streams_by_default, do_change_enable_offline_push_notifications, \ - do_deactivate_stream, do_change_autoscroll_forever + do_deactivate_stream, do_change_autoscroll_forever, do_make_stream_public from zerver.lib.create_user import random_api_key from zerver.lib.push_notifications import num_push_devices_for_user from zerver.forms import RegistrationForm, HomepageForm, ToSForm, \ @@ -1579,6 +1579,12 @@ def get_public_streams_backend(request, user_profile): def json_rename_stream(request, user_profile, old_name=REQ, new_name=REQ): return json_success(do_rename_stream(user_profile.realm, old_name, new_name)) +@authenticated_json_post_view +@require_realm_admin +@has_request_variables +def json_make_stream_public(request, user_profile, stream_name=REQ): + return json_success(do_make_stream_public(user_profile, user_profile.realm, stream_name)) + def list_subscriptions_backend(request, user_profile): return json_success({"subscriptions": gather_subscriptions(user_profile)[0]}) diff --git a/zproject/urls.py b/zproject/urls.py index 40894723a2..3290531f0b 100644 --- a/zproject/urls.py +++ b/zproject/urls.py @@ -107,6 +107,7 @@ urlpatterns += patterns('zerver.views', url(r'^json/get_old_messages$', 'json_get_old_messages'), url(r'^json/get_public_streams$', 'json_get_public_streams'), url(r'^json/rename_stream$', 'json_rename_stream'), + url(r'^json/make_stream_public$', 'json_make_stream_public'), url(r'^json/send_message$', 'json_send_message'), url(r'^json/invite_users$', 'json_invite_users'), url(r'^json/bulk_invite_users$', 'json_bulk_invite_users'),