blob: 3b8a5167c770fd7621f13336fc51ed7256a7b25f [file] [log] [blame]
#!/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 <gunjansharma@google.com>'
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 = ('<html:div xmlns:html="http://www.w3.org/1999/xhtml">'
'<html:table cellspacing="0" class='
'"sites-layout-name-one-column sites-layout-hbox"><html:tbody>'
'<html:tr><html:td class="sites-layout-tile '
'sites-tile-name-content-1">')
#Footer for the new webpages
HTML_FOOTER = '</html:td></html:tr></html:tbody></html:table></html:div>'
#The template string for each user's html page
TEMPLATE_USER_HTML = ('<h2>Name:</h2><p>%s</p><h2>Gender:</h2><p> %s</p>'
'<h2>Address:</h2><p>%s</p><h2>Email:</h2><p>%s</p>')
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<li>%s</li><br />' % (address_string, address)
for email in profile.email:
if email.primary and email.primary == 'true':
email_string = '%s<li>%s</li><br />' % (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 = '<p>'
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<li><a href="%s">%s</a></li><br />' % (new_html,
site_uri + user_page_name, user_email)
new_html = new_html + '</p>'
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()