-
Notifications
You must be signed in to change notification settings - Fork 196
/
Copy pathdownload_tile.py
93 lines (75 loc) · 2.59 KB
/
download_tile.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import sys
import time
import looker_sdk
from looker_sdk import models40 as models
from looker_sdk.rtl import transport
class MyTransportOptions(transport.PTransportSettings): timeout = 300
sdk = looker_sdk.init40("../../looker.ini")
def get_dashboard(title: str):
"""Get a dashboard by title"""
dashboards = sdk.search_dashboards(title=title)
if not dashboards:
print(f"dashboard {title} was not found")
return None
return dashboards[0]
def get_tile(dash: models.Dashboard, title: str):
"""Find a dashboard tile by title"""
title = title.lower()
assert dash.dashboard_elements
found = None
for tile in dash.dashboard_elements:
assert tile.title
if tile.title.lower() == title:
found = tile
break
else:
print(f"tile {title} of dashboard {dash.title} was not found")
return found
def download_tile(tile: models.DashboardElement, format: str = "png"):
"""Download the dashboard tile in the specified format"""
if not tile.query_id:
print(f"tile {tile.title} has no query_id")
return None
task = sdk.create_query_render_task(
query_id=tile.query_id, result_format=format, width=500, height=500
)
if not task or not task.id:
print(f"Could not create a render task for {tile.title}")
return None
# poll the render task until it completes
elapsed = 0.0
delay = 0.5 # wait .5 seconds
while True:
poll = sdk.render_task(task.id)
if poll.status == "failure":
print(poll)
print(f"Render failed for {tile.title}")
return None
elif poll.status == "success":
break
time.sleep(delay)
elapsed += delay
print(f"{elapsed} seconds elapsed")
result = sdk.render_task_results(
task.id,
# wait up to 300 seconds
transport_options=MyTransportOptions,
)
fileName = f"{tile.title}.{format}"
with open(fileName, "wb") as f:
f.write(result)
return fileName
def main():
dashboard_title = sys.argv[1] if len(sys.argv) > 1 else ""
tile_title = sys.argv[2] if len(sys.argv) > 2 else ""
render_format = sys.argv[3] if len(sys.argv) > 3 else "png"
if not dashboard_title or not tile_title:
print("Please provide: <dashboardTitle> <titleTitle> [<renderFormat>]")
print(' renderFormat defaults to "png"')
return
dashboard = get_dashboard(dashboard_title)
if dashboard:
tile = get_tile(dashboard, tile_title)
if tile:
download_tile(tile, render_format)
main()