diff --git a/samples/create_group.py b/samples/create_group.py new file mode 100644 index 000000000..3b7892fdf --- /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() diff --git a/tableauserverclient/server/endpoint/groups_endpoint.py b/tableauserverclient/server/endpoint/groups_endpoint.py index a5bb3eb24..a21888695 100644 --- a/tableauserverclient/server/endpoint/groups_endpoint.py +++ b/tableauserverclient/server/endpoint/groups_endpoint.py @@ -46,6 +46,12 @@ 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) + return GroupItem.from_response(server_response.content)[0] + # 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..8fb3902a4 --- /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..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 @@ -8,6 +9,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 +158,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(u'試供品') + group = self.server.groups.create(group_to_create) + self.assertEqual(group.name, u'試供品') + self.assertEqual(group.id, '3e4a9ea0-a07a-4fe6-b50f-c345c8c81034')