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
Original file line number Diff line number Diff line change
Expand Up @@ -155,13 +155,22 @@ def apply_png_options(logger, request_options: TSC.ImageRequestOptions, args):
request_options.image_resolution = None
else:
request_options.image_resolution = TSC.ImageRequestOptions.Resolution.High.lower()
if args.language:
request_options.language = args.language

@staticmethod
def apply_pdf_options(logger, request_options: TSC.PDFRequestOptions, args):
if args.pagelayout:
request_options.orientation = args.pagelayout
if args.pagesize:
request_options.page_type = args.pagesize
if args.language:
request_options.language = args.language

@staticmethod
def apply_csv_options(logger, request_options: TSC.CSVRequestOptions, args):
if args.language:
request_options.language = args.language

@staticmethod
def save_to_data_file(logger, output, filename):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ def download_csv(server_content_type, export_item, args, logger):
csv_options = TSC.CSVRequestOptions(maxage=1)
ExportCommand.apply_values_from_url_params(logger, csv_options, args.url)
ExportCommand.apply_filters_from_args(csv_options, args, logger)
DatasourcesAndWorkbooks.apply_csv_options(logger, csv_options, args)
logger.debug(csv_options.get_query_params())
server_content_type.populate_csv(export_item, csv_options)
return export_item.csv
Expand Down
34 changes: 16 additions & 18 deletions tabcmd/commands/datasources_and_workbooks/publish_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,15 @@ def run_command(args):
source = PublishCommand.get_filename_extension_if_tableau_type(logger, args.filename)
logger.info(_("publish.status").format(args.filename))
if source in ["twbx", "twb"]:
if args.thumbnail_group:
raise AttributeError("Generating thumbnails for a group is not yet implemented.")
if args.thumbnail_username and args.thumbnail_group:
raise AttributeError("Cannot specify both a user and group for thumbnails.")

new_workbook = TSC.WorkbookItem(project_id, name=args.name, show_tabs=args.tabbed)
if args.thumbnail_username:
new_workbook.thumbnails_user_id = args.thumbnail_username
elif args.thumbnail_group:
new_workbook.thumbnails_group_id = args.thumbnail_group

try:
new_workbook = server.workbooks.publish(
new_workbook,
Expand Down Expand Up @@ -114,24 +117,19 @@ def get_publish_mode(args, logger):
default_mode = TSC.Server.PublishMode.CreateNew
publish_mode = default_mode

if args.replace:
raise AttributeError("Replacing an extract is not yet implemented")

if args.append:
if publish_mode != default_mode:
publish_mode = None
else:
# only relevant for datasources, but tsc will throw an error for us if necessary
publish_mode = TSC.Server.PublishMode.Append
mode_mapping = {
"replace": TSC.Server.PublishMode.Replace,
"append": TSC.Server.PublishMode.Append,
"overwrite": TSC.Server.PublishMode.Overwrite,
}

if args.overwrite:
if publish_mode != default_mode:
publish_mode = None
else:
# Overwrites the workbook, data source, or data extract if it already exists on the server.
publish_mode = TSC.Server.PublishMode.Overwrite
selected_modes = [mode for mode, mode_value in mode_mapping.items() if getattr(args, mode, False)]

if not publish_mode:
if len(selected_modes) > 1:
Errors.exit_with_error(logger, "Invalid combination of publishing options (Append, Overwrite, Replace)")

if selected_modes:
publish_mode = mode_mapping[selected_modes[0]]

logger.debug("Publish mode selected: " + publish_mode)
return publish_mode
2 changes: 1 addition & 1 deletion tabcmd/execution/global_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ def set_publish_args(parser):
)
thumbnails.add_argument(
"--thumbnail-group",
help="[Not yet implemented] If the workbook contains user filters, the thumbnails will be generated based on what the "
help="If the workbook contains user filters, the thumbnails will be generated based on what the "
"specified group can see. Cannot be specified when --thumbnail-username option is set.",
)

Expand Down
41 changes: 41 additions & 0 deletions tests/commands/test_datasources_and_workbooks_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,30 @@ def test_apply_png_options(self):
mock_args.width = "800"
mock_args.height = "76"
mock_args.resolution = None
mock_args.language = None
request_options = tsc.ImageRequestOptions()
DatasourcesAndWorkbooks.apply_png_options(mock_logger, request_options, mock_args)
assert request_options.image_resolution == "high"
assert request_options.viz_width == 800
assert request_options.viz_height == 76

def test_apply_png_options_with_language(self):
mock_args.width = "800"
mock_args.height = "76"
mock_args.resolution = None
mock_args.language = "de"
request_options = tsc.ImageRequestOptions()
DatasourcesAndWorkbooks.apply_png_options(mock_logger, request_options, mock_args)
assert request_options.image_resolution == "high"
assert request_options.viz_width == 800
assert request_options.viz_height == 76
assert request_options.language == "de"

def test_apply_png_options_with_resolution_high(self):
mock_args.width = "800"
mock_args.height = "76"
mock_args.resolution = "high"
mock_args.language = None
request_options = tsc.ImageRequestOptions()
DatasourcesAndWorkbooks.apply_png_options(mock_logger, request_options, mock_args)
assert request_options.image_resolution == "high"
Expand All @@ -70,6 +84,7 @@ def test_apply_png_options_with_resolution_standard(self):
mock_args.width = "800"
mock_args.height = "76"
mock_args.resolution = "standard"
mock_args.language = None
request_options = tsc.ImageRequestOptions()
DatasourcesAndWorkbooks.apply_png_options(mock_logger, request_options, mock_args)
assert request_options.image_resolution is None
Expand All @@ -88,11 +103,25 @@ def test_apply_pdf_options(self):
expected_layout = tsc.PDFRequestOptions.Orientation.Portrait.__str__()
mock_args.pagelayout = expected_layout
mock_args.pagesize = expected_page
mock_args.language = None
request_options = tsc.PDFRequestOptions()
DatasourcesAndWorkbooks.apply_pdf_options(mock_logger, request_options, mock_args)
assert request_options.page_type == expected_page
assert request_options.orientation == expected_layout

def test_apply_pdf_options_with_language(self):
language = "de"
expected_page = tsc.PDFRequestOptions.PageType.Folio.__str__()
expected_layout = tsc.PDFRequestOptions.Orientation.Portrait.__str__()
mock_args.pagelayout = expected_layout
mock_args.pagesize = expected_page
mock_args.language = language
request_options = tsc.PDFRequestOptions()
DatasourcesAndWorkbooks.apply_pdf_options(mock_logger, request_options, mock_args)
assert request_options.page_type == expected_page
assert request_options.orientation == expected_layout
assert request_options.language == language

def test_apply_options_in_url_with_size(self):
request_options = tsc.ImageRequestOptions()
value = ":size=800,600"
Expand Down Expand Up @@ -126,6 +155,18 @@ def test_apply_options_in_url_with_unrecognized_parameter(self):
self.assertEqual(request_options.viz_width, None)
self.assertEqual(request_options.max_age, default_max_age)

def test_apply_csv_options(self):
mock_args.language = None
request_options = tsc.CSVRequestOptions()
DatasourcesAndWorkbooks.apply_csv_options(mock_logger, request_options, mock_args)
assert request_options.language == None

def test_apply_csv_options_with_language(self):
mock_args.language = "de"
request_options = tsc.CSVRequestOptions()
DatasourcesAndWorkbooks.apply_csv_options(mock_logger, request_options, mock_args)
assert request_options.language == "de"


@mock.patch("tableauserverclient.Server")
class MockedServerTests(unittest.TestCase):
Expand Down
1 change: 1 addition & 0 deletions tests/commands/test_geturl_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
mock_args.filename = None
mock_args.filter = None
mock_args.resolution = None
mock_args.language = None

mock_logger = mock.MagicMock()

Expand Down
45 changes: 43 additions & 2 deletions tests/commands/test_publish_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
from unittest.mock import *
import tableauserverclient as TSC

from tabcmd.commands.auth import login_command
from tabcmd.commands.datasources_and_workbooks import delete_command, export_command, get_url_command, publish_command
from tabcmd.commands.datasources_and_workbooks import publish_command


from typing import List, NamedTuple, TextIO, Union
Expand All @@ -31,6 +30,8 @@
getter.get = MagicMock("get", return_value=([fake_item], fake_item_pagination))
getter.publish = MagicMock("publish", return_value=fake_item)

mock_logger = MagicMock()


@patch("tableauserverclient.Server")
@patch("tabcmd.commands.auth.session.Session.create_session")
Expand Down Expand Up @@ -95,3 +96,43 @@ def test_publish_with_creds(self, mock_session, mock_server):
mock_server.projects = getter
publish_command.PublishCommand.run_command(mock_args)
mock_session.assert_called()

def test_default_publish_mode(self, mock_session, mock_server):
mock_args.replace = False
mock_args.append = False
mock_args.overwrite = False

publish_mode = publish_command.PublishCommand.get_publish_mode(mock_args, mock_logger)
self.assertEqual(publish_mode, TSC.Server.PublishMode.CreateNew)

def test_replace_publish_mode(self, mock_session, mock_server):
mock_args.replace = True
mock_args.append = False
mock_args.overwrite = False

publish_mode = publish_command.PublishCommand.get_publish_mode(mock_args, mock_logger)
self.assertEqual(publish_mode, TSC.Server.PublishMode.Replace)

def test_append_publish_mode(self, mock_session, mock_server):
mock_args.replace = False
mock_args.append = True
mock_args.overwrite = False

publish_mode = publish_command.PublishCommand.get_publish_mode(mock_args, mock_logger)
self.assertEqual(publish_mode, TSC.Server.PublishMode.Append)

def test_overwrite_publish_mode(self, mock_session, mock_server):
mock_args.replace = False
mock_args.append = False
mock_args.overwrite = True

publish_mode = publish_command.PublishCommand.get_publish_mode(mock_args, mock_logger)
self.assertEqual(publish_mode, TSC.Server.PublishMode.Overwrite)

def test_invalid_combination_of_modes(self, mock_session, mock_server):
mock_args.replace = True
mock_args.append = True
mock_args.overwrite = False

with self.assertRaises(SystemExit):
publish_command.PublishCommand.get_publish_mode(mock_args, mock_logger)
1 change: 1 addition & 0 deletions tests/commands/test_run_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ def test_export(self, mock_session, mock_server):
mock_args.height = None
mock_args.width = None
mock_args.filter = None
mock_args.language = None
export_command.ExportCommand.run_command(mock_args)
mock_session.assert_called()

Expand Down
Loading