1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | import logging import datetime import os from pylons import config from ckan.lib.cli import CkanCommand # No other CKAN imports allowed until _load_config is run, # or logging is disabled class InitDB(CkanCommand): """Initialise the extension's database tables """ summary = __doc__.split('\n')[0] usage = __doc__ max_args = 0 min_args = 0 def command(self): self._load_config() import ckan.model as model model.Session.remove() model.Session.configure(bind=model.meta.engine) log = logging.getLogger('ckanext.ga-report') import ga_model ga_model.init_tables() log.info("DB tables are setup") class GetAuthToken(CkanCommand): """ Get's the Google auth token Usage: paster getauthtoken <credentials_file> Where <credentials_file> is the file name containing the details for the service (obtained from https://code.google.com/apis/console). By default this is set to credentials.json """ summary = __doc__.split('\n')[0] usage = __doc__ max_args = 0 min_args = 0 def command(self): """ In this case we don't want a valid service, but rather just to force the user through the auth flow. We allow this to complete to act as a form of verification instead of just getting the token and assuming it is correct. """ from ga_auth import init_service init_service('token.dat', self.args[0] if self.args else 'credentials.json') class FixTimePeriods(CkanCommand): """ Fixes the 'All' records for GA_Urls It is possible that older urls that haven't recently been visited do not have All records. This command will traverse through those records and generate valid All records for them. """ summary = __doc__.split('\n')[0] usage = __doc__ max_args = 0 min_args = 0 def __init__(self, name): super(FixTimePeriods, self).__init__(name) def command(self): import ckan.model as model from ga_model import post_update_url_stats self._load_config() model.Session.remove() model.Session.configure(bind=model.meta.engine) log = logging.getLogger('ckanext.ga_report') log.info("Updating 'All' records for old URLs") post_update_url_stats() log.info("Processing complete") class LoadAnalytics(CkanCommand): """Get data from Google Analytics API and save it in the ga_model Usage: paster loadanalytics <time-period> Where <time-period> is: all - data for all time latest - (default) just the 'latest' data YYYY-MM - just data for the specific month """ summary = __doc__.split('\n')[0] usage = __doc__ max_args = 1 min_args = 0 def __init__(self, name): super(LoadAnalytics, self).__init__(name) self.parser.add_option('-d', '--delete-first', action='store_true', default=False, dest='delete_first', help='Delete data for the period first') self.parser.add_option('-s', '--skip_url_stats', action='store_true', default=False, dest='skip_url_stats', help='Skip the download of URL data - just do site-wide stats') def command(self): self._load_config() from download_analytics import DownloadAnalytics from ga_auth import (init_service, get_profile_id) ga_token_filepath = os.path.expanduser(config.get('googleanalytics.token.filepath', '')) if not ga_token_filepath: print 'ERROR: In the CKAN config you need to specify the filepath of the ' \ 'Google Analytics token file under key: googleanalytics.token.filepath' return try: svc = init_service(ga_token_filepath, None) except TypeError: print ('Have you correctly run the getauthtoken task and ' 'specified the correct token file in the CKAN config under ' '"googleanalytics.token.filepath"?') return downloader = DownloadAnalytics(svc, profile_id=get_profile_id(svc), delete_first=self.options.delete_first, skip_url_stats=self.options.skip_url_stats) time_period = self.args[0] if self.args else 'latest' if time_period == 'all': downloader.all_() elif time_period == 'latest': downloader.latest() else: # The month to use for_date = datetime.datetime.strptime(time_period, '%Y-%m') downloader.specific_month(for_date) |