Add an API call to subscribe to a list of streams.

(imported from commit 0a5d46d5f54fb4c8ebfad8c9adb777c0b4938dfa)
This commit is contained in:
Tim Abbott
2012-10-11 15:34:17 -04:00
parent 04c631fd24
commit fc99d2983a
4 changed files with 85 additions and 22 deletions

View File

@@ -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
View 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())

View File

@@ -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'),

View File

@@ -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