diff --git a/addons/mail/static/tests/chatter_tests.js b/addons/mail/static/tests/chatter_tests.js index 760a6bcf6cd..b5d7feab56e 100644 --- a/addons/mail/static/tests/chatter_tests.js +++ b/addons/mail/static/tests/chatter_tests.js @@ -530,7 +530,7 @@ QUnit.test('form activity widget: schedule next activity', function (assert) { return $.when(); } if (args.method === 'read' && checkReadArgs) { - assert.deepEqual(args.args[1], ['activity_ids', 'message_ids'], + assert.deepEqual(args.args[1], ['activity_ids', 'message_ids', 'display_name'], "should only read the mail fields"); } return this._super.apply(this, arguments); @@ -686,11 +686,11 @@ QUnit.test('form activity widget: mark as done and remove', function (assert) { if (nbReads === 1) { // first read assert.strictEqual(args.args[1].length, 4, 'should read all fiels the first time'); } else if (nbReads === 2) { // second read: after the unlink - assert.ok(_.isEqual(args.args[1], ['activity_ids']), - 'should only read the activities after an unlink'); + assert.ok(_.isEqual(args.args[1], ['activity_ids', 'display_name']), + 'should only read the activities (+ display_name) after an unlink'); } else { // third read: after marking an activity done - assert.ok(_.isEqual(args.args[1], ['activity_ids', 'message_ids']), - 'should read the activities and messages after marking an activity done'); + assert.ok(_.isEqual(args.args[1], ['activity_ids', 'message_ids', 'display_name']), + 'should read the activities and messages (+ display_name) after marking an activity done'); } } return this._super.apply(this, arguments); @@ -809,8 +809,8 @@ QUnit.test('followers widget: follow/unfollow, edit subtypes', function (assert) assert.strictEqual(args.args[1].length, 3, 'should read "foo", "message_follower_ids" and "display_name"'); } else { // three next reads: only read 'message_follower_ids' field - assert.ok(_.isEqual(args.args[1], ['message_follower_ids']), - 'should only read "message_follower_ids"'); + assert.deepEqual(args.args[1], ['message_follower_ids', 'display_name'], + 'should only read "message_follower_ids" and "display_name"'); } } return this._super.apply(this, arguments); diff --git a/addons/web/static/src/js/services/data_manager.js b/addons/web/static/src/js/services/data_manager.js index 999a9d8df01..77857ef2d31 100644 --- a/addons/web/static/src/js/services/data_manager.js +++ b/addons/web/static/src/js/services/data_manager.js @@ -398,11 +398,6 @@ return core.Class.extend({ */ _processFieldsView: function (viewInfo) { var viewFields = this._processFields(viewInfo.type, viewInfo.arch, viewInfo.fields); - // by default fetch display_name and id - if (!viewInfo.fields.display_name) { - viewInfo.fields.display_name = {type: 'char'}; - viewFields.display_name = {}; - } viewInfo.fieldsInfo = {}; viewInfo.fieldsInfo[viewInfo.type] = viewFields; utils.deepFreeze(viewInfo.fields); 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 d54f609f002..aa0aab7aa64 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -1629,8 +1629,8 @@ var BasicModel = AbstractModel.extend({ */ _fetchRecord: function (record, options) { var self = this; - var fieldNames = options && options.fieldNames || - _.uniq(record.getFieldNames().concat(['display_name'])); + var fieldNames = options && options.fieldNames || record.getFieldNames(); + fieldNames = _.uniq(fieldNames.concat(['display_name'])); return this._rpc({ model: record.model, method: 'read', @@ -2337,6 +2337,16 @@ var BasicModel = AbstractModel.extend({ _generateOnChangeData: function (record) { var commands = this._generateX2ManyCommands(record, {withReadonly: true}); var data = _.extend(this.get(record.id, {raw: true}).data, commands); + // 'display_name' is automatically added to the list of fields to fetch, + // when fetching a record, even if it doesn't appear in the view. However, + // only the fields in the view must be passed to the onchange RPC, so we + // remove it from the data sent by RPC if it isn't in the view. + var hasDisplayName = _.some(record.fieldsInfo, function (fieldsInfo) { + return 'display_name' in fieldsInfo; + }); + if (!hasDisplayName) { + delete data.display_name; + } // one2many records have a parentID if (record.parentID) { diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index a2504af38bb..92a24066408 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -2521,6 +2521,7 @@ QUnit.module('relational_fields', { arch:'