diff --git a/docs/docs/api-ref.md b/docs/docs/api-ref.md index 68f86321f..532d5d9b9 100644 --- a/docs/docs/api-ref.md +++ b/docs/docs/api-ref.md @@ -2405,11 +2405,14 @@ Source file: models/view_item.py Name | Description :--- | :--- +`created_at` | The date and time when the view was created. `id` | The identifier of the view item. `name` | The name of the view. `owner_id` | The id for the owner of the view. `preview_image` | The thumbnail image for the view. +`sheet_type` | The type of the view which is either a worksheet, a dashboard or a story. `total_views` | The usage statistics for the view. Indicates the total number of times the view has been looked at. +`updated_at` | The date and time when the view was last updated. `workbook_id` | The id of the workbook associated with the view. diff --git a/tableauserverclient/models/view_item.py b/tableauserverclient/models/view_item.py index 1fc6d4e8e..c4d36a841 100644 --- a/tableauserverclient/models/view_item.py +++ b/tableauserverclient/models/view_item.py @@ -1,10 +1,12 @@ import xml.etree.ElementTree as ET +from ..datetime_helpers import parse_datetime from .exceptions import UnpopulatedPropertyError class ViewItem(object): def __init__(self): self._content_url = None + self._created_at = None self._id = None self._image = None self._initial_tags = set() @@ -15,6 +17,8 @@ def __init__(self): self._pdf = None self._csv = None self._total_views = None + self._sheet_type = None + self._updated_at = None self._workbook_id = None self.tags = set() @@ -34,6 +38,10 @@ def _set_csv(self, csv): def content_url(self): return self._content_url + @property + def created_at(self): + return self._created_at + @property def id(self): return self._id @@ -78,6 +86,10 @@ def csv(self): raise UnpopulatedPropertyError(error) return self._csv() + @property + def sheet_type(self): + return self._sheet_type + @property def total_views(self): if self._total_views is None: @@ -85,6 +97,10 @@ def total_views(self): raise UnpopulatedPropertyError(error) return self._total_views + @property + def updated_at(self): + return self._updated_at + @property def workbook_id(self): return self._workbook_id @@ -103,9 +119,13 @@ def from_xml_element(cls, parsed_response, ns, workbook_id=''): workbook_elem = view_xml.find('.//t:workbook', namespaces=ns) owner_elem = view_xml.find('.//t:owner', namespaces=ns) project_elem = view_xml.find('.//t:project', namespaces=ns) + view_item._created_at = parse_datetime(view_xml.get('createdAt', None)) + view_item._updated_at = parse_datetime(view_xml.get('updatedAt', None)) view_item._id = view_xml.get('id', None) view_item._name = view_xml.get('name', None) view_item._content_url = view_xml.get('contentUrl', None) + view_item._sheet_type = view_xml.get('sheetType', None) + if usage_elem is not None: total_view = usage_elem.get('totalViewCount', None) if total_view: diff --git a/test/assets/view_get.xml b/test/assets/view_get.xml index 36f43e255..f205edf6a 100644 --- a/test/assets/view_get.xml +++ b/test/assets/view_get.xml @@ -7,10 +7,10 @@ - + - \ No newline at end of file + diff --git a/test/assets/view_get_usage.xml b/test/assets/view_get_usage.xml index a6844879d..741e607e7 100644 --- a/test/assets/view_get_usage.xml +++ b/test/assets/view_get_usage.xml @@ -8,11 +8,11 @@ - + - \ No newline at end of file + diff --git a/test/test_view.py b/test/test_view.py index 292f86887..213ea2538 100644 --- a/test/test_view.py +++ b/test/test_view.py @@ -3,6 +3,8 @@ import requests_mock import tableauserverclient as TSC +from tableauserverclient.datetime_helpers import format_datetime + TEST_ASSET_DIR = os.path.join(os.path.dirname(__file__), 'assets') ADD_TAGS_XML = os.path.join(TEST_ASSET_DIR, 'view_add_tags.xml') @@ -40,6 +42,9 @@ def test_get(self): self.assertEqual('3cc6cd06-89ce-4fdc-b935-5294135d6d42', all_views[0].workbook_id) self.assertEqual('5de011f8-5aa9-4d5b-b991-f462c8dd6bb7', all_views[0].owner_id) self.assertEqual('5241e88d-d384-4fd7-9c2f-648b5247efc5', all_views[0].project_id) + self.assertIsNone(all_views[0].created_at) + self.assertIsNone(all_views[0].updated_at) + self.assertIsNone(all_views[0].sheet_type) self.assertEqual('fd252f73-593c-4c4e-8584-c032b8022adc', all_views[1].id) self.assertEqual('Overview', all_views[1].name) @@ -47,6 +52,9 @@ def test_get(self): self.assertEqual('6d13b0ca-043d-4d42-8c9d-3f3313ea3a00', all_views[1].workbook_id) self.assertEqual('5de011f8-5aa9-4d5b-b991-f462c8dd6bb7', all_views[1].owner_id) self.assertEqual('5b534f74-3226-11e8-b47a-cb2e00f738a3', all_views[1].project_id) + self.assertEqual('2002-05-30T09:00:00Z', format_datetime(all_views[1].created_at)) + self.assertEqual('2002-06-05T08:00:59Z', format_datetime(all_views[1].updated_at)) + self.assertEqual('story', all_views[1].sheet_type) def test_get_with_usage(self): with open(GET_XML_USAGE, 'rb') as f: @@ -57,8 +65,15 @@ def test_get_with_usage(self): self.assertEqual('d79634e1-6063-4ec9-95ff-50acbf609ff5', all_views[0].id) self.assertEqual(7, all_views[0].total_views) + self.assertIsNone(all_views[0].created_at) + self.assertIsNone(all_views[0].updated_at) + self.assertIsNone(all_views[0].sheet_type) + self.assertEqual('fd252f73-593c-4c4e-8584-c032b8022adc', all_views[1].id) self.assertEqual(13, all_views[1].total_views) + self.assertEqual('2002-05-30T09:00:00Z', format_datetime(all_views[1].created_at)) + self.assertEqual('2002-06-05T08:00:59Z', format_datetime(all_views[1].updated_at)) + self.assertEqual('story', all_views[1].sheet_type) def test_get_with_usage_and_filter(self): with open(GET_XML_USAGE, 'rb') as f: