1
1
import argparse
2
2
import getpass
3
3
import logging
4
+ import os
4
5
import tableauserverclient as TSC
5
6
from collections import defaultdict
6
7
@@ -124,7 +125,7 @@ def show_materialized_views_status(args, password, site_content_url):
124
125
print ("Workbook: {} from site: {}" .format (workbook .name , site .name ))
125
126
126
127
127
- def update_project_by_path (args , materialized_views_mode , password , site_content_url ):
128
+ def update_project_by_path (args , materialized_views_config , password , site_content_url ):
128
129
if args .project_path is None :
129
130
print ("Use --project_path <project path> to specify the path of the project" )
130
131
return False
@@ -139,7 +140,7 @@ def update_project_by_path(args, materialized_views_mode, password, site_content
139
140
return False
140
141
141
142
possible_paths = get_project_paths (server , projects )
142
- update_project (possible_paths [args .project_path ], server , materialized_views_mode )
143
+ update_project (possible_paths [args .project_path ], server , materialized_views_config )
143
144
return True
144
145
145
146
@@ -171,7 +172,7 @@ def update_project_by_name(args, materialized_views_config, password, site_conte
171
172
172
173
def update_project (project , server , materialized_views_config ):
173
174
all_projects = list (TSC .Pager (server .projects ))
174
- project_ids = find_project_ids_to_update (all_projects , project , server )
175
+ project_ids = find_project_ids_to_update (all_projects , project )
175
176
for workbook in TSC .Pager (server .workbooks ):
176
177
if workbook .project_id in project_ids :
177
178
workbook .materialized_views_config = materialized_views_config
@@ -181,15 +182,16 @@ def update_project(project, server, materialized_views_config):
181
182
print ('\n ' )
182
183
183
184
184
- def find_project_ids_to_update (all_projects , project , server ):
185
+ def find_project_ids_to_update (all_projects , project ):
185
186
projects_to_update = []
186
- find_projects_to_update (project , server , all_projects , projects_to_update )
187
+ find_projects_to_update (project , all_projects , projects_to_update )
187
188
return set ([project_to_update .id for project_to_update in projects_to_update ])
188
189
189
190
190
191
def parse_workbook_path (file_path ):
191
192
# parse the list of project path of workbooks
192
- workbook_paths = open (file_path , 'r' )
193
+ workbook_paths = sanitize_workbook_list (file_path , "path" )
194
+
193
195
workbook_path_mapping = defaultdict (list )
194
196
for workbook_path in workbook_paths :
195
197
workbook_project = workbook_path .rstrip ().split ('/' )
@@ -223,23 +225,32 @@ def update_workbooks_by_paths(all_projects, materialized_views_config, server, w
223
225
TSC .RequestOptions .Operator .Equals ,
224
226
workbook_name ))
225
227
workbooks = list (TSC .Pager (server .workbooks , req_option ))
228
+ all_paths = set (workbook_paths [:])
226
229
for workbook in workbooks :
227
230
path = find_project_path (all_projects [workbook .project_id ], all_projects , "" )
228
231
if path in workbook_paths :
232
+ all_paths .remove (path )
229
233
workbook .materialized_views_config = materialized_views_config
230
234
server .workbooks .update (workbook )
231
235
print ("Updated materialized views settings for workbook: {}" .format (path + '/' + workbook .name ))
236
+
237
+ for path in all_paths :
238
+ print ("Cannot find workbook path: {}, each line should only contain one workbook path"
239
+ .format (path + '/' + workbook_name ))
232
240
print ('\n ' )
233
241
234
242
235
243
def update_workbooks_by_names (name_list , server , materialized_views_config ):
236
- workbook_names = open (name_list , 'r' )
244
+ workbook_names = sanitize_workbook_list (name_list , "name" )
237
245
for workbook_name in workbook_names :
238
246
req_option = TSC .RequestOptions ()
239
247
req_option .filter .add (TSC .Filter (TSC .RequestOptions .Field .Name ,
240
248
TSC .RequestOptions .Operator .Equals ,
241
249
workbook_name .rstrip ()))
242
250
workbooks = list (TSC .Pager (server .workbooks , req_option ))
251
+ if len (workbooks ) == 0 :
252
+ print ("Cannot find workbook name: {}, each line should only contain one workbook name"
253
+ .format (workbook_name ))
243
254
for workbook in workbooks :
244
255
workbook .materialized_views_config = materialized_views_config
245
256
server .workbooks .update (workbook )
@@ -304,15 +315,27 @@ def assert_project_valid(project_name, projects):
304
315
return True
305
316
306
317
307
- def find_projects_to_update (project , server , all_projects , projects_to_update ):
318
+ def find_projects_to_update (project , all_projects , projects_to_update ):
308
319
# Use recursion to find all the sub-projects and enable/disable the workbooks in them
309
320
projects_to_update .append (project )
310
321
children_projects = [child for child in all_projects if child .parent_id == project .id ]
311
322
if len (children_projects ) == 0 :
312
323
return
313
324
314
325
for child in children_projects :
315
- find_projects_to_update (child , server , all_projects , projects_to_update )
326
+ find_projects_to_update (child , all_projects , projects_to_update )
327
+
328
+
329
+ def sanitize_workbook_list (file_name , file_type ):
330
+ if not os .path .isfile (file_name ):
331
+ print ("Invalid file name '{}'" .format (file_name ))
332
+ return []
333
+ file_list = open (file_name , "r" )
334
+
335
+ if file_type == "name" :
336
+ return [workbook .rstrip () for workbook in file_list if not workbook .isspace ()]
337
+ if file_type == "path" :
338
+ return [workbook .rstrip () for workbook in file_list if not workbook .isspace ()]
316
339
317
340
318
341
if __name__ == "__main__" :
0 commit comments