Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion tableauserverclient/models/property_decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ def property_is_int(range, allowed=None):
def property_type_decorator(func):
@wraps(func)
def wrapper(self, value):
error = "Invalid priority defined: {}.".format(value)
error = "Invalid property defined: '{}'. Integer value expected.".format(value)

if range is None:
if isinstance(value, int):
Expand Down
45 changes: 43 additions & 2 deletions tableauserverclient/server/request_options.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from ..models.property_decorators import property_is_int


class RequestOptionsBase(object):
def apply_query_params(self, url):
raise NotImplementedError()
Expand Down Expand Up @@ -100,8 +103,24 @@ def _append_view_filters(self, params):


class CSVRequestOptions(_FilterOptionsBase):
def __init__(self, maxage=None):
super(CSVRequestOptions, self).__init__()
self.max_age = maxage

@property
def max_age(self):
return self._max_age

@max_age.setter
@property_is_int(range=(0, 240))
def max_age(self, value):
self._max_age = value

def apply_query_params(self, url):
params = []
if self.max_age != 0:
params.append('maxAge={0}'.format(self.max_age))

self._append_view_filters(params)
return "{0}?{1}".format(url, '&'.join(params))

Expand All @@ -116,11 +135,20 @@ def __init__(self, imageresolution=None, maxage=None):
self.image_resolution = imageresolution
self.max_age = maxage

@property
def max_age(self):
return self._max_age

@max_age.setter
@property_is_int(range=(0, 240))
def max_age(self, value):
self._max_age = value

def apply_query_params(self, url):
params = []
if self.image_resolution:
params.append('resolution={0}'.format(self.image_resolution))
if self.max_age:
if self.max_age != 0:
params.append('maxAge={0}'.format(self.max_age))

self._append_view_filters(params)
Expand Down Expand Up @@ -148,10 +176,20 @@ class Orientation:
Portrait = "portrait"
Landscape = "landscape"

def __init__(self, page_type=None, orientation=None):
def __init__(self, page_type=None, orientation=None, maxage=0):
super(PDFRequestOptions, self).__init__()
self.page_type = page_type
self.orientation = orientation
self.max_age = maxage

@property
def max_age(self):
return self._max_age

@max_age.setter
@property_is_int(range=(0, 240))
def max_age(self, value):
self._max_age = value

def apply_query_params(self, url):
params = []
Expand All @@ -161,6 +199,9 @@ def apply_query_params(self, url):
if self.orientation:
params.append('orientation={0}'.format(self.orientation))

if self.max_age != 0:
params.append('maxAge={0}'.format(self.max_age))

self._append_view_filters(params)

return "{0}?{1}".format(url, '&'.join(params))
16 changes: 9 additions & 7 deletions test/test_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,29 +129,30 @@ def test_populate_image(self):
self.server.views.populate_image(single_view)
self.assertEqual(response, single_view.image)

def test_populate_image_high_resolution(self):
def test_populate_image_with_options(self):
with open(POPULATE_PREVIEW_IMAGE, 'rb') as f:
response = f.read()
with requests_mock.mock() as m:
m.get(self.baseurl + '/d79634e1-6063-4ec9-95ff-50acbf609ff5/image?resolution=high', content=response)
m.get(self.baseurl + '/d79634e1-6063-4ec9-95ff-50acbf609ff5/image?resolution=high&maxAge=10',
content=response)
single_view = TSC.ViewItem()
single_view._id = 'd79634e1-6063-4ec9-95ff-50acbf609ff5'
req_option = TSC.ImageRequestOptions(imageresolution=TSC.ImageRequestOptions.Resolution.High)
req_option = TSC.ImageRequestOptions(imageresolution=TSC.ImageRequestOptions.Resolution.High, maxage=10)
self.server.views.populate_image(single_view, req_option)
self.assertEqual(response, single_view.image)

def test_populate_pdf(self):
with open(POPULATE_PDF, 'rb') as f:
response = f.read()
with requests_mock.mock() as m:
m.get(self.baseurl + '/d79634e1-6063-4ec9-95ff-50acbf609ff5/pdf?type=letter&orientation=portrait',
m.get(self.baseurl + '/d79634e1-6063-4ec9-95ff-50acbf609ff5/pdf?type=letter&orientation=portrait&maxAge=5',
content=response)
single_view = TSC.ViewItem()
single_view._id = 'd79634e1-6063-4ec9-95ff-50acbf609ff5'

size = TSC.PDFRequestOptions.PageType.Letter
orientation = TSC.PDFRequestOptions.Orientation.Portrait
req_option = TSC.PDFRequestOptions(size, orientation)
req_option = TSC.PDFRequestOptions(size, orientation, 5)

self.server.views.populate_pdf(single_view, req_option)
self.assertEqual(response, single_view.pdf)
Expand All @@ -160,10 +161,11 @@ def test_populate_csv(self):
with open(POPULATE_CSV, 'rb') as f:
response = f.read()
with requests_mock.mock() as m:
m.get(self.baseurl + '/d79634e1-6063-4ec9-95ff-50acbf609ff5/data', content=response)
m.get(self.baseurl + '/d79634e1-6063-4ec9-95ff-50acbf609ff5/data?maxAge=1', content=response)
single_view = TSC.ViewItem()
single_view._id = 'd79634e1-6063-4ec9-95ff-50acbf609ff5'
self.server.views.populate_csv(single_view)
request_option = TSC.CSVRequestOptions(maxage=1)
self.server.views.populate_csv(single_view, request_option)

csv_file = b"".join(single_view.csv)
self.assertEqual(response, csv_file)
Expand Down