Skip to content

Commit 38a6d0a

Browse files
committed
Merged pull request from @sdorazio which fixes the User.all
method to return all users and adds ``unsubscribed_from_emails`` attribute to ``User``. Removed change to ``User.all`` that added named parameters.
2 parents 58f5ed3 + 410deea commit 38a6d0a

File tree

4 files changed

+45
-45
lines changed

4 files changed

+45
-45
lines changed

intercom/intercom.py

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,24 @@ def _create_or_update_user(cls, method, **kwargs):
110110
return user_dict
111111

112112
@classmethod
113-
def get_users(cls, page=None, per_page=None, tag_id=None, tag_name=None):
114-
""" Return a dict for the user represented by the specified email
115-
or user_id.
113+
def get_users(cls, **kwargs):
114+
""" Returns a paginated list of all users in your application on Intercom.
115+
116+
**Arguments**
117+
118+
* ``page``: optional (defaults to 1)
119+
* ``per_page``: optional (defaults to 500, max value of 500)
120+
* ``tag_id``: optional — query for users that are tagged with a specific tag.
121+
* ``tag_name``: optional — query for users that are tagged with a specific tag.
122+
123+
**Response**
124+
125+
* ``users``: an array of User objects (same as returned by getting a single User)
126+
* ``total_count``: the total number of Users tracked in your Intercom application
127+
* ``page``: the current requested page
128+
* ``next_page``: the next page number, if any
129+
* ``previous_page``: the previous page number, if any
130+
* ``total_pages``: the total number of pages
116131
117132
>>> result = Intercom.get_users()
118133
>>> type(result)
@@ -121,27 +136,7 @@ def get_users(cls, page=None, per_page=None, tag_id=None, tag_name=None):
121136
3
122137
123138
"""
124-
125-
# collate parameters
126-
params = {}
127-
128-
if page:
129-
params['page'] = page
130-
131-
if per_page:
132-
# if per_page is outside bounds use default
133-
if per_page < 1 or per_page > 500:
134-
per_page = 500
135-
params['per_page'] = per_page
136-
137-
if tag_id:
138-
params['tag_id'] = tag_id
139-
140-
if tag_name:
141-
params['tag_name'] = tag_name
142-
143-
user_dict = Intercom._call('GET', Intercom.api_endpoint + 'users', params=params)
144-
return user_dict
139+
return Intercom._call('GET', Intercom.api_endpoint + 'users', params=kwargs)
145140

146141
@classmethod
147142
def get_user(cls, email=None, user_id=None):
@@ -186,7 +181,8 @@ def create_user(
186181
@classmethod
187182
def update_user(
188183
cls, user_id=None, email=None, name=None, created_at=None,
189-
custom_data=None, last_seen_ip=None, last_seen_user_agent=None):
184+
custom_data=None, last_seen_ip=None, last_seen_user_agent=None,
185+
unsubscribed_from_emails=None):
190186
""" Update a user with the available parameters.
191187
192188
>>> user = Intercom.get_user(user_id='123')
@@ -201,7 +197,8 @@ def update_user(
201197
'PUT', user_id=user_id, email=email, name=name,
202198
created_at=created_at, custom_data=custom_data,
203199
last_seen_ip=last_seen_ip,
204-
last_seen_user_agent=last_seen_user_agent)
200+
last_seen_user_agent=last_seen_user_agent,
201+
unsubscribed_from_emails=unsubscribed_from_emails)
205202

206203
@classmethod
207204
def delete_user(cls, user_id=None, email=None):

intercom/user.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class User(UserId):
4949

5050
attributes = (
5151
'user_id', 'email', 'name', 'created_at', 'custom_data',
52-
'last_seen_ip', 'last_seen_user_agent')
52+
'last_seen_ip', 'last_seen_user_agent', 'unsubscribed_from_emails')
5353

5454
@classmethod
5555
def find(cls, user_id=None, email=None):
@@ -131,7 +131,7 @@ def delete(cls, user_id=None, email=None):
131131
return cls(resp)
132132

133133
@classmethod
134-
def all(cls, page=None, per_page=None, tag_id=None, tag_name=None):
134+
def all(cls):
135135
""" Return all of the Users.
136136
137137
>>> users = User.all()
@@ -141,9 +141,15 @@ def all(cls, page=None, per_page=None, tag_id=None, tag_name=None):
141141
u'first.user@example.com'
142142
143143
"""
144-
resp = Intercom.get_users(
145-
page=page, per_page=per_page, tag_id=tag_id, tag_name=tag_name)
146-
return [cls(u) for u in resp['users']]
144+
page = 1
145+
total_pages = 1
146+
users = []
147+
while page <= total_pages:
148+
resp = Intercom.get_users(page=page)
149+
page += 1
150+
total_pages = resp.get('total_pages', 0)
151+
users.extend([cls(u) for u in resp['users']])
152+
return users
147153

148154
def save(self):
149155
""" Creates or updates a User.
@@ -158,7 +164,7 @@ def save(self):
158164
attrs = {}
159165
for key in User.attributes:
160166
value = dict.get(self, key)
161-
if value:
167+
if value is not None:
162168
attrs[key] = value
163169
resp = Intercom.update_user(**attrs)
164170
self.update(resp)
@@ -263,6 +269,16 @@ def location_data(self):
263269
dict.__setitem__(self, 'location_data', data)
264270
return data
265271

272+
@property
273+
def unsubscribed_from_emails(self):
274+
""" Returns whether or not the user has unsubscribed from emails """
275+
return dict.get(self, 'unsubscribed_from_emails', None)
276+
277+
@unsubscribed_from_emails.setter
278+
def unsubscribed_from_emails(self, unsubscribed_from_emails):
279+
""" Sets whether or not the user has unsubscribed from email """
280+
self['unsubscribed_from_emails'] = unsubscribed_from_emails
281+
266282
@property
267283
def custom_data(self):
268284
""" Returns a CustomData object for this User.

tests/unit/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ def _call(*args, **kwargs):
3333
reply[name] = value
3434
for name, value in params.items():
3535
reply[name] = value
36-
3736
response.content = json.dumps(reply)
3837
response.status_code = 200
3938
return response

tests/unit/test_user.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -172,18 +172,6 @@ def test_get_users_valid(self):
172172
self.assertEqual('foobloggs@example.com', users[1].email)
173173
self.assertEqual('barbloggs@example.com', users[2].email)
174174

175-
@patch('requests.request', local_response(users=[]))
176-
def test_get_users_params(self):
177-
resp = User.all()
178-
resp = User.all(page=20)
179-
resp = User.all(per_page=10)
180-
resp = User.all(tag_id=100)
181-
resp = User.all(tag_name="starter")
182-
try:
183-
resp = User.all(no_such_param="value")
184-
except TypeError:
185-
pass
186-
187175
def test_properties(self):
188176
user = User()
189177
user.email = 'xxx@example.com'

0 commit comments

Comments
 (0)