Skip to content

Commit 571843d

Browse files
authored
[TOOLSLIBS-441] Subscription lists (#182)
* wires up SubscriptionList * adds SubscriptionList and url * wires up new audience types * adds subscription_list and static_list audience * adds subscription_list tests
1 parent 538cbfe commit 571843d

File tree

7 files changed

+121
-0
lines changed

7 files changed

+121
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import datetime
2+
import mock
3+
import unittest
4+
import json
5+
6+
import requests
7+
8+
import urbanairship as ua
9+
from tests import TEST_KEY, TEST_SECRET
10+
from urbanairship.push import audience
11+
12+
13+
class TestSubscriptionList(unittest.TestCase):
14+
def setUp(self):
15+
self.airship = ua.Airship(TEST_KEY, TEST_SECRET)
16+
self.ios_channel = ua.ios_channel("b8f9b663-0a3b-cf45-587a-be880946e881")
17+
18+
def test_list_subscribe(self):
19+
with mock.patch.object(ua.Airship, "_request") as mock_request:
20+
response = requests.Response()
21+
response._content = json.dumps({"ok": True}).encode("utf-8")
22+
mock_request.return_value = response
23+
24+
sub_list = ua.SubscriptionList(airship=self.airship, list_id="test_list")
25+
26+
results = sub_list.subscribe(audience=self.ios_channel)
27+
28+
self.assertEqual(results.json(), {"ok": True})
29+
30+
def test_list_unsubscribe(self):
31+
with mock.patch.object(ua.Airship, "_request") as mock_request:
32+
response = requests.Response()
33+
response._content = json.dumps({"ok": True}).encode("utf-8")
34+
mock_request.return_value = response
35+
36+
sub_list = ua.SubscriptionList(airship=self.airship, list_id="test_list")
37+
38+
results = sub_list.unsubscribe(audience=self.ios_channel)
39+
40+
self.assertEqual(results.json(), {"ok": True})

urbanairship/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
Sms,
3131
StaticList,
3232
StaticLists,
33+
SubscriptionList,
3334
)
3435
from .experiments import ABTest, Experiment, Variant
3536
from .push import (
@@ -78,6 +79,8 @@
7879
recent_date,
7980
recurring_schedule,
8081
schedule_exclusion,
82+
static_list,
83+
subscription_list,
8184
scheduled_time,
8285
segment,
8386
sms,
@@ -160,6 +163,10 @@
160163
best_time,
161164
named_user,
162165
merge_data,
166+
recurring_schedule,
167+
schedule_exclusion,
168+
static_list,
169+
subscription_list,
163170
ChannelList,
164171
ChannelInfo,
165172
OpenChannel,
@@ -206,6 +213,7 @@
206213
WebResponseReport,
207214
ExperimentReport,
208215
KeywordInteraction,
216+
SubscriptionList,
209217
]
210218

211219

urbanairship/core.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def __init__(self, location=None):
3535
self.location_url = self.base_url + "location/"
3636
self.attributes_url = self.channel_url + "attributes/"
3737
self.message_center_delete_url = self.base_url + "user/messages/"
38+
self.subscription_lists_url = self.channel_url + "subscription_lists/"
3839

3940
self.templates_url = self.base_url + "templates/"
4041
self.schedule_template_url = self.templates_url + "schedules/"

urbanairship/devices/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99
from .segment import Segment, SegmentList
1010
from .sms import Sms, KeywordInteraction
1111
from .static_lists import StaticList, StaticLists
12+
from .subscription_lists import SubscriptionList
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import json
2+
3+
4+
class SubscriptionList(object):
5+
"""
6+
Subscribe or unsubscribe channels to/from Subscription lists. These lists must
7+
be created in the Airship web dashboard prior to making these calls. The
8+
value for list_id can be found after creating these lists.
9+
10+
:param airship: Required. An urbanairship.Airship instance.
11+
:param list_id: Required. The list_id from the Airship web dashboard.
12+
"""
13+
14+
def __init__(self, airship, list_id):
15+
self.airship = airship
16+
self.list_id = list_id
17+
18+
def unsubscribe(self, audience):
19+
"""
20+
Unsubscribe an audience from a subscription list.
21+
22+
:param audience: Required. A single audience selector (ex:
23+
urbanairship.ios_channel) to unsubscribe.
24+
"""
25+
payload = {
26+
"subscription_lists": {"action": "unsubscribe", "list_id": self.list_id},
27+
"audience": audience,
28+
}
29+
30+
response = self.airship.request(
31+
method="POST",
32+
body=json.dumps(payload).encode("utf-8"),
33+
url=self.airship.urls.get("subscription_lists_url"),
34+
version=3,
35+
)
36+
37+
return response
38+
39+
def subscribe(self, audience):
40+
"""
41+
Subscribe an audience from a subscription list.
42+
43+
:param list_id: Required. The list_id from the Airship web dashboard.
44+
:param audience: Required. A single audience selector (ex:
45+
urbanairship.ios_channel) to subscribe.
46+
"""
47+
payload = {
48+
"subscription_lists": {"action": "subscribe", "list_id": self.list_id},
49+
"audience": audience,
50+
}
51+
52+
response = self.airship.request(
53+
method="POST",
54+
body=json.dumps(payload).encode("utf-8"),
55+
url=self.airship.urls.get("subscription_lists_url"),
56+
version=3,
57+
)
58+
59+
return response

urbanairship/push/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
segment,
2020
sms_id,
2121
sms_sender,
22+
subscription_list,
23+
static_list,
2224
tag,
2325
tag_group,
2426
text_attribute,
@@ -123,4 +125,6 @@
123125
merge_data,
124126
text_attribute,
125127
number_attribute,
128+
static_list,
129+
subscription_list,
126130
]

urbanairship/push/audience.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ def named_user(name):
117117
return {"named_user": name}
118118

119119

120+
def subscription_list(list_id):
121+
return {"subscription_lists": list_id}
122+
123+
124+
def static_list(list_id):
125+
return {"static_list": list_id}
126+
127+
120128
# Attribute selectors
121129
def date_attribute(attribute, operator, precision=None, value=None):
122130
"""

0 commit comments

Comments
 (0)