Skip to content

Commit 50d94bb

Browse files
committed
V2
1 parent d169d9e commit 50d94bb

File tree

4 files changed

+25
-47
lines changed

4 files changed

+25
-47
lines changed

tableauserverclient/server/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@
88
from .endpoint import Auth, Datasources, Endpoint, Groups, Projects, Schedules, \
99
Sites, Users, Views, Workbooks, ServerResponseError, MissingRequiredFieldError
1010
from .server import Server
11-
from .pager import Pager, InternalPager
11+
from .pager import Pager
1212
from .exceptions import NotSignedInError

tableauserverclient/server/endpoint/groups_endpoint.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ def get(self, req_options=None):
2525
# Gets all users in a given group
2626
@api(version="2.0")
2727
def populate_users(self, group_item, req_options=None):
28-
from .. import InternalPager
28+
from .. import Pager
2929
if not group_item.id:
3030
error = "Group item missing ID. Group must be retrieved from server first."
3131
raise MissingRequiredFieldError(error)
3232

33-
all_users = InternalPager(self._get_users_for_group, group_item, request_opts=req_options)
34-
35-
group_item._set_users(list(all_users))
33+
# TODO should this be a list or a Pager directly?
34+
all_users = list(Pager(lambda options: self._get_users_for_group(group_item, options), req_options))
35+
group_item._set_users(all_users)
3636

3737
def _get_users_for_group(self, group_item, req_options=None):
3838
url = "{0}/{1}/users".format(self.baseurl, group_item.id)

tableauserverclient/server/pager.py

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,15 @@ class Pager(object):
88
"""
99

1010
def __init__(self, endpoint, request_opts=None):
11-
self._endpoint = endpoint.get
11+
if hasattr(endpoint, 'get'):
12+
# The simpliest case is to take an Endpoint and call its get
13+
self._endpoint = endpoint.get
14+
else:
15+
# but if they pass a callable then use that instead (used internally)
16+
self._endpoint = endpoint
17+
1218
self._options = request_opts
19+
self._length = None
1320

1421
# If we have options we could be starting on any page, backfill the count
1522
if self._options:
@@ -20,6 +27,7 @@ def __init__(self, endpoint, request_opts=None):
2027
def __iter__(self):
2128
# Fetch the first page
2229
current_item_list, last_pagination_item = self._endpoint(self._options)
30+
self._length = int(last_pagination_item.total_available)
2331

2432
# Get the rest on demand as a generator
2533
while self._count < last_pagination_item.total_available:
@@ -34,48 +42,18 @@ def __iter__(self):
3442
# The total count on Server changed while fetching exit gracefully
3543
raise StopIteration
3644

37-
def _load_next_page(self, last_pagination_item):
38-
next_page = last_pagination_item.page_number + 1
39-
opts = RequestOptions(pagenumber=next_page, pagesize=last_pagination_item.page_size)
40-
if self._options is not None:
41-
opts.sort, opts.filter = self._options.sort, self._options.filter
42-
current_item_list, last_pagination_item = self._endpoint(opts)
43-
return current_item_list, last_pagination_item
44-
45-
class InternalPager(object):
46-
47-
def __init__(self, caller, *args, request_opts=None, **kwargs):
48-
self._endpoint = caller
49-
self._options = request_opts
50-
self._funcargs = args
51-
self._kwargs = kwargs
52-
# If we have options we could be starting on any page, backfill the count
53-
if self._options:
54-
self._count = ((self._options.pagenumber - 1) * self._options.pagesize)
55-
else:
56-
self._count = 0
57-
58-
def __iter__(self):
59-
# Fetch the first page
60-
current_item_list, last_pagination_item = self._endpoint(*self._funcargs, **self._kwargs, req_options=self._options)
61-
62-
# Get the rest on demand as a generator
63-
while self._count < last_pagination_item.total_available:
64-
if len(current_item_list) == 0:
65-
current_item_list, last_pagination_item = self._load_next_page(last_pagination_item)
66-
67-
try:
68-
yield current_item_list.pop(0)
69-
self._count += 1
70-
71-
except IndexError:
72-
# The total count on Server changed while fetching exit gracefully
73-
raise StopIteration
45+
def __len__(self):
46+
if not self._length:
47+
# We have no length yet, so get the first page and then we'll know total size
48+
# TODO This isn't needed if we convert to list
49+
next(self.__iter__())
50+
return self._length
51+
return self._length
7452

7553
def _load_next_page(self, last_pagination_item):
7654
next_page = last_pagination_item.page_number + 1
7755
opts = RequestOptions(pagenumber=next_page, pagesize=last_pagination_item.page_size)
7856
if self._options is not None:
7957
opts.sort, opts.filter = self._options.sort, self._options.filter
80-
current_item_list, last_pagination_item = self._endpoint(*self._funcargs, **self._kwargs, req_options=opts)
58+
current_item_list, last_pagination_item = self._endpoint(opts)
8159
return current_item_list, last_pagination_item

test/test_group.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ def test_populate_users(self):
5555
m.get(self.baseurl + '/e7833b48-c6f7-47b5-a2a7-36e7dd232758/users', text=response_xml)
5656
single_group = TSC.GroupItem(name='Test Group')
5757
single_group._id = 'e7833b48-c6f7-47b5-a2a7-36e7dd232758'
58-
pagination_item = self.server.groups.populate_users(single_group)
58+
self.server.groups.populate_users(single_group)
59+
user = list(single_group.users).pop()
5960

60-
self.assertEqual(1, pagination_item.total_available)
61-
user = single_group.users.pop()
61+
self.assertEqual(1, len(single_group.users))
6262
self.assertEqual('dd2239f6-ddf1-4107-981a-4cf94e415794', user.id)
6363
self.assertEqual('alice', user.name)
6464
self.assertEqual('Publisher', user.site_role)

0 commit comments

Comments
 (0)