8000 feat: allow viz height and width parameters · LehmD/server-client-python@5611859 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5611859

Browse files
committed
feat: allow viz height and width parameters
1 parent 969922b commit 5611859

File tree

3 files changed

+67
-3
lines changed

3 files changed

+67
-3
lines changed

tableauserverclient/models/property_decorators.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
from collections.abc import Container
12
import datetime
23
import re
34
from functools import wraps
5+
from typing import Any, Optional
46

57
from tableauserverclient.datetime_helpers import parse_datetime
68

@@ -65,7 +67,7 @@ def wrapper(self, value):
6567
return wrapper
6668

6769

68-
def property_is_int(range, allowed=None):
70+
def property_is_int(range: tuple[int, int], allowed: Optional[Container[Any]] = None):
6971
"""Takes a range of ints and a list of exemptions to check against
7072
when setting a property on a model. The range is a tuple of (min, max) and the
7173
allowed list (empty by default) allows values outside that range.
@@ -89,8 +91,10 @@ def wrapper(self, value):
8991
raise ValueError(error)
9092

9193
min, max = range
94+
if value in allowed:
95+
return func(self, value)
9296

93-
if (value < min or value > max) and (value not in allowed):
97+
if value < min or value > max:
9498
raise ValueError(error)
9599

96100
return func(self, value)

tableauserverclient/server/request_options.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import sys
2+
13
from tableauserverclient.models.property_decorators import property_is_int
24
import logging
35

@@ -261,11 +263,13 @@ class Orientation:
261263
Portrait = "portrait"
262264
Landscape = "landscape"
263265

264-
def __init__(self, page_type=None, orientation=None, maxage=-1):
266+
def __init__(self, page_type=None, orientation=None, maxage=-1, viz_height=None, viz_width=None):
265267
super(PDFRequestOptions, self).__init__()
266268
self.page_type = page_type
267269
self.orientation = orientation
268270
self.max_age = maxage
271+
self.viz_height = viz_height
272+
self.viz_width = viz_width
269273

270274
@property
271275
def max_age(self):
@@ -276,6 +280,24 @@ def max_age(self):
276280
def max_age(self, value):
277281
self._max_age = value
278282

283+
@property
284+
def viz_height(self):
285+
return self._viz_height
286+
287+
@viz_height.setter
288+
@property_is_int(range=(0, sys.maxsize), allowed=(None,))
289+
def viz_height(self, value):
290+
self._viz_height = value
291+
292+
@property
293+
def viz_width(self):
294+
return self._viz_width
295+
296+
@viz_width.setter
297+
@property_is_int(range=(0, sys.maxsize), allowed=(None,))
298+
def viz_width(self, value):
299+
self._viz_width = value
300+
279301
def get_query_params(self):
280302
params = {}
281303
if self.page_type:
@@ -287,6 +309,15 @@ def get_query_params(self):
287309
if self.max_age != -1:
288310
params["maxAge"] = self.max_age
289311

312+
if (self.viz_height is None) ^ (self.viz_width is None):
313+
raise ValueError("viz_height and viz_width must be specified together")
314+
315+
if self.viz_height is not None:
316+
params["vizHeight"] = self.viz_height
317+
318+
if self.viz_width is not None:
319+
params["vizWidth"] = self.viz_width
320+
290321
self._append_view_filters(params)
291322

292323
return params

test/test_view.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,3 +315,32 @@ def test_filter_excel(self) -> None:
315315

316316
excel_file = b"".join(single_view.excel)
317317
self.assertEqual(response, excel_file)
318+
319+
def test_pdf_height(self) -> None:
320+
self.server.version = "3.8"
321+
self.baseurl = self.server.views.baseurl
322+
with open(POPULATE_PDF, "rb") as f:
323+
response = f.read()
324+
with requests_mock.mock() as m:
325+
m.get(
326+
self.baseurl + "/d79634e1-6063-4ec9-95ff-50acbf609ff5/pdf?vizHeight=1080&vizWidth=1920",
327+
content=response,
328+
)
329+
single_view = TSC.ViewItem()
330+
single_view._id = "d79634e1-6063-4ec9-95ff-50acbf609ff5"
331+
332+
req_option = TSC.PDFRequestOptions(
333+
viz_height=1080,
334+
viz_width=1920,
335+
)
336+
337+
self.server.views.populate_pdf(single_view, req_option)
338+
self.assertEqual(response, single_view.pdf)
339+
340+
def test_pdf_errors(self) -> None:
341+
req_option = TSC.PDFRequestOptions(viz_height=1080)
342+
with self.assertRaises(ValueError):
343+
req_option.get_query_params()
344+
req_option = TSC.PDFRequestOptions(viz_width=1920)
345+
with self.assertRaises(ValueError):
346+
req_option.get_query_params()

0 commit comments

Comments
 (0)
0