diff options
| author | Denis Ledoux <dle@odoo.com> | 2015-01-09 18:02:48 +0100 |
|---|---|---|
| committer | Denis Ledoux <dle@odoo.com> | 2015-01-09 18:10:38 +0100 |
| commit | 38aa984f31f525539d27f2bf47806352705830ba (patch) | |
| tree | 17e1f1fae82dc42af303788c2dccd84e1da2ef16 /addons/web/static/src/js/view_form.js | |
| parent | 1e5c68f7a64088d6ff0394f13a471cd74dfe0050 (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.js | 29 |
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()) { |
