diff --git a/tableauserverclient/server/endpoint/views_endpoint.py b/tableauserverclient/server/endpoint/views_endpoint.py index 19a30849a..c2779b17d 100644 --- a/tableauserverclient/server/endpoint/views_endpoint.py +++ b/tableauserverclient/server/endpoint/views_endpoint.py @@ -204,7 +204,8 @@ def populate_pdf(self, view_item: ViewItem, req_options: "PDFRequestOptions | No req_options: PDFRequestOptions | None, default None Optional request options for the request. These options can include - parameters such as orientation and paper size. + parameters such as orientation, paper size, and viz dimensions + (viz_width and viz_height). Returns ------- diff --git a/tableauserverclient/server/endpoint/workbooks_endpoint.py b/tableauserverclient/server/endpoint/workbooks_endpoint.py index ce605806f..665b50b5d 100644 --- a/tableauserverclient/server/endpoint/workbooks_endpoint.py +++ b/tableauserverclient/server/endpoint/workbooks_endpoint.py @@ -604,12 +604,10 @@ def populate_pdf(self, workbook_item: WorkbookItem, req_options: "PDFRequestOpti def pdf_fetcher() -> bytes: return self._get_wb_pdf(workbook_item, req_options) - if not self.parent_srv.check_at_least_version("3.23") and req_options is not None: - if req_options.view_filters or req_options.view_parameters: - raise UnsupportedAttributeError("view_filters and view_parameters are only supported in 3.23+") - - if req_options.viz_height or req_options.viz_width: - raise UnsupportedAttributeError("viz_height and viz_width are only supported in 3.23+") + if req_options is not None: + if not self.parent_srv.check_at_least_version("3.23"): + if req_options.view_filters or req_options.view_parameters: + raise UnsupportedAttributeError("view_filters and view_parameters are only supported in 3.23+") workbook_item._set_pdf(pdf_fetcher) logger.info(f"Populated pdf for workbook (ID: {workbook_item.id})") diff --git a/test/test_request_option.py b/test/test_request_option.py index 2c5354b2a..3709e18d3 100644 --- a/test/test_request_option.py +++ b/test/test_request_option.py @@ -380,9 +380,6 @@ def test_queryset_endpoint_pagesize_filter(server: TSC.Server, page_size: int) - _ = list(queryset) -44 - - @pytest.mark.parametrize("page_size", [1, 10, 100, 1_000]) def test_queryset_pagesize_filter(server: TSC.Server, page_size: int) -> None: with requests_mock.mock() as m: @@ -441,3 +438,41 @@ def test_queryset_field_all(server: TSC.Server) -> None: fields = history.qs.get("fields", [""])[0] assert fields == "_all_" + + +def test_pdf_viz_dimensions_query_params() -> None: + opts = TSC.PDFRequestOptions(viz_width=1920, viz_height=1080) + params = opts.get_query_params() + assert params["vizWidth"] == 1920 + assert params["vizHeight"] == 1080 + + +def test_pdf_viz_dimensions_only_one_raises() -> None: + opts = TSC.PDFRequestOptions(viz_width=1920) + with pytest.raises(ValueError): + opts.get_query_params() + + opts2 = TSC.PDFRequestOptions(viz_height=1080) + with pytest.raises(ValueError): + opts2.get_query_params() + + +def test_pdf_viz_dimensions_none_by_default() -> None: + opts = TSC.PDFRequestOptions() + params = opts.get_query_params() + assert "vizWidth" not in params + assert "vizHeight" not in params + + +def test_pdf_viz_dimensions_via_request(server: TSC.Server) -> None: + with requests_mock.mock() as m: + m.get(requests_mock.ANY) + url = server.views.baseurl + "/abc/pdf" + opts = TSC.PDFRequestOptions(viz_width=800, viz_height=600) + + resp = server.views.get_request(url, request_object=opts) + query_string = parse_qs(resp.request.query) + assert "vizwidth" in query_string + assert ["800"] == query_string["vizwidth"] + assert "vizheight" in query_string + assert ["600"] == query_string["vizheight"] diff --git a/test/test_view.py b/test/test_view.py index a940e1d18..f4d5b7e1f 100644 --- a/test/test_view.py +++ b/test/test_view.py @@ -427,8 +427,7 @@ def test_filter_excel(server: TSC.Server) -> None: assert response == excel_file -def test_pdf_height(server: TSC.Server) -> None: - server.version = "3.8" +def test_pdf_viz_dimensions(server: TSC.Server) -> None: response = POPULATE_PDF.read_bytes() with requests_mock.mock() as m: m.get( diff --git a/test/test_workbook.py b/test/test_workbook.py index c5c4f6662..ca9628738 100644 --- a/test/test_workbook.py +++ b/test/test_workbook.py @@ -507,7 +507,6 @@ def test_populate_pdf_unsupported(server: TSC.Server) -> None: def test_populate_pdf_vf_dims(server: TSC.Server) -> None: server.version = "3.23" - server.workbooks.baseurl response = POPULATE_PDF.read_bytes() with requests_mock.mock() as m: m.get(