blob: 3ea8c4cb86d6dd2c02e0d70a4ff7e436922a1357 [file] [log] [blame]
#!/usr/bin/python
#
# Copyright 2011 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Sample for the Orgunits Provisioning API to demonstrate all methods.
Usage:
$ python orgunit_quick_start_example.py
You can also specify the user credentials from the command-line
$ python orgunit_quick_start_example.py
--client_id [client_id] --client_secret [client_scret] --domain [domain]
You can get help for command-line arguments as
$ python orgunit_quick_start_example.py --help
"""
__author__ = 'Shraddha Gupta <shraddhag@google.com>'
import getopt
import sys
import gdata.apps.client
from gdata.apps.organization.client import OrganizationUnitProvisioningClient
import gdata.client
import gdata.gauth
SCOPE = 'https://apps-apis.google.com/a/feeds/policies/'
USER_AGENT = 'OrgUnitProvisioningQuickStartExample'
class OrgUnitProvisioning(object):
"""Demonstrates all the functions of org units provisioning."""
def __init__(self, client_id, client_secret, domain):
"""
Args:
client_id: [string] The clientId of the developer.
client_secret: [string] The clientSecret of the developer.
domain: [string] The domain on which the functions are to be performed.
"""
self.client_id = client_id
self.client_secret = client_secret
self.domain = domain
def _AuthorizeClient(self):
"""Authorize the client for making API requests."""
self.token = gdata.gauth.OAuth2Token(
client_id=self.client_id, client_secret=self.client_secret,
scope=SCOPE, user_agent=USER_AGENT)
uri = self.token.generate_authorize_url()
print 'Please visit this URL to authorize the application:'
print uri
# Get the verification code from the standard input.
code = raw_input('What is the verification code? ').strip()
self.token.get_access_token(code)
self.client = OrganizationUnitProvisioningClient(
domain=self.domain, auth_token=self.token)
def _PrintCustomerIdDetails(self, entry):
"""Prints the attributes for a CustomerIdEntry.
Args:
entry: [gdata.apps.organization.data.CustomerIdEntry]
"""
print '\nCustomer Id: %s' % (entry.customer_id)
print 'Org unit name: %s' % (entry.org_unit_name)
print 'Customer org unit name: %s' % (entry.customer_org_unit_name)
print 'Org unit description: %s' % (entry.org_unit_description)
print 'Customer org unit description: %s' % (
entry.customer_org_unit_description)
def _PrintOrgUnitDetails(self, entry):
"""Prints the attributes for a OrgUnitEntry.
Args:
entry: [gdata.apps.organization.data.OrgUnitEntry]
"""
if entry:
print '\nOrg unit name: %s' % (entry.org_unit_name)
print 'Org unit path: %s' % (entry.org_unit_path)
print 'Parent org unit path: %s' % (entry.parent_org_unit_path)
print 'organization unit description: %s' % (entry.org_unit_description)
print 'Block inheritance flag: %s' % (entry.org_unit_block_inheritance)
else:
print 'null entry'
def _PrintOrgUserDetails(self, entry):
"""Prints the attributes for a OrgUserEntry.
Args:
entry: [gdata.apps.organization.data.OrgUserEntry]
"""
if entry:
print 'Org user email: %s' % (entry.user_email)
print 'Org unit path: %s' % (entry.org_unit_path)
else:
print 'null entry'
def _GetChoice(self, for_field):
"""Gets input for boolean fields.
Args:
for_value : string field for which input is required
Returns:
boolean input for the given field
"""
choice = raw_input(('(Optional) Enter a choice for %s\n'
'1-True 2-False ') % (for_field))
if choice == '1':
return True
return False
def _GetOrgUnitPath(self):
"""Gets org_unit_path from user.
Returns:
string org_unit_path entered by the user
"""
org_unit_path = raw_input('Enter the org unit path ')
if org_unit_path is None:
print 'Organization path missing\n'
return
return org_unit_path
def _RetrieveCustomerId(self):
"""Retrieves Groups Apps account customerId.
Returns:
CustomerIdEntry
"""
response = self.client.RetrieveCustomerId()
self._PrintCustomerIdDetails(response)
return response
def _CreateOrgUnit(self, customer_id):
"""Creates a new org unit.
Args:
customer_id : string customer_id of organization
"""
name = raw_input('Enter a name for organization: ')
parent_org_unit_path = raw_input('(default "/")'
'Enter full path of the parentental tree: ')
description = raw_input('(Optional) Enter description of organization: ')
block_inheritance = self._GetChoice('(default: False) block_inheritance: ')
if not parent_org_unit_path:
parent_org_unit_path = '/'
try:
orgunit_entry = self.client.CreateOrgUnit(
customer_id=customer_id, name=name,
parent_org_unit_path=parent_org_unit_path,
description=description, block_inheritance=block_inheritance)
self._PrintOrgUnitDetails(orgunit_entry)
print 'Org unit Created'
except gdata.client.RequestError, e:
print e.reason, e.body
return
def _UpdateOrgUnit(self, customer_id):
"""Updates an org unit.
Args:
customer_id : string customer_id of organization
"""
org_unit_path = self._GetOrgUnitPath()
if org_unit_path is None:
return
try:
org_unit_entry = self.client.RetrieveOrgUnit(customer_id=customer_id,
org_unit_path=org_unit_path)
print self._PrintOrgUnitDetails(org_unit_entry)
attributes = {1: 'org_name', 2: 'parent_org_unit_path', 3: 'description',
4: 'block_inheritance'}
print attributes
while True:
attr = int(raw_input('\nEnter number(1-4) of attribute to be updated'))
updated_val = raw_input('Enter updated value ')
if attr == 1:
org_unit_entry.org_unit_name = updated_val
if attr == 2:
org_unit_entry.parent_org_unit_path = updated_val
if attr == 3:
org_unit_entry.org_unit_description = updated_val
if attr == 4:
org_unit_entry.login.org_unit_block_inheritance = updated_val
choice = raw_input('\nDo you want to update more attributes y/n')
if choice != 'y':
break
self.client.UpdateOrgUnit(customer_id=customer_id,
org_unit_path=org_unit_path, org_unit_entry=org_unit_entry)
print 'Updated Org unit'
except gdata.client.RequestError, e:
print e.reason, e.body
return
def _RetrieveOrgUnit(self, customer_id):
"""Retrieves a single org unit.
Args:
customer_id : string customer_id of organization
"""
org_unit_path = self._GetOrgUnitPath()
if org_unit_path is None:
return
try:
response = self.client.RetrieveOrgUnit(customer_id=customer_id,
org_unit_path=org_unit_path)
self._PrintOrgUnitDetails(response)
except gdata.client.RequestError, e:
print e.reason, e.body
return
def _RetrieveAllOrgUnits(self, customer_id):
"""Retrieves all org units.
Args:
customer_id : string customer_id of organization
"""
try:
response = self.client.RetrieveAllOrgUnits(customer_id=customer_id)
for entry in response.entry:
self._PrintOrgUnitDetails(entry)
except gdata.client.RequestError, e:
print e.reason, e.body
return
def _RetrieveSubOrgUnits(self, customer_id):
"""Retrieves all sub org units of an org unit.
Args:
customer_id : string customer_id of organization
"""
org_unit_path = self._GetOrgUnitPath()
if org_unit_path is None:
return
try:
response = self.client.RetrieveSubOrgUnits(customer_id=customer_id,
org_unit_path=org_unit_path)
if not response.entry:
print 'No Sub organization units'
return
for entry in response.entry:
self._PrintOrgUnitDetails(entry)
except gdata.client.RequestError, e:
print e.reason, e.body
return
def _MoveUsers(self, customer_id):
"""Moves users to an org unit.
Args:
customer_id : string customer_id of organization
"""
org_unit_path = self._GetOrgUnitPath()
if org_unit_path is None:
return
users = []
while True:
user = raw_input('Enter user email address ')
if user:
users.append(user)
else:
break
if users is None:
print 'No users given to move'
return
try:
self.client.MoveUserToOrgUnit(customer_id=customer_id,
org_unit_path=org_unit_path, users_to_move=users)
print 'Moved users'
print users
except gdata.client.RequestError, e:
print e.reason, e.body
return
def _DeleteOrgUnit(self, customer_id):
"""Deletes an org unit.
Args:
customer_id : string customer_id of organization
"""
org_unit_path = self._GetOrgUnitPath()
if org_unit_path is None:
return
try:
self.client.DeleteOrgUnit(customer_id=customer_id,
org_unit_path=org_unit_path)
print 'OrgUnit Deleted'
except gdata.client.RequestError, e:
print e.reason, e.body
return
def _UpdateOrgUser(self, customer_id):
"""Updates the orgunit of an org user.
Args:
customer_id : string customer_id of organization
"""
org_unit_path = self._GetOrgUnitPath()
user_email = raw_input('Enter the email address')
if None in (org_unit_path, user_email):
print 'Organization path and email are both required\n'
return
try:
org_user_entry = self.client.UpdateOrgUser(customer_id=customer_id,
user_email=user_email, org_unit_path=org_unit_path)
print 'Updated org unit for user'
print self._PrintOrgUserDetails(org_user_entry)
except gdata.client.RequestError, e:
print e.reason, e.body
return
def _RetrieveOrgUser(self, customer_id):
"""Retrieves an organization user.
Args:
customer_id : string customer_id of organization
"""
user_email = raw_input('Enter the email address ')
if user_email is None:
print 'Email address missing\n'
return
try:
response = self.client.RetrieveOrgUser(customer_id=customer_id,
user_email=user_email)
self._PrintOrgUserDetails(response)
except gdata.client.RequestError, e:
print e.reason, e.body
return
def _RetrieveOrgUnitUsers(self, customer_id):
"""Retrieves all org users of an org unit.
Args:
customer_id : string customer_id of organization
"""
org_unit_path = self._GetOrgUnitPath()
if org_unit_path is None:
return
try:
response = self.client.RetrieveOrgUnitUsers(customer_id=customer_id,
org_unit_path=org_unit_path)
if not response.entry:
print 'No users in this organization'
return
for entry in response.entry:
self._PrintOrgUserDetails(entry)
except gdata.client.RequestError, e:
print e.reason, e.body
return
def _RetrieveAllOrgUsers(self, customer_id):
"""Retrieves all org users.
Args:
customer_id : string customer_id of organization
"""
try:
response = self.client.RetrieveAllOrgUsers(customer_id=customer_id)
for entry in response.entry:
self._PrintOrgUserDetails(entry)
except gdata.client.RequestError, e:
print e.reason, e.body
return
def Run(self):
"""Runs the sample by getting user input and taking appropriate action."""
self._AuthorizeClient()
# CustomerId is required to perform any opertaion on org unit
# Retrieve customerId beforehand.
customer_id_entry = self._RetrieveCustomerId()
customer_id = customer_id_entry.customer_id
# List of all the functions and their descriptions
functions_list = [
{'function': self._CreateOrgUnit,
'description': 'Create an org unit'},
{'function': self._UpdateOrgUnit,
'description': 'Update an org unit'},
{'function': self._RetrieveOrgUnit,
'description': 'Retrieve an org unit'},
{'function': self._RetrieveAllOrgUnits,
'description': 'Retrieve all org units'},
{'function': self._RetrieveSubOrgUnits,
'description': 'Retrieve sub org unit of a given org unit'},
{'function': self._MoveUsers,
'description': 'Move users to an org unit'},
{'function': self._DeleteOrgUnit,
'description': 'Delete an org unit'},
{'function': self._UpdateOrgUser,
'description': 'Update org unit of a user'},
{'function': self._RetrieveOrgUser,
'description': 'Retrieve an org user '},
{'function': self._RetrieveOrgUnitUsers,
'description': 'Retrieve users of an org unit'},
{'function': self._RetrieveAllOrgUsers,
'description': 'Retrieve all org users'}
]
while True:
print '\nChoose an option:\n0 - to exit'
for i in range (0, len(functions_list)):
print '%d - %s' % ((i+1), functions_list[i]['description'])
choice = int(raw_input())
if choice == 0:
break
if choice < 0 or choice > 11:
print 'Not a valid option!'
continue
functions_list[choice-1]['function'](customer_id=customer_id)
def main():
"""A menu driven application to demo all methods of org unit provisioning."""
usage = ('python orgunit_quick_start_example.py '
'--client_id [clientId] --client_secret [clientSecret] '
'--domain [domain]')
# Parse command line options
try:
opts, args = getopt.getopt(sys.argv[1:], '', ['client_id=',
'client_secret=',
'domain='])
except getopt.error:
print 'Usage: %s' % usage
return
client_id = None
client_secret = None
domain = None
# Parse options
for option, arg in opts:
if option == '--client_id':
client_id = arg
elif option == '--client_secret':
client_secret = arg
elif option == '--domain':
domain = arg
if None in (client_id, client_secret, domain):
print 'Usage: %s' % usage
return
try:
orgunit_provisioning = OrgUnitProvisioning(
client_id, client_secret, domain)
except gdata.service.BadAuthentication:
print 'Invalid user credentials given.'
return
orgunit_provisioning.Run()
if __name__ == '__main__':
main()