#!/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 ' 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()