mirror of
https://github.com/zulip/zulip.git
synced 2025-11-10 17:07:07 +00:00
Add an API call to subscribe to a list of streams.
(imported from commit 0a5d46d5f54fb4c8ebfad8c9adb777c0b4938dfa)
This commit is contained in:
@@ -56,6 +56,11 @@ class HumbugAPI():
|
||||
def get_subscriptions(self, request = {}):
|
||||
return self.do_api_query(request, "/api/v1/get_subscriptions")
|
||||
|
||||
def subscribe(self, streams):
|
||||
request = {}
|
||||
request["streams"] = simplejson.dumps(streams)
|
||||
return self.do_api_query(request, "/api/v1/subscribe")
|
||||
|
||||
def call_on_each_message(self, callback, options = {}):
|
||||
max_message_id = None
|
||||
while True:
|
||||
|
||||
41
api/examples/subscribe
Normal file
41
api/examples/subscribe
Normal file
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
import os
|
||||
import optparse
|
||||
|
||||
usage = """subscribe --user=<email address> [options] --streams=<streams>
|
||||
|
||||
Ensures the user is subscribed to the listed streams.
|
||||
|
||||
Example: subscribe --user=tabbott@humbughq.com --site=http://127.0.0.1:8000
|
||||
"""
|
||||
parser = optparse.OptionParser(usage=usage)
|
||||
parser.add_option('--site',
|
||||
dest='site',
|
||||
default="https://app.humbughq.com/",
|
||||
action='store')
|
||||
parser.add_option('--api-key',
|
||||
dest='api_key',
|
||||
default="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
|
||||
action='store')
|
||||
parser.add_option('--streams',
|
||||
dest='streams',
|
||||
default="",
|
||||
action='store')
|
||||
parser.add_option('--user',
|
||||
dest='user',
|
||||
action='store')
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
|
||||
import api.common
|
||||
client = api.common.HumbugAPI(email=options.user,
|
||||
api_key=options.api_key,
|
||||
verbose=True,
|
||||
site=options.site)
|
||||
|
||||
if options.streams == "":
|
||||
print >>sys.stderr, "Usage:", parser.usage
|
||||
sys.exit(1)
|
||||
|
||||
print client.subscribe(options.streams.split())
|
||||
@@ -13,6 +13,7 @@ urlpatterns = patterns('',
|
||||
url(r'^api/v1/get_messages$', 'zephyr.views.api_get_messages', name='api_get_messages'),
|
||||
url(r'^api/v1/get_public_streams$', 'zephyr.views.api_get_public_streams', name='api_get_public_streams'),
|
||||
url(r'^api/v1/get_subscriptions$', 'zephyr.views.api_get_subscriptions', name='api_get_subscriptions'),
|
||||
url(r'^api/v1/subscribe$', 'zephyr.views.api_subscribe', name='api_subscribe'),
|
||||
url(r'^api/v1/send_message$', 'zephyr.views.api_send_message', name='api_send_message'),
|
||||
url(r'^send_message/', 'zephyr.views.send_message', name='send_message'),
|
||||
url(r'^accounts/home/', 'zephyr.views.accounts_home', name='accounts_home'),
|
||||
|
||||
@@ -475,6 +475,16 @@ def valid_stream_name(name):
|
||||
# Streams must start with a letter or number.
|
||||
return re.match("^[.a-zA-Z0-9][.a-z A-Z0-9_-]*$", name)
|
||||
|
||||
@csrf_exempt
|
||||
@require_post
|
||||
@api_key_required
|
||||
def api_subscribe(request, user_profile):
|
||||
if "streams" not in request.POST:
|
||||
return json_error("Missing streams argument.")
|
||||
streams = simplejson.loads(request.POST.get("streams"))
|
||||
res = add_subscriptions_backend(request, user_profile, streams)
|
||||
return json_success(res)
|
||||
|
||||
@login_required
|
||||
@require_post
|
||||
def json_add_subscription(request):
|
||||
@@ -482,33 +492,39 @@ def json_add_subscription(request):
|
||||
|
||||
if "new_subscription" not in request.POST:
|
||||
return HttpResponseRedirect(reverse('zephyr.views.subscriptions'))
|
||||
|
||||
sub_name = request.POST.get('new_subscription').strip()
|
||||
if not valid_stream_name(sub_name):
|
||||
return json_error("Invalid characters in stream names")
|
||||
res = add_subscriptions_backend(request,user_profile,
|
||||
[request.POST["new_subscription"]])
|
||||
if len(res["already_subscribed"]) != 0:
|
||||
return json_error("Subscription already exists")
|
||||
return json_success({"data": res["subscribed"][0]})
|
||||
|
||||
stream = create_stream_if_needed(user_profile.realm, sub_name)
|
||||
def add_subscriptions_backend(request, user_profile, streams):
|
||||
subscribed = []
|
||||
already_subscribed = []
|
||||
for stream_name in streams:
|
||||
stream = create_stream_if_needed(user_profile.realm, stream_name)
|
||||
recipient = Recipient.objects.get(type_id=stream.id,
|
||||
type=Recipient.STREAM)
|
||||
|
||||
subscription = Subscription.objects.filter(userprofile=user_profile,
|
||||
try:
|
||||
subscription = Subscription.objects.get(userprofile=user_profile,
|
||||
recipient=recipient)
|
||||
if subscription.active:
|
||||
# Subscription already exists and is active
|
||||
already_subscribed.append(stream_name)
|
||||
continue
|
||||
except Subscription.DoesNotExist:
|
||||
subscription = Subscription(userprofile=user_profile,
|
||||
recipient=recipient)
|
||||
if subscription:
|
||||
subscription = subscription[0]
|
||||
if not subscription.active:
|
||||
# Activating old subscription.
|
||||
subscription.active = True
|
||||
subscription.save()
|
||||
actually_new_sub = sub_name
|
||||
else:
|
||||
# Subscription already exists and is active
|
||||
return json_error("Subscription already exists")
|
||||
else:
|
||||
new_subscription = Subscription(userprofile=user_profile,
|
||||
recipient=recipient)
|
||||
new_subscription.save()
|
||||
actually_new_sub = sub_name
|
||||
return json_success({"data": actually_new_sub})
|
||||
subscribed.append(stream_name)
|
||||
|
||||
return {"subscribed": subscribed,
|
||||
"already_subscribed": already_subscribed}
|
||||
|
||||
@login_required
|
||||
@require_post
|
||||
|
||||
Reference in New Issue
Block a user