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')