diff --git a/ckanext/googleanalytics/plugin.py b/ckanext/googleanalytics/plugin.py index 4ff1646..14fb662 100644 --- a/ckanext/googleanalytics/plugin.py +++ b/ckanext/googleanalytics/plugin.py @@ -21,6 +21,7 @@ class GoogleAnalyticsPlugin(p.SingletonPlugin): p.implements(p.IGenshiStreamFilter, inherit=True) p.implements(p.IRoutes, inherit=True) p.implements(p.IConfigurer, inherit=True) + p.implements(p.ITemplateHelpers) def configure(self, config): '''Load config settings for this extension from config file. @@ -28,25 +29,22 @@ class GoogleAnalyticsPlugin(p.SingletonPlugin): See IConfigurable. ''' - if (not 'googleanalytics.id' in config): + if 'googleanalytics.id' not in config: msg = "Missing googleanalytics.id in config" raise GoogleAnalyticsException(msg) + self.googleanalytics_id = config['googleanalytics.id'] + self.googleanalytics_domain = config.get( + 'googleanalytics.domain', 'auto') + self.googleanalytics_javascript_url = h.url_for_static( + '/scripts/ckanext-googleanalytics.js') + + self.googleanalytics_resource_prefix = config.get( + 'googleanalytics.resource_prefix', commands.DEFAULT_RESOURCE_URL_TAG) - ga_id = config['googleanalytics.id'] - ga_domain = config.get('googleanalytics.domain', 'auto') - js_url = h.url_for_static('/scripts/ckanext-googleanalytics.js') - self.resource_url = config.get('googleanalytics.resource_prefix', - commands.DEFAULT_RESOURCE_URL_TAG) self.show_downloads = converters.asbool( - config.get('googleanalytics.show_downloads', True) - ) + config.get('googleanalytics.show_downloads', True)) self.track_events = converters.asbool( - config.get('googleanalytics.track_events', False) - ) - - self.header_code = genshi.HTML( - gasnippet.header_code % (ga_id, ga_domain)) - self.footer_code = genshi.HTML(gasnippet.footer_code % js_url) + config.get('googleanalytics.track_events', False)) def update_config(self, config): '''Change the CKAN (Pylons) environment configuration. @@ -54,8 +52,12 @@ class GoogleAnalyticsPlugin(p.SingletonPlugin): See IConfigurer. ''' - p.toolkit.add_template_directory(config, 'legacy_templates') - p.toolkit.add_public_directory(config, 'legacy_public') + if converters.asbool(config.get('ckan.legacy_templates', 'false')): + p.toolkit.add_template_directory(config, 'legacy_templates') + p.toolkit.add_public_directory(config, 'legacy_public') + else: + p.toolkit.add_template_directory(config, 'templates') + p.toolkit.add_public_directory(config, 'public') def after_map(self, map): '''Add new routes that this extension's controllers handle. @@ -75,19 +77,26 @@ class GoogleAnalyticsPlugin(p.SingletonPlugin): '''Insert Google Analytics code into legacy Genshi templates. This is called by CKAN whenever any page is rendered, _if_ using old - CKAN 1.x legacy templates. + CKAN 1.x legacy templates. If using new CKAN 2.0 Jinja templates, the + template helper methods below are used instead. See IGenshiStreamFilter. ''' log.info("Inserting Google Analytics code into template") + # Add the Google Analytics tracking code into the page header. + header_code = genshi.HTML(gasnippet.header_code + % (self.googleanalytics_id, self.googleanalytics_domain)) stream = stream | genshi.filters.Transformer('head').append( - self.header_code) + header_code) + # Add the Google Analytics Event Tracking script into the page footer. if self.track_events: + footer_code = genshi.HTML( + gasnippet.footer_code % self.googleanalytics_javascript_url) stream = stream | genshi.filters.Transformer( - 'body/div[@id="scripts"]').append(self.footer_code) + 'body/div[@id="scripts"]').append(footer_code) routes = pylons.request.environ.get('pylons.routes_dict') action = routes.get('action') @@ -103,7 +112,8 @@ class GoogleAnalyticsPlugin(p.SingletonPlugin): def js_attr(name, event): attrs = event[1][1] href = attrs.get('href').encode('utf-8') - link = '%s%s' % (self.resource_url, urllib.quote(href)) + link = '%s%s' % (self.googleanalytics_resource_prefix, + urllib.quote(href)) js = "javascript: _gaq.push(['_trackPageview', '%s']);" % link return js @@ -138,3 +148,40 @@ class GoogleAnalyticsPlugin(p.SingletonPlugin): genshi.HTML(gasnippet.download_style)) return stream + + def get_helpers(self): + '''Return the CKAN 2.0 template helper functions this plugin provides. + + See ITemplateHelpers. + + ''' + return {'googleanalytics_header': self.googleanalytics_header, + 'googleanalytics_footer': self.googleanalytics_footer + } + + def googleanalytics_header(self): + '''Render the googleanalytics_header snippet for CKAN 2.0 templates. + + This is a template helper function that renders the + googleanalytics_header jinja snippet. To be called from the jinja + templates in this extension, see ITemplateHelpers. + + ''' + data = {'googleanalytics_id': self.googleanalytics_id, + 'googleanalytics_domain': self.googleanalytics_domain} + return p.toolkit.render_snippet( + 'googleanalytics/snippets/googleanalytics_header.html', data) + + def googleanalytics_footer(self): + '''Render the googleanalytics_footer snippet for CKAN 2.0 templates. + + If self.track_events is True return the rendered + googleanalytics_footer jinja snippet, otherwise return None. + + This is a template helper function to be called from the jinja + templates in this extension, see ITemplateHelpers. + + ''' + if self.track_events: + return p.toolkit.render_snippet( + 'googleanalytics/snippets/googleanalytics_footer.html') diff --git a/ckanext/googleanalytics/public/scripts/ckanext-googleanalytics.js b/ckanext/googleanalytics/public/scripts/ckanext-googleanalytics.js new file mode 100644 index 0000000..277766a --- /dev/null +++ b/ckanext/googleanalytics/public/scripts/ckanext-googleanalytics.js @@ -0,0 +1,6 @@ +(function ($) { + $(document).ready(function () { + // Google Analytics event tracking + + }); +}(jQuery)); diff --git a/ckanext/googleanalytics/templates/base.html b/ckanext/googleanalytics/templates/base.html new file mode 100644 index 0000000..45fe844 --- /dev/null +++ b/ckanext/googleanalytics/templates/base.html @@ -0,0 +1,15 @@ +{% ckan_extends %} + +{% block links %} + {{ super() }} + {% block googleanalytics_header %} + {{ h.googleanalytics_header() }} + {% endblock %} +{% endblock %} + +{% block scripts %} + {{ super() }} + {% block googleanalytics_footer %} + {{ h.googleanalytics_footer() }} + {% endblock %} +{% endblock %} diff --git a/ckanext/googleanalytics/templates/googleanalytics/snippets/googleanalytics_footer.html b/ckanext/googleanalytics/templates/googleanalytics/snippets/googleanalytics_footer.html new file mode 100644 index 0000000..f3a0773 --- /dev/null +++ b/ckanext/googleanalytics/templates/googleanalytics/snippets/googleanalytics_footer.html @@ -0,0 +1 @@ + diff --git a/ckanext/googleanalytics/templates/googleanalytics/snippets/googleanalytics_header.html b/ckanext/googleanalytics/templates/googleanalytics/snippets/googleanalytics_header.html new file mode 100644 index 0000000..863a1e6 --- /dev/null +++ b/ckanext/googleanalytics/templates/googleanalytics/snippets/googleanalytics_header.html @@ -0,0 +1,11 @@ +