Skip to content

Commit 4a3d9a9

Browse files
committed
add subscriptions sample
1 parent e1b8281 commit 4a3d9a9

File tree

3 files changed

+105
-19
lines changed

3 files changed

+105
-19
lines changed

samples/subscriptions.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
####
2+
# This script demonstrates how to create a subscription on a schedule
3+
#
4+
# To run the script, you must have installed Python 3.7 or later.
5+
####
6+
7+
8+
import argparse
9+
import logging
10+
11+
import tableauserverclient as TSC
12+
13+
14+
def usage(args):
15+
parser = argparse.ArgumentParser(description="Set refresh schedule for a workbook or datasource.")
16+
# Common options; please keep those in sync across all samples
17+
parser.add_argument("--server", "-s", help="server address")
18+
parser.add_argument("--site", "-S", help="site name")
19+
parser.add_argument("--token-name", "-p", help="name of the personal access token used to sign into the server")
20+
parser.add_argument("--token-value", "-v", help="value of the personal access token used to sign into the server")
21+
parser.add_argument(
22+
"--logging-level",
23+
"-l",
24+
choices=["debug", "info", "error"],
25+
default="error",
26+
help="desired logging level (set to error by default)",
27+
)
28+
# Options specific to this sample
29+
parser.add_argument("schedule", help="The *name* of a schedule to use")
30+
31+
return parser.parse_args(args)
32+
33+
34+
def create_subscription(schedule: TSC.ScheduleItem, user: TSC.UserItem, target: TSC.Target):
35+
# Create the new SubscriptionItem object with variables from above.
36+
new_sub = TSC.SubscriptionItem("My scheduled subscription", schedule.id, user.id, target)
37+
38+
# (Optional) Set other fields. Any of these can be added or removed.
39+
new_sub.attach_image = True
40+
new_sub.attach_pdf = True
41+
new_sub.message = "An update from Tableau!"
42+
new_sub.page_orientation = TSC.PDFRequestOptions.Orientation.Portrait
43+
new_sub.page_size_option = TSC.PDFRequestOptions.PageType.A4
44+
new_sub.send_if_view_empty = True
45+
46+
return new_sub
47+
48+
49+
def get_schedule_by_name(server, name):
50+
schedules = [x for x in TSC.Pager(server.schedules) if x.name == name]
51+
assert len(schedules) == 1
52+
return schedules.pop()
53+
54+
55+
def run(args):
56+
# Set logging level based on user input, or error by default
57+
logging_level = getattr(logging, args.logging_level.upper())
58+
logging.basicConfig(level=logging_level)
59+
60+
# Step 1: Sign in to server.
61+
tableau_auth = TSC.PersonalAccessTokenAuth(args.token_name, args.token_value, site_id=args.site)
62+
server = TSC.Server(args.server, use_server_version=True, http_options={"verify": False})
63+
with server.auth.sign_in(tableau_auth):
64+
target = TSC.Target(server.workbooks.get()[0][0].id, "workbook")
65+
print(target)
66+
schedule = get_schedule_by_name(server, args.schedule)
67+
user = server.users.get_by_id(server.user_id)
68+
sub_values = create_subscription(schedule, user, target)
69+
70+
# Create the new subscription on the site you are logged in.
71+
sub = server.subscriptions.create(sub_values)
72+
print(sub)
73+
74+
75+
def main():
76+
import sys
77+
78+
args = usage(sys.argv[1:])
79+
run(args)
80+
81+
82+
if __name__ == "__main__":
83+
main()

tableauserverclient/models/subscription_item.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import TYPE_CHECKING
1+
from typing import List, Type, TYPE_CHECKING, Optional
22

33
from defusedxml.ElementTree import fromstring
44

@@ -11,20 +11,21 @@
1111

1212

1313
class SubscriptionItem:
14-
def __init__(self, subject: str, schedule_id: str, user_id: str, target: "Target") -> None:
14+
def __init__(self, subject: str, schedule_id: str | None, user_id: str | None, target: "Target") -> None:
1515
self._id = None
16-
self.attach_image = True
17-
self.attach_pdf = False
18-
self.message = None
19-
self.page_orientation = None
20-
self.page_size_option = None
21-
self.schedule_id = schedule_id
22-
self.send_if_view_empty = True
23-
self.subject = subject
24-
self.suspended = False
25-
self.target = target
26-
self.user_id = user_id
27-
self.schedule = None
16+
17+
self.attach_image: bool = True # chosen as default value
18+
self.attach_pdf: bool = False
19+
self.message: Optional[str] = None
20+
self.page_orientation: Optional[str] = None
21+
self.page_size_option: Optional[str] = None
22+
self.schedule_id: Optional[str] = schedule_id
23+
self.send_if_view_empty: bool = True
24+
self.subject: str = subject
25+
self.suspended: bool = False
26+
self.target: Target = target
27+
self.user_id: Optional[str] = user_id
28+
self.schedule: Optional[ScheduleItem] = None
2829

2930
def __repr__(self) -> str:
3031
if self.id is not None:

tableauserverclient/server/request_factory.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -996,9 +996,9 @@ def update_req(self, workbook_item):
996996
if data_freshness_policy_config.option == "FreshEvery":
997997
if data_freshness_policy_config.fresh_every_schedule is not None:
998998
fresh_every_element = ET.SubElement(data_freshness_policy_element, "freshEverySchedule")
999-
fresh_every_element.attrib["frequency"] = (
1000-
data_freshness_policy_config.fresh_every_schedule.frequency
1001-
)
999+
fresh_every_element.attrib[
1000+
"frequency"
1001+
] = data_freshness_policy_config.fresh_every_schedule.frequency
10021002
fresh_every_element.attrib["value"] = str(data_freshness_policy_config.fresh_every_schedule.value)
10031003
else:
10041004
raise ValueError(f"data_freshness_policy_config.fresh_every_schedule must be populated.")
@@ -1199,11 +1199,13 @@ def create_req(self, xml_request: ET.Element, subscription_item: "SubscriptionIt
11991199

12001200
# Schedule element
12011201
schedule_element = ET.SubElement(subscription_element, "schedule")
1202-
schedule_element.attrib["id"] = subscription_item.schedule_id
1202+
if subscription_item.schedule_id is not None:
1203+
schedule_element.attrib["id"] = subscription_item.schedule_id
12031204

12041205
# User element
12051206
user_element = ET.SubElement(subscription_element, "user")
1206-
user_element.attrib["id"] = subscription_item.user_id
1207+
if subscription_item.user_id is not None:
1208+
user_element.attrib["id"] = subscription_item.user_id
12071209
return ET.tostring(xml_request)
12081210

12091211
@_tsrequest_wrapped

0 commit comments

Comments
 (0)