From a1d18ccb7a338ce01cfe45108a5443aaee96ee6c Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Thu, 3 Jan 2013 10:18:21 +0100 Subject: [PATCH] [IMP] Refactoring web_analytics, step 2 bzr revid: vta@openerp.com-20130103091821-mo57o9oybzpyrzqm --- .../static/src/js/web_analytics.js | 261 +++++++++--------- 1 file changed, 135 insertions(+), 126 deletions(-) diff --git a/addons/web_analytics/static/src/js/web_analytics.js b/addons/web_analytics/static/src/js/web_analytics.js index 1f1941b768b..a25c2169528 100644 --- a/addons/web_analytics/static/src/js/web_analytics.js +++ b/addons/web_analytics/static/src/js/web_analytics.js @@ -3,12 +3,13 @@ var _gaq = _gaq || []; // asynchronous stack used by google analytics openerp.web_analytics = function(instance) { - /** The Google 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 - */ + /* + * The Google 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() { @@ -21,142 +22,150 @@ openerp.web_analytics = function(instance) { })(); instance.web_analytics.Tracker = instance.web.Class.extend({ + /* + * This method initializes the tracker + */ init: function() { - // initialize tracker _gaq.push(['_setAccount', 'UA-35793871-1']); // _gaq.push(['_setAccount', 'UA-7333765-1']); //_gaq.push(['_setAccount', 'UA-36797757-1']); // Debug code _gaq.push(['_setDomainName', 'none']); // Change for the real domain this.initialize_custom(); - instance.client.on('state_pushed', this, on_state_pushed); + instance.client.on('state_pushed', this, this.on_state_pushed); this.include_tracker(); }, - initialize_custom: function() {}, - on_state_pushed: function() {}, - include_tracker: function() {}, + /* + * 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 + */ + initialize_custom: function() { + // Track User Access Level, Custom Variable 4 in GA with visitor level scope + // Values: 'Admin User', 'Normal User', 'Portal User', 'Anonymous User' + if (instance.session.uid === 1) { + _gaq.push(['_setCustomVar', 4, 'User Type', 'Admin User', 1]); + // Make the difference between portal users and anonymous users + } else if (instance.session.username.indexOf('@') !== -1) { + if (instance.session.username.indexOf('anonymous') === -1) { + _gaq.push(['_setCustomVar', 4, 'User Type', 'Portal User', 1]); + } else { + _gaq.push(['_setCustomVar', 4, 'User Type', 'Anonymous User', 1]); + } + } else if (instance.session.username.indexOf('anonymous') !== -1) { + _gaq.push(['_setCustomVar', 4, 'User Type', 'Anonymous User', 1]); + } else { + _gaq.push(['_setCustomVar', 4, 'User Type', 'Normal User', 1]); + } + }, + /* + * This method contains the initialization of the object and view type + * custom variables stored in GA. Setting here the CV will work if web_analytics + * module is auto-install, because the first view of a fresh DB is the modules + * kanban view (also in trial), otherwise the responsibility of the first + * initialization relies on instance.web.ActionManager#ir_actions_client + * method + */ + 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 object usage + _gaq.push(['_setCustomVar', 2, 'Object', state.model, 3]); + // Tack view usage + _gaq.push(['_setCustomVar', 3, 'View Type', state.view_type, 3]); + // Track the page + var url = instance.web_analytics.generateUrl({'model': state.model, 'view_type': state.view_type}); + _gaq.push(['_trackPageview', url]); + } + }, + /* + * This method includes the tracker into view and managers. It can be overriden + * by other modules in order to extend tracking functionalities + */ + include_tracker: function() { + // Track the events related with the creation and the modification of records, + // the view type is always form + instance.web.FormView = instance.web.FormView.extend({ + 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': this.model, 'view_type': 'form'}); + _gaq.push(['_trackEvent', this.model, 'on_button_create_save', url]); + }); + this.on('record_saved', self, function(r) { + var url = instance.web_analytics.generateUrl({'model': this.model, 'view_type': 'form'}); + _gaq.push(['_trackEvent', this.model, 'on_button_edit_save', url]); + }); + } + }); + + // Track client actions, also if not in a fresh DB it initializes the + // CV related to objects and view types + instance.web.ActionManager.include({ + ir_actions_client: function (action, options) { + if (action.res_model) { + _gaq.push(['_setCustomVar', 2, 'Object', action.res_model, 3]); + } else { + _gaq.push(['_setCustomVar', 2, 'Object', action.type, 3]); + } + _gaq.push(['_setCustomVar', 2, 'View Type', action.name, 3]); + var url = instance.web_analytics.generateUrl({'action': action.tag}); + _gaq.push(['_trackPageview', url]); + return this._super.apply(this, arguments); + }, + }); + + // Track button events + instance.web.View.include({ + do_execute_action: function(action_data, dataset, record_id, on_closed) { + console.log(action_data); + 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 label = instance.web_analytics.generateUrl({'model': category, 'view_type': this.view_type}); + _gaq.push(['_trackEvent', category, action, label]); + 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 label = instance.web_analytics.generateUrl(options); + if (error.code) { + _gaq.push(['_trackEvent', error.message, error.data.fault_code, label, ,true]); + } else { + _gaq.push(['_trackEvent', error.type, error.data.debug, label, ,true]); + } + this._super.apply(this, arguments); + }, + }); + }, }); - var init_tracker = function() { - // initialize tracker - _gaq.push(['_setAccount', 'UA-35793871-1']); - // _gaq.push(['_setAccount', 'UA-7333765-1']); - //_gaq.push(['_setAccount', 'UA-36797757-1']); // Debug code - _gaq.push(['_setDomainName', 'none']); // Change for the real domain - - // Track user types - if (instance.session.uid === 1) { - _gaq.push(['_setCustomVar', 1, 'User Type', 'Admin User', 1]); - } else { - _gaq.push(['_setCustomVar', 1, 'User Type', 'Normal User', 1]); - } - }; - - var 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 object usage - _gaq.push(['_setCustomVar', 2, 'Object', state.model, 3]); - // Tack view usage - _gaq.push(['_setCustomVar', 3, 'View Type', state.view_type, 3]); - // Track the page - var url = instance.web_analytics.generateUrl({'model': state.model, 'view_type': state.view_type}); - _gaq.push(['_trackPageview', url]); - } - }; - - var include_tracker = function() { - // include the tracker into views and managers - - // Track the events related with the creation and the modification of records - instance.web.FormView = instance.web.FormView.extend({ - 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': this.model, 'view_type': 'form'}); - _gaq.push(['_trackEvent', this.model, 'on_button_create_save', url]); - }); - this.on('record_saved', self, function(r) { - var url = instance.web_analytics.generateUrl({'model': this.model, 'view_type': 'form'}); - _gaq.push(['_trackEvent', this.model, 'on_button_edit_save', url]); - }); - } - }); - - // Track client actions - instance.web.ActionManager.include({ - ir_actions_client: function (action, options) { - console.log(action); - console.log(options); - var url = instance.web_analytics.generateUrl({'action': action.tag}); - _gaq.push(['_trackPageview', url]); - return this._super.apply(this, arguments); - }, - }); - - // Track button events - instance.web.View.include({ - do_execute_action: function(action_data, dataset, record_id, on_closed) { - console.log(action_data); - 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 label = instance.web_analytics.generateUrl({'model': category, 'view_type': this.view_type}); - _gaq.push(['_trackEvent', category, action, label]); - 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 label = instance.web_analytics.generateUrl(options); - if (error.code) { - _gaq.push(['_trackEvent', error.message, error.data.fault_code, label, ,true]); - } else { - _gaq.push(['_trackEvent', error.type, error.data.debug, label, ,true]); - } - this._super.apply(this, arguments); - }, - }); - }; - - + // Set correctly the tracker in the current instance if (instance.client instanceof instance.web.WebClient) { // not for embedded clients - init_tracker(); - - // Set the account and domain to start tracking - instance.client.on('state_pushed', this, on_state_pushed); - - include_tracker(); + instance.webclient.tracker = new instance.web_analytics.Tracker(); } else if (!instance.client) { // client does not already exists, we are in monodb mode - instance.web.WebClient.include({ init: function() { - init_tracker(); - return this._super.apply(this, arguments); + var d = this._super.apply(this, arguments); + this.tracker = new instance.web_analytics.Tracker(); + return d; }, - start: function() { - var self = this; - return this._super.apply(this, arguments).done(function() { - self.on('state_pushed', self, on_state_pushed); - include_tracker(); - }); - } }); }