8000 add query-tagging attribute to connection (#1202) · cbini/server-client-python@ec37de2 · GitHub
[go: up one dir, main page]

Skip to content

Commit ec37de2

Browse files
authored
add query-tagging attribute to connection (tableau#1202)
* add query-tagging attribute to connection * add explanation for why it doesn't work on hyper
1 parent ffa2d49 commit ec37de2

File tree

4 files changed

+67
-2
lines changed

4 files changed

+67
-2
lines changed

tableauserverclient/models/connection_item.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import logging
12
from typing import List, Optional
23

34
from defusedxml.ElementTree import fromstring
45

56
from .connection_credentials import ConnectionCredentials
7+
from .property_decorators import property_is_boolean
68

79

810
class ConnectionItem(object):
@@ -17,6 +19,7 @@ def __init__(self):
1719
self.server_port: Optional[str] = None
1820
self.username: Optional[str] = None
1921
self.connection_credentials: Optional[ConnectionCredentials] = None
22+
self._query_tagging: Optional[bool] = None
2023

2124
@property
2225
def datasource_id(self) -> Optional[str]:
@@ -34,6 +37,22 @@ def id(self) -> Optional[str]:
3437
def connection_type(self) -> Optional[str]:
3538
return self._connection_type
3639

40+
@property
41+
def query_tagging(self) -> Optional[bool]:
42+
return self._query_tagging
43+
44+
@query_tagging.setter
45+
@property_is_boolean
46+
def query_tagging(self, value: Optional[bool]):
47+
# if connection type = hyper, Snowflake, or Teradata, we can't change this value: it is always true
48+
if self._connection_type in ["hyper", "snowflake", "teradata"]:
49+
logger = logging.getLogger("tableauserverclient.models.connection_item")
50+
logger.debug(
51+
"Cannot update value: Query tagging is always enabled for {} connections".format(self._connection_type)
52+
)
53+
return
54+
self._query_tagging = value
55+
3756
def __repr__(self):
3857
return "<ConnectionItem#{_id} embed={embed_password} type={_connection_type} username={username}>".format(
3958
**self.__dict__
@@ -52,6 +71,7 @@ def from_response(cls, resp, ns) -> List["ConnectionItem"]:
5271
connection_item.server_address = connection_xml.get("serverAddress", None)
5372
connection_item.server_port = connection_xml.get("serverPort", None)
5473
connection_item.username = connection_xml.get("userName", None)
74+
connection_item._query_tagging = string_to_bool(connection_xml.get("queryTaggingEnabled", None))
5575
datasource_elem = connection_xml.find(".//t:datasource", namespaces=ns)
5676
if datasource_elem is not None:
5777
connection_item._datasource_id = datasource_elem.get("id", None)
@@ -93,4 +113,4 @@ def from_xml_element(cls, parsed_response, ns) -> List["ConnectionItem"]:
93113

94114
# Used to convert string represented boolean to a boolean type
95115
def string_to_bool(s: str) -> bool:
96-
return s.lower() == "true"
116+
return s is not None and s.lower() == "true"

tableauserverclient/server/request_factory.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,8 @@ def update_req(self, xml_request: ET.Element, connection_item: "ConnectionItem")
10021002
connection_element.attrib["password"] = connection_item.password
10031003
if connection_item.embed_password is not None:
10041004
connection_element.attrib["embedPassword"] = str(connection_item.embed_password).lower()
1005+
if connection_item.query_tagging is not None:
1006+
connection_element.attrib["queryTaggingEnabled"] = str(connection_item.query_tagging).lower()
10051007

10061008

10071009
class TaskRequest(object):

test/test_connection_.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import unittest
2+
import tableauserverclient as TSC
3+
4+
5+
class DatasourceModelTests(unittest.TestCase):
6+
def test_require_boolean_query_tag_fails(self):
7+
conn = TSC.ConnectionItem()
8+
conn._connection_type = "postgres"
9+
with self.assertRaises(ValueError):
10+
conn.query_tagging = "no"
11+
12+
def test_set_query_tag_normal_conn(self):
13+
conn = TSC.ConnectionItem()
14+
conn._connection_type = "postgres"
15+
conn.query_tagging = True
16+
self.assertEqual(conn.query_tagging, True)
17+
18+
def test_ignore_query_tag_for_hyper(self):
19+
conn = TSC.ConnectionItem()
20+
conn._connection_type = "hyper"
21+
conn.query_tagging = True
22+
self.assertEqual(conn.query_tagging, None)
23+
24+
def test_ignore_query_tag_for_teradata(self):
25+
conn = TSC.ConnectionItem()
26+
conn._connection_type = "teradata"
27+
conn.query_tagging = True
28 6D40 +
self.assertEqual(conn.query_tagging, None)
29+
30+
def test_ignore_query_tag_for_snowflake(self):
31+
conn = TSC.ConnectionItem()
32+
conn._connection_type = "snowflake"
33+
conn.query_tagging = True
34+
self.assertEqual(conn.query_tagging, None)

test/test_datasource_model.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import unittest
2-
32
import tableauserverclient as TSC
43

54

@@ -9,3 +8,13 @@ def test_invalid_project_id(self):
98
datasource = TSC.DatasourceItem("10")
109
with self.assertRaises(ValueError):
1110
datasource.project_id = None
11+
12+
def test_require_boolean_flag_bridge_fail(self):
13+
datasource = TSC.DatasourceItem("10")
14+
with self.assertRaises(ValueError):
15+
datasource.use_remote_query_agent = "yes"
16+
17+
def test_require_boolean_flag_bridge_ok(self):
18+
datasource = TSC.DatasourceItem("10")
19+
datasource.use_remote_query_agent = True
20+
self.assertEqual(datasource.use_remote_query_agent, True)

0 commit comments

Comments
 (0)
0