summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorSébastien Theys <seb@odoo.com>2020-12-07 13:06:15 +0000
committerSébastien Theys <seb@odoo.com>2020-12-07 13:06:15 +0000
commit9fbea9f8ee193e672c855c73ad29de187f27cef1 (patch)
tree7060d2860d2a3c517943e8171dca19dec3fb218d /addons
parent486c445d2200d3805ffac30e84ff35a7a61bf0b7 (diff)
[FIX] mail, im_livechat: properly handle multiple public partners
task-2391334 closes odoo/odoo#62956 Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
Diffstat (limited to 'addons')
-rw-r--r--addons/im_livechat/models/mail_channel.py9
-rw-r--r--addons/im_livechat/static/src/models/messaging_notification_handler/messaging_notification_handler.js2
-rw-r--r--addons/im_livechat/static/src/models/thread/thread.js2
-rw-r--r--addons/mail/controllers/main.py1
-rw-r--r--addons/mail/static/src/models/messaging/messaging.js14
-rw-r--r--addons/mail/static/src/models/messaging_initializer/messaging_initializer.js14
6 files changed, 34 insertions, 8 deletions
diff --git a/addons/im_livechat/models/mail_channel.py b/addons/im_livechat/models/mail_channel.py
index 9f090a6ccfc..f6c89c3666c 100644
--- a/addons/im_livechat/models/mail_channel.py
+++ b/addons/im_livechat/models/mail_channel.py
@@ -104,12 +104,13 @@ class MailChannel(models.Model):
if not partners:
# operator probably testing the livechat with his own user
partners = channel_partner_ids
- if partners and partners[0] != self.env.ref('base.public_partner'):
+ first_partner = partners and partners[0]
+ if first_partner and (not first_partner.user_ids or not any(user._is_public() for user in first_partner.user_ids)):
# legit non-public partner
return {
- 'country': partners[0].country_id.name_get()[0] if partners[0].country_id else False,
- 'id': partners[0].id,
- 'name': partners[0].name,
+ 'country': first_partner.country_id.name_get()[0] if first_partner.country_id else False,
+ 'id': first_partner.id,
+ 'name': first_partner.name,
}
return {
'country': self.country_id.name_get()[0] if self.country_id else False,
diff --git a/addons/im_livechat/static/src/models/messaging_notification_handler/messaging_notification_handler.js b/addons/im_livechat/static/src/models/messaging_notification_handler/messaging_notification_handler.js
index ca08208907d..efae3eed105 100644
--- a/addons/im_livechat/static/src/models/messaging_notification_handler/messaging_notification_handler.js
+++ b/addons/im_livechat/static/src/models/messaging_notification_handler/messaging_notification_handler.js
@@ -23,7 +23,7 @@ registerInstancePatchModel('mail.messaging_notification_handler', 'im_livechat/s
}
let partnerId;
let partnerName;
- if (partner_id === this.env.messaging.publicPartner.id) {
+ if (this.env.messaging.publicPartners.some(publicPartner => publicPartner.id === partner_id)) {
// Some shenanigans that this is a typing notification
// from public partner.
partnerId = channel.correspondent.id;
diff --git a/addons/im_livechat/static/src/models/thread/thread.js b/addons/im_livechat/static/src/models/thread/thread.js
index b3984500f8d..745aff78f69 100644
--- a/addons/im_livechat/static/src/models/thread/thread.js
+++ b/addons/im_livechat/static/src/models/thread/thread.js
@@ -39,7 +39,7 @@ registerClassPatchModel('mail.thread', 'im_livechat/static/src/models/thread/thr
* of polluting the database, it is therefore acceptable and
* easier to handle one temporary partner per channel.
*/
- data2.members.push(['unlink', this.env.messaging.publicPartner]);
+ data2.members.push(['unlink', this.env.messaging.publicPartners]);
const partner = this.env.models['mail.partner'].create(
Object.assign(
this.env.models['mail.partner'].convertData(data.livechat_visitor),
diff --git a/addons/mail/controllers/main.py b/addons/mail/controllers/main.py
index 6e1525439c4..bf3f268f68b 100644
--- a/addons/mail/controllers/main.py
+++ b/addons/mail/controllers/main.py
@@ -268,6 +268,7 @@ class MailController(http.Controller):
'moderation_channel_ids': request.env.user.moderation_channel_ids.ids,
'partner_root': request.env.ref('base.partner_root').sudo().mail_partner_format(),
'public_partner': request.env.ref('base.public_partner').sudo().mail_partner_format(),
+ 'public_partners': [partner.mail_partner_format() for partner in request.env.ref('base.group_public').sudo().with_context(active_test=False).users.partner_id],
'current_partner': request.env.user.partner_id.mail_partner_format(),
'current_user_id': request.env.user.id,
}
diff --git a/addons/mail/static/src/models/messaging/messaging.js b/addons/mail/static/src/models/messaging/messaging.js
index a7f7fcf0b6a..6594f8db48c 100644
--- a/addons/mail/static/src/models/messaging/messaging.js
+++ b/addons/mail/static/src/models/messaging/messaging.js
@@ -2,7 +2,7 @@ odoo.define('mail/static/src/models/messaging/messaging.js', function (require)
'use strict';
const { registerNewModel } = require('mail/static/src/model/model_core.js');
-const { attr, many2one, one2many, one2one } = require('mail/static/src/model/model_field.js');
+const { attr, many2many, many2one, one2many, one2one } = require('mail/static/src/model/model_field.js');
function factory(dependencies) {
@@ -222,8 +222,20 @@ function factory(dependencies) {
default: 0,
}),
partnerRoot: many2one('mail.partner'),
+ /**
+ * Determines which partner should be considered the public partner,
+ * which is a special partner notably used in livechat.
+ *
+ * @deprecated in favor of `publicPartners` because in multi-website
+ * setup there might be a different public partner per website.
+ */
publicPartner: many2one('mail.partner'),
/**
+ * Determines which partners should be considered the public partners,
+ * which are special partners notably used in livechat.
+ */
+ publicPartners: many2many('mail.partner'),
+ /**
* Mailbox Starred.
*/
starred: one2one('mail.thread'),
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 07d44355931..a0c8372940d 100644
--- a/addons/mail/static/src/models/messaging_initializer/messaging_initializer.js
+++ b/addons/mail/static/src/models/messaging_initializer/messaging_initializer.js
@@ -80,6 +80,7 @@ function factory(dependencies) {
* @param {integer} [param0.needaction_inbox_counter=0]
* @param {Object} param0.partner_root
* @param {Object} param0.public_partner
+ * @param {Object[]} param0.public_partners
* @param {Object[]} [param0.shortcodes=[]]
* @param {integer} [param0.starred_counter=0]
*/
@@ -96,6 +97,7 @@ function factory(dependencies) {
needaction_inbox_counter = 0,
partner_root,
public_partner,
+ public_partners,
shortcodes = [],
starred_counter = 0
}) {
@@ -107,6 +109,7 @@ function factory(dependencies) {
moderation_channel_ids,
partner_root,
public_partner,
+ public_partners,
});
// mailboxes after partners and before other initializers that might
// manipulate threads or messages
@@ -246,6 +249,7 @@ function factory(dependencies) {
* @param {integer[]} moderation_channel_ids
* @param {Object} partner_root
* @param {Object} public_partner
+ * @param {Object[]} [public_partners=[]]
*/
_initPartners({
current_partner,
@@ -253,7 +257,9 @@ function factory(dependencies) {
moderation_channel_ids = [],
partner_root,
public_partner,
+ public_partners = [],
}) {
+ const publicPartner = this.env.models['mail.partner'].convertData(public_partner);
this.messaging.update({
currentPartner: [['insert', Object.assign(
this.env.models['mail.partner'].convertData(current_partner),
@@ -271,7 +277,13 @@ function factory(dependencies) {
)]],
currentUser: [['insert', { id: currentUserId }]],
partnerRoot: [['insert', this.env.models['mail.partner'].convertData(partner_root)]],
- publicPartner: [['insert', this.env.models['mail.partner'].convertData(public_partner)]],
+ publicPartner: [['insert', publicPartner]],
+ publicPartners: [
+ ['insert', publicPartner],
+ ['insert', public_partners.map(
+ publicPartner => this.env.models['mail.partner'].convertData(publicPartner))
+ ],
+ ],
});
}