diff --git a/addons/mail/static/src/js/many2many_tags_email.js b/addons/mail/static/src/js/many2many_tags_email.js index 874ae7ec00a..e11a147d8e1 100644 --- a/addons/mail/static/src/js/many2many_tags_email.js +++ b/addons/mail/static/src/js/many2many_tags_email.js @@ -21,9 +21,9 @@ BasicModel.include({ * @param {Object} record - an element from the localData * @param {string} fieldName * @return {Deferred} the deferred is resolved with the - * invalidPartnerIds + * invalidPartnerIds and partnerNames */ - _setInvalidMany2ManyTagsEmail: function (record, fieldName) { + _fetchSpecialMany2ManyTagsEmail: function (record, fieldName) { var self = this; var localID = (record._changes && fieldName in record._changes) ? record._changes[fieldName] : @@ -37,14 +37,26 @@ BasicModel.include({ } }); var def; - if (invalidPartnerIds) { + if (invalidPartnerIds.length) { // remove invalid partners var changes = {operation: 'DELETE', ids: _.pluck(invalidPartnerIds, 'id')}; def = this._applyX2ManyChange(record, fieldName, changes); } return $.when(def).then(function () { - return $.when({ - invalidPartnerIds: _.pluck(invalidPartnerIds, 'res_id'), + list = self._applyX2ManyOperations(self.localData[localID]); + if (list.res_ids.length) { + def = self._rpc({ + model: list.model, + method: 'name_get', + args: list.res_ids, + context: record.getContext({fieldName: fieldName}), + }); + } + return $.when(def).then(function (names) { + return $.when({ + invalidPartnerIds: _.pluck(invalidPartnerIds, 'res_id'), + partnerNames: _.object(names), + }); }); }); }, @@ -54,7 +66,7 @@ var FieldMany2ManyTagsEmail = M2MTags.extend({ fieldsToFetch: _.extend({}, M2MTags.prototype.fieldsToFetch, { email: {type: 'char'}, }), - specialData: "_setInvalidMany2ManyTagsEmail", + specialData: "_fetchSpecialMany2ManyTagsEmail", //-------------------------------------------------------------------------- // Private @@ -131,14 +143,17 @@ var FieldMany2ManyTagsEmail = M2MTags.extend({ * Override for res.partner * name_get is dynamic (based on context) while display_name is static * (stored) + * + * @override + * @private */ - get_render_data: function(ids){ - this.dataset.cancel_read(); - return this.dataset.name_get(ids).then(function (names) { - return _.map(names, function(name) { - return {id: name[0], display_name: name[1]}; - }); + _getRenderTagsContext: function () { + var result = this._super.apply(this, arguments); + var partnerNames = this.record.specialData[this.name].partnerNames; + _.each(result.elements, function (partner) { + partner.display_name = partnerNames[partner.id]; }); + return result; }, }); diff --git a/addons/mail/static/tests/chatter_tests.js b/addons/mail/static/tests/chatter_tests.js index 409b729fc78..53b1cde91b9 100644 --- a/addons/mail/static/tests/chatter_tests.js +++ b/addons/mail/static/tests/chatter_tests.js @@ -1092,8 +1092,9 @@ QUnit.module('FieldMany2ManyTagsEmail', { }); QUnit.test('fieldmany2many tags email', function (assert) { - assert.expect(11); + assert.expect(13); var done = assert.async(); + var nameGottenIds = [[12], [12, 14]]; this.data.partner.records[0].timmy = [12, 14]; @@ -1113,7 +1114,11 @@ QUnit.test('fieldmany2many tags email', function (assert) { mode: 'edit', }, mockRPC: function (route, args) { - if (args.method ==='read' && args.model === 'partner_type') { + if (route === "/web/dataset/call_kw/partner_type/name_get") { + assert.deepEqual(args.args, nameGottenIds.shift(), + "partner with email should be name_get'ed"); + } + else if (args.method ==='read' && args.model === 'partner_type') { assert.step(args.args[0]); assert.deepEqual(args.args[1] , ['display_name', 'email'], "should read the email"); } diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index d14c1f008fd..d07d3153303 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -760,7 +760,7 @@ - +