[REF] website, *: remove 'website.context' module

* website_forum, website_gengo, website_mail_channel, website_sale

Retrieving the global context is now the root's job, this will prevent
problems when trying to extend the values the context has.

See upcoming improvements with https://github.com/odoo/odoo/pull/29442

closes odoo/odoo#30816
This commit is contained in:
qsm-odoo
2019-02-05 11:39:11 +00:00
parent 99499589ea
commit b6db6b878c
15 changed files with 176 additions and 85 deletions
@@ -1,25 +0,0 @@
odoo.define('website.context', function (require) {
'use strict';
function getContext(context) {
var html = document.documentElement;
return _.extend({
lang: (html.getAttribute('lang') || 'en_US').replace('-', '_'),
website_id: html.getAttribute('data-website-id') | 0,
}, context || {});
}
function getExtraContext(context) {
var html = document.documentElement;
return _.extend(getContext(), {
editable: !!(html.dataset.editable || $('[data-oe-model]').length), // temporary hack, this should be done in python
translatable: !!html.dataset.translatable,
edit_translations: !!html.dataset.edit_translations,
}, context || {});
}
return {
get: getContext,
getExtra: getExtraContext,
};
});
@@ -487,6 +487,23 @@ var Animation = Widget.extend({
new AnimationEffect(this, updateCallback, startEvents, $startTarget, options)
);
},
/**
* @private
* @param {boolean} [extra=false]
* @param {Object} [extraContext]
* @returns {Object}
*/
_getContext: function (extra, extraContext) {
var context;
this.trigger_up('context_get', {
extra: extra || false,
context: extraContext,
callback: function (ctx) {
context = ctx;
},
});
return context;
},
});
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@@ -22,7 +22,6 @@ var ServiceProviderMixin = require('web.ServiceProviderMixin');
var session = require('web.session');
var utils = require('web.utils');
var rootWidget = require('web_editor.root_widget');
var wContext = require('website.context');
var sAnimation = require('website.content.snippets.animation');
require("website.content.zoomodoo");
@@ -32,7 +31,11 @@ var websiteRootRegistry = new rootWidget.RootWidgetRegistry();
// Load localizations outside the WebsiteRoot to not wait for DOM ready (but
// wait for them in WebsiteRoot)
var lang = utils.get_cookie('frontend_lang') || wContext.get().lang; // FIXME the cookie value should maybe be in the ctx?
function getLang() {
var html = document.documentElement;
return (html.getAttribute('lang') || 'en_US').replace('-', '_');
}
var lang = utils.get_cookie('frontend_lang') || getLang(); // FIXME the cookie value should maybe be in the ctx?
var localeDef = ajax.loadJS('/web/webclient/locale/' + lang.replace('-', '_'));
/**
@@ -53,6 +56,7 @@ var WebsiteRoot = rootWidget.RootWidget.extend(ServiceProviderMixin, {
custom_events: _.extend({}, rootWidget.RootWidget.prototype.custom_events || {}, {
animation_start_demand: '_onAnimationStartDemand',
animation_stop_demand: '_onAnimationStopDemand',
context_get: '_onContextGet',
main_object_request: '_onMainObjectRequest',
ready_to_clean_for_save: '_onAnimationStopDemand',
}),
@@ -138,7 +142,7 @@ var WebsiteRoot = rootWidget.RootWidget.extend(ServiceProviderMixin, {
if (_.str.startsWith(route, '/web/dataset/call_kw/')) {
var params = ev.data.args[1];
var options = ev.data.args[2];
params.kwargs.context = _.extend({}, wContext.get(), params.kwargs.context || {});
params.kwargs.context = _.extend({}, this._getContext(), params.kwargs.context || {});
if (options) {
params.kwargs.context = _.omit(params.kwargs.context, options.noContextKeys);
ev.data.args[2] = _.omit(options, 'noContextKeys');
@@ -148,6 +152,38 @@ var WebsiteRoot = rootWidget.RootWidget.extend(ServiceProviderMixin, {
}
return ServiceProviderMixin._call_service.apply(this, arguments);
},
/**
* Retrieves the global context of the public environment. This is the
* context which is automatically added to each RPC.
*
* @private
* @param {Object} [context]
* @returns {Object}
*/
_getContext: function (context) {
var html = document.documentElement;
return _.extend({
'lang': getLang(),
'website_id': html.getAttribute('data-website-id') | 0,
}, context || {});
},
/**
* Retrieves the global context of the public environment (as
* @see _getContext) but with extra informations that would be useless to
* send with each RPC.
*
* @private
* @param {Object} [context]
* @returns {Object}
*/
_getExtraContext: function (context) {
var html = document.documentElement;
return _.extend(this._getContext(), {
'editable': !!(html.dataset.editable || $('[data-oe-model]').length), // temporary hack, this should be done in python
'translatable': !!html.dataset.translatable,
'edit_translations': !!html.dataset.edit_translations,
}, context || {});
},
/**
* As the WebsiteRoot instance is designed to be unique, the associated
* registry has been instantiated outside of the class and is simply
@@ -242,6 +278,19 @@ var WebsiteRoot = rootWidget.RootWidget.extend(ServiceProviderMixin, {
_onAnimationStopDemand: function (ev) {
this._stopAnimations(ev.data.$target);
},
/**
* Called when someone asked for the global public context.
*
* @private
* @param {OdooEvent} ev
*/
_onContextGet: function (ev) {
if (ev.data.extra) {
ev.data.callback(this._getExtraContext(ev.data.context));
} else {
ev.data.callback(this._getContext(ev.data.context));
}
},
/**
* @todo review
* @private
@@ -4,7 +4,6 @@ odoo.define('website.editor.menu', function (require) {
var Dialog = require('web.Dialog');
var Widget = require('web.Widget');
var core = require('web.core');
var wContext = require('website.context');
var WysiwygMultizone = require('web_editor.wysiwyg.multizone');
var _t = core._t;
@@ -147,12 +146,18 @@ var EditorMenu = Widget.extend({
* @private
*/
_wysiwygInstance: function () {
var context;
this.trigger_up('context_get', {
callback: function (ctx) {
context = ctx;
},
});
return new WysiwygMultizone(this, {
snippets: 'website.snippets',
recordInfo: {
context: wContext.get(),
context: context,
data_res_model: 'website',
data_res_id: wContext.get().website_id,
data_res_id: context.website_id,
}
});
},
@@ -5,15 +5,9 @@ require('web.dom_ready');
var core = require('web.core');
var Dialog = require('web.Dialog');
var localStorage = require('web.local_storage');
var wContext = require('website.context');
var WysiwygTranslate = require('web_editor.wysiwyg.multizone.translate');
var EditorMenu = require('website.editor.menu');
var lang = $('html').attr('lang').replace('-', '_');
if ($('.js_change_lang[data-lang="' + lang + '"]').data('default-lang')) {
return $.Deferred().reject("It's the default language");
}
var _t = core._t;
var localStorageNoDialogKey = 'website_translator_nodialog';
@@ -95,10 +89,15 @@ var TranslatorMenu = EditorMenu.extend({
* @private
*/
_wysiwygInstance: function () {
return new WysiwygTranslate(this, {lang: lang || wContext.get().lang});
var context;
this.trigger_up('context_get', {
callback: function (ctx) {
context = ctx;
},
});
return new WysiwygTranslate(this, {lang: context.lang});
},
});
return TranslatorMenu;
});
+18 -4
View File
@@ -5,7 +5,6 @@ var Class = require('web.Class');
var core = require('web.core');
var Dialog = require('web.Dialog');
var time = require('web.time');
var wContext = require('website.context');
var weWidgets = require('wysiwyg.widgets');
var websiteNavbarData = require('website.navbar');
var websiteRootData = require('website.WebsiteRoot');
@@ -195,7 +194,12 @@ var PagePropertiesDialog = weWidgets.Dialog.extend({
*/
save: function (data) {
var self = this;
var context = wContext.get();
var context;
this.trigger_up('context_get', {
callback: function (ctx) {
context = ctx;
},
});
var url = this.$('#page_url').val();
var $date_publish = this.$("#date_publish");
@@ -469,7 +473,12 @@ var EditMenuDialog = weWidgets.Dialog.extend({
willStart: function () {
var defs = [this._super.apply(this, arguments)];
var self = this;
var context = wContext.get();
var context;
this.trigger_up('context_get', {
callback: function (ctx) {
context = ctx;
},
});
defs.push(this._rpc({
model: 'website.menu',
method: 'get_tree',
@@ -516,7 +525,12 @@ var EditMenuDialog = weWidgets.Dialog.extend({
var new_menu = this.$('.oe_menu_editor').nestedSortable('toArray', {startDepthCount: 0});
var levels = [];
var data = [];
var context = wContext.get();
var context;
this.trigger_up('context_get', {
callback: function (ctx) {
context = ctx;
},
});
// Resequence, re-tree and remove useless data
new_menu.forEach(function (menu) {
if (menu.id) {
+8 -2
View File
@@ -2,7 +2,6 @@ odoo.define('website.editMenu', function (require) {
'use strict';
var core = require('web.core');
var wContext = require('website.context');
var EditorMenu = require('website.editor.menu');
var websiteNavbarData = require('website.navbar');
@@ -31,7 +30,14 @@ var EditPageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({
*/
init: function () {
this._super.apply(this, arguments);
this._editorAutoStart = (wContext.getExtra().editable && window.location.search.indexOf('enable_editor') >= 0);
var context;
this.trigger_up('context_get', {
extra: true,
callback: function (ctx) {
context = ctx;
},
});
this._editorAutoStart = (context.editable && window.location.search.indexOf('enable_editor') >= 0);
},
/**
* Auto-starts the editor if necessary or add the welcome message otherwise.
+15 -4
View File
@@ -7,7 +7,6 @@ var Dialog = require('web.Dialog');
var mixins = require('web.mixins');
var rpc = require('web.rpc');
var Widget = require('web.Widget');
var wContext = require('website.context');
var weWidgets = require('wysiwyg.widgets');
var websiteNavbarData = require('website.navbar');
@@ -49,7 +48,13 @@ var SuggestionList = Widget.extend({
refresh: function () {
var self = this;
self.$el.append(_t("Loading..."));
var language = self.language || wContext.get().lang.toLowerCase();
var context;
this.trigger_up('context_get', {
callback: function (ctx) {
context = ctx;
},
});
var language = self.language || context.lang.toLowerCase();
this._rpc({
route: '/website/seo_suggest',
params: {
@@ -475,14 +480,20 @@ var MetaKeywords = Widget.extend({
},
_getLanguages: function () {
var self = this;
var context;
this.trigger_up('context_get', {
callback: function (ctx) {
context = ctx;
},
});
this._rpc({
model: 'website',
method: 'get_languages',
args: [[wContext.get().website_id]],
args: [[context.website_id]],
}).then( function (data) {
self.$('#language-box').html(core.qweb.render('Configurator.language_promote', {
'language': data,
'def_lang': wContext.get().lang
'def_lang': context.lang
}));
});
},
+11 -9
View File
@@ -2,15 +2,9 @@ odoo.define('website.translateMenu', function (require) {
'use strict';
var utils = require('web.utils');
var wContext = require('website.context');
var TranslatorMenu = require('website.editor.menu.translate');
var websiteNavbarData = require('website.navbar');
var ctx = wContext.getExtra();
if (!ctx.translatable) {
return;
}
var TranslatePageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({
actions: _.extend({}, websiteNavbarData.WebsiteNavbar.prototype.actions || {}, {
edit_master: '_goToMasterPage',
@@ -21,7 +15,15 @@ var TranslatePageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({
* @override
*/
start: function () {
if (ctx.edit_translations) {
var context;
this.trigger_up('context_get', {
extra: true,
callback: function (ctx) {
context = ctx;
},
});
this._mustEditTranslations = context.edit_translations;
if (this._mustEditTranslations) {
this._startTranslateMode();
}
return this._super.apply(this, arguments);
@@ -63,7 +65,7 @@ var TranslatePageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({
* @returns {Deferred}
*/
_startTranslateMode: function () {
if (!ctx.edit_translations) {
if (!this._mustEditTranslations) {
window.location.search += '&edit_translations';
return $.Deferred();
}
@@ -72,5 +74,5 @@ var TranslatePageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({
},
});
websiteNavbarData.websiteNavbarRegistry.add(TranslatePageMenu, '.o_menu_systray');
websiteNavbarData.websiteNavbarRegistry.add(TranslatePageMenu, '.o_menu_systray:has([data-action="translate"])');
});
+6 -2
View File
@@ -2,7 +2,6 @@ odoo.define("website.ace", function (require) {
"use strict";
var AceEditor = require('web_editor.ace');
var weContext = require('website.context');
/**
* Extends the default view editor so that the URL hash is updated with view ID
@@ -45,7 +44,12 @@ var WebsiteAceEditor = AceEditor.extend({
// When saving a generic view, the view will be COW'd and
// replace by the specific view after the reload. Thus the id in
// URL won't exist anymore. We need to find the specific ID.
var context = weContext.get();
var context;
this.trigger_up('context_get', {
callback: function (ctx) {
context = ctx;
},
});
defs.push(this._rpc({
model: 'ir.ui.view',
method: 'search_read',
@@ -50,7 +50,6 @@
<script type="text/javascript" src="/website/static/src/js/utils.js"/>
<script type="text/javascript" src="/website/static/src/js/website.js"/>
<script type="text/javascript" src="/website/static/src/js/content/context.js"/>
<script type="text/javascript" src="/website/static/src/js/content/compatibility.js"/>
<script type="text/javascript" src="/website/static/src/js/content/lazy_template_call.js"/>
<script type="text/javascript" src="/website/static/src/js/content/menu.js"/>
@@ -2,7 +2,6 @@ odoo.define('website_forum.website_forum', function (require) {
'use strict';
var core = require('web.core');
var wContext = require('website.context');
var Wysiwyg = require('web_editor.wysiwyg');
var sAnimations = require('website.content.snippets.animation');
var session = require('web.session');
@@ -138,7 +137,7 @@ sAnimations.registry.websiteForum = sAnimations.Class.extend({
toolbar: toolbar,
styleWithSpan: false,
recordInfo: {
context: wContext.get(),
context: self._getContext(),
res_model: 'forum.post',
res_id: +window.location.pathname.split('-').pop(),
},
@@ -5,20 +5,14 @@ var ajax = require('web.ajax');
var core = require('web.core');
var Dialog = require('web.Dialog');
var Widget = require('web.Widget');
var wContext = require('website.context');
var WysiwygTranslate = require('web_editor.wysiwyg.multizone.translate');
var qweb = core.qweb;
var _t = core._t;
if (!wContext.getExtra().edit_translations) {
// Temporary hack until the editor bar is moved to the web client
return;
}
ajax.loadXML('/website_gengo/static/src/xml/website.gengo.xml', qweb);
WysiwygTranslate.include({
xmlDependencies: (WysiwygTranslate.prototype.xmlDependencies || [])
.concat(['/website_gengo/static/src/xml/website.gengo.xml']),
events: _.extend({}, WysiwygTranslate.prototype.events, {
'click a[data-action=translation_gengo_post]': 'translation_gengo_post',
'click a[data-action=translation_gengo_info]': 'translation_gengo_info',
@@ -26,8 +20,14 @@ WysiwygTranslate.include({
start: function () {
var def = this._super.apply(this, arguments);
var context;
this.trigger_up('context_get', {
callback: function (ctx) {
context = ctx;
},
});
var gengo_langs = ["ar_SY","id_ID","nl_NL","fr_CA","pl_PL","zh_TW","sv_SE","ko_KR","pt_PT","en_US","ja_JP","es_ES","zh_CN","de_DE","fr_FR","fr_BE","ru_RU","it_IT","pt_BR","pt_BR","th_TH","nb_NO","ro_RO","tr_TR","bg_BG","da_DK","en_GB","el_GR","vi_VN","he_IL","hu_HU","fi_FI"];
if (gengo_langs.indexOf(wContext.get().lang) >= 0) {
if (gengo_langs.indexOf(context.lang) >= 0) {
this.$('.gengo_post,.gengo_wait,.gengo_inprogress,.gengo_info').remove();
this.$('button[data-action=save]')
.after(qweb.render('website.ButtonGengoTranslator'));
@@ -50,6 +50,12 @@ WysiwygTranslate.include({
$('[data-oe-translation-state="to_translate"], [data-oe-translation-state="None"]').each(function () {
self.new_words += $(this).text().trim().replace(/ +/g," ").split(" ").length;
});
var context;
this.trigger_up('context_get', {
callback: function (ctx) {
context = ctx;
},
});
ajax.jsonRpc('/website/check_gengo_set', 'call', {
}).then(function (res) {
var dialog;
@@ -76,7 +82,7 @@ WysiwygTranslate.include({
});
ajax.jsonRpc('/website_gengo/set_translations', 'call', {
'data': trans,
'lang': wContext.get().lang,
'lang': context.lang,
}).then(function () {
ajax.jsonRpc('/website/post_gengo_jobs', 'call', {});
self._save();
@@ -98,9 +104,15 @@ WysiwygTranslate.include({
$('[data-oe-translation-state="translated"]').each(function () {
translated_ids.push($(this).attr('data-oe-translation-id'));
});
var context;
this.trigger_up('context_get', {
callback: function (ctx) {
context = ctx;
},
});
ajax.jsonRpc('/website/get_translated_length', 'call', {
'translated_ids': translated_ids,
'lang': wContext.get().lang,
'lang': context.lang,
}).done(function (res){
var dialog = new GengoTranslatorStatisticDialog(res);
dialog.appendTo($(document.body));
@@ -109,6 +121,7 @@ WysiwygTranslate.include({
});
var GengoTranslatorPostDialog = Widget.extend({
xmlDependencies: ['/website_gengo/static/src/xml/website.gengo.xml'],
events: {
'hidden.bs.modal': 'destroy',
'click button[data-action=service_level]': function () {
@@ -126,6 +139,7 @@ var GengoTranslatorPostDialog = Widget.extend({
});
var GengoTranslatorStatisticDialog = Widget.extend({
xmlDependencies: ['/website_gengo/static/src/xml/website.gengo.xml'],
events: {
'hidden.bs.modal': 'destroy',
},
@@ -150,6 +164,7 @@ var GengoTranslatorStatisticDialog = Widget.extend({
});
var GengoApiConfigDialog = Widget.extend({
xmlDependencies: ['/website_gengo/static/src/xml/website.gengo.xml'],
events: {
'hidden.bs.modal': 'destroy',
'click button[data-action=set_config]': 'set_config'
@@ -2,8 +2,6 @@ odoo.define('website_mail_channel.editor', function (require) {
'use strict';
var core = require('web.core');
var rpc = require('web.rpc');
var wContext = require('website.context');
var options = require('web_editor.snippets.options');
var wUtils = require('website.utils');
@@ -17,12 +15,11 @@ options.registry.subscribe = options.Class.extend({
window_title: _t("Add a Subscribe Button"),
select: _t("Discussion List"),
init: function (field) {
return rpc.query({
model: 'mail.channel',
method: 'name_search',
args: ['', [['public','=','public']]],
context: wContext.get(), // TODO use this._rpc
});
return self._rpc({
model: 'mail.channel',
method: 'name_search',
args: ['', [['public', '=', 'public']]],
});
},
}).then(function (mail_channel_id) {
self.$target.attr("data-id", mail_channel_id);
@@ -4,7 +4,6 @@ odoo.define('website_sale_options.website_sale', function (require) {
var core = require('web.core');
var _t = core._t;
var OptionalProductsModal = require('sale.OptionalProductsModal');
var wContext = require('website.context');
var sAnimations = require('website.content.snippets.animation');
var ProductConfiguratorMixin = require('sale.ProductConfiguratorMixin');
require('website_sale.website_sale');
@@ -86,7 +85,7 @@ sAnimations.registry.WebsiteSaleOptions = sAnimations.Class.extend(ProductConfig
okButtonText: _t('Proceed to Checkout'),
cancelButtonText: _t('Continue Shopping'),
title: _t('Add to cart'),
context: wContext.get(),
context: self._getContext(),
}).open();
self.optionalProductsModal.on('options_empty', null, self._onModalOptionsEmpty.bind(self));
@@ -172,7 +171,7 @@ sAnimations.registry.WebsiteSaleOptions = sAnimations.Class.extend(ProductConfig
this.$form.ajaxSubmit({
url: '/shop/cart/update_option',
data: {
lang: wContext.get().lang,
lang: this._getContext().lang,
custom_values: customValues
},
success: function (quantity) {