#!/usr/bin/python # # Copyright (C) 2007, 2009 Google Inc. # # 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. __author__ = 'Gunjan Sharma ' import getopt import getpass import sys import time import atom import atom.data import gdata.apps.multidomain.client import gdata.apps.organization.service import gdata.apps.service import gdata.client import gdata.contacts.client import gdata.contacts.data import gdata.contacts.service import gdata.sites.client import gdata.sites.data #The title for the site ORG_SITE_TITLE = 'Organization Hierarchy' #Title for the users site USER_SITE_TITLE = 'Users' #The template URI for a site URI = 'https://sites.google.com/a/%s/%s/' #Description for the sites DESCRIPTION = 'Under Construction' #Theme for the sites THEME = 'slate' #Header for the new webpages HTML_HEADER = ('' '' '') #Footer for the new webpages HTML_FOOTER = '' #The template string for each user's html page TEMPLATE_USER_HTML = ('

Name:

%s

Gender:

%s

' '

Address:

%s

Email:

%s

') class OrgUnitAddressBook(object): """Creates organization unit sites from the domain.""" def __init__(self, email, password, domain): """Constructor for the OrgUnitSites object. Takes an email, password and domain to create a site map corresponding to the organization units in the domain. Args: email: [string] The email address of the admin. password: [string] The password corresponding to the admin account. domain: [string] The domain for which sites are to be made. Returns: A OrgUnitSites object used to run the site making. """ source = 'Making sites corresponding to org units' self.domain = domain # Create sites object self.sites_client = gdata.sites.client.SitesClient(source=source, domain=domain) self.sites_client.ClientLogin(email, password, self.sites_client.source); #Get the sites feed self.all_site_feed = self.sites_client.GetSiteFeed() # Create google contacts object self.profiles_client = gdata.contacts.client.ContactsClient(domain=domain) self.profiles_client.client_login(email, password, 'cp', service='cp') # Create an Organization Unit Client self.org_unit_client = gdata.apps.organization.service.OrganizationService( email=email, domain=domain, password=password) self.org_unit_client.ProgrammaticLogin() customer_id_set = self.org_unit_client.RetrieveCustomerId() self.customer_id = customer_id_set['customerId'] def _GetSiteName(self, site_title): """Returns the corresponding site_name. This is needed since the site name isn't the same as the title. Args: site_title: [string] The title for a site. Returns: A string which is the corresponding site_name. """ site_name = site_title.replace(' ', '-') site_name = site_name.lower() return site_name def _GetSiteURI(self, site_title): """Returns the corresponding uri to the site. Needed to get the link to a particular user page. Args: site_title: [string] The title for a site. Returns: A string which is the corresponding site's URI. """ uri = URI % (self.domain, self._GetSiteName(site_title)) return uri def _CreateSite(self, site_title, description=DESCRIPTION, theme=THEME): """Creates a site with the site_title, if it not already exists. Args: site_title: [string] The title for a site. description: [string] The description for the site. theme: [string] The theme that should be set for the site. Returns: A Content feed object for the created site. """ site_entry = None site_found = False site_name = self._GetSiteName(site_title) for site in self.all_site_feed.entry: if site.site_name.text == site_name: site_found = True site_entry = site break if site_found == False: try: site_entry = self.sites_client.CreateSite(site_title, description=description, theme=theme) except gdata.client.RequestError, error: print error self.sites_client.site = site_name return site_entry def _DeleteAllPages(self): '''Deletes all the pages in a site except home''' feed_uri = self.sites_client.make_content_feed_uri() while feed_uri: feed = self.sites_client.GetContentFeed() for entry in feed.entry: if entry.page_name.text != 'home': self.sites_client.Delete(entry) feed_uri = feed.FindNextLink() def _GetUsersProfileFeed(self): """Retrieves all the user's profile. Returns: A Dictionary of email address to ContentEntry objects """ profiles = [] feed_uri = self.profiles_client.GetFeedUri('profiles') while feed_uri: feed = self.profiles_client.GetProfilesFeed(uri=feed_uri) profiles.extend(feed.entry) feed_uri = feed.FindNextLink() profiles_dict = {} for profile in profiles: for email in profile.email: if email.primary and email.primary == 'true': profiles_dict[email.address] = profile break return profiles_dict def _CreateUserPageHTML(self, profile): """Creates HTML for a user profile. Args: profile: [gdata.contacts.data.ProfileEntry] It is the profile of the user whose HTML has to be created. Returns: A String which is the HTML code. """ address_string = '' email_string = '' for address in profile.structured_postal_address: address_string = '%s
  • %s

  • ' % (address_string, address) for email in profile.email: if email.primary and email.primary == 'true': email_string = '%s
  • %s

  • ' % (email_string, email.address) new_html = TEMPLATE_USER_HTML % (profile.name.full_name.text, str(profile.gender), address_string, email_string) return HTML_HEADER + new_html + HTML_FOOTER def _GetUserPageName(self, user_email): """Creates a page name for a particular user depending on the email address. Args: user_email: [string] The email address of the user. Returns: A String which defines the user page name. """ user_page_name = user_email.replace('@', '-') user_page_name = user_page_name.replace('.', '_') user_page_name = user_page_name.lower() return user_page_name def _CreateUserPages(self): """Makes all the user pages""" entry = self._CreateSite(USER_SITE_TITLE) #Delete all the pages self._DeleteAllPages() users_profile = self._GetUsersProfileFeed() users = self.org_unit_client.RetrieveAllOrgUsers(self.customer_id) for user in users: user_email = user['orgUserEmail'] user_profile = users_profile[user_email] new_html = self._CreateUserPageHTML(user_profile) user_page_name = self._GetUserPageName(user_email) self.sites_client.CreatePage('webpage', user_profile.name.full_name.text, html=new_html, page_name=user_page_name) def _GetOrgUnitPageHTML(self, path): """Creates HTML for a Org Unit Page. Args: profile: [string] Path of the Org Unit. Returns: A String which is the HTML code. """ domain_users = self.org_unit_client.RetrieveOrgUnitUsers(self.customer_id, path) new_html = '

    ' for user in domain_users: user_email = user['orgUserEmail'] user_page_name = self._GetUserPageName(user_email) site_uri = self._GetSiteURI(USER_SITE_TITLE) new_html = '%s

  • %s

  • ' % (new_html, site_uri + user_page_name, user_email) new_html = new_html + '

    ' return HTML_HEADER + new_html + HTML_FOOTER def _SetOrgSiteHomePage(self): """Sets up the home page for Org Unit Site""" new_html = self._GetOrgUnitPageHTML('/') home_path = self._GetUnitPath() home_feed = self.sites_client.GetContentFeed(uri=home_path) home_feed.entry[0].title.text = self.domain home_feed.entry[0].content.html = new_html self.sites_client.Update(home_feed.entry[0]) def _GetUnitPath(self, path=None): """Returns path to the parent unit Args: parent_path: [string] Path of the Parent Org Unit. Returns: A String which is the path to the parent. """ path_uri = '%s?path=/%s' if path: path = path.replace('+', '-') path = path.lower() path = 'home/' + path else: path = 'home' uri = path_uri % (self.sites_client.MakeContentFeedUri(), path) return uri def _CreateOrgUnitPages(self): """Creates all the org unit pages""" entry = self._CreateSite(ORG_SITE_TITLE) #Delete all the pages self._DeleteAllPages() self._SetOrgSiteHomePage() orgUnits = self.org_unit_client.RetrieveAllOrgUnits(self.customer_id) for unit in orgUnits: parent_uri = self._GetUnitPath(unit['parentOrgUnitPath']) parent_feed = self.sites_client.GetContentFeed(uri=parent_uri) new_html = self._GetOrgUnitPageHTML(unit['orgUnitPath']) self.sites_client.CreatePage('webpage', unit['name'], html=new_html, parent=parent_feed.entry[0]) def Run(self): """Controls the entire flow of the sites making process""" print 'Starting the process. This may take few minutes.' print 'Creating user pages...' self._CreateUserPages() print 'User pages created' print 'Creating Organization Unit Pages' self._CreateOrgUnitPages() print 'Your website is ready, visit it at: %s' % (self._GetSiteURI( ORG_SITE_TITLE)) def main(): """Runs the site making module using an instance of OrgUnitAddressBook""" # Parse command line options try: opts, args = getopt.getopt(sys.argv[1:], '', ['email=', 'pw=', 'domain=']) except getopt.error, msg: print ('python org_unit_sites.py --email [emailaddress] --pw [password]' ' --domain [domain]') sys.exit(2) email = '' password = '' domain = '' # Parse options for option, arg in opts: if option == '--email': email = arg elif option == '--pw': password = arg elif option == '--domain': domain = arg while not email: email = raw_input('Please enter admin email address (admin@example.com): ') while not password: sys.stdout.write('Admin Password: ') password = getpass.getpass() if not password: print 'Password cannot be blank.' while not domain: username, domain = email.split('@', 1) choice = raw_input('You have not given us the domain name. ' + 'Is it %s? (y/n)' % (domain)) if choice == 'n': domain = raw_input('Please enter domain name (domain.com): ') try: org_unit_address_book = OrgUnitAddressBook(email, password, domain) except gdata.service.BadAuthentication: print 'Invalid user credentials given.' return org_unit_address_book.Run() if __name__ == '__main__': main()