8000 adding sample file for favorites, issue #737 (#1085) · LehmD/server-client-python@cc62a50 · GitHub
[go: up one dir, main page]

Skip to content

Commit cc62a50

Browse files
narcolino-tableaujacalataNicole Arcolino
authored
adding sample file for favorites, issue tableau#737 (tableau#1085)
* adding sample file for favorites, issue tableau#737 * add metrics to favorites Cleaned up the from_response method for several items because we can now initialize them empty Co-authored-by: Jac Fitzgerald <jac.fitzgerald@salesforce.com> Co-authored-by: Nicole Arcolino <narcolino@internal.salesforce.com>
1 parent 4fb6180 commit cc62a50

15 files changed

+358
-266
lines changed

samples/explore_favorites.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# This script demonstrates how to get all favorites, or add/delete a favorite.
2+
3+
import argparse
4+
import logging
5+
import tableauserverclient as TSC
6+
from tableauserverclient import Resource
7+
8+
9+
def main():
10+
parser = argparse.ArgumentParser(description="Explore favoriting functions supported by the Server API.")
11+
# Common options; please keep those in sync across all samples
12+
parser.add_argument("--server", "-s", help="server address")
13+
parser.add_argument("--site", "-S", help="site name")
14+
parser.add_argument("--token-name", "-p", help="name of the personal access token used to sign into the server")
15+
parser.add_argument("--token-value", "-v", help="value of the personal access token used to sign into the server")
16+
parser.add_argument(
17+
"--logging-level",
18+
"-l",
19+
choices=["debug", "info", "error"],
20+
default="error",
21+
help="desired logging level (set to error by default)",
22+
)
23+
24+
args = parser.parse_args()
25+
26+
# Set logging level based on user input, or error by default
27+
logging_level = getattr(logging, args.logging_level.upper())
28+
logging.basicConfig(level=logging_level)
29+
30+
# SIGN IN
31+
tableau_auth = TSC.PersonalAccessTokenAuth(args.token_name, args.token_value, site_id=args.site)
32+
server = TSC.Server(args.server, use_server_version=True)
33+
with server.auth.sign_in(tableau_auth):
34+
print(server)
35+
my_workbook = None
36+
my_view = None
37+
my_datasource = None
38+
39+
# get all favorites on site for the logged on user
40+
user: TSC.UserItem = TSC.UserItem()
41+
user.id = server.user_id
42+
print("Favorites for user: {}".format(user.id))
43+
server.favorites.get(user)
44+
print(user.favorites)
45+
46+
# get list of workbooks
A3D4
47+
all_workbook_items, pagination_item = server.workbooks.get()
48+
if all_workbook_items is not None and len(all_workbook_items) > 0:
49+
my_workbook: TSC.WorkbookItem = all_workbook_items[0]
50+
server.favorites.add_favorite(server, user, Resource.Workbook.name(), all_workbook_items[0])
51+
print(
52+
"Workbook added to favorites. Workbook Name: {}, Workbook ID: {}".format(
53+
my_workbook.name, my_workbook.id
54+
)
55+
)
56+
views = server.workbooks.populate_views(my_workbook)
57+
if views is not None and len(views) > 0:
58+
my_view = views[0]
59+
server.favorites.add_favorite_view(user, my_view)
60+
print("View added to favorites. View Name: {}, View ID: {}".format(my_view.name, my_view.id))
61+
62+
all_datasource_items, pagination_item = server.datasources.get()
63+
if all_datasource_items:
64+
my_datasource = all_datasource_items[0]
65+
server.favorites.add_favorite_datasource(user, my_datasource)
66+
print(
67+
"Datasource added to favorites. Datasource Name: {}, Datasource ID: {}".format(
68+
my_datasource.name, my_datasource.id
69+
)
70+
)
71+
72+
server.favorites.delete_favorite_workbook(user, my_workbook)
73+
print(
74+
"Workbook deleted from favorites. Workbook Name: {}, Workbook ID: {}".format(my_workbook.name, my_workbook.id)
75+
)
76+
77+
server.favorites.delete_favorite_view(user, my_view)
78+
print("View deleted from favorites. View Name: {}, View ID: {}".format(my_view.name, my_view.id))
79+
80+
server.favorites.delete_favorite_datasource(user, my_datasource)
81+
print(
82+
"Datasource deleted from favorites. Datasource Name: {}, Datasource ID: {}".format(
83+
my_datasource.name, my_datasource.id
84+
)
85+
)

tableauserverclient/models/datasource_item.py

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -305,50 +305,16 @@ def from_response(cls, resp: str, ns: Dict) -> List["DatasourceItem"]:
305305
all_datasource_xml = parsed_response.findall(".//t:datasource", namespaces=ns)
306306

307307
for datasource_xml in all_datasource_xml:
308-
(
309-
ask_data_enablement,
310-
certified,
311-
certification_note,
312-
content_url,
313-
created_at,
314-
datasource_type,
315-
description,
316-
encrypt_extracts,
317-
has_extracts,
318-
id_,
319-
name,
320-
owner_id,
321-
project_id,
322-
project_name,
323-
tags,
324-
updated_at,
325-
use_remote_query_agent,
326-
webpage_url,
327-
) = cls._parse_element(datasource_xml, ns)
328-
datasource_item = cls(project_id)
329-
datasource_item._set_values(
330-
ask_data_enablement,
331-
certified,
332-
certification_note,
333-
content_url,
334-
created_at,
335-
datasource_type,
336-
description,
337-
encrypt_extracts,
338-
has_extracts,
339-
id_,
340-
name,
341-
owner_id,
342-
None,
343-
project_name,
344-
tags,
345-
updated_at,
346-
use_remote_query_agent,
347-
webpage_url,
348-
)
308+
datasource_item = cls.from_xml(datasource_xml, ns)
349309
all_datasource_items.append(datasource_item)
350310
return all_datasource_items
351311

312+
@classmethod
313+
def from_xml(cls, datasource_xml, ns):
314+
datasource_item = cls()
315+
datasource_item._set_values(*cls._parse_element(datasource_xml, ns))
316+
return datasource_item
317+
352318
@staticmethod
353319
def _parse_element(datasource_xml: ET.Element, ns: Dict) -> Tuple:
354320
id_ = datasource_xml.get("id", None)
Lines changed: 55 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,90 @@
11
import logging
22

33
from defusedxml.ElementTree import fromstring
4+
from .tableau_types import TableauItem
45

56
from .datasource_item import DatasourceItem
67
from .flow_item import FlowItem
78
from .project_item import ProjectItem
9+
from .metric_item import MetricItem
810
from .view_item import ViewItem
911
from .workbook_item import WorkbookItem
12+
from typing import Dict, List
1013

1114
logger = logging.getLogger("tableau.models.favorites_item")
1215

13-
from typing import Dict, List, Union
1416

1517
FavoriteType = Dict[
1618
str,
17-
List[
18-
Union[
19-
DatasourceItem,
20-
ProjectItem,
21-
FlowItem,
22-
ViewItem,
23-
WorkbookItem,
24-
]
25-
],
19+
List[TableauItem],
2620
]
2721

2822

2923
class FavoriteItem:
30-
class Type:
31-
Workbook: str = "workbook"
32-
Datasource: str = "datasource"
33-
View: str = "view"
34-
Project: str = "project"
35-
Flow: str = "flow"
36-
3724
@classmethod
3825
def from_response(cls, xml: str, namespace: Dict) -> FavoriteType:
3926
favorites: FavoriteType = {
4027
"datasources": [],
4128
"flows": [],
4229
"projects": [],
30+
"metrics": [],
4331
"views": [],
4432
"workbooks": [],
4533
}
46-
4734
parsed_response = fromstring(xml)
48-
for workbook in parsed_response.findall(".//t:favorite/t:workbook", namespace):
49-
fav_workbook = WorkbookItem("")
50-
fav_workbook._set_values(*fav_workbook._parse_element(workbook, namespace))
51-
if fav_workbook:
52-
favorites["workbooks"].append(fav_workbook)
53-
for view in parsed_response.findall(".//t:favorite[t:view]", namespace):
54-
fav_views = ViewItem.from_xml_element(view, namespace)
55-
if fav_views:
56-
for fav_view in fav_views:
57-
favorites["views"].append(fav_view)
58-
for datasource in parsed_response.findall(".//t:favorite/t:datasource", namespace):
59-
fav_datasource = DatasourceItem("")
60-
fav_datasource._set_values(*fav_datasource._parse_element(datasource, namespace))
35+
36+
datasources_xml = parsed_response.findall(".//t:favorite/t:datasource", namespace)
37+
flows_xml = parsed_response.findall(".//t:favorite/t:flow", namespace)
38+
metrics_xml = parsed_response.findall(".//t:favorite/t:metric", namespace)
39+
projects_xml = parsed_response.findall(".//t:favorite/t:project", namespace)
40+
views_xml = parsed_response.findall(".//t:favorite/t:view", namespace)
41+
workbooks_xml = parsed_response.findall(".//t:favorite/t:workbook", namespace)
42+
43+
logger.debug(
44+
"ds: {}, flows: {}, metrics: {}, projects: {}, views: {}, wbs: {}".format(
45+
len(datasources_xml),
46+
len(flows_xml),
47+
len(metrics_xml),
48+
len(projects_xml),
49+
len(views_xml),
50+
len(workbooks_xml),
51+
)
52+
)
53+
for datasource in datasources_xml:
54+
fav_datasource = DatasourceItem.from_xml(datasource, namespace)
6155
if fav_datasource:
56+
logger.debug(fav_datasource)
6257
favorites["datasources"].append(fav_datasource)
63-
for project in parsed_response.findall(".//t:favorite/t:project", namespace):
64-
fav_project = ProjectItem("p")
65-
fav_project._set_values(*fav_project._parse_element(project))
66-
if fav_project:
67-
favorites["projects"].append(fav_project)
68-
for flow in parsed_response.findall(".//t:favorite/t:flow", namespace):
69-
fav_flow = FlowItem("flows")
70-
fav_flow._set_values(*fav_flow._parse_element(flow, namespace))
58+
59+
for flow in flows_xml:
60+
fav_flow = FlowItem.from_xml(flow, namespace)
7161
if fav_flow:
62+
logger.debug(fav_flow)
7263
favorites["flows"].append(fav_flow)
7364

65+
for metric in metrics_xml:
66+
fav_metric = MetricItem.from_xml(metric, namespace)
67+
if fav_metric:
68+
logger.debug(fav_metric)
69+
favorites["metrics"].append(fav_metric)
70+
71+
for project in projects_xml:
72+
fav_project = ProjectItem.from_xml(project, namespace)
73+
if fav_project:
74+
logger.debug(fav_project)
75+
favorites["projects"].append(fav_project)
76+
77+
for view in views_xml:
78+
fav_view = ViewItem.from_xml(view, namespace)
79+
if fav_view:
80+
logger.debug(fav_view)
81+
favorites["views"].append(fav_view)
82+
83+
for workbook in workbooks_xml:
84+
fav_workbook = WorkbookItem.from_xml(workbook, namespace)
85+
if fav_workbook:
86+
logger.debug(fav_workbook)
87+
favorites["workbooks"].append(fav_workbook)
88+
89+
logger.debug(favorites)
7490
return favorites

tableauserverclient/models/flow_item.py

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -176,34 +176,39 @@ def from_response(cls, resp, ns) -> List["FlowItem"]:
176176
all_flow_xml = parsed_response.findall(".//t:flow", namespaces=ns)
177177

178178
for flow_xml in all_flow_xml:
179-
(
180-
id_,
181-
name,
182-
description,
183-
webpage_url,
184-
created_at,
185-
updated_at,
186-
tags,
187-
project_id,
188-
project_name,
189-
owner_id,
190-
) = cls._parse_element(flow_xml, ns)
191-
flow_item = cls(project_id)
192-
flow_item._set_values(
193-
id_,
194-
name,
195-
description,
196-
webpage_url,
197-
created_at,
198-
updated_at,
199-
tags,
200-
None,
201-
project_name,
202-
owner_id,
203-
)
179+
flow_item = cls.from_xml(flow_xml, ns)
204180
all_flow_items.append(flow_item)
205181
return all_flow_items
206182

183+
@classmethod
184+
def from_xml(cls, flow_xml, ns) -> "FlowItem":
185+
(
186+
id_,
187+
name,
188+
description,
189+
webpage_url,
190+
created_at,
191+
updated_at,
192+
tags,
193+
project_id,
194+
project_name,
195+
owner_id,
196+
) = cls._parse_element(flow_xml, ns)
197+
flow_item = cls(project_id)
198+
flow_item._set_values(
199+
id_,
200+
name,
201+
description,
202+
webpage_url,
203+
created_at,
204+
updated_at,
205+
tags,
206+
None,
207+
project_name,
208+
owner_id,
209+
)
210+
return flow_item
211+
207212
@staticmethod
208213
def _parse_element(flow_xml, ns):
209214
id_ = flow_xml.get("id", None)

0 commit comments

Comments
 (0)
0