From d9abdae6a352e2bf5018ea7964d60a6c16b20983 Mon Sep 17 00:00:00 2001 From: bzhang Date: Fri, 15 Feb 2019 10:39:29 -0800 Subject: [PATCH 1/3] fixed the bug that materialize_workbooks.py cannot handle empty lines in workbook list, and not user get notified when workbook name/path is not valid --- samples/materialize_workbooks.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/samples/materialize_workbooks.py b/samples/materialize_workbooks.py index a349a6c99..71a269fb4 100644 --- a/samples/materialize_workbooks.py +++ b/samples/materialize_workbooks.py @@ -189,7 +189,8 @@ def find_project_ids_to_update(all_projects, project, server): def parse_workbook_path(file_path): # parse the list of project path of workbooks - workbook_paths = open(file_path, 'r') + workbook_paths = sanitize_workbook_list(file_path, "path") + workbook_path_mapping = defaultdict(list) for workbook_path in workbook_paths: workbook_project = workbook_path.rstrip().split('/') @@ -223,23 +224,30 @@ def update_workbooks_by_paths(all_projects, materialized_views_config, server, w TSC.RequestOptions.Operator.Equals, workbook_name)) workbooks = list(TSC.Pager(server.workbooks, req_option)) + all_paths = set(workbook_paths[:]) for workbook in workbooks: path = find_project_path(all_projects[workbook.project_id], all_projects, "") if path in workbook_paths: + all_paths.remove(path) workbook.materialized_views_config = materialized_views_config server.workbooks.update(workbook) print("Updated materialized views settings for workbook: {}".format(path + '/' + workbook.name)) + + for path in all_paths: + print("Cannot find workbook path: {}").format(path + '/' + workbook_name) print('\n') def update_workbooks_by_names(name_list, server, materialized_views_config): - workbook_names = open(name_list, 'r') + workbook_names = sanitize_workbook_list(name_list, "name") for workbook_name in workbook_names: req_option = TSC.RequestOptions() req_option.filter.add(TSC.Filter(TSC.RequestOptions.Field.Name, TSC.RequestOptions.Operator.Equals, workbook_name.rstrip())) workbooks = list(TSC.Pager(server.workbooks, req_option)) + if len(workbooks) == 0: + print("Cannot find workbook name: {}".format(workbook_name)) for workbook in workbooks: workbook.materialized_views_config = materialized_views_config server.workbooks.update(workbook) @@ -315,5 +323,14 @@ def find_projects_to_update(project, server, all_projects, projects_to_update): find_projects_to_update(child, server, all_projects, projects_to_update) +def sanitize_workbook_list(file_name, file_type): + if file_type == "name": + name_list = open(file_name, "r") + return [workbook.rstrip() for workbook in name_list if not workbook.isspace()] + if file_type == "path": + path_list = open(file_name, "r") + return [workbook.rstrip() for workbook in path_list if not workbook.isspace()] + + if __name__ == "__main__": main() From 29d2224a610a419626d8af23bb6ab41d4576c80b Mon Sep 17 00:00:00 2001 From: bzhang Date: Fri, 15 Feb 2019 13:38:23 -0800 Subject: [PATCH 2/3] check for invalid file names, when can't find workbook name/path, remind user to use new line separated file as workbook list --- samples/materialize_workbooks.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/samples/materialize_workbooks.py b/samples/materialize_workbooks.py index 71a269fb4..d6aa5e58d 100644 --- a/samples/materialize_workbooks.py +++ b/samples/materialize_workbooks.py @@ -1,6 +1,7 @@ import argparse import getpass import logging +import os import tableauserverclient as TSC from collections import defaultdict @@ -124,7 +125,7 @@ def show_materialized_views_status(args, password, site_content_url): print("Workbook: {} from site: {}".format(workbook.name, site.name)) -def update_project_by_path(args, materialized_views_mode, password, site_content_url): +def update_project_by_path(args, materialized_views_config, password, site_content_url): if args.project_path is None: print("Use --project_path to specify the path of the project") return False @@ -139,7 +140,7 @@ def update_project_by_path(args, materialized_views_mode, password, site_content return False possible_paths = get_project_paths(server, projects) - update_project(possible_paths[args.project_path], server, materialized_views_mode) + update_project(possible_paths[args.project_path], server, materialized_views_config) return True @@ -171,7 +172,7 @@ def update_project_by_name(args, materialized_views_config, password, site_conte def update_project(project, server, materialized_views_config): all_projects = list(TSC.Pager(server.projects)) - project_ids = find_project_ids_to_update(all_projects, project, server) + project_ids = find_project_ids_to_update(all_projects, project) for workbook in TSC.Pager(server.workbooks): if workbook.project_id in project_ids: workbook.materialized_views_config = materialized_views_config @@ -181,9 +182,9 @@ def update_project(project, server, materialized_views_config): print('\n') -def find_project_ids_to_update(all_projects, project, server): +def find_project_ids_to_update(all_projects, project): projects_to_update = [] - find_projects_to_update(project, server, all_projects, projects_to_update) + find_projects_to_update(project, all_projects, projects_to_update) return set([project_to_update.id for project_to_update in projects_to_update]) @@ -234,7 +235,8 @@ def update_workbooks_by_paths(all_projects, materialized_views_config, server, w print("Updated materialized views settings for workbook: {}".format(path + '/' + workbook.name)) for path in all_paths: - print("Cannot find workbook path: {}").format(path + '/' + workbook_name) + print("Cannot find workbook path: {}, each line should only contain one workbook path" + .format(path + '/' + workbook_name)) print('\n') @@ -247,7 +249,8 @@ def update_workbooks_by_names(name_list, server, materialized_views_config): workbook_name.rstrip())) workbooks = list(TSC.Pager(server.workbooks, req_option)) if len(workbooks) == 0: - print("Cannot find workbook name: {}".format(workbook_name)) + print("Cannot find workbook name: {}, each line should only contain one workbook name" + .format(workbook_name)) for workbook in workbooks: workbook.materialized_views_config = materialized_views_config server.workbooks.update(workbook) @@ -312,7 +315,7 @@ def assert_project_valid(project_name, projects): return True -def find_projects_to_update(project, server, all_projects, projects_to_update): +def find_projects_to_update(project, all_projects, projects_to_update): # Use recursion to find all the sub-projects and enable/disable the workbooks in them projects_to_update.append(project) children_projects = [child for child in all_projects if child.parent_id == project.id] @@ -320,16 +323,18 @@ def find_projects_to_update(project, server, all_projects, projects_to_update): return for child in children_projects: - find_projects_to_update(child, server, all_projects, projects_to_update) + find_projects_to_update(child, all_projects, projects_to_update) def sanitize_workbook_list(file_name, file_type): + if not os.path.isfile(file_name): + return [] + file_list = open(file_name, "r") + if file_type == "name": - name_list = open(file_name, "r") - return [workbook.rstrip() for workbook in name_list if not workbook.isspace()] + return [workbook.rstrip() for workbook in file_list if not workbook.isspace()] if file_type == "path": - path_list = open(file_name, "r") - return [workbook.rstrip() for workbook in path_list if not workbook.isspace()] + return [workbook.rstrip() for workbook in file_list if not workbook.isspace()] if __name__ == "__main__": From e36a7717a2a39cf3cbce66beb0e3a910596bd52e Mon Sep 17 00:00:00 2001 From: bzhang Date: Fri, 15 Feb 2019 15:55:41 -0800 Subject: [PATCH 3/3] notify user when file name is invalid --- samples/materialize_workbooks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/materialize_workbooks.py b/samples/materialize_workbooks.py index d6aa5e58d..696dda4b7 100644 --- a/samples/materialize_workbooks.py +++ b/samples/materialize_workbooks.py @@ -328,6 +328,7 @@ def find_projects_to_update(project, all_projects, projects_to_update): def sanitize_workbook_list(file_name, file_type): if not os.path.isfile(file_name): + print("Invalid file name '{}'".format(file_name)) return [] file_list = open(file_name, "r")