8000 added 'run-materialization-now' flag for workbooks: · prnka11/server-client-python@440b6cf · GitHub
[go: up one dir, main page]

Skip to content

Commit 440b6cf

Browse files
author
bzhang
committed
added 'run-materialization-now' flag for workbooks:
1 parent 17921d4 commit 440b6cf

File tree

8 files changed

+144
-61
lines changed

8 files changed

+144
-61
lines changed

samples/materialize_workbooks.py

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ def main():
1010
parser.add_argument('--server', '-s', required=True, help='Tableau server address')
1111
parser.add_argument('--username', '-u', required=True, help='username to sign into server')
1212
parser.add_argument('--password', '-p', required=False, help='password to sign into server')
13-
parser.add_argument('--mode', '-m', required=False, choices=['enable', 'disable'],
13+
# TODO: for workbook, only disable and enable
14+
parser.add_argument('--mode', '-m', required=False, choices=['disable', 'enable', 'enable_all', 'enable_selective'],
1415
help='enable/disable materialized views for sites/workbooks')
1516
parser.add_argument('--status', '-st', required=False, action='store_true',
1617
help='show materialized views enabled sites/workbooks')
@@ -25,6 +26,8 @@ def main():
2526
parser.add_argument('--name-list', '-nl', required=False, help='path to a list of workbook names')
2627
parser.add_argument('--project-name', '-pn', required=False, help='name of the project')
2728
parser.add_argument('--project-path', '-pp', required=False, help="path of the project")
29+
parser.add_argument('--materialize-now', '-mn', required=False, action='store_true',
30+
help='create materialized views for workbooks immediately')
2831

2932
args = parser.parse_args()
3033

@@ -38,32 +41,32 @@ def main():
3841

3942
# site content url is the TSC term for site id
4043
site_content_url = args.site_id if args.site_id is not None else ""
41-
enable_materialized_views = args.mode == "enable"
4244

43-
if (args.type is None) != (args.mode is None):
44-
print("Use '--type <content type> --mode <enable/disable>' to update materialized views settings.")
45+
if not assert_options_valid(args):
4546
return
4647

48+
materialized_views_config = create_materialized_views_config(args)
49+
4750
# enable/disable materialized views for site
4851
if args.type == 'site':
49-
if not update_site(args, enable_materialized_views, password, site_content_url):
52+
if not update_site(args, password, site_content_url):
5053
return
5154

5255
# enable/disable materialized views for workbook
5356
# works only when the site the workbooks belong to are enabled too
5457
elif args.type == 'workbook':
55-
if not update_workbook(args, enable_materialized_views, password, site_content_url):
58+
if not update_workbook(args, materialized_views_config, password, site_content_url):
5659
return
5760

5861
# enable/disable materialized views for project by project name
5962
# will show possible projects when project name is not unique
6063
elif args.type == 'project_name':
61-
if not update_project_by_name(args, enable_materialized_views, password, site_content_url):
64+
if not update_project_by_name(args, materialized_views_config, password, site_content_url):
6265
return
6366

64-
# enable/disable materialized views for proejct by project path, for example: project1/project2
67+
# enable/disable materialized views for project by project path, for example: project1/project2
6568
elif args.type == 'project_path':
66-
if not update_project_by_path(args, enable_materialized_views, password, site_content_url):
69+
if not update_project_by_path(args, materialized_views_config, password, site_content_url):
6770
return
6871

6972
# show enabled sites and workbooks
@@ -108,7 +111,7 @@ def show_materialized_views_status(args, password, site_content_url):
108111
# only server admins can get all the sites in the server
109112
# other users can only get the site they are in
110113
for site in TSC.Pager(server.sites):
111-
if site.materialized_views_enabled:
114+
if site.materialized_views_mode != "disable":
112115
enabled_sites.add(site)
113116
print("Site name: {}".format(site.name))
114117
print('\n')
@@ -119,11 +122,11 @@ def show_materialized_views_status(args, password, site_content_url):
119122
site_auth = TSC.TableauAuth(args.username, password, site.content_url)
120123
with server.auth.sign_in(site_auth):
121124
for workbook in TSC.Pager(server.workbooks):
122-
if workbook.materialized_views_enabled:
125+
if workbook.materialized_views_config['materialized_views_enabled']:
123126
print("Workbook: {} from site: {}".format(workbook.name, site.name))
124127

125128

126-
def update_project_by_path(args, enable_materialized_views, password, site_content_url):
129+
def update_project_by_path(args, materialized_views_mode, password, site_content_url):
127130
if args.project_path is None:
128131
print("Use --project_path <project path> to specify the path of the project")
129132
return False
@@ -134,11 +137,11 @@ def update_project_by_path(args, enable_materialized_views, password, site_conte
134137
projects = [project for project in TSC.Pager(server.projects) if project.name == project_name]
135138

136139
possible_paths = get_project_paths(server, projects)
137-
update_project(possible_paths[args.project_path], server, enable_materialized_views)
140+
update_project(possible_paths[args.project_path], server, materialized_views_mode)
138141
return True
139142

140143

141-
def update_project_by_name(args, enable_materialized_views, password, site_content_url):
144+
def update_project_by_name(args, materialized_views_config, password, site_content_url):
142145
if args.project_name is None:
143146
print("Use --project-name <project name> to specify the name of the project")
144147
return False
@@ -156,14 +159,14 @@ def update_project_by_name(args, enable_materialized_views, password, site_conte
156159
print('\n')
157160
return False
158161
else:
159-
update_project(projects[0], server, enable_materialized_views)
162+
update_project(projects[0], server, materialized_views_config)
160163
return True
161164

162165

163-
def update_project(project, server, enable_materialized_views):
166+
def update_project(project, server, materialized_views_config):
164167
for workbook in TSC.Pager(server.workbooks):
165168
if workbook.project_id == project.id:
166-
workbook.materialized_views_enabled = enable_materialized_views
169+
workbook.materialized_views_config = materialized_views_config
167170
server.workbooks.update(workbook)
168171

169172
print("Updated materialized views settings for project: {}".format(project.name))
@@ -180,7 +183,7 @@ def parse_workbook_path(file_path):
180183
return workbook_path_mapping
181184

182185

183-
def update_workbook(args, enable_materialized_views, password, site_content_url):
186+
def update_workbook(args, materialized_views_config, password, site_content_url):
184187
if args.path_list is None and args.name_list is None:
185188
print("Use '--path-list <filename>' or '--name-list <filename>' to specify the path of a list of workbooks")
186189
print('\n')
@@ -191,13 +194,13 @@ def update_workbook(args, enable_materialized_views, password, site_content_url)
191194
if args.path_list is not None:
192195
workbook_path_mapping = parse_workbook_path(args.path_list)
193196
all_projects = {project.id: project for project in TSC.Pager(server.projects)}
194-
update_workbooks_by_paths(all_projects, enable_materialized_views, server, workbook_path_mapping)
197+
update_workbooks_by_paths(all_projects, materialized_views_config, server, workbook_path_mapping)
195198
elif args.name_list is not None:
196-
update_workbooks_by_names(args.name_list, server, enable_materialized_views)
199+
update_workbooks_by_names(args.name_list, server, materialized_views_config)
197200
return True
198201

199202

200-
def update_workbooks_by_paths(all_projects, enable_materialized_views, server, workbook_path_mapping):
203+
def update_workbooks_by_paths(all_projects, materialized_views_config, server, workbook_path_mapping):
201204
for workbook_name, workbook_paths in workbook_path_mapping.items():
202205
req_option = TSC.RequestOptions()
203206
req_option.filter.add(TSC.Filter(TSC.RequestOptions.Field.Name,
@@ -207,13 +210,13 @@ def update_workbooks_by_paths(all_projects, enable_materialized_views, server, w
207210
for workbook in workbooks:
208211
path = find_project_path(all_projects[workbook.project_id], all_projects, "")
209212
if path in workbook_paths:
210-
workbook.materialized_views_enabled = enable_materialized_views
213+
workbook.materialized_views_config = materialized_views_config
211214
server.workbooks.update(workbook)
212215
print("Updated materialized views settings for workbook: {}".format(path + '/' + workbook.name))
213216
print('\n')
214217

215218

216-
def update_workbooks_by_names(name_list, server, enable_materialized_views):
219+
def update_workbooks_by_names(name_list, server, materialized_views_config):
217220
workbook_names = open(name_list, 'r')
218221
for workbook_name in workbook_names:
219222
req_option = TSC.RequestOptions()
@@ -222,24 +225,53 @@ def update_workbooks_by_names(name_list, server, enable_materialized_views):
222225
workbook_name.rstrip()))
223226
workbooks = list(TSC.Pager(server.workbooks, req_option))
224227
for workbook in workbooks:
225-
workbook.materialized_views_enabled = enable_materialized_views
228+
workbook.materialized_views_config = materialized_views_config
226229
server.workbooks.update(workbook)
227230
print("Updated materialized views settings for workbook: {}".format(workbook.name))
228231
print('\n')
229232

230233

231-
def update_site(args, enable_materialized_views, password, site_content_url):
234+
def update_site(args, password, site_content_url):
235+
if not assert_site_options_valid(args):
236+
return False
232237
tableau_auth = TSC.TableauAuth(args.username, password, site_id=site_content_url)
233238
server = TSC.Server(args.server, use_server_version=True)
234239
with server.auth.sign_in(tableau_auth):
235240
site_to_update = server.sites.get_by_content_url(site_content_url)
236-
site_to_update.materialized_views_enabled = enable_materialized_views
241+
site_to_update.materialized_views_mode = args.mode
237242

238243
server.sites.update(site_to_update)
239244
print("Updated materialized views settings for site: {}".format(site_to_update.name))
240245
print('\n')
241246
return True
242247

243248

249+
def create_materialized_views_config(args):
250+
# TODO: if clean up now and enable all for site is both True, then abort
251+
materialized_views_config = dict()
252+
materialized_views_config['materialized_views_enabled'] = args.mode == "enable"
253+
materialized_views_config['run_materialization_now'] = True if args.materialize_now else False
254+
return materialized_views_config
255+
256+
257+
def assert_site_options_valid(args):
258+
if args.materialize_now:
259+
print('"--materialize-now" only applies to workbook/project type')
260+
return False
261+
if args.mode == 'enable':
262+
print('For site type please choose from "disable", "enable_all", or "enable_selective"')
263+
return False
264+
return True
265+
266+
267+
def assert_options_valid(args):
268+
if args.type != "site" and args.mode in ("enable_all", "enable_selective"):
269+
print('"enable_all" and "enable_selective" do not apply to workbook/project type')
270+
return False
271+
if (args.type is None) != (args.mode is None):
272+
print("Use '--type <content type> --mode <mode>' to update materialized views settings.")
273+
return False
274+
return True
275+
244276
if __name__ == "__main__":
245277
main()

samples/name.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
project1/Book1

tableauserverclient/models/property_decorators.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,19 @@ def wrapper(self, value):
136136
dt = parse_datetime(value)
137137
return func(self, dt)
138138
return wrapper
139+
140+
141+
def property_is_materialized_views_config(func):
142+
@wraps(func)
143+
def wrapper(self, value):
144+
if not isinstance(value, dict):
145+
raise ValueError("{} is not type 'dict', cannot update {})".format(value.__class__.__name__,
146+
func.__name__))
147+
if len(value) != 2 or not all(attr in value.keys() for attr in ('materialized_views_enabled',
148+
'run_materialization_now')):
149+
error = "{} should have 2 keys ".format(func.__name__)
150+
error += "'materialized_views_enabled' and 'run_materialization_now'"
151+
error += "instead you have {}".format(value.keys())
152+
raise ValueError(error)
153+
return func(self, value)
154+
return wrapper

tableauserverclient/models/site_item.py

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class State:
1717

1818
def __init__(self, name, content_url, admin_mode=None, user_quota=None, storage_quota=None,
1919
disable_subscriptions=False, subscribe_others_enabled=True, revision_history_enabled=False,
20-
revision_limit=None, materialized_views_enabled=False):
20+
revision_limit=None, materialized_views_mode=False):
2121
self._admin_mode = None
2222
self._id = None
2323
self._num_users = None
@@ -33,7 +33,7 @@ def __init__(self, name, content_url, admin_mode=None, user_quota=None, storage_
3333
self.revision_history_enabled = revision_history_enabled
3434
self.subscribe_others_enabled = subscribe_others_enabled
3535
self.admin_mode = admin_mode
36-
self.materialized_views_enabled = materialized_views_enabled
36+
self.materialized_views_mode = materialized_views_mode
3737

3838
@property
3939
def admin_mode(self):
@@ -125,13 +125,12 @@ def subscribe_others_enabled(self, value):
125125
self._subscribe_others_enabled = value
126126

127127
@property
128-
def materialized_views_enabled(self):
129-
return self._materialized_views_enabled
128+
def materialized_views_mode(self):
129+
return self._materialized_views_mode
130130

131-
@materialized_views_enabled.setter
132-
@property_is_boolean
133-
def materialized_views_enabled(self, value):
134-
self._materialized_views_enabled = value
131+
@materialized_views_mode.setter
132+
def materialized_views_mode(self, value):
133+
self._materialized_views_mode = value
135134

136135
def is_default(self):
137136
return self.name.lower() == 'default'
@@ -143,16 +142,16 @@ def _parse_common_tags(self, site_xml, ns):
143142
(_, name, content_url, _, admin_mode, state,
144143
subscribe_others_enabled, disable_subscriptions, revision_history_enabled,
145144
user_quota, storage_quota, revision_limit, num_users, storage,
146-
materialized_views_enabled) = self._parse_element(site_xml, ns)
145+
materialized_views_mode) = self._parse_element(site_xml, ns)
147146

148147
self._set_values(None, name, content_url, None, admin_mode, state, subscribe_others_enabled,
149148
disable_subscriptions, revision_history_enabled, user_quota, storage_quota,
150-
revision_limit, num_users, storage, materialized_views_enabled)
149+
revision_limit, num_users, storage, materialized_views_mode)
151150
return self
152151

153152
def _set_values(self, id, name, content_url, status_reason, admin_mode, state,
154153
subscribe_others_enabled, disable_subscriptions, revision_history_enabled,
155-
user_quota, storage_quota, revision_limit, num_users, storage, materialized_views_enabled):
154+
user_quota, storage_quota, revision_limit, num_users, storage, materialized_views_mode):
156155
if id is not None:
157156
self._id = id
158157
if name:
@@ -181,8 +180,8 @@ def _set_values(self, id, name, content_url, status_reason, admin_mode, state,
181180
self._num_users = num_users
182181
if storage:
183182
self._storage = storage
184-
if materialized_views_enabled:
185-
self._materialized_views_enabled = materialized_views_enabled
183+
if materialized_views_mode:
184+
self._materialized_views_mode = materialized_views_mode
186185

187186
@classmethod
188187
def from_response(cls, resp, ns):
@@ -192,13 +191,13 @@ def from_response(cls, resp, ns):
192191
for site_xml in all_site_xml:
193192
(id, name, content_url, status_reason, admin_mode, state, subscribe_others_enabled,
194193
disable_subscriptions, revision_history_enabled, user_quota, storage_quota,
195-
revision_limit, num_users, storage, materialized_views_enabled) = cls._parse_element(site_xml, ns)
194+
revision_limit, num_users, storage, materialized_views_mode) = cls._parse_element(site_xml, ns)
196195

197196
site_item = cls(name, content_url)
198197
site_item._set_values(id, name, content_url, status_reason, admin_mode, state,
199198
subscribe_others_enabled, disable_subscriptions, revision_history_enabled,
200199
user_quota, storage_quota, revision_limit, num_users, storage,
201-
materialized_views_enabled)
200+
materialized_views_mode)
202201
all_site_items.append(site_item)
203202
return all_site_items
204203

@@ -233,11 +232,11 @@ def _parse_element(site_xml, ns):
233232
num_users = usage_elem.get('numUsers', None)
234233
storage = usage_elem.get('storage', None)
235234

236-
materialized_views_enabled = string_to_bool(site_xml.get('materializedViewsEnabled', ''))
235+
materialized_views_mode = site_xml.get('materializedViewsMode', '')
237236

238237
return id, name, content_url, status_reason, admin_mode, state, subscribe_others_enabled,\
239238
disable_subscriptions, revision_history_enabled, user_quota, storage_quota,\
240-
revision_limit, num_users, storage, materialized_views_enabled
239+
revision_limit, num_users, storage, materialized_views_mode
241240

242241

243242
# Used to convert string represented boolean to a boolean type

0 commit comments

Comments
 (0)
0