--- a/ckanext/ga_report/ga_auth.py +++ b/ckanext/ga_report/ga_auth.py @@ -1,3 +1,4 @@ +import os import httplib2 from apiclient.discovery import build from oauth2client.client import flow_from_clientsecrets @@ -7,12 +8,12 @@ from pylons import config -def _prepare_credentials( token_filename, credentials_filename ): +def _prepare_credentials(token_filename, credentials_filename): """ Either returns the user's oauth credentials or uses the credentials file to generate a token (by forcing the user to login in the browser) """ - storage = Storage( token_filename ) + storage = Storage(token_filename) credentials = storage.get() if credentials is None or credentials.invalid: @@ -23,7 +24,8 @@ return credentials -def init_service( token_file, credentials_file ): + +def init_service(token_file, credentials_file): """ Given a file containing the user's oauth token (and another with credentials in case we need to generate the token) will return a @@ -34,21 +36,34 @@ credentials = _prepare_credentials(token_file, credentials_file) http = credentials.authorize(http) # authorize the http object - return build('analytics', 'v3', http=http) + return credentials.access_token, build('analytics', 'v3', http=http) def get_profile_id(service): """ Get the profile ID for this user and the service specified by the - 'googleanalytics.id' configuration option. + 'googleanalytics.id' configuration option. This function iterates + over all of the accounts available to the user who invoked the + service to find one where the account name matches (in case the + user has several). """ accounts = service.management().accounts().list().execute() if not accounts.get('items'): return None - accountId = accounts.get('items')[0].get('id') + accountName = config.get('googleanalytics.account') + if not accountName: + raise Exception('googleanalytics.account needs to be configured') webPropertyId = config.get('googleanalytics.id') + if not webPropertyId: + raise Exception('googleanalytics.id needs to be configured') + for acc in accounts.get('items'): + if acc.get('name') == accountName: + accountId = acc.get('id') + + webproperties = service.management().webproperties().list(accountId=accountId).execute() + profiles = service.management().profiles().list( accountId=accountId, webPropertyId=webPropertyId).execute() @@ -56,3 +71,4 @@ return profiles.get('items')[0].get('id') return None +