diff options
Diffstat (limited to 'addons/web_analytics/static/src/js/web_analytics.js')
| -rw-r--r-- | addons/web_analytics/static/src/js/web_analytics.js | 532 |
1 files changed, 269 insertions, 263 deletions
diff --git a/addons/web_analytics/static/src/js/web_analytics.js b/addons/web_analytics/static/src/js/web_analytics.js index c8212f4d213..a81275d1b74 100644 --- a/addons/web_analytics/static/src/js/web_analytics.js +++ b/addons/web_analytics/static/src/js/web_analytics.js @@ -1,290 +1,296 @@ var _gaq = _gaq || []; // asynchronous stack used by google analytics -openerp.web_analytics = function(instance) { +odoo.define('web_analytics.web_analytics', ['web.ActionManager', 'web.core', 'web.CrashManager', 'web.FormView', 'web.Session', 'web.session', 'web.View', 'web.web_client', 'web.WebClient'], function (require) { +"use strict"; - /* - * The Web Analytics Module inserts the Google Analytics JS Snippet - * at the top of the page, and sends to google an url each time the - * openerp url is changed. - * The pushes of the urls is made by triggering the 'state_pushed' event in the - * web_client.do_push_state() method which is responsible of changing the openerp current url - */ +var ActionManager = require('web.ActionManager'); +var CrashManager = require('web.CrashManager'); +var core = require('web.core'); +var FormView = require('web.FormView'); +var Session = require('web.Session'); +var session = require('web.session'); +var View = require('web.View'); +var web_client = require('web.web_client'); +var WebClient = require('web.WebClient'); + +/* +* The Web Analytics Module inserts the Google Analytics JS Snippet +* at the top of the page, and sends to google an url each time the +* openerp url is changed. +* The pushes of the urls is made by triggering the 'state_pushed' event in the +* web_client.do_push_state() method which is responsible of changing the openerp current url +*/ - // Google Analytics Code snippet - (function() { - var ga = document.createElement('script'); - ga.type = 'text/javascript'; - ga.async = true; - ga.src = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; - s.parentNode.insertBefore(ga,s); - })(); +// Google Analytics Code snippet +(function() { + var ga = document.createElement('script'); + ga.type = 'text/javascript'; + ga.async = true; + ga.src = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; + s.parentNode.insertBefore(ga,s); +})(); - instance.web_analytics.Tracker = instance.web.Class.extend({ - /* - * This method initializes the tracker - */ - init: function(webclient) { - var self = this; - self.initialized = $.Deferred(); - _gaq.push(['_setAccount', 'UA-7333765-1']); - _gaq.push(['_setDomainName', '.openerp.com']); // Allow multi-domain - self.initialize_custom(webclient).then(function() { - webclient.on('state_pushed', self, self.on_state_pushed); - self.include_tracker(); +var Tracker = core.Class.extend({ + /* + * This method initializes the tracker + */ + init: function(webclient) { + var self = this; + self.initialized = $.Deferred(); + _gaq.push(['_setAccount', 'UA-7333765-1']); + _gaq.push(['_setDomainName', '.openerp.com']); // Allow multi-domain + self.initialize_custom(webclient).then(function() { + webclient.on('state_pushed', self, self.on_state_pushed); + self.include_tracker(); + }); + }, + /* + * This method MUST be overriden by saas_demo and saas_trial in order to + * set the correct user type. By default, the user connected is local to + * the DB (like in accounts). + */ + _get_user_type: function() { + return 'Local User'; + }, + /* + * This method gets the user access level, to be used as CV in GA + */ + _get_user_access_level: function() { + if (!session.session_is_valid()) { + return "Unauthenticated User"; + } + if (session.uid === 1) { + return 'Admin User'; + } + // Make the difference between portal users and anonymous users + if (session.username.indexOf('@') !== -1) { + return 'Portal User'; + } + if (session.username === 'anonymous') { + return 'Anonymous User'; + } + return 'Normal User'; + }, + + /* + * This method contains the initialization of all user-related custom variables + * stored in GA. Also other modules can override it to add new custom variables + * Must be followed by a call to _push_*() in order to actually send the data + * to GA. + */ + initialize_custom: function() { + var self = this; + session.rpc("/web/webclient/version_info", {}) + .done(function(res) { + _gaq.push(['_setCustomVar', 5, 'Version', res.server_version, 3]); + self._push_customvars(); + self.initialized.resolve(self); }); - }, - /* - * This method MUST be overriden by saas_demo and saas_trial in order to - * set the correct user type. By default, the user connected is local to - * the DB (like in accounts). - */ - _get_user_type: function() { - return 'Local User'; - }, - /* - * This method gets the user access level, to be used as CV in GA - */ - _get_user_access_level: function() { - if (!instance.session.session_is_valid()) { - return "Unauthenticated User"; - } - if (instance.session.uid === 1) { - return 'Admin User'; - } - // Make the difference between portal users and anonymous users - if (instance.session.username.indexOf('@') !== -1) { - return 'Portal User'; - } - if (instance.session.username === 'anonymous') { - return 'Anonymous User'; - } - return 'Normal User'; - }, - - /* - * This method contains the initialization of all user-related custom variables - * stored in GA. Also other modules can override it to add new custom variables - * Must be followed by a call to _push_*() in order to actually send the data - * to GA. - */ - initialize_custom: function() { - var self = this; - instance.session.rpc("/web/webclient/version_info", {}) - .done(function(res) { - _gaq.push(['_setCustomVar', 5, 'Version', res.server_version, 3]); - self._push_customvars(); - self.initialized.resolve(self); - }); - return self.initialized; - }, + return self.initialized; + }, - /* - * Method called in order to send _setCustomVar to GA - */ - _push_customvars: function() { - var self = this; - // Track User Access Level, Custom Variable 4 in GA with visitor level scope - // Values: 'Admin User', 'Normal User', 'Portal User', 'Anonymous User' - _gaq.push(['_setCustomVar', 4, 'User Access Level', self._get_user_access_level(), 1]); + /* + * Method called in order to send _setCustomVar to GA + */ + _push_customvars: function() { + var self = this; + // Track User Access Level, Custom Variable 4 in GA with visitor level scope + // Values: 'Admin User', 'Normal User', 'Portal User', 'Anonymous User' + _gaq.push(['_setCustomVar', 4, 'User Access Level', self._get_user_access_level(), 1]); - // Track User Type Conversion, Custom Variable 3 in GA with session level scope - // Values: 'Visitor', 'Demo', 'Online Trial', 'Online Paying', 'Local User' - _gaq.push(['_setCustomVar', 1, 'User Type Conversion', self._get_user_type(), 2]); - }, - - /* - * Method called in order to send _trackPageview to GA - */ - _push_pageview: function(url) { - _gaq.push(['_trackPageview', url]); - }, - /* - * Method called in order to send _trackEvent to GA - */ - _push_event: function(options) { - _gaq.push(['_trackEvent', - options.category, - options.action, - options.label, - options.value, - options.noninteraction - ]); - }, - /* - * Method called in order to send ecommerce transactions to GA - */ - _push_ecommerce: function(trans_data, item_list) { - _gaq.push(['_addTrans', - trans_data.order_id, - trans_data.store_name, - trans_data.total, - trans_data.tax, - trans_data.shipping, - trans_data.city, - trans_data.state, - trans_data.country, + // Track User Type Conversion, Custom Variable 3 in GA with session level scope + // Values: 'Visitor', 'Demo', 'Online Trial', 'Online Paying', 'Local User' + _gaq.push(['_setCustomVar', 1, 'User Type Conversion', self._get_user_type(), 2]); + }, + + /* + * Method called in order to send _trackPageview to GA + */ + _push_pageview: function(url) { + _gaq.push(['_trackPageview', url]); + }, + /* + * Method called in order to send _trackEvent to GA + */ + _push_event: function(options) { + _gaq.push(['_trackEvent', + options.category, + options.action, + options.label, + options.value, + options.noninteraction + ]); + }, + /* + * Method called in order to send ecommerce transactions to GA + */ + _push_ecommerce: function(trans_data, item_list) { + _gaq.push(['_addTrans', + trans_data.order_id, + trans_data.store_name, + trans_data.total, + trans_data.tax, + trans_data.shipping, + trans_data.city, + trans_data.state, + trans_data.country, + ]); + _.each(item_list, function(item) { + _gaq.push(['_addItem', + item.order_id, + item.sku, + item.name, + item.category, + item.price, + item.quantity, ]); - _.each(item_list, function(item) { - _gaq.push(['_addItem', - item.order_id, - item.sku, - item.name, - item.category, - item.price, - item.quantity, - ]); - }); - _gaq.push(['_trackTrans']); - }, - /* - * This method contains the initialization of the object and view type - * as an event in GA. - */ - on_state_pushed: function(state) { - // Track only pages corresponding to a 'normal' view of OpenERP, views - // related to client actions are tracked by the action manager - if (state.model && state.view_type) { - // Track the page - var url = instance.web_analytics.generateUrl({'model': state.model, 'view_type': state.view_type}); - this._push_event({ - 'category': state.model, - 'action': state.view_type, - 'label': url, - }); - this._push_pageview(url); - } - }, - /* - * This method includes the tracker into views and managers. It can be overriden - * by other modules in order to extend tracking functionalities - */ - include_tracker: function() { - var t = this; - // Track the events related with the creation and the modification of records, - // the view type is always form - instance.web.FormView.include({ - init: function(parent, dataset, view_id, options) { - this._super.apply(this, arguments); - var self = this; - this.on('record_created', self, function(r) { - var url = instance.web_analytics.generateUrl({'model': self.model, 'view_type': 'form'}); - t._push_event({ - 'category': self.model, - 'action': 'create', - 'label': url, - 'noninteraction': true, - }); - }); - this.on('record_saved', self, function(r) { - var url = instance.web_analytics.generateUrl({'model': self.model, 'view_type': 'form'}); - t._push_event({ - 'category': self.model, - 'action': 'save', - 'label': url, - 'noninteraction': true, - }); - }); - } - }); - - // Track client actions - instance.web.ActionManager.include({ - ir_actions_client: function (action, options) { - var url = instance.web_analytics.generateUrl({'action': action.tag}); - t._push_event({ - 'category': action.type, - 'action': action.tag, - 'label': url, - }); - t._push_pageview(url); - return this._super.apply(this, arguments); - }, + }); + _gaq.push(['_trackTrans']); + }, + /* + * This method contains the initialization of the object and view type + * as an event in GA. + */ + on_state_pushed: function(state) { + // Track only pages corresponding to a 'normal' view of OpenERP, views + // related to client actions are tracked by the action manager + if (state.model && state.view_type) { + // Track the page + var url = generateUrl({'model': state.model, 'view_type': state.view_type}); + this._push_event({ + 'category': state.model, + 'action': state.view_type, + 'label': url, }); - - // Track button events - instance.web.View.include({ - do_execute_action: function(action_data, dataset, record_id, on_closed) { - var category = this.model || dataset.model || ''; - var action; - if (action_data.name && _.isNaN(action_data.name-0)) { - action = action_data.name; - } else { - action = action_data.string || action_data.special || ''; - } - var url = instance.web_analytics.generateUrl({'model': category, 'view_type': this.view_type}); + this._push_pageview(url); + } + }, + /* + * This method includes the tracker into views and managers. It can be overriden + * by other modules in order to extend tracking functionalities + */ + include_tracker: function() { + var t = this; + // Track the events related with the creation and the modification of records, + // the view type is always form + FormView.include({ + init: function(parent, dataset, view_id, options) { + this._super.apply(this, arguments); + var self = this; + this.on('record_created', self, function(r) { + var url = generateUrl({'model': self.model, 'view_type': 'form'}); t._push_event({ - 'category': category, - 'action': action, + 'category': self.model, + 'action': 'create', 'label': url, 'noninteraction': true, }); - return this._super.apply(this, arguments); - }, - }); - - // Track error events - instance.web.CrashManager.include({ - show_error: function(error) { - var hash = window.location.hash; - var params = $.deparam(hash.substr(hash.indexOf('#')+1)); - var options = {}; - if (params.model && params.view_type) { - options = {'model': params.model, 'view_type': params.view_type}; - } else { - options = {'action': params.action}; - } - var url = instance.web_analytics.generateUrl(options); + }); + this.on('record_saved', self, function(r) { + var url = generateUrl({'model': self.model, 'view_type': 'form'}); t._push_event({ - 'category': options.model || "ir.actions.client", - 'action': "error " + (error.code ? error.message + error.data.message : error.type + error.data.debug), + 'category': self.model, + 'action': 'save', 'label': url, 'noninteraction': true, }); - this._super.apply(this, arguments); - }, - }); - }, - }); + }); + } + }); - // ---------------------------------------------------------------- - // utility functions - // ---------------------------------------------------------------- + // Track client actions + ActionManager.include({ + ir_actions_client: function (action, options) { + var url = generateUrl({'action': action.tag}); + t._push_event({ + 'category': action.type, + 'action': action.tag, + 'label': url, + }); + t._push_pageview(url); + return this._super.apply(this, arguments); + }, + }); - instance.web_analytics.generateUrl = function(options) { - var url = ''; - var keys = _.keys(options); - keys = _.sortBy(keys, function(i) { return i;}); - _.each(keys, function(key) { - url += '/' + key + '/' + options[key]; + // Track button events + View.include({ + do_execute_action: function(action_data, dataset, record_id, on_closed) { + var category = this.model || dataset.model || ''; + var action; + if (action_data.name && _.isNaN(action_data.name-0)) { + action = action_data.name; + } else { + action = action_data.string || action_data.special || ''; + } + var url = generateUrl({'model': category, 'view_type': this.view_type}); + t._push_event({ + 'category': category, + 'action': action, + 'label': url, + 'noninteraction': true, + }); + return this._super.apply(this, arguments); + }, }); - return url; - }; - // kept for API compatibility - instance.web_analytics.setupTracker = function(wc) { - return wc.tracker.initialized; - }; + // Track error events + CrashManager.include({ + show_error: function(error) { + var hash = window.location.hash; + var params = $.deparam(hash.substr(hash.indexOf('#')+1)); + var options = {}; + if (params.model && params.view_type) { + options = {'model': params.model, 'view_type': params.view_type}; + } else { + options = {'action': params.action}; + } + var url = generateUrl(options); + t._push_event({ + 'category': options.model || "ir.actions.client", + 'action': "error " + (error.code ? error.message + error.data.message : error.type + error.data.debug), + 'label': url, + 'noninteraction': true, + }); + this._super.apply(this, arguments); + }, + }); + }, +}); - instance.web.Client.include({ - bind_events: function() { - this._super.apply(this, arguments); - this.tracker = new instance.web_analytics.Tracker(this); - }, - }); +// ---------------------------------------------------------------- +// utility functions +// ---------------------------------------------------------------- - instance.web.Session.include({ - session_authenticate: function() { - return $.when(this._super.apply(this, arguments)).then(function() { - // the call to bind_events() may have been delayed in some embed - // cases, and when that happens we can skip the push, as the - // proper one will be done when bind_event is eventually called. - if (instance.client && instance.client.tracker) { - instance.client.tracker._push_customvars(); - } - }); - }, +var generateUrl = function(options) { + var url = ''; + var keys = _.keys(options); + keys = _.sortBy(keys, function(i) { return i;}); + _.each(keys, function(key) { + url += '/' + key + '/' + options[key]; }); - + return url; +}; + +// kept for API compatibility +var setupTracker = function(wc) { + return wc.tracker.initialized; }; + +WebClient.include({ + bind_events: function() { + this._super.apply(this, arguments); + this.tracker = new Tracker(this); + }, +}); + +Session.include({ + session_authenticate: function() { + return $.when(this._super.apply(this, arguments)).then(function() { + web_client.tracker._push_customvars(); + }); + }, +}); + +}); |
