Refactoring and tidying Rickshaw code. Placeholder graphs inserted. Front page sparklines are sensibly sorted.
[ckanext-ga-report.git] / ckanext / ga_report / command.py
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)