summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/view_form.js
diff options
context:
space:
mode:
authorDenis Ledoux <dle@odoo.com>2015-01-09 18:02:48 +0100
committerDenis Ledoux <dle@odoo.com>2015-01-09 18:10:38 +0100
commit38aa984f31f525539d27f2bf47806352705830ba (patch)
tree17e1f1fae82dc42af303788c2dccd84e1da2ef16 /addons/web/static/src/js/view_form.js
parent1e5c68f7a64088d6ff0394f13a471cd74dfe0050 (diff)
[FIX] web: avoid rendering fields on one2many list validation
This rev. reverts 91911159f5bc12046d791744ff23562378be047f The above rev. was a good idea, except that internal_set_value expects the raw value, while the records attributes can be tuples(for instance, many2one are tuple(id, name) or list of command(one2many, many2many). set_value must be use here, as all fields (js) override set_value in order to handle their value repr (for instance, many2one fields handle the tuple (id,name). Besides, avoiding the re-render provides a huge performance improvment, as rerendering fields can lead to xmlrpc calls (for instance, re-rendering a many2one field implies calling the name_get method) opw-620111 opw-622108
Diffstat (limited to 'addons/web/static/src/js/view_form.js')
-rw-r--r--addons/web/static/src/js/view_form.js29
1 files changed, 21 insertions, 8 deletions
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 48df090a8d9..fd1fbdb22ad 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -3094,7 +3094,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
reinit_value: function(val) {
this.internal_set_value(val);
this.floating = false;
- if (this.is_started)
+ if (this.is_started && !this.no_rerender)
this.render_value();
},
initialize_field: function() {
@@ -3328,14 +3328,14 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
}
if (! no_recurse) {
var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.build_context());
- this.alive(dataset.name_get([self.get("value")])).done(function(data) {
+ this.view.render_value_defs.push(this.alive(dataset.name_get([self.get("value")])).done(function(data) {
if (!data[0]) {
self.do_warn(_t("Render"), _t("No value found for the field "+self.field.string+" for value "+self.get("value")));
return;
}
self.display_value["" + self.get("value")] = data[0][1];
self.render_value(true);
- });
+ }));
}
},
display_string: function(str) {
@@ -3741,7 +3741,7 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
this.dataset.index = 0;
}
this.trigger_on_change();
- if (this.is_started) {
+ if (this.is_started && !this.no_rerender) {
return self.reload_current_view();
} else {
return $.when();
@@ -3888,12 +3888,19 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
return true;
}
var r;
- return _.every(this.records.records, function(record){
+ if (_.isEmpty(this.records.records)){
+ return true;
+ }
+ current_values = {};
+ _.each(this.editor.form.fields, function(field){
+ field._inhibit_on_change_flag = true;
+ field.no_rerender = true;
+ current_values[field.name] = field.get('value');
+ });
+ var valid = _.every(this.records.records, function(record){
r = record;
_.each(self.editor.form.fields, function(field){
- field._inhibit_on_change_flag = true;
- field.internal_set_value(r.attributes[field.name]);
- field._inhibit_on_change_flag = false;
+ field.set_value(r.attributes[field.name]);
});
return _.every(self.editor.form.fields, function(field){
field.process_modifiers();
@@ -3901,6 +3908,12 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
return field.is_valid();
});
});
+ _.each(this.editor.form.fields, function(field){
+ field.set('value', current_values[field.name]);
+ field._inhibit_on_change_flag = false;
+ field.no_rerender = false;
+ });
+ return valid;
},
do_add_record: function () {
if (this.editable()) {