Skip to content

Commit c36945d

Browse files
committed
Merge pull request #99 from Jeff-Meadows/client_users
Add limit, offset, and filter_term to client.users()
2 parents f365c17 + d2a8e30 commit c36945d

File tree

4 files changed

+88
-16
lines changed

4 files changed

+88
-16
lines changed

HISTORY.rst

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,17 @@ Release History
66
Upcoming
77
++++++++
88

9-
1.3.2
9+
1.3.3 (2015-12-22)
10+
++++++++++++++++++
11+
12+
- Added a new class, ``DeveloperTokenClient`` that makes it easy to get started using the SDK with a Box developer
13+
token. It uses another new class, ``DeveloperTokenAuth`` for auth.
14+
15+
**Bugfixes**
16+
17+
- Added limit, offset, and filter_term parameters to ``client.users()`` to match up with the Box API.
18+
19+
1.3.2 (2015-11-16)
1020
++++++++++++++++++
1121

1222
- Fix ``boxsdk.util.log.setup_logging()`` on Python 3.

boxsdk/client.py

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -100,21 +100,48 @@ def group(self, group_id):
100100
"""
101101
return Group(session=self._session, object_id=group_id)
102102

103-
def users(self):
103+
def users(self, limit=None, offset=0, filter_term=None):
104104
"""
105105
Get a list of all users for the Enterprise along with their user_id, public_name, and login.
106106
107+
:param limit:
108+
The maximum number of users to return. If not specified, the Box API will determine an appropriate limit.
109+
:type limit:
110+
`int` or None
111+
:param offset:
112+
The user index at which to start the response.
113+
:type offset:
114+
`int`
115+
:param filter_term:
116+
Filters the results to only users starting with the filter_term in either the name or the login.
117+
:type filter_term:
118+
`unicode` or None
107119
:return:
108120
The list of all users in the enterprise.
109121
:rtype:
110122
`list` of :class:`User`
111123
"""
112124
url = '{0}/users'.format(API.BASE_API_URL)
113-
box_response = self._session.get(url)
125+
params = dict(offset=offset)
126+
if limit is not None:
127+
params['limit'] = limit
128+
if filter_term is not None:
129+
params['filter_term'] = filter_term
130+
box_response = self._session.get(url, params=params)
114131
response = box_response.json()
115132
return [User(self._session, item['id'], item) for item in response['entries']]
116133

117-
def search(self, query, limit, offset, ancestor_folders=None, file_extensions=None, metadata_filters=None, result_type=None, content_types=None):
134+
def search(
135+
self,
136+
query,
137+
limit,
138+
offset,
139+
ancestor_folders=None,
140+
file_extensions=None,
141+
metadata_filters=None,
142+
result_type=None,
143+
content_types=None
144+
):
118145
"""
119146
Search Box for items matching the given query.
120147
@@ -155,14 +182,16 @@ def search(self, query, limit, offset, ancestor_folders=None, file_extensions=No
155182
:rtype:
156183
`list` of :class:`Item`
157184
"""
158-
return Search(self._session).search(query=query,
159-
limit=limit,
160-
offset=offset,
161-
ancestor_folders=ancestor_folders,
162-
file_extensions=file_extensions,
163-
metadata_filters=metadata_filters,
164-
result_type=result_type,
165-
content_types=content_types)
185+
return Search(self._session).search(
186+
query=query,
187+
limit=limit,
188+
offset=offset,
189+
ancestor_folders=ancestor_folders,
190+
file_extensions=file_extensions,
191+
metadata_filters=metadata_filters,
192+
result_type=result_type,
193+
content_types=content_types,
194+
)
166195

167196
def events(self):
168197
"""
@@ -333,5 +362,8 @@ def with_shared_link(self, shared_link, shared_link_password):
333362

334363

335364
class DeveloperTokenClient(Client):
365+
"""
366+
Box client subclass which authorizes with a developer token.
367+
"""
336368
def __init__(self, oauth=None, network_layer=None, session=None):
337369
super(DeveloperTokenClient, self).__init__(oauth or DeveloperTokenAuth(), network_layer, session)

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,15 @@ def main():
6161
install_requires.append('ordereddict>=1.1')
6262
setup(
6363
name='boxsdk',
64-
version='1.3.2',
64+
version='1.3.3',
6565
description='Official Box Python SDK',
6666
long_description=open(join(base_dir, 'README.rst')).read(),
6767
author='Box',
6868
author_email='[email protected]',
6969
url='http://opensource.box.com',
7070
packages=find_packages(exclude=['demo', 'docs', 'test']),
7171
install_requires=install_requires,
72-
extras_require={'jwt': jwt_requires, 'redis': redis_requires},
72+
extras_require={'jwt': jwt_requires, 'redis': redis_requires, 'all': jwt_requires + redis_requires},
7373
tests_require=['pytest', 'pytest-xdist', 'mock', 'sqlalchemy', 'bottle', 'jsonpatch'],
7474
cmdclass={'test': PyTest},
7575
classifiers=CLASSIFIERS,

test/unit/test_client.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,40 @@ def test_factory_returns_the_correct_object(mock_client, test_class, factory_met
159159
assert obj.object_id == fake_id
160160

161161

162-
def test_users_return_the_correct_user_objects(mock_client, mock_box_session, users_response, user_id_1, user_id_2):
162+
@pytest.fixture(scope='module', params=(None, 'user1'))
163+
def users_filter_term(request):
164+
return request.param
165+
166+
167+
@pytest.fixture(scope='module', params=(0, 10))
168+
def users_offset(request):
169+
return request.param
170+
171+
172+
@pytest.fixture(scope='module', params=(0, 10))
173+
def users_limit(request):
174+
return request.param
175+
176+
177+
def test_users_return_the_correct_user_objects(
178+
mock_client,
179+
mock_box_session,
180+
users_response,
181+
user_id_1,
182+
user_id_2,
183+
users_filter_term,
184+
users_offset,
185+
users_limit,
186+
):
163187
# pylint:disable=redefined-outer-name
164188
mock_box_session.get.return_value = users_response
165-
users = mock_client.users()
189+
users = mock_client.users(users_limit, users_offset, users_filter_term)
190+
expected_params = {'offset': users_offset}
191+
if users_limit is not None:
192+
expected_params['limit'] = users_limit
193+
if users_filter_term is not None:
194+
expected_params['filter_term'] = users_filter_term
195+
mock_box_session.get.assert_called_once_with('{0}/users'.format(API.BASE_API_URL), params=expected_params)
166196
assert users[0].object_id == user_id_1
167197
assert users[1].object_id == user_id_2
168198

0 commit comments

Comments
 (0)