forked from tableau/document-api-python
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathworksheet.py
More file actions
142 lines (114 loc) · 5.67 KB
/
worksheet.py
File metadata and controls
142 lines (114 loc) · 5.67 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
from tableaudocumentapi.worksheet_view_subelements import SliceColumn, Sort
from tableaudocumentapi.filter import Filter
from tableaudocumentapi.datasource_dependency import DatasourceDependency
from tableaudocumentapi.worksheet_subelements import LayoutOptions, WorksheetPane, WorksheetStyleRule, \
WorksheetRowsOrCols, JoinLodExcludeOverrides, JoinLodIncludeOverrides
class Worksheet(object):
"""A class representing worksheet object."""
def __init__(self, worksheetXmlElement):
"""Constructor for XMl element representing Tableau worksheet with its children XML elements."""
self._worksheetXmlElement = worksheetXmlElement
self._worksheetTableXmlElement = worksheetXmlElement.find('table')
self._worksheetViewXmlElement = self._worksheetTableXmlElement.find('view')
self._worksheet_name = self._worksheetXmlElement.get('name')
self._layout_options = LayoutOptions(self._worksheetXmlElement.find('layout-options'))
self._styles = list(map(WorksheetStyleRule, self._worksheetTableXmlElement.findall('./style/style-rule')))
self._panes = list(map(WorksheetPane, self._worksheetTableXmlElement.findall('./panes/pane')))
self._rows = WorksheetRowsOrCols( self._worksheetTableXmlElement.find('rows'))
self._cols = WorksheetRowsOrCols(self._worksheetTableXmlElement.find('cols'))
self._join_lod_exclude_overrides = JoinLodExcludeOverrides(self._worksheetTableXmlElement.find('join-lod-exclude-overrides'))
self._join_lod_include_overrides = JoinLodIncludeOverrides(
self._worksheetTableXmlElement.find('join-lod-include-overrides'))
self._datasources = self._worksheetViewXmlElement.find('./datasources')
self._datasource_dependencies = list(map(DatasourceDependency, self._worksheetViewXmlElement.findall('./datasource-dependencies')))
self._filters = list(map(Filter, self._worksheetViewXmlElement.findall('./filter')))
self._manual_sort_xml = self._worksheetViewXmlElement.find('./manual-sort')
self._manual_sort = Sort(self._manual_sort_xml) if self._manual_sort_xml else None
self._sorts = list(map(Sort, self._worksheetViewXmlElement.findall('./sort')))
self._natural_sort_xml = self._worksheetViewXmlElement.find('./natural-sort')
self._natural_sort = Sort(self._natural_sort_xml) if self._natural_sort_xml else None
self._computed_sort_xml = self._worksheetViewXmlElement.find('./computed-sort')
self._computed_sort = Sort(self._computed_sort_xml) if self._computed_sort_xml else None
self._alphabetic_sort_xml = self._worksheetViewXmlElement.find('./alphabetic-sort')
self._alphabetic_sort = Sort(self._alphabetic_sort_xml) if self._alphabetic_sort_xml else None
self._slices_columns = list(map(SliceColumn, self._worksheetViewXmlElement.findall('./slices/column')))
self._dependent_on_datasources = self.get_names_of_dependency_datasources() # list of names
self._datasources_dependent_on_columns = self.get_names_of_columns_per_datasource()
@property
def manual_sort(self):
return self._manual_sort
@property
def natural_sort(self):
return self._natural_sort
@property
def computed_sort(self):
return self._computed_sort
@property
def alphabetic_sort(self):
return self._alphabetic_sort
@property
def worksheet_name(self):
return self._worksheet_name
def get_names_of_dependency_datasources(self):
sub_datasources = self._datasources.findall('./datasource')
datasource_names = list(dsxml.get('name') for dsxml in sub_datasources)
return datasource_names
def get_names_of_columns_per_datasource(self):
names_per_ds = {}
# loop through the list of the names of the datasources
for ds in self._dependent_on_datasources:
# check against dependent columns and create a map (dictionary)
for ds_dep in self._datasource_dependencies:
if ds_dep.dependency_datasource_name == ds:
# column name is enough as it seems that the columns mirror column instances in this case
names_per_ds[ds] = list(cl.column_name for cl in ds_dep.columns)
return names_per_ds
@property
def dependent_on_datasources(self):
"""List of data source names on which the worksheet is dependent.
:rtype: list()
"""
return self._dependent_on_datasources
@property
def datasources_dependent_on_columns(self, ):
"""Dictionary of data source names on which the worksheet is dependent together with columns of the data sources.
keys: data source names.
values: list of column names
"""
return self._datasources_dependent_on_columns
@property
def layout_options(self):
return self._layout_options
@property
def styles(self):
return self._styles
@property
def panes(self):
return self._panes
@property
def rows(self):
return self._rows
@property
def cols(self):
return self._cols
@property
def join_lod_exclude_overrides(self):
return self._join_lod_exclude_overrides
@property
def join_lod_include_overrides(self):
return self._join_lod_include_overrides
@property
def datasources(self):
return self._datasources
@property
def datasources_dependencies(self):
return self._datasource_dependencies
@property
def filters(self):
return self._filters
@property
def sorts(self):
return self._sorts
@property
def slices_columns(self):
return self._slices_columns