diff options
| author | Géry Debongnie <ged@odoo.com> | 2016-05-25 12:18:48 +0200 |
|---|---|---|
| committer | Géry Debongnie <ged@odoo.com> | 2016-05-30 09:23:07 +0200 |
| commit | 9c68bc74827864a3c6c21be8ead1b2ed3d122d73 (patch) | |
| tree | e9dec0618783fbce6d12e89369fa064c63dc886b | |
| parent | 2a8a17024d2b46f3f8837a8672334a7dff3abd1b (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.py | 6 | ||||
| -rw-r--r-- | addons/point_of_sale/views/pos_templates.xml | 13 | ||||
| -rw-r--r-- | addons/web/__init__.py | 1 | ||||
| -rw-r--r-- | addons/web/controllers/main.py | 29 | ||||
| -rw-r--r-- | addons/web/models/__init__.py | 3 | ||||
| -rw-r--r-- | addons/web/models/ir_http.py | 21 | ||||
| -rw-r--r-- | addons/web/static/src/js/boot.js | 5 | ||||
| -rw-r--r-- | addons/web/static/src/js/framework/core.js | 5 | ||||
| -rw-r--r-- | addons/web/static/src/js/framework/session.js | 11 | ||||
| -rw-r--r-- | addons/web/static/test/evals.js | 22 | ||||
| -rw-r--r-- | addons/web/views/webclient_templates.xml | 15 | ||||
| -rw-r--r-- | addons/website/views/website_templates.xml | 14 |
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"/> <