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() {
})();
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() {},
- });
-
- 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};
+ /*
+ * 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 {
- options = {'action': params.action};
+ _gaq.push(['_setCustomVar', 4, 'User Type', 'Anonymous User', 1]);
}
- 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]);
+ } 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]);
+ });
}
- this._super.apply(this, arguments);
- },
- });
- };
-
+ });
+
+ // 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);
+ },
+ });
+ },
+ });
+ // 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();
- });
- }
});
}