diff --git a/tableauserverclient/models/property_decorators.py b/tableauserverclient/models/property_decorators.py index 77612b172..f8a8662a8 100644 --- a/tableauserverclient/models/property_decorators.py +++ b/tableauserverclient/models/property_decorators.py @@ -69,7 +69,18 @@ def wrapper(self, value): return wrapper -def property_is_int(range): +def property_is_int(range, allowed=None): + '''Takes a range of ints and a list of exemptions to check against + when setting a property on a model. The range is a tuple of (min, max) and the + allowed list (empty by default) allows values outside that range. + This is useful for when we use sentinel values. + + Example: Revisions allow a range of 2-10000, but use -1 as a sentinel for 'unlimited'. + ''' + + if allowed is None: + allowed = () # Empty tuple for fast no-op testing. + def property_type_decorator(func): @wraps(func) def wrapper(self, value): @@ -83,14 +94,11 @@ def wrapper(self, value): min, max = range - if value < min or value > max: - + if (value < min or value > max) and (value not in allowed): raise ValueError(error) return func(self, value) - return wrapper - return property_type_decorator diff --git a/tableauserverclient/models/site_item.py b/tableauserverclient/models/site_item.py index 40a49e453..e10c71ec2 100644 --- a/tableauserverclient/models/site_item.py +++ b/tableauserverclient/models/site_item.py @@ -1,6 +1,6 @@ import xml.etree.ElementTree as ET from .property_decorators import (property_is_enum, property_is_boolean, property_matches, - property_not_empty, property_not_nullable) + property_not_empty, property_not_nullable, property_is_int) from .. import NAMESPACE @@ -17,14 +17,15 @@ class State: Suspended = 'Suspended' def __init__(self, name, content_url, admin_mode=None, user_quota=None, storage_quota=None, - disable_subscriptions=False, subscribe_others_enabled=True, revision_history_enabled=False): + disable_subscriptions=False, subscribe_others_enabled=True, revision_history_enabled=False, + revision_limit=None): self._admin_mode = None self._id = None self._num_users = None self._state = None self._status_reason = None self._storage = None - self.revision_limit = None + self._revision_limit = None self.user_quota = user_quota self.storage_quota = storage_quota self.content_url = content_url @@ -88,6 +89,15 @@ def revision_history_enabled(self): def revision_history_enabled(self, value): self._revision_history_enabled = value + @property + def revision_limit(self): + return self._revision_limit + + @revision_limit.setter + @property_is_int((2, 10000), allowed=[-1]) + def revision_limit(self, value): + self._revision_limit = value + @property def state(self): return self._state diff --git a/tableauserverclient/server/request_factory.py b/tableauserverclient/server/request_factory.py index 439f517cb..1762cd3bd 100644 --- a/tableauserverclient/server/request_factory.py +++ b/tableauserverclient/server/request_factory.py @@ -222,6 +222,10 @@ def update_req(self, site_item): site_element.attrib['disableSubscriptions'] = str(site_item.disable_subscriptions).lower() if site_item.subscribe_others_enabled: site_element.attrib['subscribeOthersEnabled'] = str(site_item.subscribe_others_enabled).lower() + if site_item.revision_limit: + site_element.attrib['revisionLimit'] = str(site_item.revision_limit) + if site_item.subscribe_others_enabled: + site_element.attrib['revisionHistoryEnabled'] = str(site_item.revision_history_enabled).lower() return ET.tostring(xml_request) def create_req(self, site_item): diff --git a/test/assets/site_update.xml b/test/assets/site_update.xml index 8dabb4613..ade302fef 100644 --- a/test/assets/site_update.xml +++ b/test/assets/site_update.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/test/test_site.py b/test/test_site.py index 1d23351a9..8113613ca 100644 --- a/test/test_site.py +++ b/test/test_site.py @@ -91,7 +91,7 @@ def test_update(self): single_site = TSC.SiteItem(name='Tableau', content_url='tableau', admin_mode=TSC.SiteItem.AdminMode.ContentAndUsers, user_quota=15, storage_quota=1000, - disable_subscriptions=True) + disable_subscriptions=True, revision_history_enabled=False) single_site._id = '6b7179ba-b82b-4f0f-91ed-812074ac5da6' single_site = self.server.sites.update(single_site) @@ -100,6 +100,8 @@ def test_update(self): self.assertEqual('Suspended', single_site.state) self.assertEqual('Tableau', single_site.name) self.assertEqual('ContentAndUsers', single_site.admin_mode) + self.assertEqual(True, single_site.revision_history_enabled) + self.assertEqual(13, single_site.revision_limit) self.assertEqual(True, single_site.disable_subscriptions) self.assertEqual(15, single_site.user_quota)