8000 Refactored inheritance for tagged resources to composition pattern. · SnarkyPapi/server-client-python@31df99b · GitHub
[go: up one dir, main page]

Skip to content

Commit 31df99b

Browse files
lbrendanlRussell Hay
authored and
Russell Hay
committed
Refactored inheritance for tagged resources to composition pattern.
Fixed a few minor nits from PR.
1 parent 16469a9 commit 31df99b

File tree

11 files changed

+53
-37
lines changed

11 files changed

+53
-37
lines changed

samples/explore_datasource.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def main():
3737
# SIGN IN
3838
tableau_auth = TSC.TableauAuth(args.username, password)
3939
server = TSC.Server(args.server)
40+
server.use_highest_version()
4041
with server.auth.sign_in(tableau_auth):
4142
# Query projects for use when demonstrating publishing and updating
4243
all_projects, pagination_item = server.projects.get()
@@ -68,7 +69,6 @@ def main():
6869
for connection in sample_datasource.connections])
6970

7071
# Add some tags to the datasource
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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def main():
4040
# SIGN IN
4141
tableau_auth = TSC.TableauAuth(args.username, password)
4242
server = TSC.Server(args.server)
43+
server.use_highest_version()
4344

4445
overwrite_true = TSC.Server.PublishMode.Overwrite
4546

@@ -91,7 +92,6 @@ def main():
9192
server.workbooks.update(sample_workbook)
9293

9394
# Add tag to just one view
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")

tableauserverclient/models/datasource_item.py

Lines changed: 10 additions & 4 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
65
from .. import NAMESPACE
76
from ..datetime_helpers import parse_datetime
87
import copy
98

109

11-
class DatasourceItem(TaggedResourceItem):
10+
class DatasourceItem(object):
1211
def __init__(self, project_id, name=None):
13-
super(DatasourceItem, self).__init__() # Python2 compatible super
1412
self._connections = None
1513
self._content_url = None
1614
self._created_at = None
15+
self._datasource_type = None
1716
self._id = None
17+
self._initial_tags = set()
1818
self._project_name = None
19-
self._datasource_type = None
2019
self._updated_at = None
2120
self.name = name
2221
self.owner_id = None
2322
self.project_id = project_id
23+
self.tags = set()
2424

2525
@property
2626
def connections(self):
@@ -62,6 +62,12 @@ def datasource_type(self):
6262
def updated_at(self):
6363
return self._updated_at
6464

65+
def _get_initial_tags(self):
66+
return self._initial_tags
67+
68+
def _set_initial_tags(self, initial_tags):
69+
self._initial_tags = initial_tags
70+
6571
def _set_connections(self, connections):
6672
self._connections = connections
6773

tableauserverclient/models/tagged_resource_item.py

Lines changed: 0 additions & 13 deletions
This file was deleted.

tableauserverclient/models/view_item.py

Lines changed: 9 additions & 3 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
43
from .. import NAMESPACE
54

65

7-
class ViewItem(TaggedResourceItem):
6+
class ViewItem(object):
87
def __init__(self):
9-
super(ViewItem, self).__init__() # Python2 compatible super
108
self._content_url = None
119
self._id = None
1210
self._image = None
11+
self._initial_tags = set()
1312
self._name = None
1413
self._owner_id = None
1514
self._preview_image = None
1615
self._total_views = None
1716
self._workbook_id = None
17+
self.tags = set()
1818

1919
@property
2020
def content_url(self):
@@ -51,6 +51,12 @@ def total_views(self):
5151
def workbook_id(self):
5252
return self._workbook_id
5353

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
59+
5460
@classmethod
5561
def from_response(cls, resp, workbook_id=''):
5662
return cls.from_xml_element(ET.fromstring(resp), workbook_id)

tableauserverclient/models/workbook_item.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,19 @@
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
65
from .view_item import ViewItem
76
from .. import NAMESPACE
87
from ..datetime_helpers import parse_datetime
98
import copy
109

1110

12-
class WorkbookItem(TaggedResourceItem):
11+
class WorkbookItem(object):
1312
def __init__(self, project_id, name=None, show_tabs=False):
14-
super(WorkbookItem, self).__init__() # Python2 compatible super
1513
self._connections = None
1614
self._content_url = None
1715
self._created_at = None
1816
self._id = None
17+
self._initial_tags = set()
1918
self._preview_image = None
2019
self._project_name = None
2120
self._size = None
@@ -25,6 +24,7 @@ def __init__(self, project_id, name=None, show_tabs=False):
2524
self.owner_id = None
2625
self.project_id = project_id
2726
self.show_tabs = show_tabs
27+
self.tags = set()
2828

2929
@property
3030
def connections(self):
@@ -89,6 +89,12 @@ def views(self):
8989
raise UnpopulatedPropertyError(error)
9090
return self._views
9191

92+
def _get_initial_tags(self):
93+
return self._initial_tags
94+
95+
def _set_initial_tags(self, initial_tags):
96+
self._initial_tags = initial_tags
97+
9298
def _set_connections(self, connections):
9399
self._connections = connections
94100

tableauserverclient/server/endpoint/datasources_endpoint.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +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
4+
from .resource_tagger import ResourceTagger
55
from .. import RequestFactory, DatasourceItem, PaginationItem, ConnectionItem
66
from ...filesys_helpers import to_filename
77
from ...models.tag_item import TagItem
@@ -19,7 +19,11 @@
1919
logger = logging.getLogger('tableau.endpoint.datasources')
2020

2121

22-
class Datasources(TaggedResourcesEndpoint):
22+
class Datasources(Endpoint):
23+
def __init__(self, parent_srv):
24+
super(Datasources, self).__init__(parent_srv)
25+
self._m_resource_tagger = ResourceTagger(parent_srv)
26+
2327
@property
2428
def baseurl(self):
2529
return "{0}/sites/{1}/datasources".format(self.parent_srv.baseurl, self.parent_srv.site_id)
@@ -100,7 +104,7 @@ def update(self, datasource_item):
100104
error = 'Datasource item missing ID. Datasource must be retrieved from server first.'
101105
raise MissingRequiredFieldError(error)
102106

103-
self._update_tags(self.baseurl, datasource_item)
107+
self._m_resource_tagger._update_tags(self.baseurl, datasource_item)
104108

105109
# Update the datasource itself
106110
url = "{0}/{1}".format(self.baseurl, datasource_item.id)

tableauserverclient/server/endpoint/tagged_resources_endpoint.py renamed to tableauserverclient/server/endpoint/resource_tagger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
logger = logging.getLogger('tableau.endpoint')
88

99

10-
class TaggedResourcesEndpoint(Endpoint):
10+
class ResourceTagger(Endpoint):
1111
# Add new tags to resource
1212
def _add_tags(self, baseurl, resource_id, tag_set):
1313
url = "{0}/{1}/tags".format(baseurl, resource_id)

tableauserverclient/server/endpoint/views_endpoint.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from .endpoint import Endpoint, api
22
from .exceptions import MissingRequiredFieldError
3-
from .tagged_resources_endpoint import TaggedResourcesEndpoint
3+
from .resource_tagger import ResourceTagger
44
from .. import RequestFactory, ViewItem, PaginationItem
55
from ...models.tag_item import TagItem
66
import logging
@@ -9,7 +9,11 @@
99
logger = logging.getLogger('tableau.endpoint.views')
1010

1111

12-
class Views(TaggedResourcesEndpoint):
12+
class Views(Endpoint):
13+
def __init__(self, parent_srv):
14+
super(Views, self).__init__(parent_srv)
15+
self._m_resource_tagger = ResourceTagger(parent_srv)
16+
1317
# Used because populate_preview_image functionaliy requires workbook endpoint
1418
@property
1519
def siteurl(self):
@@ -53,7 +57,7 @@ def update(self, view_item):
5357
error = "View item missing ID. View must be retrieved from server first."
5458
raise MissingRequiredFieldError(error)
5559

56-
self._update_tags(self.baseurl, view_item)
60+
self._m_resource_tagger._update_tags(self.baseurl, view_item)
5761

5862
# Returning view item to stay consistent with datasource/view update functions
5963
return view_item

tableauserverclient/server/endpoint/workbooks_endpoint.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +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
4+
from .resource_tagger import ResourceTagger
55
from .. import RequestFactory, WorkbookItem, ConnectionItem, ViewItem, PaginationItem
66
from ...models.tag_item import TagItem
77
from ...filesys_helpers import to_filename
@@ -20,7 +20,11 @@
2020
logger = logging.getLogger('tableau.endpoint.workbooks')
2121

2222

23-
class Workbooks(TaggedResourcesEndpoint):
23+
class Workbooks(Endpoint):
24+
def __init__(self, parent_srv):
25+
super(Workbooks, self).__init__(parent_srv)
26+
self._m_resource_tagger = ResourceTagger(parent_srv)
27+
2428
@property
2529
def baseurl(self):
2630
return "{0}/sites/{1}/workbooks".format(self.parent_srv.baseurl, self.parent_srv.site_id)
@@ -63,7 +67,7 @@ def update(self, workbook_item):
6367
error = "Workbook item missing ID. Workbook must be retrieved from server first."
6468
raise MissingRequiredFieldError(error)
6569

66-
self._update_tags(self.baseurl, workbook_item)
70+
self._m_resource_tagger._update_tags(self.baseurl, workbook_item)
6771

6872
# Update the workbook itself
6973
url = "{0}/{1}".format(self.baseurl, workbook_item.id)

test/test_view.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def test_get(self):
2626
with open(GET_XML, 'rb') as f:
2727
response_xml = f.read().decode('utf-8')
2828
with requests_mock.mock() as m:
29-
m.get(self.baseurl + '', text=response_xml)
29+
m.get(self.baseurl, text=response_xml)
3030
all_views, pagination_item = self.server.views.get()
3131

3232
self.assertEqual(2, pagination_item.total_available)
@@ -109,6 +109,5 @@ def test_update_tags(self):
109109
single_view.tags.update(['a', 'c', 'e'])
110110
updated_view = self.server.views.update(single_view)
111111

112-
print("asdfasdf" + str(single_view) + str(updated_view))
113112
self.assertEqual(single_view.tags, updated_v 38CD iew.tags)
114113
self.assertEqual(single_view._initial_tags, updated_view._initial_tags)

0 commit comments

Comments
 (0)
0