api: Pass group id instead of name to default stream group api.

This commit is contained in:
Vishnu Ks
2017-11-14 19:33:09 +00:00
committed by Tim Abbott
parent 9565ea4513
commit f45ba7de93
7 changed files with 92 additions and 95 deletions

View File

@@ -2947,44 +2947,32 @@ def do_create_default_stream_group(realm: Realm, group_name: Text, streams: List
group.save() group.save()
notify_default_stream_groups(realm) notify_default_stream_groups(realm)
def do_add_streams_to_default_stream_group(realm: Realm, group_name: Text, streams: List[Stream]) -> None: def do_add_streams_to_default_stream_group(realm: Realm, group: DefaultStreamGroup, streams: List[Stream]) -> None:
try:
group = DefaultStreamGroup.objects.get(name=group_name, realm=realm)
except DefaultStreamGroup.DoesNotExist:
raise JsonableError(_("Default stream group '%s' does not exist") % (group_name,))
default_streams = get_default_streams_for_realm(realm.id) default_streams = get_default_streams_for_realm(realm.id)
for stream in streams: for stream in streams:
if stream in default_streams: if stream in default_streams:
raise JsonableError(_("'%s' is a default stream and cannot be added to '%s'") % (stream.name, group_name)) raise JsonableError(_("'%s' is a default stream and cannot be added to '%s'") % (stream.name, group.name))
if stream in group.streams.all(): if stream in group.streams.all():
raise JsonableError(_("Stream '%s' is already present in default stream group '%s'") raise JsonableError(_("Stream '%s' is already present in default stream group '%s'")
% (stream.name, group_name)) % (stream.name, group.name))
group.streams.add(stream) group.streams.add(stream)
group.save() group.save()
notify_default_stream_groups(realm) notify_default_stream_groups(realm)
def do_remove_streams_from_default_stream_group(realm: Realm, group_name: Text, streams: List[Stream]) -> None: def do_remove_streams_from_default_stream_group(realm: Realm, group: DefaultStreamGroup,
try: streams: List[Stream]) -> None:
group = DefaultStreamGroup.objects.get(name=group_name, realm=realm)
except DefaultStreamGroup.DoesNotExist:
raise JsonableError(_("Default stream group '%s' does not exist") % (group_name,))
for stream in streams: for stream in streams:
if stream not in group.streams.all(): if stream not in group.streams.all():
raise JsonableError(_("Stream '%s' is not present in default stream group '%s'") raise JsonableError(_("Stream '%s' is not present in default stream group '%s'")
% (stream.name, group_name)) % (stream.name, group.name))
group.streams.remove(stream) group.streams.remove(stream)
group.save() group.save()
notify_default_stream_groups(realm) notify_default_stream_groups(realm)
def do_remove_default_stream_group(realm: Realm, group_name: Text) -> None: def do_remove_default_stream_group(realm: Realm, group: DefaultStreamGroup) -> None:
try: group.delete()
DefaultStreamGroup.objects.filter(name=group_name, realm=realm).delete()
except DefaultStreamGroup.DoesNotExist:
raise JsonableError(_("Default stream group '%s' does not exist") % (group_name,))
notify_default_stream_groups(realm) notify_default_stream_groups(realm)
def get_default_streams_for_realm(realm_id): def get_default_streams_for_realm(realm_id):

View File

@@ -8,7 +8,7 @@ from zerver.lib.actions import check_stream_name, create_streams_if_needed
from zerver.lib.request import JsonableError from zerver.lib.request import JsonableError
from zerver.models import UserProfile, Stream, Subscription, \ from zerver.models import UserProfile, Stream, Subscription, \
Realm, Recipient, bulk_get_recipients, get_stream_recipient, get_stream, \ Realm, Recipient, bulk_get_recipients, get_stream_recipient, get_stream, \
bulk_get_streams, get_realm_stream bulk_get_streams, get_realm_stream, DefaultStreamGroup
def access_stream_for_delete(user_profile, stream_id): def access_stream_for_delete(user_profile, stream_id):
# type: (UserProfile, int) -> Stream # type: (UserProfile, int) -> Stream
@@ -220,3 +220,9 @@ def list_to_streams(streams_raw, user_profile, autocreate=False):
existing_streams += dup_streams existing_streams += dup_streams
return existing_streams, created_streams return existing_streams, created_streams
def access_default_stream_group_by_id(realm: Realm, group_id: int) -> DefaultStreamGroup:
try:
return DefaultStreamGroup.objects.get(realm=realm, id=group_id)
except DefaultStreamGroup.DoesNotExist:
raise JsonableError(_("Default stream group with id '%s' does not exist." % (group_id,)))

View File

@@ -1810,7 +1810,9 @@ class DefaultStreamGroup(models.Model):
def to_dict(self): def to_dict(self):
# type: () -> Dict[str, Any] # type: () -> Dict[str, Any]
return dict(name=self.name, streams=[stream.to_dict() for stream in self.streams.all()]) return dict(name=self.name,
id=self.id,
streams=[stream.to_dict() for stream in self.streams.all()])
def get_default_stream_groups(realm): def get_default_stream_groups(realm):
# type: (Realm) -> List[DefaultStreamGroup] # type: (Realm) -> List[DefaultStreamGroup]

View File

@@ -71,6 +71,7 @@ from zerver.lib.actions import (
do_update_pointer, do_update_pointer,
do_update_user_presence, do_update_user_presence,
log_event, log_event,
lookup_default_stream_groups,
notify_realm_custom_profile_fields, notify_realm_custom_profile_fields,
) )
from zerver.lib.events import ( from zerver.lib.events import (
@@ -989,6 +990,7 @@ class EventsRegisterTest(ZulipTestCase):
('type', equals('default_stream_groups')), ('type', equals('default_stream_groups')),
('default_stream_groups', check_list(check_dict_only([ ('default_stream_groups', check_list(check_dict_only([
('name', check_string), ('name', check_string),
('id', check_int),
('streams', check_list(check_dict_only([ ('streams', check_list(check_dict_only([
('description', check_string), ('description', check_string),
('invite_only', check_bool), ('invite_only', check_bool),
@@ -1006,19 +1008,19 @@ class EventsRegisterTest(ZulipTestCase):
error = default_stream_groups_checker('events[0]', events[0]) error = default_stream_groups_checker('events[0]', events[0])
self.assert_on_error(error) self.assert_on_error(error)
group = lookup_default_stream_groups(["group1"], self.user_profile.realm)[0]
venice_stream = get_stream("Venice", self.user_profile.realm) venice_stream = get_stream("Venice", self.user_profile.realm)
events = self.do_test(lambda: do_add_streams_to_default_stream_group(self.user_profile.realm, events = self.do_test(lambda: do_add_streams_to_default_stream_group(self.user_profile.realm,
"group1", [venice_stream])) group, [venice_stream]))
error = default_stream_groups_checker('events[0]', events[0]) error = default_stream_groups_checker('events[0]', events[0])
self.assert_on_error(error) self.assert_on_error(error)
events = self.do_test(lambda: do_remove_streams_from_default_stream_group(self.user_profile.realm, events = self.do_test(lambda: do_remove_streams_from_default_stream_group(self.user_profile.realm,
"group1", [venice_stream])) group, [venice_stream]))
error = default_stream_groups_checker('events[0]', events[0]) error = default_stream_groups_checker('events[0]', events[0])
self.assert_on_error(error) self.assert_on_error(error)
events = self.do_test(lambda: do_remove_default_stream_group(self.user_profile.realm, events = self.do_test(lambda: do_remove_default_stream_group(self.user_profile.realm, group))
"group1"))
error = default_stream_groups_checker('events[0]', events[0]) error = default_stream_groups_checker('events[0]', events[0])
self.assert_on_error(error) self.assert_on_error(error)

View File

@@ -56,6 +56,7 @@ from zerver.lib.actions import (
do_create_default_stream_group, do_create_default_stream_group,
do_add_streams_to_default_stream_group, do_remove_streams_from_default_stream_group, do_add_streams_to_default_stream_group, do_remove_streams_from_default_stream_group,
do_remove_default_stream_group, do_remove_default_stream_group,
lookup_default_stream_groups,
) )
from zerver.views.streams import ( from zerver.views.streams import (
@@ -852,6 +853,7 @@ class DefaultStreamGroupTest(ZulipTestCase):
self.assertEqual(list(default_stream_groups[0].streams.all()), streams) self.assertEqual(list(default_stream_groups[0].streams.all()), streams)
# Test adding streams to existing default stream group # Test adding streams to existing default stream group
group = lookup_default_stream_groups(["group1"], realm)[0]
new_stream_names = ["stream4", "stream5"] new_stream_names = ["stream4", "stream5"]
new_streams = [] new_streams = []
for new_stream_name in new_stream_names: for new_stream_name in new_stream_names:
@@ -859,14 +861,14 @@ class DefaultStreamGroupTest(ZulipTestCase):
new_streams.append(new_stream) new_streams.append(new_stream)
streams.append(new_stream) streams.append(new_stream)
do_add_streams_to_default_stream_group(realm, group_name, new_streams) do_add_streams_to_default_stream_group(realm, group, new_streams)
default_stream_groups = get_default_stream_groups(realm) default_stream_groups = get_default_stream_groups(realm)
self.assert_length(default_stream_groups, 1) self.assert_length(default_stream_groups, 1)
self.assertEqual(default_stream_groups[0].name, group_name) self.assertEqual(default_stream_groups[0].name, group_name)
self.assertEqual(list(default_stream_groups[0].streams.all()), streams) self.assertEqual(list(default_stream_groups[0].streams.all()), streams)
# Test removing streams from existing default stream group # Test removing streams from existing default stream group
do_remove_streams_from_default_stream_group(realm, group_name, new_streams) do_remove_streams_from_default_stream_group(realm, group, new_streams)
remaining_streams = streams[0:3] remaining_streams = streams[0:3]
default_stream_groups = get_default_stream_groups(realm) default_stream_groups = get_default_stream_groups(realm)
self.assert_length(default_stream_groups, 1) self.assert_length(default_stream_groups, 1)
@@ -874,7 +876,7 @@ class DefaultStreamGroupTest(ZulipTestCase):
self.assertEqual(list(default_stream_groups[0].streams.all()), remaining_streams) self.assertEqual(list(default_stream_groups[0].streams.all()), remaining_streams)
# Test removing default stream group # Test removing default stream group
do_remove_default_stream_group(realm, group_name) do_remove_default_stream_group(realm, group)
default_stream_groups = get_default_stream_groups(realm) default_stream_groups = get_default_stream_groups(realm)
self.assert_length(default_stream_groups, 0) self.assert_length(default_stream_groups, 0)
@@ -900,11 +902,7 @@ class DefaultStreamGroupTest(ZulipTestCase):
(stream, _) = create_stream_if_needed(realm, stream_name) (stream, _) = create_stream_if_needed(realm, stream_name)
streams.append(stream) streams.append(stream)
result = self.client_post('/json/default_stream_groups', result = self.client_post('/json/default_stream_groups/create',
{"group_name": "", "stream_names": ujson.dumps(stream_names)})
self.assert_json_error(result, "Invalid default stream group name ''")
result = self.client_post('/json/default_stream_groups',
{"group_name": group_name, "stream_names": ujson.dumps(stream_names)}) {"group_name": group_name, "stream_names": ujson.dumps(stream_names)})
self.assert_json_success(result) self.assert_json_success(result)
default_stream_groups = get_default_stream_groups(realm) default_stream_groups = get_default_stream_groups(realm)
@@ -913,6 +911,7 @@ class DefaultStreamGroupTest(ZulipTestCase):
self.assertEqual(list(default_stream_groups[0].streams.all()), streams) self.assertEqual(list(default_stream_groups[0].streams.all()), streams)
# Test adding streams to existing default stream group # Test adding streams to existing default stream group
group_id = default_stream_groups[0].id
new_stream_names = ["stream4", "stream5"] new_stream_names = ["stream4", "stream5"]
new_streams = [] new_streams = []
for new_stream_name in new_stream_names: for new_stream_name in new_stream_names:
@@ -920,75 +919,69 @@ class DefaultStreamGroupTest(ZulipTestCase):
new_streams.append(new_stream) new_streams.append(new_stream)
streams.append(new_stream) streams.append(new_stream)
result = self.client_patch("/json/default_stream_groups", result = self.client_patch("/json/default_stream_groups/{}/streams".format(group_id),
{"group_name": group_name, {"stream_names": ujson.dumps(new_stream_names)})
"stream_names": ujson.dumps(new_stream_names)})
self.assert_json_error(result, "Missing 'op' argument") self.assert_json_error(result, "Missing 'op' argument")
result = self.client_patch("/json/default_stream_groups", result = self.client_patch("/json/default_stream_groups/{}/streams".format(group_id),
{"group_name": group_name, "op": "invalid", {"op": "invalid", "stream_names": ujson.dumps(new_stream_names)})
"stream_names": ujson.dumps(new_stream_names)}) self.assert_json_error(result, 'Invalid value for "op". Specify one of "add" or "remove".')
self.assert_json_error(result, 'Nothing to do. Specify at least one of "add" or "remove".')
result = self.client_patch("/json/default_stream_groups", result = self.client_patch("/json/default_stream_groups/12345/streams",
{"group_name": "dumbledore's army", "op": "add", {"op": "add", "stream_names": ujson.dumps(new_stream_names)})
"stream_names": ujson.dumps(new_stream_names)}) self.assert_json_error(result, "Default stream group with id '12345' does not exist.")
self.assert_json_error(result, "Default stream group 'dumbledore's army' does not exist")
result = self.client_patch("/json/default_stream_groups/{}/streams".format(group_id), {"op": "add"})
self.assert_json_error(result, "Missing 'stream_names' argument")
do_add_default_stream(new_streams[0]) do_add_default_stream(new_streams[0])
result = self.client_patch('/json/default_stream_groups', result = self.client_patch("/json/default_stream_groups/{}/streams".format(group_id),
{"group_name": group_name, "op": "add", "stream_names": ujson.dumps(new_stream_names)}) {"op": "add", "stream_names": ujson.dumps(new_stream_names)})
self.assert_json_error(result, "'stream4' is a default stream and cannot be added to 'group1'") self.assert_json_error(result, "'stream4' is a default stream and cannot be added to 'group1'")
do_remove_default_stream(new_streams[0]) do_remove_default_stream(new_streams[0])
result = self.client_patch("/json/default_stream_groups", result = self.client_patch("/json/default_stream_groups/{}/streams".format(group_id),
{"group_name": group_name, "op": "add", {"op": "add", "stream_names": ujson.dumps(new_stream_names)})
"stream_names": ujson.dumps(new_stream_names)})
default_stream_groups = get_default_stream_groups(realm)
self.assert_length(default_stream_groups, 1)
self.assertEqual(default_stream_groups[0].name, group_name)
self.assertEqual(list(default_stream_groups[0].streams.all()), streams)
result = self.client_patch('/json/default_stream_groups',
{"group_name": group_name, "op": "add", "stream_names": ujson.dumps(new_stream_names)})
self.assert_json_error(result, "Stream 'stream4' is already present in default stream group 'group1'")
# Test removing streams from default stream group
result = self.client_patch("/json/default_stream_groups",
{"group_name": "dumbledore's army", "op": "remove",
"stream_names": ujson.dumps(new_stream_names)})
self.assert_json_error(result, "Default stream group 'dumbledore's army' does not exist")
result = self.client_patch("/json/default_stream_groups",
{"group_name": group_name, "op": "remove",
"stream_names": ujson.dumps(["random stream name"])})
self.assert_json_error(result, "Invalid stream name 'random stream name'")
streams.remove(new_streams[0])
result = self.client_patch("/json/default_stream_groups",
{"group_name": group_name, "op": "remove",
"stream_names": ujson.dumps([new_stream_names[0]])})
self.assert_json_success(result) self.assert_json_success(result)
default_stream_groups = get_default_stream_groups(realm) default_stream_groups = get_default_stream_groups(realm)
self.assert_length(default_stream_groups, 1) self.assert_length(default_stream_groups, 1)
self.assertEqual(default_stream_groups[0].name, group_name) self.assertEqual(default_stream_groups[0].name, group_name)
self.assertEqual(list(default_stream_groups[0].streams.all()), streams) self.assertEqual(list(default_stream_groups[0].streams.all()), streams)
result = self.client_patch("/json/default_stream_groups", result = self.client_patch("/json/default_stream_groups/{}/streams".format(group_id),
{"group_name": group_name, "op": "remove", {"op": "add", "stream_names": ujson.dumps(new_stream_names)})
"stream_names": ujson.dumps(new_stream_names)}) self.assert_json_error(result, "Stream 'stream4' is already present in default stream group 'group1'")
# Test removing streams from default stream group
result = self.client_patch("/json/default_stream_groups/12345/streams",
{"op": "remove", "stream_names": ujson.dumps(new_stream_names)})
self.assert_json_error(result, "Default stream group with id '12345' does not exist.")
result = self.client_patch("/json/default_stream_groups/{}/streams".format(group_id),
{"op": "remove", "stream_names": ujson.dumps(["random stream name"])})
self.assert_json_error(result, "Invalid stream name 'random stream name'")
streams.remove(new_streams[0])
result = self.client_patch("/json/default_stream_groups/{}/streams".format(group_id),
{"op": "remove", "stream_names": ujson.dumps([new_stream_names[0]])})
self.assert_json_success(result)
default_stream_groups = get_default_stream_groups(realm)
self.assert_length(default_stream_groups, 1)
self.assertEqual(default_stream_groups[0].name, group_name)
self.assertEqual(list(default_stream_groups[0].streams.all()), streams)
result = self.client_patch("/json/default_stream_groups/{}/streams".format(group_id),
{"op": "remove", "stream_names": ujson.dumps(new_stream_names)})
self.assert_json_error(result, "Stream 'stream4' is not present in default stream group 'group1'") self.assert_json_error(result, "Stream 'stream4' is not present in default stream group 'group1'")
# Test deleting a default stream group # Test deleting a default stream group
result = self.client_delete('/json/default_stream_groups', {"group_name": group_name}) result = self.client_delete('/json/default_stream_groups/{}'.format(group_id))
self.assert_json_success(result) self.assert_json_success(result)
default_stream_groups = get_default_stream_groups(realm) default_stream_groups = get_default_stream_groups(realm)
self.assert_length(default_stream_groups, 0) self.assert_length(default_stream_groups, 0)
do_remove_default_stream(new_stream) result = self.client_delete('/json/default_stream_groups/{}'.format(group_id))
result = self.client_patch("/json/default_stream_groups", self.assert_json_error(result, "Default stream group with id '{}' does not exist.".format(group_id))
{"group_name": group_name, "op": "add", "stream_names": ujson.dumps(new_stream_names)})
self.assert_json_error(result, "Default stream group 'group1' does not exist")
class SubscriptionPropertiesTest(ZulipTestCase): class SubscriptionPropertiesTest(ZulipTestCase):
def test_set_stream_color(self): def test_set_stream_color(self):

View File

@@ -24,7 +24,7 @@ from zerver.lib.actions import bulk_remove_subscriptions, \
from zerver.lib.response import json_success, json_error, json_response from zerver.lib.response import json_success, json_error, json_response
from zerver.lib.streams import access_stream_by_id, access_stream_by_name, \ from zerver.lib.streams import access_stream_by_id, access_stream_by_name, \
check_stream_name, check_stream_name_available, filter_stream_authorization, \ check_stream_name, check_stream_name_available, filter_stream_authorization, \
list_to_streams, access_stream_for_delete list_to_streams, access_stream_for_delete, access_default_stream_group_by_id
from zerver.lib.validator import check_string, check_int, check_list, check_dict, \ from zerver.lib.validator import check_string, check_int, check_list, check_dict, \
check_bool, check_variable_type check_bool, check_variable_type
from zerver.models import UserProfile, Stream, Realm, Subscription, \ from zerver.models import UserProfile, Stream, Realm, Subscription, \
@@ -88,26 +88,30 @@ def create_default_stream_group(request: HttpRequest, user_profile: UserProfile,
@require_realm_admin @require_realm_admin
@has_request_variables @has_request_variables
def update_default_stream_group(request: HttpRequest, user_profile: UserProfile, @require_realm_admin
group_name: Text=REQ(), op: Text=REQ(), @has_request_variables
def update_default_stream_group_streams(request: HttpRequest, user_profile: UserProfile,
group_id: int, op: Text=REQ(),
stream_names: List[Text]=REQ(validator=check_list(check_string))) -> None: stream_names: List[Text]=REQ(validator=check_list(check_string))) -> None:
group = access_default_stream_group_by_id(user_profile.realm, group_id,)
streams = [] streams = []
for stream_name in stream_names: for stream_name in stream_names:
(stream, recipient, sub) = access_stream_by_name(user_profile, stream_name) (stream, recipient, sub) = access_stream_by_name(user_profile, stream_name)
streams.append(stream) streams.append(stream)
if op == 'add': if op == 'add':
do_add_streams_to_default_stream_group(user_profile.realm, group_name, streams) do_add_streams_to_default_stream_group(user_profile.realm, group, streams)
elif op == 'remove': elif op == 'remove':
do_remove_streams_from_default_stream_group(user_profile.realm, group_name, streams) do_remove_streams_from_default_stream_group(user_profile.realm, group, streams)
else: else:
return json_error(_('Nothing to do. Specify at least one of "add" or "remove".')) return json_error(_('Invalid value for "op". Specify one of "add" or "remove".'))
return json_success() return json_success()
@require_realm_admin @require_realm_admin
@has_request_variables @has_request_variables
def remove_default_stream_group(request: HttpRequest, user_profile: UserProfile, group_name: Text=REQ()) -> None: def remove_default_stream_group(request: HttpRequest, user_profile: UserProfile, group_id: int) -> None:
do_remove_default_stream_group(user_profile.realm, group_name) group = access_default_stream_group_by_id(user_profile.realm, group_id)
do_remove_default_stream_group(user_profile.realm, group)
return json_success() return json_success()
@require_realm_admin @require_realm_admin

View File

@@ -283,10 +283,12 @@ v1_api_and_json_patterns = [
url(r'^default_streams$', rest_dispatch, url(r'^default_streams$', rest_dispatch,
{'POST': 'zerver.views.streams.add_default_stream', {'POST': 'zerver.views.streams.add_default_stream',
'DELETE': 'zerver.views.streams.remove_default_stream'}), 'DELETE': 'zerver.views.streams.remove_default_stream'}),
url(r'^default_stream_groups', rest_dispatch, url(r'^default_stream_groups/create$', rest_dispatch,
{'POST': 'zerver.views.streams.create_default_stream_group', {'POST': 'zerver.views.streams.create_default_stream_group'}),
'PATCH': 'zerver.views.streams.update_default_stream_group', url(r'^default_stream_groups/(?P<group_id>\d+)$', rest_dispatch,
'DELETE': 'zerver.views.streams.remove_default_stream_group'}), {'DELETE': 'zerver.views.streams.remove_default_stream_group'}),
url(r'^default_stream_groups/(?P<group_id>\d+)/streams$', rest_dispatch,
{'PATCH': 'zerver.views.streams.update_default_stream_group_streams'}),
# GET lists your streams, POST bulk adds, PATCH bulk modifies/removes # GET lists your streams, POST bulk adds, PATCH bulk modifies/removes
url(r'^users/me/subscriptions$', rest_dispatch, url(r'^users/me/subscriptions$', rest_dispatch,
{'GET': 'zerver.views.streams.list_subscriptions_backend', {'GET': 'zerver.views.streams.list_subscriptions_backend',