[FIX] bus, mail: fix im_status for archived partners

Before this commit, archived and deleted partners had not their
im_status being updated automatically. There were some issues
with this, notably:

- odoobot 'bot' status was not displayed in chatter
- im_status of partners becoming archived were not updated.

This commit fixes both issues.

task-2329591

closes odoo/odoo#60567

X-original-commit: 63b081c49da089c839479b807de8c0cea45221da
Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
This commit is contained in:
Thanh Dodeur
2020-10-22 17:23:13 +00:00
committed by Alexandre Kühn
parent 00b77514c3
commit e77e205252
4 changed files with 32 additions and 79 deletions
+1 -1
View File
@@ -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'])
+1
View File
@@ -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
@@ -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)]],
});
}
@@ -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);
}
/**