diff --git a/tableauserverclient/models/property_decorators.py b/tableauserverclient/models/property_decorators.py index 2a47c889a..f1625d112 100644 --- a/tableauserverclient/models/property_decorators.py +++ b/tableauserverclient/models/property_decorators.py @@ -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): diff --git a/tableauserverclient/server/request_options.py b/tableauserverclient/server/request_options.py index 4dad4c1ea..549b41a28 100644 --- a/tableauserverclient/server/request_options.py +++ b/tableauserverclient/server/request_options.py @@ -1,3 +1,6 @@ +from ..models.property_decorators import property_is_int + + class RequestOptionsBase(object): def apply_query_params(self, url): raise NotImplementedError() @@ -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)) @@ -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) @@ -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 = [] @@ -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)) diff --git a/test/test_view.py b/test/test_view.py index 350be83fd..576bc0fca 100644 --- a/test/test_view.py +++ b/test/test_view.py @@ -129,14 +129,15 @@ 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) @@ -144,14 +145,14 @@ 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) @@ -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)