[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:
committed by
Alexandre Kühn
parent
00b77514c3
commit
e77e205252
@@ -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'])
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user