Add Analytics Management API sample.

Reviewed in http://codereview.appspot.com/4947041/

Index: samples/analytics/management_v3_reference.py
===================================================================
new file mode 100755
diff --git a/samples/analytics/management_v3_reference.py b/samples/analytics/management_v3_reference.py
new file mode 100644
index 0000000..0ecfc08
--- /dev/null
+++ b/samples/analytics/management_v3_reference.py
@@ -0,0 +1,381 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# 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.
+
+"""Reference command-line example for Google Analytics Management API v3.
+
+This application demonstrates how to use the python client library to access
+all the pieces of data returned by the Google Analytics Management API v3.
+
+The application manages autorization by saving an OAuth2.0 token in a local
+file and reusing the token for subsequent requests. It then traverses the
+Google Analytics Management hiearchy. It first retrieves and prints all the
+authorized user's accounts, next it prints all the web properties for the
+first account, then all the profiles for the first web property and finally
+all the goals for the first profile. The sample then prints all the
+user's advanced segments.
+
+To read an indepth discussion on how this file works, check out the Management
+API Python Getting Started guide here:
+http://code.google.com/apis/analytics/docs/mgmt/v3/mgmtPython.html
+
+Usage:
+
+Before you begin, you should register your application as an installed
+application to get your own Project / OAUth2 Client ID / Secret:
+https://code.google.com/apis/console
+
+Learn more about registering your Analytics Application here:
+http://code.google.com/apis/analytics/docs/mgmt/v3/mgmtPython.html#authorize
+
+  $ python analytics.py
+
+Also you can also get help on all the command-line flags the program
+understands by running:
+
+  $ python analytics.py --help
+"""
+
+__author__ = 'api.nickm@ (Nick Mihailovski)'
+
+import sys
+
+from apiclient.discovery import build
+from apiclient.errors import HttpError
+
+import gflags
+import httplib2
+
+from oauth2client.client import AccessTokenRefreshError
+from oauth2client.client import OAuth2WebServerFlow
+from oauth2client.file import Storage
+from oauth2client.tools import run
+
+FLAGS = gflags.FLAGS
+
+
+# Remember to get your own client_id / client_secret in the
+# Google API developer console: https://code.google.com/apis/console
+FLOW = OAuth2WebServerFlow(
+    client_id='INSERT_YOUR_CLIENT_ID_HERE',
+    client_secret='INSERT_YOUR_CLIENT_SECRET_HERE',
+    scope='https://www.googleapis.com/auth/analytics.readonly',
+    user_agent='analytics-api-v3-awesomeness')
+
+TOKEN_FILE_NAME = 'analytics.dat'
+
+
+def main(argv):
+  # Let the gflags module process the command-line arguments
+  try:
+    argv = FLAGS(argv)
+  except gflags.FlagsError, e:
+    print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS)
+    sys.exit(1)
+
+  # Manage re-using tokens.
+  storage = Storage(TOKEN_FILE_NAME)
+  credentials = storage.get()
+  if not credentials or credentials.invalid:
+    # Get a new token.
+    credentials = run(FLOW, storage)
+
+  # Build an authorized service object.
+  http = httplib2.Http()
+  http = credentials.authorize(http)
+  service = build('analytics', 'v3', http=http)
+
+  # Traverse the Management hiearchy and print results.
+  try:
+    traverse_hiearchy(service)
+
+  except HttpError, error:
+    print ('Arg, there was an API error : %s %s : %s' %
+            (error.resp.status, error.resp.reason, error._get_reason()))
+
+  except AccessTokenRefreshError:
+    print ('The credentials have been revoked or expired, please re-run'
+           'the application to re-authorize')
+
+
+def traverse_hiearchy(service):
+  """Traverses the management API hiearchy and prints results.
+
+  This retrieves and prints the authorized user's accounts. It then
+  retrieves and prints all the web properties for the first account,
+  retrieves and prints all the profiles for the first web property,
+  and retrieves and prints all the goals for the first profile.
+
+  Args:
+    service: The service object built by the Google API Python client library.
+
+  Raises:
+    HttpError: If an error occured when accessing the API.
+    AccessTokenRefreshError: If the current token was invalid.
+  """
+  view = View()
+
+  accounts = service.management().accounts().list().execute()
+
+  view.print_accounts(accounts)
+
+  if accounts.get('items'):
+    firstAccountId = accounts.get('items')[0].get('id')
+    webproperties = service.management().webproperties().list(
+        accountId=firstAccountId).execute()
+
+    view.print_webproperties(webproperties)
+
+    if webproperties.get('items'):
+      firstWebpropertyId = webproperties.get('items')[0].get('id')
+      profiles = service.management().profiles().list(
+          accountId=firstAccountId,
+          webPropertyId=firstWebpropertyId).execute()
+
+      view.print_profiles(profiles)
+
+      if profiles.get('items'):
+        firstProfileId = profiles.get('items')[0].get('id')
+        goals = service.management().goals().list(
+            accountId=firstAccountId,
+            webPropertyId=firstWebpropertyId,
+            profileId=firstProfileId).execute()
+
+        view.print_goals(goals)
+
+  view.print_segments(service.management().segments().list().execute())
+
+
+class View(object):
+  """Utility class to print various Management API collections."""
+
+  def print_accounts(self, accounts_list):
+    """Prints all the account info in the Accounts Collection."""
+
+    print '------ Account Collection -------'
+    self.print_pagination_info(accounts_list)
+    print
+
+    for account in accounts_list.get('items'):
+      print 'Account ID      = %s' % account.get('id')
+      print 'Kind            = %s' % account.get('kind')
+      print 'Self Link       = %s' % account.get('selfLink')
+      print 'Account Name    = %s' % account.get('name')
+      print 'Created         = %s' % account.get('created')
+      print 'Updated         = %s' % account.get('updated')
+
+      child_link = account.get('childLink')
+      print 'Child link href = %s' % child_link.get('href')
+      print 'Child link type = %s' % child_link.get('type')
+      print
+
+  def print_webproperties(self, webproperties_list):
+    """Prints all the web property info in the WebProperties Collection."""
+
+    print '------ Web Properties Collection -------'
+    self.print_pagination_info(webproperties_list)
+    print
+
+    for webproperty in webproperties_list.get('items'):
+      print 'Kind               = %s' % webproperty.get('kind')
+      print 'Account ID         = %s' % webproperty.get('accountId')
+      print 'Web Property ID    = %s' % webproperty.get('id')
+      print ('Internal Web Property ID = %s' %
+             webproperty.get('internalWebPropertyId'))
+
+      print 'Website URL        = %s' % webproperty.get('websiteUrl')
+      print 'Created            = %s' % webproperty.get('created')
+      print 'Updated            = %s' % webproperty.get('updated')
+
+      print 'Self Link          = %s' % webproperty.get('selfLink')
+      parent_link = webproperty.get('parentLink')
+      print 'Parent link href   = %s' % parent_link.get('href')
+      print 'Parent link type   = %s' % parent_link.get('type')
+      child_link = webproperty.get('childLink')
+      print 'Child link href    = %s' % child_link.get('href')
+      print 'Child link type    = %s' % child_link.get('type')
+      print
+
+  def print_profiles(self, profiles_list):
+    """Prints all the profile info in the Profiles Collection."""
+
+    print '------ Profiles Collection -------'
+    self.print_pagination_info(profiles_list)
+    print
+
+    for profile in profiles_list.get('items'):
+      print 'Kind                      = %s' % profile.get('kind')
+      print 'Account ID                = %s' % profile.get('accountId')
+      print 'Web Property ID           = %s' % profile.get('webPropertyId')
+      print ('Internal Web Property ID = %s' %
+             profile.get('internalWebPropertyId'))
+      print 'Profile ID                = %s' % profile.get('id')
+      print 'Profile Name              = %s' % profile.get('name')
+
+      print 'Currency         = %s' % profile.get('currency')
+      print 'Timezone         = %s' % profile.get('timezone')
+      print 'Default Page     = %s' % profile.get('defaultPage')
+
+      print ('Exclude Query Parameters        = %s' %
+             profile.get('excludeQueryParameters'))
+      print ('Site Search Category Parameters = %s' %
+             profile.get('siteSearchCategoryParameters'))
+      print ('Site Search Query Parameters    = %s' %
+             profile.get('siteSearchQueryParameters'))
+
+      print 'Created          = %s' % profile.get('created')
+      print 'Updated          = %s' % profile.get('updated')
+
+      print 'Self Link        = %s' % profile.get('selfLink')
+      parent_link = profile.get('parentLink')
+      print 'Parent link href = %s' % parent_link.get('href')
+      print 'Parent link type = %s' % parent_link.get('type')
+      child_link = profile.get('childLink')
+      print 'Child link href  = %s' % child_link.get('href')
+      print 'Child link type  = %s' % child_link.get('type')
+      print
+
+  def print_goals(self, goals_list):
+    """Prints all the goal info in the Goals Collection."""
+
+    print '------ Goals Collection -------'
+    self.print_pagination_info(goals_list)
+    print
+
+    for goal in goals_list.get('items'):
+      print 'Goal ID     = %s' % goal.get('id')
+      print 'Kind        = %s' % goal.get('kind')
+      print 'Self Link        = %s' % goal.get('selfLink')
+
+      print 'Account ID               = %s' % goal.get('accountId')
+      print 'Web Property ID          = %s' % goal.get('webPropertyId')
+      print ('Internal Web Property ID = %s' %
+             goal.get('internalWebPropertyId'))
+      print 'Profile ID               = %s' % goal.get('profileId')
+
+      print 'Goal Name   = %s' % goal.get('name')
+      print 'Goal Value  = %s' % goal.get('value')
+      print 'Goal Active = %s' % goal.get('active')
+      print 'Goal Type   = %s' % goal.get('type')
+
+      print 'Created     = %s' % goal.get('created')
+      print 'Updated     = %s' % goal.get('updated')
+
+      parent_link = goal.get('parentLink')
+      print 'Parent link href = %s' % parent_link.get('href')
+      print 'Parent link type = %s' % parent_link.get('type')
+
+      # Print the goal details depending on the type of goal.
+      if goal.get('urlDestinationDetails'):
+        self.print_url_destination_goal_details(
+            goal.get('urlDestinationDetails'))
+
+      elif goal.get('visitTimeOnSiteDetails'):
+        self.print_visit_time_on_site_goal_details(
+            goal.get('visitTimeOnSiteDetails'))
+
+      elif goal.get('visitNumPagesDetails'):
+        self.print_visit_num_pages_goal_details(
+            goal.get('visitNumPagesDetails'))
+
+      elif goal.get('eventDetails'):
+        self.print_event_goal_details(goal.get('eventDetails'))
+
+      print
+
+  def print_url_destination_goal_details(self, goal_details):
+    """Prints all the URL Destination goal type info."""
+
+    print '------ Url Destination Goal -------'
+    print 'Goal URL            = %s' % goal_details.get('url')
+    print 'Case Sensitive      = %s' % goal_details.get('caseSensitive')
+    print 'Match Type          = %s' % goal_details.get('matchType')
+    print 'First Step Required = %s' % goal_details.get('firstStepRequired')
+
+    print '------ Url Destination Goal Steps -------'
+    if goal_details.get('steps'):
+      for goal_step in goal_details.get('steps'):
+        print 'Step Number  = %s' % goal_step.get('number')
+        print 'Step Name    = %s' % goal_step.get('name')
+        print 'Step URL     = %s' % goal_step.get('url')
+    else:
+      print 'No Steps Configured'
+
+  def print_visit_time_on_site_goal_details(self, goal_details):
+    """Prints all the Visit Time On Site goal type info."""
+
+    print '------ Visit Time On Site Goal -------'
+    print 'Comparison Type  = %s' % goal_details.get('comparisonType')
+    print 'comparison Value = %s' % goal_details.get('comparisonValue')
+
+  def print_visit_num_pages_goal_details(self, goal_details):
+    """Prints all the Visit Num Pages goal type info."""
+
+    print '------ Visit Num Pages Goal -------'
+    print 'Comparison Type  = %s' % goal_details.get('comparisonType')
+    print 'comparison Value = %s' % goal_details.get('comparisonValue')
+
+  def print_event_goal_details(self, goal_details):
+    """Prints all the Event goal type info."""
+
+    print '------ Event Goal -------'
+    print 'Use Event Value  = %s' % goal_details.get('useEventValue')
+
+    for event_condition in goal_details.get('eventConditions'):
+      event_type = event_condition.get('type')
+      print 'Type             = %s' % event_type
+
+      if event_type in ('CATEGORY', 'ACTION', 'LABEL'):
+        print 'Match Type       = %s' % event_condition.get('matchType')
+        print 'Expression       = %s' % event_condition.get('expression')
+      else:  # VALUE type.
+        print 'Comparison Type  = %s' % event_condition.get('comparisonType')
+        print 'Comparison Value = %s' % event_condition.get('comparisonValue')
+
+  def print_segments(self, segments_list):
+    """Prints all the segment info in the Segments Collection."""
+
+    print '------ Segments Collection -------'
+    self.print_pagination_info(segments_list)
+    print
+
+    for segment in segments_list.get('items'):
+      print 'Segment ID = %s' % segment.get('id')
+      print 'Kind       = %s' % segment.get('kind')
+      print 'Self Link  = %s' % segment.get('selfLink')
+      print 'Name       = %s' % segment.get('name')
+      print 'Definition = %s' % segment.get('definition')
+      print 'Created    = %s' % segment.get('created')
+      print 'Updated    = %s' % segment.get('updated')
+      print
+
+  def print_pagination_info(self, mgmt_list):
+    """Prints common pagination details."""
+
+    print 'Items per page = %s' % mgmt_list.get('itemsPerPage')
+    print 'Total Results  = %s' % mgmt_list.get('totalResults')
+    print 'Start Index    = %s' % mgmt_list.get('startIndex')
+
+    # These only have values if other result pages exist.
+    if mgmt_list.get('previousLink'):
+      print 'Previous Link  = %s' % mgmt_list.get('previousLink')
+    if mgmt_list.get('nextLink'):
+      print 'Next Link      = %s' % mgmt_list.get('nextLink')
+
+
+if __name__ == '__main__':
+  main(sys.argv)
+