summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGéry Debongnie <ged@odoo.com>2016-05-25 12:18:48 +0200
committerGéry Debongnie <ged@odoo.com>2016-05-30 09:23:07 +0200
commit9c68bc74827864a3c6c21be8ead1b2ed3d122d73 (patch)
treee9dec0618783fbce6d12e89369fa064c63dc886b
parent2a8a17024d2b46f3f8837a8672334a7dff3abd1b (diff)
[REF] point_of_sale,web(site): move session info into page source
This commit introduces a mechanism to add information into the session from a different module, without having to fetch it manually with a rpc. This is intended to be used with small pieces of info required at the start of the web client, such as currency informations. To add information to the session, one can simply inherit from ir.http and modify the session_info method.
-rw-r--r--addons/point_of_sale/controllers/main.py6
-rw-r--r--addons/point_of_sale/views/pos_templates.xml13
-rw-r--r--addons/web/__init__.py1
-rw-r--r--addons/web/controllers/main.py29
-rw-r--r--addons/web/models/__init__.py3
-rw-r--r--addons/web/models/ir_http.py21
-rw-r--r--addons/web/static/src/js/boot.js5
-rw-r--r--addons/web/static/src/js/framework/core.js5
-rw-r--r--addons/web/static/src/js/framework/session.js11
-rw-r--r--addons/web/static/test/evals.js22
-rw-r--r--addons/web/views/webclient_templates.xml15
-rw-r--r--addons/website/views/website_templates.xml14
12 files changed, 81 insertions, 64 deletions
diff --git a/addons/point_of_sale/controllers/main.py b/addons/point_of_sale/controllers/main.py
index cd4d91b56c9..f4af63e4c61 100644
--- a/addons/point_of_sale/controllers/main.py
+++ b/addons/point_of_sale/controllers/main.py
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
+import json
import logging
import werkzeug.utils
@@ -17,4 +18,7 @@ class PosController(http.Controller):
if not pos_sessions:
return werkzeug.utils.redirect('/web#action=point_of_sale.action_client_pos_menu')
pos_sessions.login()
- return request.render('point_of_sale.index')
+ context = {
+ 'session_info': json.dumps(request.env['ir.http'].session_info())
+ }
+ return request.render('point_of_sale.index', qcontext=context)
diff --git a/addons/point_of_sale/views/pos_templates.xml b/addons/point_of_sale/views/pos_templates.xml
index 64ab2220d9a..3d45d8e3fd5 100644
--- a/addons/point_of_sale/views/pos_templates.xml
+++ b/addons/point_of_sale/views/pos_templates.xml
@@ -23,6 +23,13 @@
<link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon"/>
+ <script type="text/javascript">
+ var odoo = {
+ csrf_token: "<t t-esc="request.csrf_token(None)"/>",
+ session_info: <t t-raw="session_info"/>,
+ };
+ </script>
+
<t t-call-assets="web.assets_common" t-css="false"/>
<t t-call-assets="web.assets_backend" t-css="false"/>
<t t-call-assets="web_editor.summernote" t-css="false"/>
@@ -45,12 +52,6 @@
});
return web_client;
});
-
- odoo.define('web.csrf', function (require) {
- var token = "<t t-esc="request.csrf_token(None)"/>";
- require('web.core').csrf_token = token;
- require('qweb').default_dict.csrf_token = token;
- });
</script>
</head>
<body>
diff --git a/addons/web/__init__.py b/addons/web/__init__.py
index 71b16f2ea19..b5b73c87bbb 100644
--- a/addons/web/__init__.py
+++ b/addons/web/__init__.py
@@ -6,3 +6,4 @@ sys.modules['openerp.addons.web.http'] = openerp.http
http = openerp.http
import controllers
+import models
diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py
index 03c6cd75b08..1dc945692c6 100644
--- a/addons/web/controllers/main.py
+++ b/addons/web/controllers/main.py
@@ -447,15 +447,19 @@ class Home(http.Controller):
return werkzeug.utils.redirect(kw.get('redirect'), 303)
request.uid = request.session.uid
- menu_data = request.registry['ir.ui.menu'].load_menus(request.cr, request.uid, request.debug, context=request.context)
version_info = openerp.service.common.exp_version()
db_info = {
'server_version': version_info.get('server_version'),
'server_version_info': version_info.get('server_version_info'),
}
+ context = {
+ 'db_info': json.dumps(db_info),
+ 'menu_data': request.registry['ir.ui.menu'].load_menus(request.cr, request.uid, request.debug, context=request.context),
+ 'session_info': json.dumps(request.env['ir.http'].session_info()),
+ }
- return request.render('web.webclient_bootstrap', qcontext={'menu_data': menu_data, 'db_info': json.dumps(db_info)})
+ return request.render('web.webclient_bootstrap', qcontext=context)
@http.route('/web/dbredirect', type='http', auth="none")
def web_db_redirect(self, redirect='/', **kw):
@@ -712,32 +716,17 @@ class Database(http.Controller):
class Session(http.Controller):
- def session_info(self):
- request.session.ensure_valid()
- user = request.env.user
- display_switch_company_menu = user.has_group('base.group_multi_company') and len(user.company_ids) > 1
- return {
- "session_id": request.session_id,
- "uid": request.session.uid,
- "user_context": request.session.get_context() if request.session.uid else {},
- "db": request.session.db,
- "username": request.session.login,
- "company_id": request.env.user.company_id.id if request.session.uid else None,
- "partner_id": request.env.user.partner_id.id if request.session.uid and request.env.user.partner_id else None,
- "user_companies": {'current_company': (user.company_id.id, user.company_id.name), 'allowed_companies': [(comp.id, comp.name) for comp in user.company_ids]} if display_switch_company_menu else False,
- }
-
@http.route('/web/session/get_session_info', type='json', auth="none")
def get_session_info(self):
+ request.session.check_security()
request.uid = request.session.uid
request.disable_db = False
- return self.session_info()
+ return request.env['ir.http'].session_info()
@http.route('/web/session/authenticate', type='json', auth="none")
def authenticate(self, db, login, password, base_location=None):
request.session.authenticate(db, login, password)
-
- return self.session_info()
+ return request.env['ir.http'].session_info()
@http.route('/web/session/change_password', type='json', auth="user")
def change_password(self, fields):
diff --git a/addons/web/models/__init__.py b/addons/web/models/__init__.py
new file mode 100644
index 00000000000..8d297897934
--- /dev/null
+++ b/addons/web/models/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+import ir_http
diff --git a/addons/web/models/ir_http.py b/addons/web/models/ir_http.py
new file mode 100644
index 00000000000..cbb83ec40e2
--- /dev/null
+++ b/addons/web/models/ir_http.py
@@ -0,0 +1,21 @@
+from openerp import models
+from openerp.http import request
+
+
+class Http(models.Model):
+ _inherit = 'ir.http'
+
+ def session_info(self):
+ user = request.env.user
+ display_switch_company_menu = user.has_group('base.group_multi_company') and len(user.company_ids) > 1
+ return {
+ "session_id": request.session_id,
+ "uid": request.session.uid,
+ "user_context": request.session.get_context() if request.session.uid else {},
+ "db": request.session.db,
+ "username": request.session.login,
+ "name": user.name,
+ "company_id": request.env.user.company_id.id if request.session.uid else None,
+ "partner_id": request.env.user.partner_id.id if request.session.uid and request.env.user.partner_id else None,
+ "user_companies": {'current_company': (user.company_id.id, user.company_id.name), 'allowed_companies': [(comp.id, comp.name) for comp in user.company_ids]} if display_switch_company_menu else False,
+ }
diff --git a/addons/web/static/src/js/boot.js b/addons/web/static/src/js/boot.js
index 666520b263d..2cc4abe29bb 100644
--- a/addons/web/static/src/js/boot.js
+++ b/addons/web/static/src/js/boot.js
@@ -47,7 +47,8 @@
var debug = ($.deparam($.param.querystring()).debug !== undefined);
- var odoo = window.odoo = {
+ var odoo = window.odoo = window.odoo || {};
+ _.extend(odoo, {
testing: typeof QUnit === "object",
debug: debug,
remaining_jobs: jobs,
@@ -253,7 +254,7 @@
return services;
}
- };
+ });
// automatically log errors detected when loading modules
var log_when_loaded = function () {
diff --git a/addons/web/static/src/js/framework/core.js b/addons/web/static/src/js/framework/core.js
index f9ab78f1c8e..1c8b55ee377 100644
--- a/addons/web/static/src/js/framework/core.js
+++ b/addons/web/static/src/js/framework/core.js
@@ -91,6 +91,8 @@ _.extend(qweb.default_dict, {
'moment': function(date) { return new moment(date); },
});
+qweb.default_dict.csrf_token = odoo.csrf_token;
+
qweb.preprocess_node = function() {
// Note that 'this' is the Qweb Node
switch (this.node.nodeType) {
@@ -187,7 +189,8 @@ return {
search_filters_registry: new Registry(),
search_widgets_registry: new Registry(),
view_registry: new Registry(),
-};
+ csrf_token: odoo.csrf_token,
+};
});
diff --git a/addons/web/static/src/js/framework/session.js b/addons/web/static/src/js/framework/session.js
index d848fd4c511..d882128c67f 100644
--- a/addons/web/static/src/js/framework/session.js
+++ b/addons/web/static/src/js/framework/session.js
@@ -136,7 +136,7 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, {
},
user_has_group: function(group) {
if (!this.uid) {
- return $.when().resolve(false);
+ return $.when(false);
}
var def = this._groups_def[group];
if (!def) {
@@ -293,11 +293,10 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, {
* @returns {$.Deferred} deferred indicating the session is done reloading
*/
session_reload: function () {
- var self = this;
- return self.rpc("/web/session/get_session_info", {}).then(function(result) {
- delete result.session_id;
- _.extend(self, result);
- });
+ var result = _.extend({}, window.odoo.session_info);
+ delete result.session_id;
+ _.extend(this, result);
+ return $.when();
},
check_session_id: function() {
var self = this;
diff --git a/addons/web/static/test/evals.js b/addons/web/static/test/evals.js
index 69c7e7b2aa0..df58cab75d2 100644
--- a/addons/web/static/test/evals.js
+++ b/addons/web/static/test/evals.js
@@ -350,22 +350,20 @@ odoo.define_section('eval.edc', ['web.pyeval', 'web.session'], function (test, m
mock.add('res.lang:load_lang', function () { return true; });
mock.add('res.users:write', function (args) {
- _.extend(user, args[1]);
+ _.extend(session.user_context, args[1]);
return true;
});
- mock.add('/web/session/get_session_info', function () {
- return {
- session_id: 'foobar',
- db: '3',
- login: user.login,
+ _.extend(session, {
+ session_id: 'foobar',
+ db: '3',
+ login: user.login,
+ uid: user.id,
+ user_context: {
uid: user.id,
- user_context: {
- uid: user.id,
- lang: user.lang,
- tz: user.tz
- }
- };
+ lang: user.lang,
+ tz: user.tz
+ }
});
return session.session_reload();
}
diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml
index 29088671ddc..c8adedc6f3c 100644
--- a/addons/web/views/webclient_templates.xml
+++ b/addons/web/views/webclient_templates.xml
@@ -387,18 +387,17 @@
<title>Odoo</title>
<link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon"/>
+ <script type="text/javascript">
+ var odoo = {
+ session_info: <t t-raw="session_info"/>,
+ csrf_token: "<t t-esc="request.csrf_token(None)"/>",
+ db_info: <t t-raw="db_info"/>,
+ };
+ </script>
<t t-call-assets="web.assets_common" t-js="false"/>
<t t-call-assets="web.assets_backend" t-js="false"/>
<t t-call-assets="web.assets_common" t-css="false"/>
- <script type="text/javascript">
- odoo.define('web.csrf', function (require) {
- var token = "<t t-esc="request.csrf_token(None)"/>";
- require('web.core').csrf_token = token;
- require('qweb').default_dict.csrf_token = token;
- });
- odoo.db_info = <t t-raw="db_info"/>;
- </script>
<t t-call-assets="web.assets_backend" t-css="false"/>
<![CDATA[
diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml
index 7b8f6e18b54..0bb4b7a94e2 100644
--- a/addons/website/views/website_templates.xml
+++ b/addons/website/views/website_templates.xml
@@ -123,6 +123,12 @@
</t>
</t>
+ <script type="text/javascript">
+ var odoo = {
+ csrf_token: "<t t-esc="request.csrf_token(None)"/>",
+ };
+ </script>
+
<t t-call-assets="web.assets_common" t-js="false"/>
<t t-call-assets="web.assets_frontend" t-js="false"/>
<t t-call-assets="web_editor.summernote" t-js="false" groups="base.group_website_designer"/>
@@ -135,14 +141,6 @@
<t t-call-assets="web_editor.assets_editor" t-css="false" groups="base.group_website_designer"/>
<t t-call-assets="website.assets_editor" t-css="false" groups="base.group_website_publisher"/>
- <script type="text/javascript">
- odoo.define('web.csrf', function (require) {
- var token = "<t t-esc="request.csrf_token(None)"/>";
- require('web.core').csrf_token = token;
- require('qweb').default_dict.csrf_token = token;
- });
- </script>
-
<t t-raw="head or ''" name='layout_head'/>
<link rel="shortcut icon" type="image/x-icon" t-attf-href="/web/image/website/{{website.id}}/favicon/"/>
</head>