From 4f16b7191059977cbd19f25c38e8a4029395ea2e Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Tue, 23 Oct 2012 12:15:09 +0200 Subject: [PATCH] [ADD] Added basic skel. bzr revid: vta@openerp.com-20121023101509-5hyjjanz89pj1qbh --- addons/saas_analytics/__init__.py | 0 addons/saas_analytics/__openerp__.py | 41 ++++++++++++++ addons/saas_analytics/controllers/__init__.py | 3 ++ addons/saas_analytics/controllers/main.py | 32 +++++++++++ .../saas_analytics/static/src/img/icon128.png | Bin 0 -> 11486 bytes .../static/src/js/web_analytics.js | 50 ++++++++++++++++++ 6 files changed, 126 insertions(+) create mode 100644 addons/saas_analytics/__init__.py create mode 100644 addons/saas_analytics/__openerp__.py create mode 100644 addons/saas_analytics/controllers/__init__.py create mode 100644 addons/saas_analytics/controllers/main.py create mode 100644 addons/saas_analytics/static/src/img/icon128.png create mode 100644 addons/saas_analytics/static/src/js/web_analytics.js diff --git a/addons/saas_analytics/__init__.py b/addons/saas_analytics/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/addons/saas_analytics/__openerp__.py b/addons/saas_analytics/__openerp__.py new file mode 100644 index 00000000000..d8ee68a2d9d --- /dev/null +++ b/addons/saas_analytics/__openerp__.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010-2012 OpenERP s.a. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +{ + 'name': 'Google Analytics', + 'version': '1.0', + 'category': 'Tools', + 'complexity': "easy", + 'description': """ +Google Analytics. +============================== + +Collects web application usage with Google Analytics. + """, + 'author': 'OpenERP SA', + 'website': 'http://openerp.com', + 'depends': ['web'], + 'icon': '/web_analytics/static/src/img/icon128.png', + 'data': [], + 'installable': True, + 'active': False, + 'js': ['static/src/js/web_analytics.js'], +} + diff --git a/addons/saas_analytics/controllers/__init__.py b/addons/saas_analytics/controllers/__init__.py new file mode 100644 index 00000000000..9f828025b8e --- /dev/null +++ b/addons/saas_analytics/controllers/__init__.py @@ -0,0 +1,3 @@ +import main + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/saas_analytics/controllers/main.py b/addons/saas_analytics/controllers/main.py new file mode 100644 index 00000000000..81ca3417255 --- /dev/null +++ b/addons/saas_analytics/controllers/main.py @@ -0,0 +1,32 @@ +import json +import textwrap + +import simplejson +import werkzeug.wrappers + +import web.common.http as openerpweb +import web.controllers.main + +class web_analytics(openerpweb.Controller): + + # This controllers redirects virtual urls of the form /web_analytics/MODEL/VIEW + # as provided to google by the analytics modules to a real url that openerp can + # understand of the form /web/webclient/home/#model=MODEL&view_type=VIEW + # So that the user can click openerp urls inside google analytics. + + @openerpweb.httprequest + def redirect(self,req): + url = req.httprequest.base_url + suburl = url.split('/') + suburl = suburl[suburl.index('redirect')+1:] + + rurl = "/web/webclient/home/#" + if len(suburl) >=1 and suburl[0]: + rurl += "model="+str(suburl[0]) + if len(suburl) >=2 and suburl[1]: + rurl += "&view_type="+str(suburl[1]) + + redirect = werkzeug.utils.redirect(rurl, 303) + + return redirect + diff --git a/addons/saas_analytics/static/src/img/icon128.png b/addons/saas_analytics/static/src/img/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..320c1f3ec34c5c73d10b512d4a1bf03d87d85f33 GIT binary patch literal 11486 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 ve3UPGXiZo(TM7KX)R%>XS1df+3;7