8000 Refeactored code so that views/datasource/workbooks have a shared bas… · SnarkyPapi/server-client-python@8c5ea2a · GitHub
[go: up one dir, main page]

Skip to content
8000

Commit 8c5ea2a

Browse files
lbrendanlRussell Hay
authored and
Russell Hay
committed
Refeactored code so that views/datasource/workbooks have a shared base class that contains shared tagging functionality.
1 parent 5cf4c19 commit 8c5ea2a

12 files changed

+89
-112
lines changed

samples/explore_datasource.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def main():
6868
for connection in sample_datasource.connections])
6969

7070
# Add some tags to the datasource
71-
server.version = 2.6
71+
server.version = 2.6 # Datasource tagging requires server version 2.6
7272
original_tag_set = set(sample_datasource.tags)
7373
sample_datasource.tags.update('a', 'b', 'c', 'd')
7474
server.datasources.update(sample_datasource)

samples/explore_workbook.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,20 +82,22 @@ def main():
8282
sample_workbook.tags.update('a', 'b', 'c', 'd')
8383
sample_workbook.show_tabs = True
8484
server.workbooks.update(sample_workbook)
85-
print("\nOld tag set: {}".format(original_tag_set))
86-
print("New tag set: {}".format(sample_workbook.tags))
85+
print("\nWorkbook's old tag set: {}".format(original_tag_set))
86+
print("Workbook's new tag set: {}".format(sample_workbook.tags))
8787
print("Workbook tabbed: {}".format(sample_workbook.show_tabs))
8888

8989
# Delete all tags that were added by setting tags to original
9090
sample_workbook.tags = original_tag_set
9191
server.workbooks.update(sample_workbook)
9292

9393
# Add tag to just one view
94-
server.version = 2.6
94+
server.version = 2.6 # View tagging requires server version 2.6
9595
sample_view = sample_workbook.views[0]
9696
original_tag_set = set(sample_view.tags)
9797
sample_view.tags.add("view_tag")
9898
server.views.update(sample_view)
99+
print("\nView's old tag set: {}".format(original_tag_set))
100+
print("View's new tag set: {}".format(sample_view.tags))
99101

100102
# Delete tag from just one view
101103
sample_view.tags = original_tag_set

tableauserverclient/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from .server_info_item import ServerInfoItem
1111
from .site_item import SiteItem
1212
from .tableau_auth import TableauAuth
13+
from .tagged_resource_item import TaggedResourceItem
1314
from .user_item import UserItem
1415
from .view_item import ViewItem
1516
from .workbook_item import WorkbookItem

tableauserverclient/models/datasource_item.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,25 @@
22
from .exceptions import UnpopulatedPropertyError
33
from .property_decorators import property_not_nullable
44
from .tag_item import TagItem
5+
from .tagged_resource_item import TaggedResourceItem
56
from .. import NAMESPACE
67
from ..datetime_helpers import parse_datetime
78
import copy
89

910

10-
class DatasourceItem(object):
11+
class DatasourceItem(TaggedResourceItem):
1112
def __init__(self, project_id, name=None):
13+
super(DatasourceItem, self).__init__() #Python2 compatible super
1214
self._connections = None
1315
self._content_url = None
1416
self._created_at = None
1517
self._id = None
16-
self._initial_tags = set()
1718
self._project_name = None
1819
self._datasource_type = None
1920
self._updated_at = None
2021
self.name = name
2122
self.owner_id = None
2223
self.project_id = project_id
23-
self.tags = set()
2424

2525
@property
2626
def connections(self):
@@ -65,12 +65,6 @@ def updated_at(self):
6565
def _set_connections(self, connections):
6666
self._connections = connections
6767

68-
def _set_initial_tags(self, initial_tags):
69-
self._initial_tags = initial_tags
70-
71-
def _get_initial_tags(self):
72-
return self._initial_tags
73-
7468
def _parse_common_tags(self, datasource_xml):
7569
if not isinstance(datasource_xml, ET.Element):
7670
datasource_xml = ET.fromstring(datasource_xml).find('.//t:datasource', namespaces=NAMESPACE)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from .. import NAMESPACE
2+
3+
4+
class TaggedResourceItem(object):
5+
def __init__(self):
6+
self._initial_tags = set()
7+
self.tags = set()
8+
9+
def _get_initial_tags(self):
10+
return self._initial_tags
11+
12+
def _set_initial_tags(self, initial_tags):
13+
self._initial_tags = initial_tags

tableauserverclient/models/view_item.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
import xml.etree.ElementTree as ET
22
from .exceptions import UnpopulatedPropertyError
3+
from .tagged_resource_item import TaggedResourceItem
34
from .. import NAMESPACE
45

56

6-
class ViewItem(object):
7+
class ViewItem(TaggedResourceItem):
78
def __init__(self):
9+
super(ViewItem, self).__init__() #Python2 compatible super
810
self._content_url = None
911
self._id = None
1012
self._image = None
11-
self._initial_tags = set()
1213
self._name = None
1314
self._owner_id = None
1415
self._preview_image = None
1516
self._total_views = None
1617
self._workbook_id = None
17-
self.tags = set()
1818

1919
@property
2020
def content_url(self):
@@ -50,12 +50,6 @@ def total_views(self):
5050
@property
5151
def workbook_id(self):
5252
return self._workbook_id
53-
54-
def _get_initial_tags(self):
55-
return self._initial_tags
56-
57-
def _set_initial_tags(self, initial_tags):
58-
self._initial_tags = initial_tags
5953

6054
@classmethod
6155
def from_response(cls, resp, workbook_id=''):

tableauserverclient/models/workbook_item.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,27 @@
22
from .exceptions import UnpopulatedPropertyError
33
from .property_decorators import property_not_nullable, property_is_boolean
44
from .tag_item import TagItem
5+
from .tagged_resource_item import TaggedResourceItem
56
from .view_item import ViewItem
67
from .. import NAMESPACE
78
from ..datetime_helpers import parse_datetime
89
import copy
910

1011

11-
class WorkbookItem(object):
12+
class WorkbookItem(TaggedResourceItem):
1213
def __init__(self, project_id, name=None, show_tabs=False):
14+
super(WorkbookItem, self).__init__() #Python2 compatible super
1315
self._connections = None
1416
self._content_url = None
1517
self._created_at = None
1618
self._id = None
17-
self._initial_tags = set()
1819
self._preview_image = None
1920
self._project_name = None
2021
self._size = None
2122
self._updated_at = None
2223
self._views = None
2324
self.name = name
2425
self.owner_id = None
25-
self.tags = set()
2626
self.project_id = project_id
2727
self.show_tabs = show_tabs
2828

@@ -98,12 +98,6 @@ def _set_views(self, views):
9898
def _set_preview_image(self, preview_image):
9999
self._preview_image = preview_image
100100

101-
def _set_initial_tags(self, initial_tags):
102-
self._initial_tags = initial_tags
103-
104-
def _get_initial_tags(self):
105-
return self._initial_tags
106-
107101
def _parse_common_tags(self, workbook_xml):
108102
if not isinstance(workbook_xml, ET.Element):
109103
workbook_xml = ET.fromstring(workbook_xml).find('.//t:workbook', namespaces=NAMESPACE)

tableauserverclient/server/endpoint/datasources_endpoint.py

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from .endpoint import Endpoint, api, parameter_added_in
22
from .exceptions import MissingRequiredFieldError
33
from .fileuploads_endpoint import Fileuploads
4+
from .tagged_resources_endpoint import TaggedResourcesEndpoint
45
from .. import RequestFactory, DatasourceItem, PaginationItem, ConnectionItem
56
from ...filesys_helpers import to_filename
67
from ...models.tag_item import TagItem
@@ -18,23 +19,11 @@
1819
logger = logging.getLogger('tableau.endpoint.datasources')
1920

2021

21-
class Datasources(Endpoint):
22+
class Datasources(TaggedResourcesEndpoint):
2223
@property
2324
def baseurl(self):
2425
return "{0}/sites/{1}/datasources".format(self.parent_srv.baseurl, self.parent_srv.site_id)
2526

26-
# Add new tags to datasource
27-
def _add_tags(self, datasource_id, tag_set):
28-
url = "{0}/{1}/tags".format(self.baseurl, datasource_id)
29-
add_req = RequestFactory.Tag.add_req(tag_set)
30-
server_response = self.put_request(url, add_req)
31-
return TagItem.from_response(server_response.content)
32-
33-
# Delete a datasources's tag by name
34-
def _delete_tag(self, datasource_id, tag_name):
35-
url = "{0}/{1}/tags/{2}".format(self.baseurl, datasource_id, tag_name)
36-
self.delete_request(url)
37-
3827
# Get all datasources
3928
@api(version="2.0")
4029
def get(self, req_options=None):
@@ -110,17 +99,8 @@ def update(self, datasource_item):
11099
if not datasource_item.id:
111100
error = 'Datasource item missing ID. Datasource must be retrieved from server first.'
112101
raise MissingRequiredFieldError(error)
113-
114-
# Remove and add tags to match the datasource item's tag set
115-
if datasource_item.tags != datasource_item._initial_tags:
116-
add_set = datasource_item.tags - datasource_item._initial_tags
117-
remove_set = datasource_item._initial_tags - datasource_item.tags
118-
for tag in remove_set:
119-
self._delete_tag(datasource_item.id, tag)
120-
if add_set:
121-
datasource_item.tags = self._add_tags(datasource_item.id, add_set)
122-
datasource_item._initial_tags = copy.copy(datasource_item.tags)
123-
logger.info('Updated datasource tags to {0}'.format(datasource_item.tags))
102+
103+
self._update_tags(self.baseurl, datasource_item)
124104

125105
# Update the datasource itself
126106
url = "{0}/{1}".format(self.baseurl, datasource_item.id)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from .endpoint import Endpoint
2+
from .. import RequestFactory
3+
from ...models.tag_item import TagItem
4+
import logging
5+
import copy
6+
7+
logger = logging.getLogger('tableau.endpoint')
8+
9+
10+
class TaggedResourcesEndpoint(Endpoint):
11+
# Add new tags to resource
12+
def _add_tags(self, baseurl, resource_id, tag_set):
13+
url = "{0}/{1}/tags".format(baseurl, resource_id)
14+
add_req = RequestFactory.Tag.add_req(tag_set)
15+
server_response = self.put_request(url, add_req)
16+
return TagItem.from_response(server_response.content)
17+
18+
# Delete a resource's tag by name
19+
def _delete_tag(self, baseurl, resource_id, tag_name):
20+
url = "{0}/{1}/tags/{2}".format(baseurl, resource_id, tag_name)
21+
self.delete_request(url)
22+
23+
# Remove and add tags to match the resource item's tag set
24+
def _update_tags(self, baseurl, resource_item):
25+
if resource_item.tags != resource_item._initial_tags:
26+
add_set = resource_item.tags - resource_item._initial_tags
27+
remove_set = resource_item._initial_tags - resource_item.tags
28+
for tag in remove_set:
29+
self._delete_tag(baseurl, resource_item.id, tag)
30+
if add_set:
31+
resource_item.tags = self._add_tags(baseurl, resource_item.id, add_set)
32+
resource_item._initial_tags = copy.copy(resource_item.tags)
33+
logger.info('Updated tags to {0}'.format(resource_item.tags))
Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from .endpoint import Endpoint, api
22
from .exceptions import MissingRequiredFieldError
3+
from .tagged_resources_endpoint import TaggedResourcesEndpoint
34
from .. import RequestFactory, ViewItem, PaginationItem
45
from ...models.tag_item import TagItem
56
import logging
@@ -8,27 +9,19 @@
89
logger = logging.getLogger('tableau.endpoint.views')
910

1011

11-
class Views(Endpoint):
12+
class Views(TaggedResourcesEndpoint):
1213
@property
13-
def baseurl(self):
14+
def siteurl(self):
1415
return "{0}/sites/{1}".format(self.parent_srv.baseurl, self.parent_srv.site_id)
1516

16-
@api(version="2.2")
17-
# Add new tags to view
18-
def _add_tags(self, view_id, tag_set):
19-
url = "{0}/views/{1}/tags".format(self.baseurl, view_id)
20-
add_req = RequestFactory.Tag.add_req(tag_set)
21-
server_response = self.put_request(url, add_req)
22-
return TagItem.from_response(server_response.content)
2317

24-
# Delete a view's tag by name
25-
def _delete_tag(self, view_id, tag_name):
26-
url = "{0}/views/{1}/tags/{2}".format(self.baseurl, view_id, tag_name)
27-
self.delete_request(url)
18+
@property
19+
def baseurl(self):
20+
return "{0}/views".format(self.siteurl)
2821

2922
def get(self, req_options=None):
3023
logger.info('Querying all views on site')
31-
url = "{0}/views".format(self.baseurl)
24+
url = self.baseurl
3225
server_response = self.get_request(url, req_options)
3326
pagination_item = PaginationItem.from_response(server_response.content)
3427
all_view_items = ViewItem.from_response(server_response.content)
@@ -39,7 +32,7 @@ def populate_preview_image(self, view_item):
3932
if not view_item.id or not view_item.workbook_id:
4033
error = "View item missing ID or workbook ID."
4134
raise MissingRequiredFieldError(error)
42-
url = "{0}/workbooks/{1}/views/{2}/previewImage".format(self.baseurl,
35+
url = "{0}/workbooks/{1}/views/{2}/previewImage".format(self.siteurl,
4336
view_item.workbook_id,
4437
view_item.id)
4538
server_response = self.get_request(url)
@@ -50,7 +43,7 @@ def populate_image(self, view_item, req_options=None):
5043
if not view_item.id:
5144
error = "View item missing ID."
5245
raise MissingRequiredFieldError(error)
53-
url = "{0}/views/{1}/image".format(self.baseurl,
46+
url = "{0}/{1}/image".format(self.baseurl,
5447
view_item.id)
5548
server_response = self.get_request(url, req_options)
5649
view_item._image = server_response.content
@@ -62,16 +55,7 @@ def update(self, view_item):
6255
error = "View item missing ID. View must be retrieved from server first."
6356
raise MissingRequiredFieldError(error)
6457

65-
# Remove and add tags to match the view item's tag set
66-
if view_item.tags != view_item._initial_tags:
67-
add_set = view_item.tags - view_item._initial_tags
68-
remove_set = view_item._initial_tags - view_item.tags
69-
for tag in remove_set:
70-
self._delete_tag(view_item.id, tag)
71-
if add_set:
72-
view_item.tags = self._add_tags(view_item.id, add_set)
73-
view_item._initial_tags = copy.copy(view_item.tags)
74-
logger.info('Updated view tags to {0}'.format(view_item.tags))
58+
self._update_tags(self.baseurl, view_item)
7559

7660
# Returning view item to stay consistent with datasource/view update functions
7761
return view_item

0 commit comments

Comments
 (0)
0