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: