From ce36786038b7b9bfa3e292ce40207d1ea46f3c92 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Wed, 15 Mar 2017 12:06:29 +0100 Subject: [PATCH] [FIX] web: _buildOnchangeSpecs must return only the present fields Before: the method '_buildOnchangeSpecs' returned all fields, but some models like 'res.users' have redefined the fields_get and add some fake fields which cause a crash. --- .../static/src/js/views/basic/basic_model.js | 4 +- .../web/static/src/js/views/form/form_view.js | 1 + addons/web/static/test/views/form_tests.js | 41 +++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index 8ae01e87bbc..7d33d51257f 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -1239,8 +1239,8 @@ var BasicModel = AbstractModel.extend({ var field = record.fields[name]; specs[name] = (field.onChange) || ""; _.each(field.views, function (view) { - _.each(view.fields, function (field, subname) { - specs[name + '.' + subname] = (field.onChange) || ""; + _.each(view.fieldAttrs, function (field, subname) { + specs[name + '.' + subname] = (view.fields[subname].onChange) || ""; }); }); }); diff --git a/addons/web/static/src/js/views/form/form_view.js b/addons/web/static/src/js/views/form/form_view.js index 3f397f64d9a..6578c7ada15 100644 --- a/addons/web/static/src/js/views/form/form_view.js +++ b/addons/web/static/src/js/views/form/form_view.js @@ -89,6 +89,7 @@ var FormView = BasicView.extend({ field.views[viewName === 'list' ? 'tree' : viewName] = view; field.relatedFields = fieldView.view_fields; field.fieldAttrs = fieldView.fieldAttrs; + view.fieldAttrs = fieldView.fieldAttrs; } })); } diff --git a/addons/web/static/test/views/form_tests.js b/addons/web/static/test/views/form_tests.js index 8096982d3f7..80c60c4bc20 100644 --- a/addons/web/static/test/views/form_tests.js +++ b/addons/web/static/test/views/form_tests.js @@ -736,6 +736,47 @@ QUnit.module('Views', { form.destroy(); }); + QUnit.test('onchange send only the present fields to the server', function (assert) { + assert.expect(1); + this.data.partner.records[0].product_id = false; + this.data.partner.onchanges.foo = function (obj) { + obj.foo = obj.foo + " alligator"; + }; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '', + archs: { + "partner_type,false,list": '' + }, + res_id: 1, + mockRPC: function (route, args) { + if (args.method === "onchange") { + assert.deepEqual(args.args[3], + {"foo": "1", "p": "", "p.bar": "", "p.product_id": "", "timmy": "", "timmy.name": ""}, + "should send only the fields used in the views"); + } + return this._super(route, args); + }, + }); + + form.$buttons.find('.o_form_button_edit').click(); + form.$('input:first').val("tralala").trigger('input'); + + form.destroy(); + }); + QUnit.test('evaluate in python field options', function (assert) { assert.expect(1);