From 65205fe5f9fbbce6200f34c5c8f669b3c4dbde11 Mon Sep 17 00:00:00 2001 From: dev-mkc19 Date: Sun, 26 Apr 2020 01:46:30 +0300 Subject: [PATCH 1/4] add shape property --- tableaudocumentapi/workbook.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tableaudocumentapi/workbook.py b/tableaudocumentapi/workbook.py index 70b280c..17b5cd5 100644 --- a/tableaudocumentapi/workbook.py +++ b/tableaudocumentapi/workbook.py @@ -27,8 +27,9 @@ def __init__(self, filename): self._datasource_index = self._prepare_datasource_index(self._datasources) self._worksheets = self._prepare_worksheets( - self._workbookRoot, self._datasource_index - ) + self._workbookRoot, self._datasource_index) + + self._shapes = self._prepare_shapes(self._workbookRoot) @property def datasources(self): @@ -42,6 +43,10 @@ def worksheets(self): def filename(self): return self._filename + @property + def shapes(self): + return self._shapes + def save(self): """ Call finalization code and save file. @@ -116,3 +121,16 @@ def _prepare_worksheets(xml_root, ds_index): datasource.fields[column_name].add_used_in(worksheet_name) return worksheets + + @staticmethod + def _prepare_shapes(xml_root): + shapes = [] + worksheets_element = xml_root.find('.//external/shapes') + if worksheets_element is None: + return shapes + + for worksheet_element in worksheets_element: + shape_name = worksheet_element.attrib['name'] + shapes.append(shape_name) + + return shapes From 576ece20610ef8d757c524a714860dcc483fe0c9 Mon Sep 17 00:00:00 2001 From: dev_mkc19 Date: Sun, 19 Sep 2021 22:30:48 +0300 Subject: [PATCH 2/4] add shape property --- tableaudocumentapi/workbook.py | 22 +- test/assets/shapes_test.twb | 3331 ++++++++++++++++++++++++++++++++ test/test_workbook.py | 18 + 3 files changed, 3369 insertions(+), 2 deletions(-) create mode 100644 test/assets/shapes_test.twb diff --git a/tableaudocumentapi/workbook.py b/tableaudocumentapi/workbook.py index 70b280c..17b5cd5 100644 --- a/tableaudocumentapi/workbook.py +++ b/tableaudocumentapi/workbook.py @@ -27,8 +27,9 @@ def __init__(self, filename): self._datasource_index = self._prepare_datasource_index(self._datasources) self._worksheets = self._prepare_worksheets( - self._workbookRoot, self._datasource_index - ) + self._workbookRoot, self._datasource_index) + + self._shapes = self._prepare_shapes(self._workbookRoot) @property def datasources(self): @@ -42,6 +43,10 @@ def worksheets(self): def filename(self): return self._filename + @property + def shapes(self): + return self._shapes + def save(self): """ Call finalization code and save file. @@ -116,3 +121,16 @@ def _prepare_worksheets(xml_root, ds_index): datasource.fields[column_name].add_used_in(worksheet_name) return worksheets + + @staticmethod + def _prepare_shapes(xml_root): + shapes = [] + worksheets_element = xml_root.find('.//external/shapes') + if worksheets_element is None: + return shapes + + for worksheet_element in worksheets_element: + shape_name = worksheet_element.attrib['name'] + shapes.append(shape_name) + + return shapes diff --git a/test/assets/shapes_test.twb b/test/assets/shapes_test.twb new file mode 100644 index 0000000..a6ccb55 --- /dev/null +++ b/test/assets/shapes_test.twb @@ -0,0 +1,3331 @@ + + + + + + <_.fcp.AnimationOnByDefault.true...AnimationOnByDefault /> + <_.fcp.MarkAnimation.true...MarkAnimation /> + <_.fcp.ObjectModelEncapsulateLegacy.true...ObjectModelEncapsulateLegacy /> + <_.fcp.ObjectModelTableType.true...ObjectModelTableType /> + <_.fcp.SchemaViewerObjectModel.true...SchemaViewerObjectModel /> + + + + + + + + <_.fcp.AnimationOnByDefault.false...style> + <_.fcp.AnimationOnByDefault.false..._.fcp.MarkAnimation.true...style-rule element='animation'> + <_.fcp.AnimationOnByDefault.false...format attr='animation-on' value='ao-on' /> + + + + + + + + + + + + + + + + + + + + + + <_.fcp.ObjectModelEncapsulateLegacy.false...relation connection='excel-direct.0ozsbj20cdelf51evvdk71kugqg0' name='Orders' table='[Orders$]' type='table'> + + + + + + + + + + + + + + + + + + + + + + + + + <_.fcp.ObjectModelEncapsulateLegacy.true...relation type='collection'> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U9995:no:A1:U9995:0" + true + 6 + + + + + 0 + [People] + + Count + true + + 0 + "A1:B5:no:A1:B5:0" + true + 6 + + + + + 0 + [Returns] + + Count + true + + 0 + "A1:B801:no:A1:B801:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Ship Date + 7 + [Ship Date] + [Orders] + Ship Date + 3 + date + Year + true + + "DATE" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Ship Mode + 130 + [Ship Mode] + [Orders] + Ship Mode + 4 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 8 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 9 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State + 130 + [State] + [Orders] + State + 10 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postal Code + 20 + [Postal Code] + [Orders] + Postal Code + 11 + integer + Sum + true + + "I8" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 12 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 13 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 14 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 15 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 16 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 17 + real + Sum + 15 + true + + "R8" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 18 + integer + Sum + true + + "I8" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 19 + real + Sum + 15 + true + + "R8" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 20 + real + Sum + 15 + true + + "R8" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Regional Manager + 130 + [Regional Manager] + [People] + Regional Manager + 21 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[People_D73023733B004CC1B3CB1ACF62F4A965] + + + Region + 130 + [Region (People)] + [People] + Region + 22 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[People_D73023733B004CC1B3CB1ACF62F4A965] + + + Returned + 130 + [Returned] + [Returns] + Returned + 23 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Returns_2AA0FE4D737A4F63970131D0E7480A03] + + + Order ID + 130 + [Order ID (Returns)] + [Returns] + Order ID + 24 + string + Count + true + + + "WSTR" + + <_.fcp.ObjectModelEncapsulateLegacy.true...object-id>[Returns_2AA0FE4D737A4F63970131D0E7480A03] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +