[IMP] web_m2x_options: Efficiency

Improved the efficiency of code: With this improvement we achieve to just do an rpc call when the js file is called instead of do the call for each field.
pull/2174/head
Carlos Roca 2020-11-09 10:19:56 +01:00 committed by nguyenhk
parent acec64f61f
commit 7fb6885241
6 changed files with 64 additions and 72 deletions

View File

@ -23,7 +23,7 @@ web_m2x_options
:target: https://runbot.odoo-community.org/runbot/162/15.0 :target: https://runbot.odoo-community.org/runbot/162/15.0
:alt: Try me on Runbot :alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5| |badge1| |badge2| |badge3| |badge4| |badge5|
This modules modifies "many2one" and "many2manytags" form widgets so as to add some new display This modules modifies "many2one" and "many2manytags" form widgets so as to add some new display
control options. control options.
@ -178,6 +178,7 @@ Contributors
* Jairo Llopis <jairo.llopis@tecnativa.com> * Jairo Llopis <jairo.llopis@tecnativa.com>
* David Vidal <david.vidal@tecnativa.com> * David Vidal <david.vidal@tecnativa.com>
* Ernesto Tejeda <ernesto.tejeda87@gmail.com> * Ernesto Tejeda <ernesto.tejeda87@gmail.com>
* Carlos Roca
* Bhavesh Odedra <bodedra@opensourceintegrators.com> * Bhavesh Odedra <bodedra@opensourceintegrators.com>
* Dhara Solanki <dhara.solanki@initos.com> (http://www.initos.com) * Dhara Solanki <dhara.solanki@initos.com> (http://www.initos.com)

View File

@ -17,7 +17,10 @@
"license": "AGPL-3", "license": "AGPL-3",
"depends": ["web"], "depends": ["web"],
"assets": { "assets": {
"web.assets_backend": ["web_m2x_options/static/src/js/form.js"], "web.assets_backend": [
"web_m2x_options/static/src/js/form.js",
"web_m2x_options/static/src/js/ir_options.js",
],
"web.assets_qweb": ["web_m2x_options/static/src/xml/base.xml"], "web.assets_qweb": ["web_m2x_options/static/src/xml/base.xml"],
}, },
"installable": True, "installable": True,

View File

@ -13,4 +13,7 @@ class IrConfigParameter(models.Model):
"web_m2x_options.search_more", "web_m2x_options.search_more",
"web_m2x_options.m2o_dialog", "web_m2x_options.m2o_dialog",
] ]
return self.sudo().search_read([["key", "in", opts]], ["key", "value"]) return {
res["key"]: res["value"]
for res in self.sudo().search_read([["key", "in", opts]], ["key", "value"])
}

View File

@ -9,5 +9,6 @@
* Jairo Llopis <jairo.llopis@tecnativa.com> * Jairo Llopis <jairo.llopis@tecnativa.com>
* David Vidal <david.vidal@tecnativa.com> * David Vidal <david.vidal@tecnativa.com>
* Ernesto Tejeda <ernesto.tejeda87@gmail.com> * Ernesto Tejeda <ernesto.tejeda87@gmail.com>
* Carlos Roca
* Bhavesh Odedra <bodedra@opensourceintegrators.com> * Bhavesh Odedra <bodedra@opensourceintegrators.com>
* Dhara Solanki <dhara.solanki@initos.com> (http://www.initos.com) * Dhara Solanki <dhara.solanki@initos.com> (http://www.initos.com)

View File

@ -6,9 +6,10 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) {
var core = require("web.core"), var core = require("web.core"),
data = require("web.data"), data = require("web.data"),
Dialog = require("web.Dialog"), Dialog = require("web.Dialog"),
FormView = require("web.FormView"),
view_dialogs = require("web.view_dialogs"), view_dialogs = require("web.view_dialogs"),
relational_fields = require("web.relational_fields"), relational_fields = require("web.relational_fields"),
rpc = require("web.rpc"); ir_options = require("web_m2x_options.ir_options");
var _t = core._t, var _t = core._t,
FieldMany2ManyTags = relational_fields.FieldMany2ManyTags, FieldMany2ManyTags = relational_fields.FieldMany2ManyTags,
@ -16,10 +17,12 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) {
FieldOne2Many = relational_fields.FieldOne2Many, FieldOne2Many = relational_fields.FieldOne2Many,
FormFieldMany2ManyTags = relational_fields.FormFieldMany2ManyTags; FormFieldMany2ManyTags = relational_fields.FormFieldMany2ManyTags;
var web_m2x_options = rpc.query({ function is_option_set(option) {
model: "ir.config_parameter", if (_.isUndefined(option)) return false;
method: "get_web_m2x_options", if (typeof option === "string") return option === "true" || option === "True";
}); if (typeof option === "boolean") return option;
return false;
}
var M2ODialog = Dialog.extend({ var M2ODialog = Dialog.extend({
template: "M2ODialog", template: "M2ODialog",
@ -93,43 +96,13 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) {
}); });
FieldMany2One.include({ FieldMany2One.include({
start: function () {
this._super.apply(this, arguments);
return this.get_options();
},
get_options: function () {
var self = this;
if (_.isUndefined(this.ir_options_loaded)) {
this.ir_options_loaded = $.Deferred();
this.ir_options = {};
web_m2x_options.then(function (records) {
_(records).each(function (record) {
self.ir_options[record.key] = record.value;
});
self.ir_options_loaded.resolve();
});
}
return $.when();
},
is_option_set: function (option) {
if (_.isUndefined(option)) return false;
if (typeof option === "string")
return option === "true" || option === "True";
if (typeof option === "boolean") return option;
return false;
},
_onInputFocusout: function () { _onInputFocusout: function () {
var m2o_dialog_opt = var m2o_dialog_opt =
this.is_option_set(this.nodeOptions.m2o_dialog) || is_option_set(this.nodeOptions.m2o_dialog) ||
(_.isUndefined(this.nodeOptions.m2o_dialog) && (_.isUndefined(this.nodeOptions.m2o_dialog) &&
this.is_option_set( is_option_set(ir_options["web_m2x_options.m2o_dialog"])) ||
this.ir_options["web_m2x_options.m2o_dialog"]
)) ||
(_.isUndefined(this.nodeOptions.m2o_dialog) && (_.isUndefined(this.nodeOptions.m2o_dialog) &&
_.isUndefined(this.ir_options["web_m2x_options.m2o_dialog"])); _.isUndefined(ir_options["web_m2x_options.m2o_dialog"]));
if (this.can_create && this.floating && m2o_dialog_opt) { if (this.can_create && this.floating && m2o_dialog_opt) {
new M2ODialog(this, this.string, this.$input.val()).open(); new M2ODialog(this, this.string, this.$input.val()).open();
} }
@ -137,14 +110,12 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) {
_search: function (search_val) { _search: function (search_val) {
var self = this; var self = this;
if (search_val === undefined) {
return this._super.apply(this, arguments);
}
var def = new Promise((resolve) => { var def = new Promise((resolve) => {
// Add options limit used to change number of selections record // Add options limit used to change number of selections record
// returned. // returned.
if (!_.isUndefined(self.ir_options["web_m2x_options.limit"])) { if (!_.isUndefined(ir_options["web_m2x_options.limit"])) {
this.limit = parseInt(self.ir_options["web_m2x_options.limit"], 10); this.limit = parseInt(ir_options["web_m2x_options.limit"], 10);
} }
if (typeof self.nodeOptions.limit === "number") { if (typeof self.nodeOptions.limit === "number") {
@ -230,14 +201,12 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) {
// 4- if set globally, apply its value // 4- if set globally, apply its value
// 5- if not set globally either, check if returned values are more than node's limit // 5- if not set globally either, check if returned values are more than node's limit
if (!_.isUndefined(self.nodeOptions.search_more)) { if (!_.isUndefined(self.nodeOptions.search_more)) {
var search_more = self.is_option_set( var search_more = is_option_set(self.nodeOptions.search_more);
self.nodeOptions.search_more
);
} else if ( } else if (
!_.isUndefined(self.ir_options["web_m2x_options.search_more"]) !_.isUndefined(ir_options["web_m2x_options.search_more"])
) { ) {
var search_more = self.is_option_set( var search_more = is_option_set(
self.ir_options["web_m2x_options.search_more"] ir_options["web_m2x_options.search_more"]
); );
} else { } else {
var search_more = values.length > self.limit; var search_more = values.length > self.limit;
@ -299,13 +268,13 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) {
var raw_result = _.map(result, function (x) { var raw_result = _.map(result, function (x) {
return x[1]; return x[1];
}); });
var quick_create = self.is_option_set(self.nodeOptions.create), var quick_create = is_option_set(self.nodeOptions.create),
quick_create_undef = _.isUndefined(self.nodeOptions.create), quick_create_undef = _.isUndefined(self.nodeOptions.create),
m2x_create_undef = _.isUndefined( m2x_create_undef = _.isUndefined(
self.ir_options["web_m2x_options.create"] ir_options["web_m2x_options.create"]
), ),
m2x_create = self.is_option_set( m2x_create = is_option_set(
self.ir_options["web_m2x_options.create"] ir_options["web_m2x_options.create"]
); );
var show_create = var show_create =
(!self.nodeOptions && (m2x_create_undef || m2x_create)) || (!self.nodeOptions && (m2x_create_undef || m2x_create)) ||
@ -332,16 +301,16 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) {
// Create and edit ... // Create and edit ...
var create_edit = var create_edit =
self.is_option_set(self.nodeOptions.create) || is_option_set(self.nodeOptions.create) ||
self.is_option_set(self.nodeOptions.create_edit), is_option_set(self.nodeOptions.create_edit),
create_edit_undef = create_edit_undef =
_.isUndefined(self.nodeOptions.create) && _.isUndefined(self.nodeOptions.create) &&
_.isUndefined(self.nodeOptions.create_edit), _.isUndefined(self.nodeOptions.create_edit),
m2x_create_edit_undef = _.isUndefined( m2x_create_edit_undef = _.isUndefined(
self.ir_options["web_m2x_options.create_edit"] ir_options["web_m2x_options.create_edit"]
), ),
m2x_create_edit = self.is_option_set( m2x_create_edit = is_option_set(
self.ir_options["web_m2x_options.create_edit"] ir_options["web_m2x_options.create_edit"]
); );
var show_create_edit = var show_create_edit =
(!self.nodeOptions && (!self.nodeOptions &&
@ -381,6 +350,17 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) {
}); });
}); });
this.orderer.add(def); this.orderer.add(def);
// Add options limit used to change number of selections record
// returned.
if (!_.isUndefined(ir_options["web_m2x_options.limit"])) {
this.limit = parseInt(ir_options["web_m2x_options.limit"], 10);
}
if (typeof this.nodeOptions.limit === "number") {
this.limit = this.nodeOptions.limit;
}
return def; return def;
}, },
}); });
@ -396,17 +376,9 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) {
return result; return result;
}, },
is_option_set: function (option) {
if (_.isUndefined(option)) return false;
if (typeof option === "string")
return option === "true" || option === "True";
if (typeof option === "boolean") return option;
return false;
},
_onOpenBadge: function (event) { _onOpenBadge: function (event) {
var self = this; var self = this;
var open = self.nodeOptions && self.is_option_set(self.nodeOptions.open); var open = self.nodeOptions && is_option_set(self.nodeOptions.open);
if (open) { if (open) {
var context = self.record.getContext(self.recordParams); var context = self.record.getContext(self.recordParams);
var id = parseInt($(event.currentTarget).data("id"), 10); var id = parseInt($(event.currentTarget).data("id"), 10);
@ -491,8 +463,8 @@ odoo.define("web_m2x_options.web_m2x_options", function (require) {
}), }),
_onOpenBadge: function (event) { _onOpenBadge: function (event) {
var open = this.is_option_set(this.nodeOptions.open); var open = is_option_set(this.nodeOptions.open);
var no_color_picker = this.is_option_set(this.nodeOptions.no_color_picker); var no_color_picker = is_option_set(this.nodeOptions.no_color_picker);
this._super.apply(this, arguments); this._super.apply(this, arguments);
if (!open && !no_color_picker) { if (!open && !no_color_picker) {
this._onOpenColorPicker(event); this._onOpenColorPicker(event);

View File

@ -0,0 +1,12 @@
/* Copyright 2020 Tecnativa - Carlos Roca
* * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
odoo.define("web_m2x_options.ir_options", function (require) {
"use strict";
var rpc = require("web.rpc");
return rpc.query({
model: "ir.config_parameter",
method: "get_web_m2x_options",
});
});