From ac76bdf6d1a9562007caa62930bded8aa307a1b4 Mon Sep 17 00:00:00 2001 From: Russell Hay Date: Thu, 20 Oct 2016 12:42:07 -0700 Subject: [PATCH 1/5] Adding create group, part 1 --- samples/create_group.py | 42 ++++++++++++++++++ samples/test.png | Bin 0 -> 7158 bytes .../server/endpoint/groups_endpoint.py | 8 ++++ tableauserverclient/server/request_factory.py | 6 +++ test/assets/group_create.xml | 6 +++ test/assets/group_create_async.xml | 7 +++ test/test_group.py | 12 +++++ 7 files changed, 81 insertions(+) create mode 100644 samples/create_group.py create mode 100644 samples/test.png create mode 100644 test/assets/group_create.xml create mode 100644 test/assets/group_create_async.xml diff --git a/samples/create_group.py b/samples/create_group.py new file mode 100644 index 000000000..0838880b3 --- /dev/null +++ b/samples/create_group.py @@ -0,0 +1,42 @@ +#### +# This script demonstrates how to create groups using the Tableau +# Server Client. +# +# To run the script, you must have installed Python 2.7.9 or later. +#### + + +import argparse +import getpass +import logging + +from datetime import time + +import tableauserverclient as TSC + + +def main(): + + parser = argparse.ArgumentParser(description='Creates sample schedules for each type of frequency.') + parser.add_argument('--server', '-s', required=True, help='server address') + parser.add_argument('--username', '-u', required=True, help='username to sign into server') + parser.add_argument('--logging-level', '-l', choices=['debug', 'info', 'error'], default='error', + help='desired logging level (set to error by default)') + args = parser.parse_args() + + password = getpass.getpass("Password: ") + + # Set logging level based on user input, or error by default + logging_level = getattr(logging, args.logging_level.upper()) + logging.basicConfig(level=logging_level) + + tableau_auth = TSC.TableauAuth(args.username, password) + server = TSC.Server(args.server) + with server.auth.sign_in(tableau_auth): + group = TSC.GroupItem('test') + group = server.groups.create(group) + print(group) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/samples/test.png b/samples/test.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5f71955b8c50a83665c7b9f794c912f6132382 GIT binary patch literal 7158 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 literal 0 HcmV?d00001 diff --git a/tableauserverclient/server/endpoint/groups_endpoint.py b/tableauserverclient/server/endpoint/groups_endpoint.py index a5bb3eb24..7e5a5cb81 100644 --- a/tableauserverclient/server/endpoint/groups_endpoint.py +++ b/tableauserverclient/server/endpoint/groups_endpoint.py @@ -46,6 +46,14 @@ def delete(self, group_id): self.delete_request(url) logger.info('Deleted single group (ID: {0})'.format(group_id)) + def create(self, group_item): + url = self.baseurl + create_req = RequestFactory.Group.create_req(group_item) + server_response = self.post_request(url, create_req) + new_group = GroupItem.from_response(server_response.content)[0] + + return new_group + # Removes 1 user from 1 group def remove_user(self, group_item, user_id): self._remove_user(group_item, user_id) diff --git a/tableauserverclient/server/request_factory.py b/tableauserverclient/server/request_factory.py index 3bc513c38..536971fc5 100644 --- a/tableauserverclient/server/request_factory.py +++ b/tableauserverclient/server/request_factory.py @@ -77,6 +77,12 @@ def add_user_req(self, user_id): user_element.attrib['id'] = user_id return ET.tostring(xml_request) + def create_req(self, group_item): + xml_request = ET.Element('tsRequest') + group_element = ET.SubElement(xml_request, 'group') + group_element.attrib['name'] = group_item.name + return ET.tostring(xml_request) + class PermissionRequest(object): def _add_capability(self, parent_element, capability_set, mode): diff --git a/test/assets/group_create.xml b/test/assets/group_create.xml new file mode 100644 index 000000000..d0f259428 --- /dev/null +++ b/test/assets/group_create.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/test/assets/group_create_async.xml b/test/assets/group_create_async.xml new file mode 100644 index 000000000..8c7ac1c22 --- /dev/null +++ b/test/assets/group_create_async.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/test/test_group.py b/test/test_group.py index 5424bb53d..c1dbab09c 100644 --- a/test/test_group.py +++ b/test/test_group.py @@ -8,6 +8,8 @@ GET_XML = os.path.join(TEST_ASSET_DIR, 'group_get.xml') POPULATE_USERS = os.path.join(TEST_ASSET_DIR, 'group_populate_users.xml') ADD_USER = os.path.join(TEST_ASSET_DIR, 'group_add_user.xml') +CREATE_GROUP = os.path.join(TEST_ASSET_DIR, 'group_create.xml') +CREATE_GROUP_ASYNC = os.path.join(TEST_ASSET_DIR, 'group_create_async.xml') class GroupTests(unittest.TestCase): @@ -155,3 +157,13 @@ def test_remove_user_missing_group_id(self): single_group._users = [] self.assertRaises(TSC.MissingRequiredFieldError, self.server.groups.remove_user, single_group, '5de011f8-5aa9-4d5b-b991-f462c8dd6bb7') + + def test_create_group(self): + with open(CREATE_GROUP, 'rb') as f: + response_xml = f.read().decode('utf-8') + with requests_mock.mock() as m: + m.post(self.baseurl, text=response_xml) + group_to_create = TSC.GroupItem('test') + group = self.server.groups.create(group_to_create) + self.assertEqual(group.name, 'test') + self.assertEqual(group.id, '3e4a9ea0-a07a-4fe6-b50f-c345c8c81034') \ No newline at end of file From 0f9a687c7beffb762c907833ac41f7962141920b Mon Sep 17 00:00:00 2001 From: Russell Hay Date: Thu, 20 Oct 2016 12:43:36 -0700 Subject: [PATCH 2/5] cleaning up --- samples/create_group.py | 2 +- samples/test.png | Bin 7158 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 samples/test.png diff --git a/samples/create_group.py b/samples/create_group.py index 0838880b3..3b7892fdf 100644 --- a/samples/create_group.py +++ b/samples/create_group.py @@ -39,4 +39,4 @@ def main(): if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/samples/test.png b/samples/test.png deleted file mode 100644 index 0d5f71955b8c50a83665c7b9f794c912f6132382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7158 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 From 3e2f7122aa2c6a67a9d6a4c7f2544dbf0bd4b0bc Mon Sep 17 00:00:00 2001 From: Russell Hay Date: Thu, 20 Oct 2016 12:44:32 -0700 Subject: [PATCH 3/5] adding EOL to EOF --- test/test_group.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_group.py b/test/test_group.py index c1dbab09c..273f19c89 100644 --- a/test/test_group.py +++ b/test/test_group.py @@ -166,4 +166,4 @@ def test_create_group(self): group_to_create = TSC.GroupItem('test') group = self.server.groups.create(group_to_create) self.assertEqual(group.name, 'test') - self.assertEqual(group.id, '3e4a9ea0-a07a-4fe6-b50f-c345c8c81034') \ No newline at end of file + self.assertEqual(group.id, '3e4a9ea0-a07a-4fe6-b50f-c345c8c81034') From 569df2aee6105a11298d4c1c8a25fdc6765baaa5 Mon Sep 17 00:00:00 2001 From: Russell Hay Date: Thu, 20 Oct 2016 13:01:32 -0700 Subject: [PATCH 4/5] addressing feedback from Lee --- tableauserverclient/server/endpoint/groups_endpoint.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tableauserverclient/server/endpoint/groups_endpoint.py b/tableauserverclient/server/endpoint/groups_endpoint.py index 7e5a5cb81..a21888695 100644 --- a/tableauserverclient/server/endpoint/groups_endpoint.py +++ b/tableauserverclient/server/endpoint/groups_endpoint.py @@ -50,9 +50,7 @@ def create(self, group_item): url = self.baseurl create_req = RequestFactory.Group.create_req(group_item) server_response = self.post_request(url, create_req) - new_group = GroupItem.from_response(server_response.content)[0] - - return new_group + return GroupItem.from_response(server_response.content)[0] # Removes 1 user from 1 group def remove_user(self, group_item, user_id): From 95158549bbbcff976057ba298bac6384e574888c Mon Sep 17 00:00:00 2001 From: Russell Hay Date: Thu, 20 Oct 2016 14:20:53 -0700 Subject: [PATCH 5/5] free sample for tyler --- test/assets/group_create.xml | 2 +- test/test_group.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/test/assets/group_create.xml b/test/assets/group_create.xml index d0f259428..8fb3902a4 100644 --- a/test/assets/group_create.xml +++ b/test/assets/group_create.xml @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/test/test_group.py b/test/test_group.py index 273f19c89..ff928bf17 100644 --- a/test/test_group.py +++ b/test/test_group.py @@ -1,3 +1,4 @@ +# encoding=utf-8 import unittest import os import requests_mock @@ -163,7 +164,7 @@ def test_create_group(self): response_xml = f.read().decode('utf-8') with requests_mock.mock() as m: m.post(self.baseurl, text=response_xml) - group_to_create = TSC.GroupItem('test') + group_to_create = TSC.GroupItem(u'試供品') group = self.server.groups.create(group_to_create) - self.assertEqual(group.name, 'test') + self.assertEqual(group.name, u'試供品') self.assertEqual(group.id, '3e4a9ea0-a07a-4fe6-b50f-c345c8c81034')