8000 add export_wb sample for 'fullpdf' (#264) · jsonhuff/server-client-python@86e4638 · GitHub 65EC
[go: up one dir, main page]

Skip to content

Commit 86e4638

Browse files
author
Russell Hay
authored
add export_wb sample for 'fullpdf' (tableau#264)
* add export_wb sample for 'fullpdf' * Addressing code review feedback from Lee * Fixing the dumb thing that I did where I was getting the view, then throwing it away and getting it again... * pep8 error
1 parent 4e8bb79 commit 86e4638

File tree

2 files changed

+96
-4
lines changed

2 files changed

+96
-4
lines changed

samples/export_wb.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#
2+
# This sample uses the PyPDF2 library for combining pdfs together to get the full pdf for all the views in a
3+
# workbook.
4+
#
5+
# You will need to do `pip install PyPDF2` to use this sample.
6+
#
7+
8+
import argparse
9+
import getpass
10+
import logging
11+
import tempfile
12+
import shutil
13+
import functools
14+
import os.path
15+
16+
import tableauserverclient as TSC
17+
try:
18+
import PyPDF2
19+
except ImportError:
20+
print('Please `pip install PyPDF2` to use this sample')
21+
import sys
22+
sys.exit(1)
23+
24+
25+
def get_views_for_workbook(server, workbook_id): # -> Iterable of views
26+
workbook = server.workbooks.get_by_id(workbook_id)
27+
server.workbooks.populate_views(workbook)
28+
return workbook.views
29+
30+
31+
def download_pdf(server, tempdir, view): # -> Filename to downloaded pdf
32+
logging.info("Exporting {}".format(view.id))
33+
destination_filename = os.path.join(tempdir, view.id)
34+
server.views.populate_pdf(view)
35+
with file(destination_filename, 'wb') as f:
36+
f.write(view.pdf)
37+
38+
return destination_filename
39+
40+
41+
def combine_into(dest_pdf, filename): # -> None
42+
dest_pdf.append(filename)
43+
return dest_pdf
44+
45+
46+
def cleanup(tempdir):
47+
shutil.rmtree(tempdir)
48+
49+
50+
def main():
51+
parser = argparse.ArgumentParser(description='Export to PDF all of the views in a workbook')
52+
parser.add_argument('--server', '-s', required=True, help='server address')
53+
parser.add_argument('--site', '-S', default=None, help='Site to log into, do not specify for default site')
54+
parser.add_argument('--username', '-u', required=True, help='username to sign into server')
55+
parser.add_argument('--password', '-p', default=None, help='password for the user')
56+
57+
parser.add_argument('--logging-level', '-l', choices=['debug', 'info', 'error'], default='error',
58+
help='desired logging level (set to error by default)')
59+
parser.add_argument('--file', '-f', default='out.pdf', help='filename to store the exported data')
60+
parser.add_argument('resource_id', help='LUID for the workbook')
61+
62+
args = parser.parse_args()
63+
64+
if args.password is None:
65+
password = getpass.getpass("Password: ")
66+
else:
67+
password = args.password
68+
69+
# Set logging level based on user input, or error by default
70+
logging_level = getattr(logging, args.logging_level.upper())
71+
logging.basicConfig(level=logging_level)
72+
73+
tempdir = tempfile.mkdtemp('tsc')
74+
logging.debug("Saving to tempdir: %s", tempdir)
75+
76+
tableau_auth = TSC.TableauAuth(args.username, password, args.site)
77+
server = TSC.Server(args.server, use_server_version=True)
78+
try:
79+
with server.auth.sign_in(tableau_auth):
80+
get_list = functools.partial(get_views_for_workbook, server)
81+
download = functools.partial(download_pdf, server, tempdir)
82+
83+
downloaded = (download(x) for x in get_list(args.resource_id))
84+
output = reduce(combine_into, downloaded, PyPDF2.PdfFileMerger())
85+
with file(args.file, 'wb') as f:
86+
output.write(f)
87+
finally:
88+
cleanup(tempdir)
89+
90+
91+
if __name__ == '__main__':
92+
main()

samples/list.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
def main():
1515
parser = argparse.ArgumentParser(description='List out the names and LUIDs for different resource types')
1616
parser.add_argument('--server', '-s', required=True, help='server address')
17+
parser.add_argument('--site', '-S', default=None, help='site to log into, do not specify for default site')
1718
parser.add_argument('--username', '-u', required=True, help='username to sign into server')
18-
parser.add_argument('--site', '-S', default=None)
19-
parser.add_argument('-p', default=None)
19+
parser.add_argument('--password', '-p', default=None, help='password for the user')
2020

2121
parser.add_argument('--logging-level', '-l', choices=['debug', 'info', 'error'], default='error',
2222
help='desired logging level (set to error by default)')
@@ -25,10 +25,10 @@ def main():
2525

2626
args = parser.parse_args()
2727

28-
if args.p is None:
28+
if args.password is None:
2929
password = getpass.getpass("Password: ")
3030
else:
31-
password = args.p
31+
password = args.password
3232

3333
# Set logging level based on user input, or error by default
3434
logging_level = getattr(logging, args.logging_level.upper())

0 commit comments

Comments
 (0)
0