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 = {}):
|
def get_subscriptions(self, request = {}):
|
||||||
return self.do_api_query(request, "/api/v1/get_subscriptions")
|
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 = {}):
|
def call_on_each_message(self, callback, options = {}):
|
||||||
max_message_id = None
|
max_message_id = None
|
||||||
while True:
|
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_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_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/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'^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'^send_message/', 'zephyr.views.send_message', name='send_message'),
|
||||||
url(r'^accounts/home/', 'zephyr.views.accounts_home', name='accounts_home'),
|
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.
|
# Streams must start with a letter or number.
|
||||||
return re.match("^[.a-zA-Z0-9][.a-z A-Z0-9_-]*$", name)
|
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
|
@login_required
|
||||||
@require_post
|
@require_post
|
||||||
def json_add_subscription(request):
|
def json_add_subscription(request):
|
||||||
@@ -482,33 +492,39 @@ def json_add_subscription(request):
|
|||||||
|
|
||||||
if "new_subscription" not in request.POST:
|
if "new_subscription" not in request.POST:
|
||||||
return HttpResponseRedirect(reverse('zephyr.views.subscriptions'))
|
return HttpResponseRedirect(reverse('zephyr.views.subscriptions'))
|
||||||
|
|
||||||
sub_name = request.POST.get('new_subscription').strip()
|
sub_name = request.POST.get('new_subscription').strip()
|
||||||
if not valid_stream_name(sub_name):
|
if not valid_stream_name(sub_name):
|
||||||
return json_error("Invalid characters in stream names")
|
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):
|
||||||
recipient = Recipient.objects.get(type_id=stream.id,
|
subscribed = []
|
||||||
type=Recipient.STREAM)
|
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:
|
||||||
recipient=recipient)
|
subscription = Subscription.objects.get(userprofile=user_profile,
|
||||||
if subscription:
|
recipient=recipient)
|
||||||
subscription = subscription[0]
|
if subscription.active:
|
||||||
if not subscription.active:
|
# Subscription already exists and is active
|
||||||
# Activating old subscription.
|
already_subscribed.append(stream_name)
|
||||||
subscription.active = True
|
continue
|
||||||
subscription.save()
|
except Subscription.DoesNotExist:
|
||||||
actually_new_sub = sub_name
|
subscription = Subscription(userprofile=user_profile,
|
||||||
else:
|
recipient=recipient)
|
||||||
# Subscription already exists and is active
|
subscription.active = True
|
||||||
return json_error("Subscription already exists")
|
subscription.save()
|
||||||
else:
|
subscribed.append(stream_name)
|
||||||
new_subscription = Subscription(userprofile=user_profile,
|
|
||||||
recipient=recipient)
|
return {"subscribed": subscribed,
|
||||||
new_subscription.save()
|
"already_subscribed": already_subscribed}
|
||||||
actually_new_sub = sub_name
|
|
||||||
return json_success({"data": actually_new_sub})
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@require_post
|
@require_post
|
||||||
|
|||||||
Reference in New Issue
Block a user