[IMP] Refactoring web_analytics, step 2
authorvta vta@openerp.com <>
Thu, 3 Jan 2013 09:18:21 +0000 (10:18 +0100)
committervta vta@openerp.com <>
Thu, 3 Jan 2013 09:18:21 +0000 (10:18 +0100)
bzr revid: vta@openerp.com-20130103091821-mo57o9oybzpyrzqm

addons/web_analytics/static/src/js/web_analytics.js

index 1f1941b..a25c216 100644 (file)
@@ -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() {},
-    });
-
-    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();
-                });
-            }
         });
     }