diff --git a/addons/bus/controllers/main.py b/addons/bus/controllers/main.py index 54bb005d5fc..5adfbb30a10 100644 --- a/addons/bus/controllers/main.py +++ b/addons/bus/controllers/main.py @@ -41,4 +41,4 @@ class BusController(Controller): @route('/longpolling/im_status', type="json", auth="user") def im_status(self, partner_ids): - return request.env['res.partner'].search_read([['id', 'in', partner_ids]], ['id', 'im_status']) + return request.env['res.partner'].browse(partner_ids).read(['im_status']) diff --git a/addons/mail/models/res_partner.py b/addons/mail/models/res_partner.py index af409c392f3..f139e483d58 100644 --- a/addons/mail/models/res_partner.py +++ b/addons/mail/models/res_partner.py @@ -69,6 +69,7 @@ class Partner(models.Model): "display_name": self.name_get()[0][1], "name": self.name, "active": self.active, + "im_status": self.im_status, } @api.model diff --git a/addons/mail/static/src/models/messaging_initializer/messaging_initializer.js b/addons/mail/static/src/models/messaging_initializer/messaging_initializer.js index 304faf79674..9fc0c052448 100644 --- a/addons/mail/static/src/models/messaging_initializer/messaging_initializer.js +++ b/addons/mail/static/src/models/messaging_initializer/messaging_initializer.js @@ -237,74 +237,36 @@ function factory(dependencies) { /** * @private * @param {Object} current_partner - * @param {boolean} current_partner.active - * @param {string} current_partner.display_name - * @param {integer} current_partner.id - * @param {string} current_partner.name * @param {integer} current_user_id * @param {integer[]} moderation_channel_ids * @param {Object} partner_root - * @param {boolean} partner_root.active - * @param {string} partner_root.display_name - * @param {integer} partner_root.id - * @param {string} partner_root.name * @param {Object} public_partner - * @param {boolean} public_partner.active - * @param {string} public_partner.display_name - * @param {integer} public_partner.id - * @param {string} public_partner.name */ _initPartners({ - current_partner: { - active: currentPartnerIsActive, - display_name: currentPartnerDisplayName, - id: currentPartnerId, - name: currentPartnerName, - }, + current_partner, current_user_id: currentUserId, moderation_channel_ids = [], - partner_root: { - active: partnerRootIsActive, - display_name: partnerRootDisplayName, - id: partnerRootId, - name: partnerRootName, - }, - public_partner: { - active: publicPartnerIsActive, - display_name: publicPartnerDisplayName, - id: publicPartnerId, - name: publicPartnerName, - }, + partner_root, + public_partner, }) { this.messaging.update({ - currentPartner: [['insert', { - active: currentPartnerIsActive, - display_name: currentPartnerDisplayName, - id: currentPartnerId, - moderatedChannels: [ - ['insert', moderation_channel_ids.map(id => { - return { - id, - model: 'mail.channel', - }; - })], - ], - name: currentPartnerName, - user: [['insert', { id: currentUserId }]], - }]], + currentPartner: [['insert', Object.assign( + this.env.models['mail.partner'].convertData(current_partner), + { + moderatedChannels: [ + ['insert', moderation_channel_ids.map(id => { + return { + id, + model: 'mail.channel', + }; + })], + ], + user: [['insert', { id: currentUserId }]], + } + )]], currentUser: [['insert', { id: currentUserId }]], - partnerRoot: [['insert', { - active: partnerRootIsActive, - display_name: partnerRootDisplayName, - id: partnerRootId, - name: partnerRootName, - }]], - publicPartner: [['insert', { - active: publicPartnerIsActive, - display_name: publicPartnerDisplayName, - id: publicPartnerId, - name: publicPartnerName, - }]], + partnerRoot: [['insert', this.env.models['mail.partner'].convertData(partner_root)]], + publicPartner: [['insert', this.env.models['mail.partner'].convertData(public_partner)]], }); } diff --git a/addons/mail/static/src/models/partner/partner.js b/addons/mail/static/src/models/partner/partner.js index e0aba1322f2..70bcad40376 100644 --- a/addons/mail/static/src/models/partner/partner.js +++ b/addons/mail/static/src/models/partner/partner.js @@ -22,6 +22,9 @@ function factory(dependencies) { */ static convertData(data) { const data2 = {}; + if ('active' in data) { + data2.active = data.active; + } if ('country' in data) { if (!data.country) { data2.country = [['unlink-all']]; @@ -213,35 +216,22 @@ function factory(dependencies) { * @private */ static async _fetchImStatus() { - let toFetchPartnersLocalIds = []; - let partnerIdToLocalId = {}; - const toFetchPartners = this.all(partner => partner.im_status !== null); - for (const partner of toFetchPartners) { - toFetchPartnersLocalIds.push(partner.localId); - partnerIdToLocalId[partner.id] = partner.localId; + const partnerIds = []; + for (const partner of this.all()) { + if (partner.im_status !== 'im_partner') { + partnerIds.push(partner.id); + } } - if (!toFetchPartnersLocalIds.length) { + if (partnerIds.length === 0) { return; } const dataList = await this.env.services.rpc({ route: '/longpolling/im_status', params: { - partner_ids: toFetchPartnersLocalIds.map(partnerLocalId => - this.get(partnerLocalId).id - ), + partner_ids: partnerIds, }, }, { shadow: true }); - for (const { id, im_status } of dataList) { - this.insert({ id, im_status }); - delete partnerIdToLocalId[id]; - } - // partners with no im_status => set null - for (const noImStatusPartnerLocalId of Object.values(partnerIdToLocalId)) { - const partner = this.get(noImStatusPartnerLocalId); - if (partner) { - partner.update({ im_status: null }); - } - } + this.insert(dataList); } /**