[IMP] mail, *: rename mail.channel.partner to mail.channel.member
* = calendar, crm_livechat, hr_holidays, im_livechat, privacy_lookup, privacy_lookup, test_discuss_full, test_mail_full, website_livechat closes odoo/odoo#95912 Related: odoo/upgrade#3681 Related: odoo/enterprise#29433 Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
This commit is contained in:
@@ -55,7 +55,7 @@ class TestLivechatLead(TestCrmCommon):
|
||||
lead = channel._convert_visitor_to_lead(self.env.user.partner_id, '/lead TestLead command')
|
||||
|
||||
self.assertEqual(
|
||||
channel.channel_last_seen_partner_ids.partner_id,
|
||||
channel.channel_member_ids.partner_id,
|
||||
self.user_sales_leads.partner_id | self.env.ref('base.public_partner')
|
||||
)
|
||||
self.assertEqual(lead.name, 'TestLead command')
|
||||
|
||||
@@ -18,7 +18,7 @@ QUnit.test('thread icon of a chat when correspondent is on leave & online', asyn
|
||||
name: 'Demo',
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -52,7 +52,7 @@ QUnit.test('thread icon of a chat when correspondent is on leave & away', async
|
||||
name: 'Demo',
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -86,7 +86,7 @@ QUnit.test('thread icon of a chat when correspondent is on leave & offline', asy
|
||||
name: 'Demo',
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
|
||||
@@ -18,7 +18,7 @@ QUnit.test('out of office message on direct chat with out of office partner', as
|
||||
out_of_office_date_end: returningDate.format("YYYY-MM-DD"),
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
|
||||
@@ -70,7 +70,7 @@ class LivechatChatbotScriptController(http.Controller):
|
||||
'chatbot_posted_message': posted_message.message_format()[0] if posted_message else None,
|
||||
'chatbot_step': {
|
||||
'chatbot_operator_found': next_step.step_type == 'forward_operator' and len(
|
||||
mail_channel.channel_last_seen_partner_ids) > 2,
|
||||
mail_channel.channel_member_ids) > 2,
|
||||
'chatbot_script_step_id': next_step.id,
|
||||
'chatbot_step_answers': [{
|
||||
'id': answer.id,
|
||||
|
||||
@@ -8,7 +8,7 @@ from . import res_users
|
||||
from . import res_partner
|
||||
from . import im_livechat_channel
|
||||
from . import mail_channel
|
||||
from . import mail_channel_partner
|
||||
from . import mail_channel_member
|
||||
from . import mail_message
|
||||
from . import res_users_settings
|
||||
from . import rating
|
||||
|
||||
@@ -134,12 +134,12 @@ class ImLivechatChannel(models.Model):
|
||||
def _get_livechat_mail_channel_vals(self, anonymous_name, operator=None, chatbot_script=None, user_id=None, country_id=None):
|
||||
# partner to add to the mail.channel
|
||||
operator_partner_id = operator.partner_id.id if operator else chatbot_script.operator_partner_id.id
|
||||
channel_partner_to_add = [Command.create({'partner_id': operator_partner_id, 'is_pinned': False})]
|
||||
members_to_add = [Command.create({'partner_id': operator_partner_id, 'is_pinned': False})]
|
||||
visitor_user = False
|
||||
if user_id:
|
||||
visitor_user = self.env['res.users'].browse(user_id)
|
||||
if visitor_user and visitor_user.active and operator and visitor_user != operator: # valid session user (not public)
|
||||
channel_partner_to_add.append(Command.create({'partner_id': visitor_user.partner_id.id}))
|
||||
members_to_add.append(Command.create({'partner_id': visitor_user.partner_id.id}))
|
||||
|
||||
if chatbot_script:
|
||||
name = chatbot_script.title
|
||||
@@ -150,7 +150,7 @@ class ImLivechatChannel(models.Model):
|
||||
])
|
||||
|
||||
return {
|
||||
'channel_last_seen_partner_ids': channel_partner_to_add,
|
||||
'channel_member_ids': members_to_add,
|
||||
'livechat_active': True,
|
||||
'livechat_operator_id': operator_partner_id,
|
||||
'livechat_channel_id': self.id,
|
||||
|
||||
@@ -45,10 +45,10 @@ class MailChannel(models.Model):
|
||||
if channel.channel_type == 'livechat':
|
||||
notifications.append([channel.uuid, 'mail.channel/new_message', notifications[0][2]])
|
||||
if not message.author_id:
|
||||
unpinned_channel_partner = self.channel_last_seen_partner_ids.filtered(lambda cp: not cp.is_pinned)
|
||||
if unpinned_channel_partner:
|
||||
unpinned_channel_partner.write({'is_pinned': True})
|
||||
notifications = self._channel_channel_notifications(unpinned_channel_partner.mapped('partner_id').ids) + notifications
|
||||
unpinned_members = self.channel_member_ids.filtered(lambda member: not member.is_pinned)
|
||||
if unpinned_members:
|
||||
unpinned_members.write({'is_pinned': True})
|
||||
notifications = self._channel_channel_notifications(unpinned_members.partner_id.ids) + notifications
|
||||
return notifications
|
||||
|
||||
def channel_info(self):
|
||||
|
||||
+7
-8
@@ -1,23 +1,22 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import api, models
|
||||
|
||||
|
||||
class ChannelPartner(models.Model):
|
||||
_inherit = 'mail.channel.partner'
|
||||
class ChannelMember(models.Model):
|
||||
_inherit = 'mail.channel.member'
|
||||
|
||||
@api.autovacuum
|
||||
def _gc_unpin_livechat_sessions(self):
|
||||
""" Unpin livechat sessions with no activity for at least one day to
|
||||
clean the operator's interface """
|
||||
self.env.cr.execute("""
|
||||
UPDATE mail_channel_partner
|
||||
UPDATE mail_channel_member
|
||||
SET is_pinned = false
|
||||
WHERE id in (
|
||||
SELECT cp.id FROM mail_channel_partner cp
|
||||
INNER JOIN mail_channel c on c.id = cp.channel_id
|
||||
WHERE c.channel_type = 'livechat' AND cp.is_pinned is true AND
|
||||
cp.write_date < current_timestamp - interval '1 day'
|
||||
SELECT cm.id FROM mail_channel_member cm
|
||||
INNER JOIN mail_channel c on c.id = cm.channel_id
|
||||
WHERE c.channel_type = 'livechat' AND cm.is_pinned is true AND
|
||||
cm.write_date < current_timestamp - interval '1 day'
|
||||
)
|
||||
""")
|
||||
@@ -1,4 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import api, models, fields
|
||||
@@ -14,7 +13,7 @@ class Partners(models.Model):
|
||||
channels = super()._get_channels_as_member()
|
||||
channels |= self.env['mail.channel'].search([
|
||||
('channel_type', '=', 'livechat'),
|
||||
('channel_last_seen_partner_ids', 'in', self.env['mail.channel.partner'].sudo()._search([
|
||||
('channel_member_ids', 'in', self.env['mail.channel.member'].sudo()._search([
|
||||
('partner_id', '=', self.id),
|
||||
('is_pinned', '=', True),
|
||||
])),
|
||||
|
||||
@@ -162,7 +162,7 @@ const LivechatButton = Widget.extend({
|
||||
});
|
||||
return;
|
||||
}
|
||||
case 'mail.channel.partner/typing_status': {
|
||||
case 'mail.channel.member/typing_status': {
|
||||
if (payload.channel_id !== this.messaging.livechatButtonView.publicLivechat.legacyPublicLivechat._id) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ patchRecordMethods('MessagingNotificationHandler', {
|
||||
/**
|
||||
* @override
|
||||
*/
|
||||
_handleNotificationChannelPartnerTypingStatus({ channel_id, is_typing, livechat_username, partner_id, partner_name }) {
|
||||
_handleNotificationChannelMemberTypingStatus({ channel_id, is_typing, livechat_username, partner_id, partner_name }) {
|
||||
const channel = this.messaging.models['Thread'].findFromIdentifyingData({
|
||||
id: channel_id,
|
||||
model: 'mail.channel',
|
||||
|
||||
@@ -96,7 +96,7 @@ patch(MockServer.prototype, 'im_livechat', {
|
||||
const id = ids[0]; // ensure_one
|
||||
const mailChannel = this.getRecords('mail.channel', [['id', '=', id]])[0];
|
||||
// remove active test to ensure public partner is taken into account
|
||||
const members = this.getRecords('mail.channel.partner', [['id', 'in', mailChannel.channel_last_seen_partner_ids]]);
|
||||
const members = this.getRecords('mail.channel.member', [['id', 'in', mailChannel.channel_member_ids]]);
|
||||
let partners = this.getRecords(
|
||||
'res.partner',
|
||||
[['id', 'in', members.filter(member => member.partner_id).map(member => member.partner_id)]],
|
||||
@@ -184,7 +184,7 @@ patch(MockServer.prototype, 'im_livechat', {
|
||||
operator.livechat_username ? operator.livechat_username : operator.name,
|
||||
];
|
||||
return {
|
||||
'channel_last_seen_partner_ids': membersToAdd,
|
||||
'channel_member_ids': membersToAdd,
|
||||
'livechat_active': true,
|
||||
'livechat_operator_id': operator_partner_id,
|
||||
'livechat_channel_id': id,
|
||||
@@ -242,10 +242,10 @@ patch(MockServer.prototype, 'im_livechat', {
|
||||
*/
|
||||
_mockResPartner_GetChannelsAsMember(ids) {
|
||||
const partner = this.getRecords('res.partner', [['id', 'in', ids]])[0];
|
||||
const members = this.getRecords('mail.channel.partner', [['partner_id', '=', partner.id], ['is_pinned', '=', true]]);
|
||||
const members = this.getRecords('mail.channel.member', [['partner_id', '=', partner.id], ['is_pinned', '=', true]]);
|
||||
const livechats = this.getRecords('mail.channel', [
|
||||
['channel_type', '=', 'livechat'],
|
||||
['channel_last_seen_partner_ids', 'in', members.map(member => member.id)],
|
||||
['channel_member_ids', 'in', members.map(member => member.id)],
|
||||
]);
|
||||
return [
|
||||
...this._super(ids),
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ QUnit.test('closing a chat window with no message from admin side unpins it', as
|
||||
pyEnv['res.users'].create({ partner_id: resPartnerId1 });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create(
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
is_pinned: true,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
|
||||
+2
-2
@@ -15,7 +15,7 @@ QUnit.test('livechat - avatar: should have a smiley face avatar for an anonymous
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -53,7 +53,7 @@ QUnit.test('livechat - avatar: should have a partner profile picture for a livec
|
||||
name: "Jean",
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
|
||||
+12
-12
@@ -16,7 +16,7 @@ QUnit.test('livechat - counter: should not have a counter if the category is unf
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -38,7 +38,7 @@ QUnit.test('livechat - counter: should not have a counter if the category is unf
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 10,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -63,7 +63,7 @@ QUnit.test('livechat - counter: should not have a counter if category is folded
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -90,7 +90,7 @@ QUnit.test('livechat - counter: should have correct value of unread threads if c
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 10,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -120,7 +120,7 @@ QUnit.test('livechat - states: close manually by clicking the title', async func
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -169,7 +169,7 @@ QUnit.test('livechat - states: open manually by clicking the title', async funct
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -218,7 +218,7 @@ QUnit.test('livechat - states: close should update the value on the server', asy
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -268,7 +268,7 @@ QUnit.test('livechat - states: open should update the value on the server', asyn
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -318,7 +318,7 @@ QUnit.test('livechat - states: close from the bus', async function (assert) {
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -366,7 +366,7 @@ QUnit.test('livechat - states: open from the bus', async function (assert) {
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -415,7 +415,7 @@ QUnit.test('livechat - states: category item should be invisible if the catgory
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -460,7 +460,7 @@ QUnit.test('livechat - states: the active category item should be visble even if
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
|
||||
@@ -19,7 +19,7 @@ QUnit.test('livechat in the sidebar: basic rendering', async function (assert) {
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -74,7 +74,7 @@ QUnit.test('livechat in the sidebar: existing user with country', async function
|
||||
name: "Jean",
|
||||
});
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -145,7 +145,7 @@ QUnit.test('do not add livechat in the sidebar on visitor typing', async functio
|
||||
user_ids: [pyEnv.currentUserId],
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
is_pinned: false,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -199,7 +199,7 @@ QUnit.test('add livechat in the sidebar on visitor sending first message', async
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor (Belgium)",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
is_pinned: false,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -255,7 +255,7 @@ QUnit.test('livechats are sorted by last activity time in the sidebar: most rece
|
||||
const [mailChannelId1, mailChannelId2] = pyEnv['mail.channel'].create([
|
||||
{
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
last_interest_dt: datetime_to_str(new Date(2021, 0, 1)),
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -267,7 +267,7 @@ QUnit.test('livechats are sorted by last activity time in the sidebar: most rece
|
||||
},
|
||||
{
|
||||
anonymous_name: "Visitor 12",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
last_interest_dt: datetime_to_str(new Date(2021, 0, 2)),
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -335,7 +335,7 @@ QUnit.test('invite button should be present on livechat', async function (assert
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create(
|
||||
{
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -365,7 +365,7 @@ QUnit.test('call buttons should not be present on livechat', async function (ass
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create(
|
||||
{
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ QUnit.test('livechats should be in "chat" filter', async function (assert) {
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 11",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
|
||||
@@ -16,7 +16,7 @@ QUnit.test('livechat: public website visitor is typing', async function (assert)
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 20",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -43,7 +43,7 @@ QUnit.test('livechat: public website visitor is typing', async function (assert)
|
||||
const mailChannel1 = pyEnv['mail.channel'].searchRead([['id', '=', mailChannelId1]])[0];
|
||||
// simulate receive typing notification from livechat visitor "is typing"
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': true,
|
||||
'partner_id': messaging.publicPartners[0].id,
|
||||
|
||||
+2
-2
@@ -16,7 +16,7 @@ QUnit.test('receive visitor typing status "is typing"', async function (assert)
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
anonymous_name: "Visitor 20",
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -39,7 +39,7 @@ QUnit.test('receive visitor typing status "is typing"', async function (assert)
|
||||
const mailChannel1 = pyEnv['mail.channel'].searchRead([['id', '=', mailChannelId1]])[0];
|
||||
// simulate receive typing notification from livechat visitor "is typing"
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': true,
|
||||
'partner_id': messaging.publicPartners[0].id,
|
||||
|
||||
@@ -113,12 +113,12 @@ class TestGetMailChannel(TransactionCase):
|
||||
def test_channel_not_pinned_for_operator_before_first_message(self):
|
||||
public_user = self.env.ref('base.public_user')
|
||||
channel_info = self.livechat_channel.with_user(public_user)._open_livechat_mail_channel(anonymous_name='whatever')
|
||||
operator_channel_partner = self.env['mail.channel.partner'].search([('channel_id', '=', channel_info['id']), ('partner_id', 'in', self.operators.partner_id.ids)])
|
||||
self.assertEqual(len(operator_channel_partner), 1, "operator should be member of channel")
|
||||
self.assertFalse(operator_channel_partner.is_pinned, "channel should not be pinned for operator initially")
|
||||
operator_channel_member = self.env['mail.channel.member'].search([('channel_id', '=', channel_info['id']), ('partner_id', 'in', self.operators.partner_id.ids)])
|
||||
self.assertEqual(len(operator_channel_member), 1, "operator should be member of channel")
|
||||
self.assertFalse(operator_channel_member.is_pinned, "channel should not be pinned for operator initially")
|
||||
self.env['mail.channel'].browse(channel_info['id']).message_post(body='cc')
|
||||
self.assertTrue(operator_channel_partner.is_pinned, "channel should be pinned for operator after visitor sent a message")
|
||||
self.assertIn(channel_info['id'], operator_channel_partner.partner_id._get_channels_as_member().ids, "channel should be fetched by operator on new page")
|
||||
self.assertTrue(operator_channel_member.is_pinned, "channel should be pinned for operator after visitor sent a message")
|
||||
self.assertIn(channel_info['id'], operator_channel_member.partner_id._get_channels_as_member().ids, "channel should be fetched by operator on new page")
|
||||
|
||||
def test_operator_livechat_username(self):
|
||||
"""Ensures the operator livechat_username is returned by `_channel_fetch_message`, which is
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
'views/mail_mail_views.xml',
|
||||
'views/mail_followers_views.xml',
|
||||
'views/mail_ice_server_views.xml',
|
||||
'views/mail_channel_partner_views.xml',
|
||||
'views/mail_channel_member_views.xml',
|
||||
'views/mail_channel_rtc_session_views.xml',
|
||||
'views/mail_channel_views.xml',
|
||||
'views/mail_shortcode_views.xml',
|
||||
|
||||
@@ -45,8 +45,8 @@ class DiscussController(http.Controller):
|
||||
|
||||
@http.route('/discuss/channel/<int:channel_id>', methods=['GET'], type='http', auth='public')
|
||||
def discuss_channel(self, channel_id, **kwargs):
|
||||
channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
return self._response_discuss_public_channel_template(channel_sudo=channel_partner_sudo.channel_id)
|
||||
channel_member_sudo = request.env['mail.channel.member']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
return self._response_discuss_public_channel_template(channel_sudo=channel_member_sudo.channel_id)
|
||||
|
||||
def _response_discuss_channel_from_token(self, create_token, channel_name=None, default_display_mode=False):
|
||||
if not request.env['ir.config_parameter'].sudo().get_param('mail.chat_from_token'):
|
||||
@@ -76,9 +76,9 @@ class DiscussController(http.Controller):
|
||||
'isChannelTokenSecret': is_channel_token_secret,
|
||||
}
|
||||
add_guest_cookie = False
|
||||
channel_partner_sudo = channel_sudo.env['mail.channel.partner']._get_as_sudo_from_request(request=request, channel_id=channel_sudo.id)
|
||||
if channel_partner_sudo:
|
||||
channel_sudo = channel_partner_sudo.channel_id # ensure guest is in context
|
||||
channel_member_sudo = channel_sudo.env['mail.channel.member']._get_as_sudo_from_request(request=request, channel_id=channel_sudo.id)
|
||||
if channel_member_sudo:
|
||||
channel_sudo = channel_member_sudo.channel_id # ensure guest is in context
|
||||
else:
|
||||
if not channel_sudo.env.user._is_public():
|
||||
try:
|
||||
@@ -135,10 +135,10 @@ class DiscussController(http.Controller):
|
||||
|
||||
@http.route('/mail/channel/<int:channel_id>/partner/<int:partner_id>/avatar_128', methods=['GET'], type='http', auth='public')
|
||||
def mail_channel_partner_avatar_128(self, channel_id, partner_id, **kwargs):
|
||||
channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request(request=request, channel_id=channel_id)
|
||||
partner_sudo = channel_partner_sudo.env['res.partner'].browse(partner_id).exists()
|
||||
channel_member_sudo = request.env['mail.channel.member']._get_as_sudo_from_request(request=request, channel_id=channel_id)
|
||||
partner_sudo = channel_member_sudo.env['res.partner'].browse(partner_id).exists()
|
||||
placeholder = partner_sudo._avatar_get_placeholder_path()
|
||||
if channel_partner_sudo and channel_partner_sudo.env['mail.channel.partner'].search([('channel_id', '=', channel_id), ('partner_id', '=', partner_id)], limit=1):
|
||||
if channel_member_sudo and channel_member_sudo.env['mail.channel.member'].search([('channel_id', '=', channel_id), ('partner_id', '=', partner_id)], limit=1):
|
||||
return request.env['ir.binary']._get_image_stream_from(partner_sudo, field_name='avatar_128', placeholder=placeholder).get_response()
|
||||
if request.env.user.share:
|
||||
return request.env['ir.binary']._get_placeholder_stream(placeholder)
|
||||
@@ -146,10 +146,10 @@ class DiscussController(http.Controller):
|
||||
|
||||
@http.route('/mail/channel/<int:channel_id>/guest/<int:guest_id>/avatar_128', methods=['GET'], type='http', auth='public')
|
||||
def mail_channel_guest_avatar_128(self, channel_id, guest_id, **kwargs):
|
||||
channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request(request=request, channel_id=channel_id)
|
||||
guest_sudo = channel_partner_sudo.env['mail.guest'].browse(guest_id).exists()
|
||||
channel_member_sudo = request.env['mail.channel.member']._get_as_sudo_from_request(request=request, channel_id=channel_id)
|
||||
guest_sudo = channel_member_sudo.env['mail.guest'].browse(guest_id).exists()
|
||||
placeholder = guest_sudo._avatar_get_placeholder_path()
|
||||
if channel_partner_sudo and channel_partner_sudo.env['mail.channel.partner'].search([('channel_id', '=', channel_id), ('guest_id', '=', guest_id)], limit=1):
|
||||
if channel_member_sudo and channel_member_sudo.env['mail.channel.member'].search([('channel_id', '=', channel_id), ('guest_id', '=', guest_id)], limit=1):
|
||||
return request.env['ir.binary']._get_image_stream_from(guest_sudo, field_name='avatar_128', placeholder=placeholder).get_response()
|
||||
if request.env.user.share:
|
||||
return request.env['ir.binary']._get_placeholder_stream(placeholder)
|
||||
@@ -157,8 +157,8 @@ class DiscussController(http.Controller):
|
||||
|
||||
@http.route('/mail/channel/<int:channel_id>/attachment/<int:attachment_id>', methods=['GET'], type='http', auth='public')
|
||||
def mail_channel_attachment(self, channel_id, attachment_id, download=None, **kwargs):
|
||||
channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
attachment_sudo = channel_partner_sudo.env['ir.attachment'].search([
|
||||
channel_member_sudo = request.env['mail.channel.member']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
attachment_sudo = channel_member_sudo.env['ir.attachment'].search([
|
||||
('id', '=', int(attachment_id)),
|
||||
('res_id', '=', int(channel_id)),
|
||||
('res_model', '=', 'mail.channel')
|
||||
@@ -172,8 +172,8 @@ class DiscussController(http.Controller):
|
||||
'/mail/channel/<int:channel_id>/image/<int:attachment_id>/<int:width>x<int:height>',
|
||||
], methods=['GET'], type='http', auth='public')
|
||||
def fetch_image(self, channel_id, attachment_id, width=0, height=0, **kwargs):
|
||||
channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
attachment_sudo = channel_partner_sudo.env['ir.attachment'].search([
|
||||
channel_member_sudo = request.env['mail.channel.member']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
attachment_sudo = channel_member_sudo.env['ir.attachment'].search([
|
||||
('id', '=', int(attachment_id)),
|
||||
('res_id', '=', int(channel_id)),
|
||||
('res_model', '=', 'mail.channel'),
|
||||
@@ -235,8 +235,8 @@ class DiscussController(http.Controller):
|
||||
@http.route('/mail/message/post', methods=['POST'], type='json', auth='public')
|
||||
def mail_message_post(self, thread_model, thread_id, post_data, **kwargs):
|
||||
if thread_model == 'mail.channel':
|
||||
channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(thread_id))
|
||||
thread = channel_partner_sudo.channel_id
|
||||
channel_member_sudo = request.env['mail.channel.member']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(thread_id))
|
||||
thread = channel_member_sudo.channel_id
|
||||
else:
|
||||
thread = request.env[thread_model].browse(int(thread_id)).exists()
|
||||
return thread.message_post(**{key: value for key, value in post_data.items() if key in self._get_allowed_message_post_params()}).message_format()[0]
|
||||
@@ -256,9 +256,9 @@ class DiscussController(http.Controller):
|
||||
|
||||
@http.route('/mail/attachment/upload', methods=['POST'], type='http', auth='public')
|
||||
def mail_attachment_upload(self, ufile, thread_id, thread_model, is_pending=False, **kwargs):
|
||||
channel_partner = request.env['mail.channel.partner']
|
||||
channel_member = request.env['mail.channel.member']
|
||||
if thread_model == 'mail.channel':
|
||||
channel_partner = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(thread_id))
|
||||
channel_member = request.env['mail.channel.member']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(thread_id))
|
||||
vals = {
|
||||
'name': ufile.filename,
|
||||
'raw': ufile.read(),
|
||||
@@ -272,11 +272,11 @@ class DiscussController(http.Controller):
|
||||
'res_id': 0,
|
||||
'res_model': 'mail.compose.message',
|
||||
})
|
||||
if channel_partner.env.user.share:
|
||||
if channel_member.env.user.share:
|
||||
# Only generate the access token if absolutely necessary (= not for internal user).
|
||||
vals['access_token'] = channel_partner.env['ir.attachment']._generate_access_token()
|
||||
vals['access_token'] = channel_member.env['ir.attachment']._generate_access_token()
|
||||
try:
|
||||
attachment = channel_partner.env['ir.attachment'].create(vals)
|
||||
attachment = channel_member.env['ir.attachment'].create(vals)
|
||||
attachment._post_add_create()
|
||||
attachmentData = {
|
||||
'filename': ufile.filename,
|
||||
@@ -388,9 +388,9 @@ class DiscussController(http.Controller):
|
||||
# Only guests should take this route.
|
||||
if not guest:
|
||||
raise NotFound()
|
||||
channel_partner = channel_sudo.env['mail.channel.partner']._get_as_sudo_from_request(request=request, channel_id=channel_id)
|
||||
channel_member = channel_sudo.env['mail.channel.member']._get_as_sudo_from_request(request=request, channel_id=channel_id)
|
||||
# Do not add the guest to channel members if they are already member.
|
||||
if not channel_partner:
|
||||
if not channel_member:
|
||||
channel_sudo = channel_sudo.with_context(guest=guest)
|
||||
try:
|
||||
channel_sudo.add_members(guest_ids=[guest.id])
|
||||
@@ -399,8 +399,8 @@ class DiscussController(http.Controller):
|
||||
|
||||
@http.route('/mail/channel/messages', methods=['POST'], type='json', auth='public')
|
||||
def mail_channel_messages(self, channel_id, max_id=None, min_id=None, limit=30, **kwargs):
|
||||
channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
return channel_partner_sudo.env['mail.message']._message_fetch(domain=[
|
||||
channel_member_sudo = request.env['mail.channel.member']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
return channel_member_sudo.env['mail.message']._message_fetch(domain=[
|
||||
('res_id', '=', channel_id),
|
||||
('model', '=', 'mail.channel'),
|
||||
('message_type', '!=', 'user_notification'),
|
||||
@@ -408,18 +408,18 @@ class DiscussController(http.Controller):
|
||||
|
||||
@http.route('/mail/channel/set_last_seen_message', methods=['POST'], type='json', auth='public')
|
||||
def mail_channel_mark_as_seen(self, channel_id, last_message_id, **kwargs):
|
||||
channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
return channel_partner_sudo.channel_id._channel_seen(int(last_message_id))
|
||||
channel_member_sudo = request.env['mail.channel.member']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
return channel_member_sudo.channel_id._channel_seen(int(last_message_id))
|
||||
|
||||
@http.route('/mail/channel/ping', methods=['POST'], type='json', auth='public')
|
||||
def channel_ping(self, channel_id, rtc_session_id=None, check_rtc_session_ids=None):
|
||||
channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
channel_member_sudo = request.env['mail.channel.member']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
if rtc_session_id:
|
||||
channel_partner_sudo.channel_id.rtc_session_ids.filtered_domain([
|
||||
channel_member_sudo.channel_id.rtc_session_ids.filtered_domain([
|
||||
('id', '=', int(rtc_session_id)),
|
||||
('channel_partner_id', '=', channel_partner_sudo.id),
|
||||
('channel_member_id', '=', channel_member_sudo.id),
|
||||
]).write({}) # update write_date
|
||||
current_rtc_sessions, outdated_rtc_sessions = channel_partner_sudo._rtc_sync_sessions(check_rtc_session_ids=check_rtc_session_ids)
|
||||
current_rtc_sessions, outdated_rtc_sessions = channel_member_sudo._rtc_sync_sessions(check_rtc_session_ids=check_rtc_session_ids)
|
||||
return {'rtcSessions': [
|
||||
('insert', [rtc_session_sudo._mail_rtc_session_format(complete_info=False) for rtc_session_sudo in current_rtc_sessions]),
|
||||
('insert-and-unlink', [{'id': missing_rtc_session_sudo.id} for missing_rtc_session_sudo in outdated_rtc_sessions]),
|
||||
@@ -519,16 +519,16 @@ class DiscussController(http.Controller):
|
||||
""" Joins the RTC call of a channel if the user is a member of that channel
|
||||
:param int channel_id: id of the channel to join
|
||||
"""
|
||||
channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
return channel_partner_sudo._rtc_join_call(check_rtc_session_ids=check_rtc_session_ids)
|
||||
channel_member_sudo = request.env['mail.channel.member']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
return channel_member_sudo._rtc_join_call(check_rtc_session_ids=check_rtc_session_ids)
|
||||
|
||||
@http.route('/mail/rtc/channel/leave_call', methods=['POST'], type="json", auth="public")
|
||||
def channel_call_leave(self, channel_id):
|
||||
""" Disconnects the current user from a rtc call and clears any invitation sent to that user on this channel
|
||||
:param int channel_id: id of the channel from which to disconnect
|
||||
"""
|
||||
channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
return channel_partner_sudo._rtc_leave_call()
|
||||
channel_member_sudo = request.env['mail.channel.member']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
return channel_member_sudo._rtc_leave_call()
|
||||
|
||||
@http.route('/mail/rtc/channel/cancel_call_invitation', methods=['POST'], type="json", auth="public")
|
||||
def channel_call_cancel_invitation(self, channel_id, member_ids=None):
|
||||
@@ -537,8 +537,8 @@ class DiscussController(http.Controller):
|
||||
|
||||
:param list member_ids: list of member ids to invite
|
||||
"""
|
||||
channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
return channel_partner_sudo.channel_id._rtc_cancel_invitations(member_ids=member_ids)
|
||||
channel_member_sudo = request.env['mail.channel.member']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id))
|
||||
return channel_member_sudo.channel_id._rtc_cancel_invitations(member_ids=member_ids)
|
||||
|
||||
@http.route('/mail/rtc/audio_worklet_processor', methods=['GET'], type='http', auth='public')
|
||||
def audio_worklet_processor(self):
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<p>This channel is accessible to all users to <b>easily share company information</b>.</p>]]></field>
|
||||
</record>
|
||||
|
||||
<record model="mail.channel.partner" id="channel_partner_general_channel_for_admin">
|
||||
<record model="mail.channel.member" id="channel_member_general_channel_for_admin">
|
||||
<field name="partner_id" ref="base.partner_admin"/>
|
||||
<field name="channel_id" ref="mail.channel_all_employees"/>
|
||||
<field name="fetched_message_id" ref="mail.module_install_notification"/>
|
||||
|
||||
@@ -29,7 +29,7 @@ from . import mail_tracking_value
|
||||
from . import mail_template
|
||||
|
||||
# discuss
|
||||
from . import mail_channel_partner
|
||||
from . import mail_channel_member
|
||||
from . import mail_channel_rtc_session
|
||||
from . import mail_channel
|
||||
from . import mail_guest
|
||||
|
||||
+103
-104
@@ -58,12 +58,12 @@ class Channel(models.Model):
|
||||
image_128 = fields.Image("Image", max_width=128, max_height=128)
|
||||
avatar_128 = fields.Image("Avatar", max_width=128, max_height=128, compute='_compute_avatar_128')
|
||||
channel_partner_ids = fields.Many2many(
|
||||
'res.partner', string='Members',
|
||||
'res.partner', string='Partners',
|
||||
compute='_compute_channel_partner_ids', inverse='_inverse_channel_partner_ids',
|
||||
compute_sudo=True, search='_search_channel_partner_ids',
|
||||
groups='base.group_user')
|
||||
channel_last_seen_partner_ids = fields.One2many(
|
||||
'mail.channel.partner', 'channel_id', string='Last Seen',
|
||||
channel_member_ids = fields.One2many(
|
||||
'mail.channel.member', 'channel_id', string='Members',
|
||||
groups='base.group_user')
|
||||
rtc_session_ids = fields.One2many('mail.channel.rtc.session', 'channel_id', groups="base.group_system")
|
||||
is_member = fields.Boolean('Is Member', compute='_compute_is_member', search='_search_is_member')
|
||||
@@ -94,10 +94,10 @@ class Channel(models.Model):
|
||||
|
||||
# CONSTRAINTS
|
||||
|
||||
@api.constrains('channel_last_seen_partner_ids', 'channel_partner_ids')
|
||||
@api.constrains('channel_member_ids', 'channel_partner_ids')
|
||||
def _constraint_partners_chat(self):
|
||||
for ch in self.sudo().filtered(lambda ch: ch.channel_type == 'chat'):
|
||||
if len(ch.channel_last_seen_partner_ids) > 2 or len(ch.channel_partner_ids) > 2:
|
||||
if len(ch.channel_member_ids) > 2 or len(ch.channel_partner_ids) > 2:
|
||||
raise ValidationError(_("A channel of type 'chat' cannot have more than two users."))
|
||||
|
||||
@api.constrains('group_public_id', 'group_ids')
|
||||
@@ -126,16 +126,16 @@ class Channel(models.Model):
|
||||
avatar = avatar.replace('fill="#875a7b"', f'fill="{bgcolor}"')
|
||||
return base64.b64encode(avatar.encode())
|
||||
|
||||
@api.depends('channel_last_seen_partner_ids.partner_id')
|
||||
@api.depends('channel_member_ids.partner_id')
|
||||
def _compute_channel_partner_ids(self):
|
||||
for channel in self:
|
||||
channel.channel_partner_ids = channel.channel_last_seen_partner_ids.partner_id
|
||||
channel.channel_partner_ids = channel.channel_member_ids.partner_id
|
||||
|
||||
def _inverse_channel_partner_ids(self):
|
||||
new_members = []
|
||||
outdated = self.env['mail.channel.partner']
|
||||
outdated = self.env['mail.channel.member']
|
||||
for channel in self:
|
||||
current_members = channel.channel_last_seen_partner_ids
|
||||
current_members = channel.channel_member_ids
|
||||
partners = channel.channel_partner_ids
|
||||
partners_new = partners - current_members.partner_id
|
||||
|
||||
@@ -146,21 +146,21 @@ class Channel(models.Model):
|
||||
outdated += current_members.filtered(lambda m: m.partner_id not in partners)
|
||||
|
||||
if new_members:
|
||||
self.env['mail.channel.partner'].create(new_members)
|
||||
self.env['mail.channel.member'].create(new_members)
|
||||
if outdated:
|
||||
outdated.sudo().unlink()
|
||||
|
||||
def _search_channel_partner_ids(self, operator, operand):
|
||||
return [(
|
||||
'channel_last_seen_partner_ids',
|
||||
'channel_member_ids',
|
||||
'in',
|
||||
self.env['mail.channel.partner'].sudo()._search([
|
||||
self.env['mail.channel.member'].sudo()._search([
|
||||
('partner_id', operator, operand)
|
||||
])
|
||||
)]
|
||||
|
||||
@api.depends_context('uid', 'guest')
|
||||
@api.depends('channel_last_seen_partner_ids')
|
||||
@api.depends('channel_member_ids')
|
||||
def _compute_is_member(self):
|
||||
if not self:
|
||||
return
|
||||
@@ -172,7 +172,7 @@ class Channel(models.Model):
|
||||
user_domain = [('guest_id', '=', guest.id)]
|
||||
else:
|
||||
user_domain = [('partner_id', '=', self.env.user.partner_id.id)]
|
||||
members = self.env['mail.channel.partner'].sudo().search(expression.AND([[('channel_id', 'in', self.ids)], user_domain]))
|
||||
members = self.env['mail.channel.member'].sudo().search(expression.AND([[('channel_id', 'in', self.ids)], user_domain]))
|
||||
is_member_channels = {member.channel_id for member in members}
|
||||
for channel in self:
|
||||
channel.is_member = channel in is_member_channels
|
||||
@@ -187,14 +187,14 @@ class Channel(models.Model):
|
||||
else:
|
||||
user_domain = [('partner_id', '=', self.env.user.partner_id.id)]
|
||||
return [(
|
||||
'channel_last_seen_partner_ids',
|
||||
'channel_member_ids',
|
||||
'in' if is_in else 'not in',
|
||||
self.env['mail.channel.partner'].sudo()._search(user_domain)
|
||||
self.env['mail.channel.member'].sudo()._search(user_domain)
|
||||
)]
|
||||
|
||||
@api.depends('channel_partner_ids')
|
||||
def _compute_member_count(self):
|
||||
read_group_res = self.env['mail.channel.partner']._read_group(domain=[('channel_id', 'in', self.ids)], fields=['channel_id'], groupby=['channel_id'])
|
||||
read_group_res = self.env['mail.channel.member']._read_group(domain=[('channel_id', 'in', self.ids)], fields=['channel_id'], groupby=['channel_id'])
|
||||
member_count_by_channel_id = {item['channel_id'][0]: item['channel_id_count'] for item in read_group_res}
|
||||
for channel in self:
|
||||
channel.member_count = member_count_by_channel_id.get(channel.id, 0)
|
||||
@@ -227,8 +227,8 @@ class Channel(models.Model):
|
||||
partner_ids = [cmd[1] for cmd in partner_ids_cmd if cmd[0] == 4]
|
||||
partner_ids += [cmd[2] for cmd in partner_ids_cmd if cmd[0] == 6]
|
||||
|
||||
# find partners to add from channel_last_seen_partner_ids
|
||||
membership_ids_cmd = vals.get('channel_last_seen_partner_ids') or []
|
||||
# find partners to add from channel_member_ids
|
||||
membership_ids_cmd = vals.get('channel_member_ids', [])
|
||||
if any(cmd[0] != 0 for cmd in membership_ids_cmd):
|
||||
raise ValidationError(_('Invalid value when creating a channel with memberships, only 0 is allowed.'))
|
||||
membership_pids = [cmd[2]['partner_id'] for cmd in membership_ids_cmd if cmd[0] == 0]
|
||||
@@ -236,7 +236,7 @@ class Channel(models.Model):
|
||||
# always add current user to new channel to have right values for
|
||||
# is_pinned + ensure they have rights to see channel
|
||||
partner_ids_to_add = list(set(partner_ids + [self.env.user.partner_id.id]))
|
||||
vals['channel_last_seen_partner_ids'] = membership_ids_cmd + [
|
||||
vals['channel_member_ids'] = membership_ids_cmd + [
|
||||
(0, 0, {'partner_id': pid})
|
||||
for pid in partner_ids_to_add if pid not in membership_pids
|
||||
]
|
||||
@@ -290,9 +290,9 @@ class Channel(models.Model):
|
||||
return result
|
||||
|
||||
def init(self):
|
||||
self._cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = %s', ('mail_channel_partner_seen_message_id_idx',))
|
||||
self._cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = %s', ('mail_channel_member_seen_message_id_idx',))
|
||||
if not self._cr.fetchone():
|
||||
self._cr.execute('CREATE INDEX mail_channel_partner_seen_message_id_idx ON mail_channel_partner (channel_id,partner_id,seen_message_id)')
|
||||
self._cr.execute('CREATE INDEX mail_channel_member_seen_message_id_idx ON mail_channel_member (channel_id,partner_id,seen_message_id)')
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# MEMBERS MANAGEMENT
|
||||
@@ -306,7 +306,7 @@ class Channel(models.Model):
|
||||
for channel_id in new_members
|
||||
for partner_id in new_members[channel_id]
|
||||
]
|
||||
self.env['mail.channel.partner'].sudo().create(to_create)
|
||||
self.env['mail.channel.member'].sudo().create(to_create)
|
||||
|
||||
def _subscribe_users_automatically_get_members(self):
|
||||
""" Return new members per channel ID """
|
||||
@@ -373,45 +373,45 @@ class Channel(models.Model):
|
||||
'guest_id': partner.id,
|
||||
'channel_id': channel.id,
|
||||
} for partner in guests - existing_guests]
|
||||
new_members = self.env['mail.channel.partner'].sudo().create(members_to_create)
|
||||
new_members = self.env['mail.channel.member'].sudo().create(members_to_create)
|
||||
members_data = []
|
||||
guest_members_data = []
|
||||
for channel_partner in new_members.filtered(lambda channel_partner: channel_partner.partner_id):
|
||||
for member in new_members.filtered(lambda member: member.partner_id):
|
||||
members_data.append({
|
||||
'id': channel_partner.partner_id.id,
|
||||
'im_status': channel_partner.partner_id.im_status,
|
||||
'name': channel_partner.partner_id.name,
|
||||
'id': member.partner_id.id,
|
||||
'im_status': member.partner_id.im_status,
|
||||
'name': member.partner_id.name,
|
||||
})
|
||||
|
||||
# notify invited members through the bus
|
||||
user = channel_partner.partner_id.user_ids[0] if channel_partner.partner_id.user_ids else self.env['res.users']
|
||||
user = member.partner_id.user_ids[0] if member.partner_id.user_ids else self.env['res.users']
|
||||
if user:
|
||||
notifications.append((channel_partner.partner_id, 'mail.channel/joined', {
|
||||
'channel': channel_partner.channel_id.with_user(user).with_context(allowed_company_ids=user.company_ids.ids).sudo().channel_info()[0],
|
||||
notifications.append((member.partner_id, 'mail.channel/joined', {
|
||||
'channel': member.channel_id.with_user(user).with_context(allowed_company_ids=user.company_ids.ids).sudo().channel_info()[0],
|
||||
'invited_by_user_id': self.env.user.id,
|
||||
'open_chat_window': open_chat_window,
|
||||
}))
|
||||
|
||||
if post_joined_message:
|
||||
# notify existing members with a new message in the channel
|
||||
if channel_partner.partner_id == self.env.user.partner_id:
|
||||
if member.partner_id == self.env.user.partner_id:
|
||||
notification = _('<div class="o_mail_notification">joined the channel</div>')
|
||||
else:
|
||||
notification = _(
|
||||
'<div class="o_mail_notification">invited %s to the channel</div>',
|
||||
channel_partner.partner_id._get_html_link(),
|
||||
member.partner_id._get_html_link(),
|
||||
)
|
||||
channel_partner.channel_id.message_post(body=notification, message_type="notification", subtype_xmlid="mail.mt_comment")
|
||||
for channel_partner in new_members.filtered(lambda channel_partner: channel_partner.guest_id):
|
||||
channel_partner.channel_id.message_post(body=_('<div class="o_mail_notification">joined the channel</div>'), message_type="notification", subtype_xmlid="mail.mt_comment")
|
||||
member.channel_id.message_post(body=notification, message_type="notification", subtype_xmlid="mail.mt_comment")
|
||||
for member in new_members.filtered(lambda member: member.guest_id):
|
||||
member.channel_id.message_post(body=_('<div class="o_mail_notification">joined the channel</div>'), message_type="notification", subtype_xmlid="mail.mt_comment")
|
||||
guest_members_data.append({
|
||||
'id': channel_partner.guest_id.id,
|
||||
'name': channel_partner.guest_id.name,
|
||||
'id': member.guest_id.id,
|
||||
'name': member.guest_id.name,
|
||||
})
|
||||
guest = channel_partner.guest_id
|
||||
guest = member.guest_id
|
||||
if guest:
|
||||
notifications.append((guest, 'mail.channel/joined', {
|
||||
'channel': channel_partner.channel_id.sudo().channel_info()[0],
|
||||
'channel': member.channel_id.sudo().channel_info()[0],
|
||||
}))
|
||||
notifications.append((channel, 'mail.channel/insert', {
|
||||
'id': channel.id,
|
||||
@@ -427,9 +427,9 @@ class Channel(models.Model):
|
||||
guest = self.env['mail.guest']
|
||||
partner = self.env.user.partner_id
|
||||
for channel in self:
|
||||
current_channel_partner = self.env['mail.channel.partner'].sudo().search([('channel_id', '=', channel.id), ('partner_id', '=', partner.id), ('guest_id', '=', guest.id)])
|
||||
if current_channel_partner and current_channel_partner.rtc_session_ids:
|
||||
current_channel_partner._rtc_invite_members(member_ids=new_members.ids)
|
||||
current_channel_member = self.env['mail.channel.member'].sudo().search([('channel_id', '=', channel.id), ('partner_id', '=', partner.id), ('guest_id', '=', guest.id)])
|
||||
if current_channel_member and current_channel_member.rtc_session_ids:
|
||||
current_channel_member._rtc_invite_members(member_ids=new_members.ids)
|
||||
self.env['bus.bus']._sendmany(notifications)
|
||||
|
||||
def _can_invite(self, partner_id):
|
||||
@@ -463,14 +463,14 @@ class Channel(models.Model):
|
||||
:param list member_ids: list of the members ids from which the invitation has to be removed
|
||||
"""
|
||||
self.ensure_one()
|
||||
channel_partner_domain = [
|
||||
channel_member_domain = [
|
||||
('channel_id', '=', self.id),
|
||||
('rtc_inviting_session_id', '!=', False),
|
||||
]
|
||||
if member_ids:
|
||||
channel_partner_domain = expression.AND([channel_partner_domain, [('id', 'in', member_ids)]])
|
||||
channel_member_domain = expression.AND([channel_member_domain, [('id', 'in', member_ids)]])
|
||||
invitation_notifications = []
|
||||
members = self.env['mail.channel.partner'].search(channel_partner_domain)
|
||||
members = self.env['mail.channel.member'].search(channel_member_domain)
|
||||
for member in members:
|
||||
member.rtc_inviting_session_id = False
|
||||
if member.partner_id:
|
||||
@@ -571,10 +571,10 @@ class Channel(models.Model):
|
||||
# So a notification is needed to update UI.
|
||||
if self.is_chat or self.channel_type == 'group':
|
||||
notifications = []
|
||||
for channel_partners in self.channel_last_seen_partner_ids.filtered('partner_id'):
|
||||
notifications.append([channel_partners.partner_id, 'mail.channel/last_interest_dt_changed', {
|
||||
for member in self.channel_member_ids.filtered('partner_id'):
|
||||
notifications.append([member.partner_id, 'mail.channel/last_interest_dt_changed', {
|
||||
'id': self.id,
|
||||
'last_interest_dt': channel_partners.last_interest_dt,
|
||||
'last_interest_dt': member.last_interest_dt,
|
||||
}])
|
||||
self.env['bus.bus']._sendmany(notifications)
|
||||
return rdata
|
||||
@@ -602,7 +602,7 @@ class Channel(models.Model):
|
||||
|
||||
@api.returns('mail.message', lambda value: value.id)
|
||||
def message_post(self, *, message_type='notification', **kwargs):
|
||||
self.filtered(lambda channel: channel.is_chat or channel.channel_type == 'group').mapped('channel_last_seen_partner_ids').sudo().write({
|
||||
self.filtered(lambda channel: channel.is_chat or channel.channel_type == 'group').mapped('channel_member_ids').sudo().write({
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': fields.Datetime.now(),
|
||||
})
|
||||
@@ -610,7 +610,7 @@ class Channel(models.Model):
|
||||
# mail_post_autofollow=False is necessary to prevent adding followers
|
||||
# when using mentions in channels. Followers should not be added to
|
||||
# channels, and especially not automatically (because channel membership
|
||||
# should be managed with channel.partner instead).
|
||||
# should be managed with mail.channel.member instead).
|
||||
# The current client code might be setting the key to True on sending
|
||||
# message but it is only useful when targeting customers in chatter.
|
||||
# This value should simply be set to False in channels no matter what.
|
||||
@@ -753,11 +753,11 @@ class Channel(models.Model):
|
||||
[('rtc_inviting_session_id', '!=', False)],
|
||||
[('partner_id', '=', self.env.user.partner_id.id)] if self.env.user and self.env.user.partner_id else expression.FALSE_LEAF,
|
||||
])
|
||||
all_needed_members = self.env['mail.channel.partner'].search(expression.AND([[('channel_id', 'in', self.ids)], all_needed_members_domain]))
|
||||
all_needed_members = self.env['mail.channel.member'].search(expression.AND([[('channel_id', 'in', self.ids)], all_needed_members_domain]))
|
||||
partner_format_by_partner = all_needed_members.partner_id.mail_partner_format()
|
||||
members_by_channel = defaultdict(lambda: self.env['mail.channel.partner'])
|
||||
invited_members_by_channel = defaultdict(lambda: self.env['mail.channel.partner'])
|
||||
member_of_current_user_by_channel = defaultdict(lambda: self.env['mail.channel.partner'])
|
||||
members_by_channel = defaultdict(lambda: self.env['mail.channel.member'])
|
||||
invited_members_by_channel = defaultdict(lambda: self.env['mail.channel.member'])
|
||||
member_of_current_user_by_channel = defaultdict(lambda: self.env['mail.channel.member'])
|
||||
for member in all_needed_members:
|
||||
members_by_channel[member.channel_id] |= member
|
||||
if member.rtc_inviting_session_id:
|
||||
@@ -783,20 +783,20 @@ class Channel(models.Model):
|
||||
# add last message preview (only used in mobile)
|
||||
info['last_message_id'] = channel_last_message_ids.get(channel.id, False)
|
||||
info['memberCount'] = channel.member_count
|
||||
# find the channel partner state, if logged user
|
||||
# find the channel member state, if logged user
|
||||
if self.env.user and self.env.user.partner_id:
|
||||
info['message_needaction_counter'] = channel.message_needaction_counter
|
||||
partner_channel = member_of_current_user_by_channel.get(channel, self.env['mail.channel.partner']).with_prefetch([m.id for m in member_of_current_user_by_channel.values()])
|
||||
if partner_channel:
|
||||
info['state'] = partner_channel.fold_state or 'open'
|
||||
info['message_unread_counter'] = partner_channel.message_unread_counter
|
||||
info['is_minimized'] = partner_channel.is_minimized
|
||||
info['seen_message_id'] = partner_channel.seen_message_id.id
|
||||
info['custom_channel_name'] = partner_channel.custom_channel_name
|
||||
info['is_pinned'] = partner_channel.is_pinned
|
||||
info['last_interest_dt'] = partner_channel.last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
if partner_channel.rtc_inviting_session_id:
|
||||
info['rtc_inviting_session'] = {'id': partner_channel.rtc_inviting_session_id.id}
|
||||
member = member_of_current_user_by_channel.get(channel, self.env['mail.channel.member']).with_prefetch([m.id for m in member_of_current_user_by_channel.values()])
|
||||
if member:
|
||||
info['state'] = member.fold_state or 'open'
|
||||
info['message_unread_counter'] = member.message_unread_counter
|
||||
info['is_minimized'] = member.is_minimized
|
||||
info['seen_message_id'] = member.seen_message_id.id
|
||||
info['custom_channel_name'] = member.custom_channel_name
|
||||
info['is_pinned'] = member.is_pinned
|
||||
info['last_interest_dt'] = member.last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
if member.rtc_inviting_session_id:
|
||||
info['rtc_inviting_session'] = {'id': member.rtc_inviting_session_id.id}
|
||||
# add members info
|
||||
if channel.channel_type != 'channel':
|
||||
# avoid sending potentially a lot of members for big channels
|
||||
@@ -858,22 +858,22 @@ class Channel(models.Model):
|
||||
raise UserError(_("A chat should not be created with more than 2 persons. Create a group instead."))
|
||||
# determine type according to the number of partner in the channel
|
||||
self.flush_model()
|
||||
self.env['mail.channel.partner'].flush_model()
|
||||
self.env['mail.channel.member'].flush_model()
|
||||
self.env.cr.execute("""
|
||||
SELECT P.channel_id
|
||||
FROM mail_channel C, mail_channel_partner P
|
||||
WHERE P.channel_id = C.id
|
||||
SELECT M.channel_id
|
||||
FROM mail_channel C, mail_channel_member M
|
||||
WHERE M.channel_id = C.id
|
||||
AND C.public LIKE 'private'
|
||||
AND P.partner_id IN %s
|
||||
AND M.partner_id IN %s
|
||||
AND C.channel_type LIKE 'chat'
|
||||
AND NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM mail_channel_partner P2
|
||||
WHERE P2.channel_id = C.id
|
||||
AND P2.partner_id NOT IN %s
|
||||
FROM mail_channel_member M2
|
||||
WHERE M2.channel_id = C.id
|
||||
AND M2.partner_id NOT IN %s
|
||||
)
|
||||
GROUP BY P.channel_id
|
||||
HAVING ARRAY_AGG(DISTINCT P.partner_id ORDER BY P.partner_id) = %s
|
||||
GROUP BY M.channel_id
|
||||
HAVING ARRAY_AGG(DISTINCT M.partner_id ORDER BY M.partner_id) = %s
|
||||
LIMIT 1
|
||||
""", (tuple(partners_to), tuple(partners_to), sorted(list(partners_to)),))
|
||||
result = self.env.cr.dictfetchall()
|
||||
@@ -882,7 +882,7 @@ class Channel(models.Model):
|
||||
channel = self.browse(result[0].get('channel_id'))
|
||||
# pin up the channel for the current partner
|
||||
if pin:
|
||||
self.env['mail.channel.partner'].search([('partner_id', '=', self.env.user.partner_id.id), ('channel_id', '=', channel.id)]).write({
|
||||
self.env['mail.channel.member'].search([('partner_id', '=', self.env.user.partner_id.id), ('channel_id', '=', channel.id)]).write({
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': fields.Datetime.now(),
|
||||
})
|
||||
@@ -905,7 +905,7 @@ class Channel(models.Model):
|
||||
:param state : the new status of the session for the current user.
|
||||
"""
|
||||
domain = [('partner_id', '=', self.env.user.partner_id.id), ('channel_id', 'in', self.ids)]
|
||||
for session_state in self.env['mail.channel.partner'].search(domain):
|
||||
for session_state in self.env['mail.channel.member'].search(domain):
|
||||
if not state:
|
||||
state = session_state.fold_state
|
||||
if session_state.fold_state == 'open':
|
||||
@@ -927,10 +927,10 @@ class Channel(models.Model):
|
||||
|
||||
def channel_pin(self, pinned=False):
|
||||
self.ensure_one()
|
||||
channel_partners = self.env['mail.channel.partner'].search(
|
||||
member = self.env['mail.channel.member'].search(
|
||||
[('partner_id', '=', self.env.user.partner_id.id), ('channel_id', '=', self.id), ('is_pinned', '!=', pinned)])
|
||||
if channel_partners:
|
||||
channel_partners.write({'is_pinned': pinned})
|
||||
if member:
|
||||
member.write({'is_pinned': pinned})
|
||||
if not pinned:
|
||||
self.env['bus.bus']._sendone(self.env.user.partner_id, 'mail.channel/unpin', {'id': self.id})
|
||||
else:
|
||||
@@ -957,7 +957,7 @@ class Channel(models.Model):
|
||||
'partner_id': self.env.user.partner_id.id,
|
||||
}
|
||||
target = self if self.channel_type == 'chat' else self.env.user.partner_id
|
||||
self.env['bus.bus']._sendone(target, 'mail.channel.partner/seen', data)
|
||||
self.env['bus.bus']._sendone(target, 'mail.channel.member/seen', data)
|
||||
return last_message.id
|
||||
|
||||
def _set_last_seen_message(self, last_message):
|
||||
@@ -965,7 +965,7 @@ class Channel(models.Model):
|
||||
Set last seen message of `self` channels for the current user.
|
||||
:param last_message: the message to set as last seen message
|
||||
"""
|
||||
channel_partner_domain = expression.AND([
|
||||
channel_member_domain = expression.AND([
|
||||
[('channel_id', 'in', self.ids)],
|
||||
[('partner_id', '=', self.env.user.partner_id.id)],
|
||||
expression.OR([
|
||||
@@ -973,9 +973,8 @@ class Channel(models.Model):
|
||||
[('seen_message_id', '<', last_message.id)]
|
||||
])
|
||||
])
|
||||
channel_partner_domain = expression.AND([channel_partner_domain, [('partner_id', '=', self.env.user.partner_id.id)]])
|
||||
channel_partner = self.env['mail.channel.partner'].search(channel_partner_domain)
|
||||
channel_partner.write({
|
||||
member = self.env['mail.channel.member'].search(channel_member_domain)
|
||||
member.write({
|
||||
'fetched_message_id': last_message.id,
|
||||
'seen_message_id': last_message.id,
|
||||
})
|
||||
@@ -989,25 +988,25 @@ class Channel(models.Model):
|
||||
if channel.channel_type != 'chat':
|
||||
return
|
||||
last_message_id = channel.message_ids.ids[0] # zero is the index of the last message
|
||||
channel_partner = self.env['mail.channel.partner'].search([('channel_id', '=', channel.id), ('partner_id', '=', self.env.user.partner_id.id)], limit=1)
|
||||
if channel_partner.fetched_message_id.id == last_message_id:
|
||||
member = self.env['mail.channel.member'].search([('channel_id', '=', channel.id), ('partner_id', '=', self.env.user.partner_id.id)], limit=1)
|
||||
if member.fetched_message_id.id == last_message_id:
|
||||
# last message fetched by user is already up-to-date
|
||||
return
|
||||
channel_partner.write({
|
||||
member.write({
|
||||
'fetched_message_id': last_message_id,
|
||||
})
|
||||
self.env['bus.bus']._sendone(channel, 'mail.channel.partner/fetched', {
|
||||
self.env['bus.bus']._sendone(channel, 'mail.channel.member/fetched', {
|
||||
'channel_id': channel.id,
|
||||
'id': channel_partner.id,
|
||||
'id': member.id,
|
||||
'last_message_id': last_message_id,
|
||||
'partner_id': self.env.user.partner_id.id,
|
||||
})
|
||||
|
||||
def channel_set_custom_name(self, name):
|
||||
self.ensure_one()
|
||||
channel_partner = self.env['mail.channel.partner'].search([('partner_id', '=', self.env.user.partner_id.id), ('channel_id', '=', self.id)])
|
||||
channel_partner.write({'custom_channel_name': name})
|
||||
self.env['bus.bus']._sendone(channel_partner.partner_id, 'mail.channel/insert', {
|
||||
member = self.env['mail.channel.member'].search([('partner_id', '=', self.env.user.partner_id.id), ('channel_id', '=', self.id)])
|
||||
member.write({'custom_channel_name': name})
|
||||
self.env['bus.bus']._sendone(member.partner_id, 'mail.channel/insert', {
|
||||
'id': self.id,
|
||||
'custom_channel_name': name,
|
||||
})
|
||||
@@ -1038,8 +1037,8 @@ class Channel(models.Model):
|
||||
'channel_id': channel.id,
|
||||
'is_typing': is_typing,
|
||||
}, **channel._notify_typing_partner_data())
|
||||
notifications.append([channel, 'mail.channel.partner/typing_status', data]) # notify backend users
|
||||
notifications.append([channel.uuid, 'mail.channel.partner/typing_status', data]) # notify frontend users
|
||||
notifications.append([channel, 'mail.channel.member/typing_status', data]) # notify backend users
|
||||
notifications.append([channel.uuid, 'mail.channel.member/typing_status', data]) # notify frontend users
|
||||
self.env['bus.bus']._sendmany(notifications)
|
||||
|
||||
def _notify_typing_partner_data(self):
|
||||
@@ -1106,7 +1105,7 @@ class Channel(models.Model):
|
||||
:rtype: dict
|
||||
"""
|
||||
channel = self.create({
|
||||
'channel_last_seen_partner_ids': [Command.create({'partner_id': partner_id}) for partner_id in partners_to],
|
||||
'channel_member_ids': [Command.create({'partner_id': partner_id}) for partner_id in partners_to],
|
||||
'channel_type': 'group',
|
||||
'default_display_mode': default_display_mode,
|
||||
'name': name,
|
||||
@@ -1158,15 +1157,15 @@ class Channel(models.Model):
|
||||
|
||||
def load_more_members(self, known_member_ids):
|
||||
self.ensure_one()
|
||||
channel_partners = self.env['mail.channel.partner'].search(
|
||||
unknown_members = self.env['mail.channel.member'].search(
|
||||
domain=[('id', 'not in', known_member_ids), ('channel_id', '=', self.id)],
|
||||
limit=100
|
||||
)
|
||||
count = self.env['mail.channel.partner'].search_count(
|
||||
count = self.env['mail.channel.member'].search_count(
|
||||
domain=[('channel_id', '=', self.id)],
|
||||
)
|
||||
return {
|
||||
'channelMembers': [('insert', channel_partners.mail_channel_member_format())],
|
||||
'channelMembers': [('insert', unknown_members.mail_channel_member_format())],
|
||||
'memberCount': count,
|
||||
}
|
||||
|
||||
@@ -1197,9 +1196,9 @@ class Channel(models.Model):
|
||||
if self.public == 'private':
|
||||
msg += _(" This channel is private. People must be invited to join it.")
|
||||
else:
|
||||
all_channel_partners = self.env['mail.channel.partner'].with_context(active_test=False)
|
||||
channel_partners = all_channel_partners.search([('partner_id', '!=', partner.id), ('channel_id', '=', self.id)])
|
||||
msg = _("You are in a private conversation with <b>@%s</b>.", html_escape(channel_partners[0].partner_id.name if channel_partners else _('Anonymous')))
|
||||
all_channel_members = self.env['mail.channel.member'].with_context(active_test=False)
|
||||
channel_members = all_channel_members.search([('partner_id', '!=', partner.id), ('channel_id', '=', self.id)])
|
||||
msg = _("You are in a private conversation with <b>@%s</b>.", html_escape(channel_members[0].partner_id.name if channel_members else _("Anonymous")))
|
||||
msg += self._execute_command_help_message_extra()
|
||||
|
||||
self._send_transient_message(partner, msg)
|
||||
|
||||
+34
-35
@@ -1,4 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from werkzeug.exceptions import NotFound
|
||||
@@ -8,10 +7,10 @@ from odoo.exceptions import AccessError
|
||||
from odoo.osv import expression
|
||||
|
||||
|
||||
class ChannelPartner(models.Model):
|
||||
_name = 'mail.channel.partner'
|
||||
class ChannelMember(models.Model):
|
||||
_name = 'mail.channel.member'
|
||||
_description = 'Listeners of a Channel'
|
||||
_table = 'mail_channel_partner'
|
||||
_table = 'mail_channel_member'
|
||||
_rec_names_search = ['partner_id', 'guest_id']
|
||||
|
||||
# identity
|
||||
@@ -30,7 +29,7 @@ class ChannelPartner(models.Model):
|
||||
is_pinned = fields.Boolean("Is pinned on the interface", default=True)
|
||||
last_interest_dt = fields.Datetime("Last Interest", default=fields.Datetime.now, help="Contains the date and time of the last interesting event that happened in this channel for this partner. This includes: creating, joining, pinning, and new message posted.")
|
||||
# RTC
|
||||
rtc_session_ids = fields.One2many(string="RTC Sessions", comodel_name='mail.channel.rtc.session', inverse_name='channel_partner_id')
|
||||
rtc_session_ids = fields.One2many(string="RTC Sessions", comodel_name='mail.channel.rtc.session', inverse_name='channel_member_id')
|
||||
rtc_inviting_session_id = fields.Many2one('mail.channel.rtc.session', string='Ringing session')
|
||||
|
||||
@api.depends('channel_id.message_ids', 'seen_message_id')
|
||||
@@ -39,29 +38,29 @@ class ChannelPartner(models.Model):
|
||||
self.flush_recordset(['channel_id', 'seen_message_id'])
|
||||
self.env.cr.execute("""
|
||||
SELECT count(mail_message.id) AS count,
|
||||
mail_channel_partner.id
|
||||
mail_channel_member.id
|
||||
FROM mail_message
|
||||
INNER JOIN mail_channel_partner
|
||||
ON mail_channel_partner.channel_id = mail_message.res_id
|
||||
INNER JOIN mail_channel_member
|
||||
ON mail_channel_member.channel_id = mail_message.res_id
|
||||
WHERE mail_message.model = 'mail.channel'
|
||||
AND mail_message.message_type NOT IN ('notification', 'user_notification')
|
||||
AND (
|
||||
mail_message.id > mail_channel_partner.seen_message_id
|
||||
OR mail_channel_partner.seen_message_id IS NULL
|
||||
mail_message.id > mail_channel_member.seen_message_id
|
||||
OR mail_channel_member.seen_message_id IS NULL
|
||||
)
|
||||
AND mail_channel_partner.id IN %(ids)s
|
||||
GROUP BY mail_channel_partner.id
|
||||
AND mail_channel_member.id IN %(ids)s
|
||||
GROUP BY mail_channel_member.id
|
||||
""", {'ids': tuple(self.ids)})
|
||||
unread_counter_by_channel_partner = {res['id']: res['count'] for res in self.env.cr.dictfetchall()}
|
||||
for channel_partner in self:
|
||||
channel_partner.message_unread_counter = unread_counter_by_channel_partner.get(channel_partner.id)
|
||||
unread_counter_by_member = {res['id']: res['count'] for res in self.env.cr.dictfetchall()}
|
||||
for member in self:
|
||||
member.message_unread_counter = unread_counter_by_member.get(member.id)
|
||||
|
||||
def name_get(self):
|
||||
return [(record.id, record.partner_id.name or record.guest_id.name) for record in self]
|
||||
|
||||
def init(self):
|
||||
self.env.cr.execute("CREATE UNIQUE INDEX IF NOT EXISTS mail_channel_partner_partner_unique ON %s (channel_id, partner_id) WHERE partner_id IS NOT NULL" % self._table)
|
||||
self.env.cr.execute("CREATE UNIQUE INDEX IF NOT EXISTS mail_channel_partner_guest_unique ON %s (channel_id, guest_id) WHERE guest_id IS NOT NULL" % self._table)
|
||||
self.env.cr.execute("CREATE UNIQUE INDEX IF NOT EXISTS mail_channel_member_partner_unique ON %s (channel_id, partner_id) WHERE partner_id IS NOT NULL" % self._table)
|
||||
self.env.cr.execute("CREATE UNIQUE INDEX IF NOT EXISTS mail_channel_member_guest_unique ON %s (channel_id, guest_id) WHERE guest_id IS NOT NULL" % self._table)
|
||||
|
||||
_sql_constraints = [
|
||||
("partner_or_guest_exists", "CHECK((partner_id IS NOT NULL AND guest_id IS NULL) OR (partner_id IS NULL AND guest_id IS NOT NULL))", "A channel member must be a partner or a guest."),
|
||||
@@ -81,14 +80,14 @@ class ChannelPartner(models.Model):
|
||||
channel_id = self.env['mail.channel'].browse(vals['channel_id'])
|
||||
if not channel_id._can_invite(vals.get('partner_id')):
|
||||
raise AccessError(_('This user can not be added in this channel'))
|
||||
return super(ChannelPartner, self).create(vals_list)
|
||||
return super().create(vals_list)
|
||||
|
||||
def write(self, vals):
|
||||
for channel_partner in self:
|
||||
for channel_member in self:
|
||||
for field_name in {'channel_id', 'partner_id', 'guest_id'}:
|
||||
if field_name in vals and vals[field_name] != channel_partner[field_name].id:
|
||||
if field_name in vals and vals[field_name] != channel_member[field_name].id:
|
||||
raise AccessError(_('You can not write on %(field_name)s.', field_name=field_name))
|
||||
return super(ChannelPartner, self).write(vals)
|
||||
return super().write(vals)
|
||||
|
||||
def unlink(self):
|
||||
self.sudo().rtc_session_ids.unlink()
|
||||
@@ -96,30 +95,30 @@ class ChannelPartner(models.Model):
|
||||
|
||||
@api.model
|
||||
def _get_as_sudo_from_request_or_raise(self, request, channel_id):
|
||||
channel_partner = self._get_as_sudo_from_request(request=request, channel_id=channel_id)
|
||||
if not channel_partner:
|
||||
channel_member = self._get_as_sudo_from_request(request=request, channel_id=channel_id)
|
||||
if not channel_member:
|
||||
raise NotFound()
|
||||
return channel_partner
|
||||
return channel_member
|
||||
|
||||
@api.model
|
||||
def _get_as_sudo_from_request(self, request, channel_id):
|
||||
""" Seeks a channel partner matching the provided `channel_id` and the
|
||||
""" Seeks a channel member matching the provided `channel_id` and the
|
||||
current user or guest.
|
||||
|
||||
:param channel_id: The id of the channel of which the user/guest is
|
||||
expected to be member.
|
||||
:type channel_id: int
|
||||
:return: A record set containing the channel partner if found, or an
|
||||
:return: A record set containing the channel member if found, or an
|
||||
empty record set otherwise. In case of guest, the record is returned
|
||||
with the 'guest' record in the context.
|
||||
:rtype: mail.channel.partner
|
||||
:rtype: mail.channel.member
|
||||
"""
|
||||
if request.session.uid:
|
||||
return self.env['mail.channel.partner'].sudo().search([('channel_id', '=', channel_id), ('partner_id', '=', self.env.user.partner_id.id)], limit=1)
|
||||
return self.env['mail.channel.member'].sudo().search([('channel_id', '=', channel_id), ('partner_id', '=', self.env.user.partner_id.id)], limit=1)
|
||||
guest = self.env['mail.guest']._get_guest_from_request(request)
|
||||
if guest:
|
||||
return guest.env['mail.channel.partner'].sudo().search([('channel_id', '=', channel_id), ('guest_id', '=', guest.id)], limit=1)
|
||||
return self.env['mail.channel.partner'].sudo()
|
||||
return guest.env['mail.channel.member'].sudo().search([('channel_id', '=', channel_id), ('guest_id', '=', guest.id)], limit=1)
|
||||
return self.env['mail.channel.member'].sudo()
|
||||
|
||||
def mail_channel_member_format(self):
|
||||
members_formatted_data = []
|
||||
@@ -155,7 +154,7 @@ class ChannelPartner(models.Model):
|
||||
check_rtc_session_ids = (check_rtc_session_ids or []) + self.rtc_session_ids.ids
|
||||
self.channel_id._rtc_cancel_invitations(member_ids=self.ids)
|
||||
self.rtc_session_ids.unlink()
|
||||
rtc_session = self.env['mail.channel.rtc.session'].create({'channel_partner_id': self.id})
|
||||
rtc_session = self.env['mail.channel.rtc.session'].create({'channel_member_id': self.id})
|
||||
current_rtc_sessions, outdated_rtc_sessions = self._rtc_sync_sessions(check_rtc_session_ids=check_rtc_session_ids)
|
||||
res = {
|
||||
'iceServers': self.env['mail.ice.server']._get_ice_servers() or False,
|
||||
@@ -180,7 +179,7 @@ class ChannelPartner(models.Model):
|
||||
return self.channel_id._rtc_cancel_invitations(member_ids=self.ids)
|
||||
|
||||
def _rtc_sync_sessions(self, check_rtc_session_ids=None):
|
||||
"""Synchronize the RTC sessions for self channel partner.
|
||||
"""Synchronize the RTC sessions for self channel member.
|
||||
- Inactive sessions of the channel are deleted.
|
||||
- Current sessions are returned.
|
||||
- Sessions given in check_rtc_session_ids that no longer exists
|
||||
@@ -200,15 +199,15 @@ class ChannelPartner(models.Model):
|
||||
:param list member_ids: list of the partner ids to invite
|
||||
"""
|
||||
self.ensure_one()
|
||||
channel_partner_domain = [
|
||||
channel_member_domain = [
|
||||
('channel_id', '=', self.channel_id.id),
|
||||
('rtc_inviting_session_id', '=', False),
|
||||
('rtc_session_ids', '=', False),
|
||||
]
|
||||
if member_ids:
|
||||
channel_partner_domain = expression.AND([channel_partner_domain, [('id', 'in', member_ids)]])
|
||||
channel_member_domain = expression.AND([channel_member_domain, [('id', 'in', member_ids)]])
|
||||
invitation_notifications = []
|
||||
members = self.env['mail.channel.partner'].search(channel_partner_domain)
|
||||
members = self.env['mail.channel.member'].search(channel_member_domain)
|
||||
for member in members:
|
||||
member.rtc_inviting_session_id = self.rtc_session_ids.id
|
||||
if member.partner_id:
|
||||
@@ -11,10 +11,10 @@ class MailRtcSession(models.Model):
|
||||
_name = 'mail.channel.rtc.session'
|
||||
_description = 'Mail RTC session'
|
||||
|
||||
channel_partner_id = fields.Many2one('mail.channel.partner', index=True, required=True, ondelete='cascade')
|
||||
channel_id = fields.Many2one('mail.channel', related='channel_partner_id.channel_id', store=True, readonly=True)
|
||||
partner_id = fields.Many2one('res.partner', related='channel_partner_id.partner_id', string="Partner")
|
||||
guest_id = fields.Many2one('mail.guest', related='channel_partner_id.guest_id')
|
||||
channel_member_id = fields.Many2one('mail.channel.member', index=True, required=True, ondelete='cascade')
|
||||
channel_id = fields.Many2one('mail.channel', related='channel_member_id.channel_id', store=True, readonly=True)
|
||||
partner_id = fields.Many2one('res.partner', related='channel_member_id.partner_id', string="Partner")
|
||||
guest_id = fields.Many2one('mail.guest', related='channel_member_id.guest_id')
|
||||
|
||||
write_date = fields.Datetime("Last Updated On", index=True)
|
||||
|
||||
@@ -24,8 +24,8 @@ class MailRtcSession(models.Model):
|
||||
is_deaf = fields.Boolean(string="Has disabled incoming sound")
|
||||
|
||||
_sql_constraints = [
|
||||
('channel_partner_unique', 'UNIQUE(channel_partner_id)',
|
||||
'There can only be one rtc session per channel partner')
|
||||
('channel_member_unique', 'UNIQUE(channel_member_id)',
|
||||
'There can only be one rtc session per channel member')
|
||||
]
|
||||
|
||||
@api.model_create_multi
|
||||
|
||||
@@ -27,7 +27,7 @@ class MailGuest(models.Model):
|
||||
country_id = fields.Many2one(string="Country", comodel_name='res.country')
|
||||
lang = fields.Selection(string="Language", selection=_lang_get)
|
||||
timezone = fields.Selection(string="Timezone", selection=_tz_get)
|
||||
channel_ids = fields.Many2many(string="Channels", comodel_name='mail.channel', relation='mail_channel_partner', column1='guest_id', column2='channel_id', copy=False)
|
||||
channel_ids = fields.Many2many(string="Channels", comodel_name='mail.channel', relation='mail_channel_member', column1='guest_id', column2='channel_id', copy=False)
|
||||
|
||||
def _get_guest_from_context(self):
|
||||
"""Returns the current guest record from the context, if applicable."""
|
||||
|
||||
@@ -21,7 +21,7 @@ class Partner(models.Model):
|
||||
user_id = fields.Many2one(tracking=4)
|
||||
vat = fields.Char(tracking=5)
|
||||
# channels
|
||||
channel_ids = fields.Many2many('mail.channel', 'mail_channel_partner', 'partner_id', 'channel_id', string='Channels', copy=False)
|
||||
channel_ids = fields.Many2many('mail.channel', 'mail_channel_member', 'partner_id', 'channel_id', string='Channels', copy=False)
|
||||
|
||||
def _compute_im_status(self):
|
||||
super()._compute_im_status()
|
||||
@@ -149,7 +149,7 @@ class Partner(models.Model):
|
||||
# get the pinned direct messages
|
||||
channels |= self.env['mail.channel'].search([
|
||||
('channel_type', '=', 'chat'),
|
||||
('channel_last_seen_partner_ids', 'in', self.env['mail.channel.partner'].sudo()._search([
|
||||
('channel_member_ids', 'in', self.env['mail.channel.member'].sudo()._search([
|
||||
('partner_id', '=', self.id),
|
||||
('is_pinned', '=', True),
|
||||
])),
|
||||
|
||||
@@ -135,11 +135,11 @@ class Users(models.Model):
|
||||
public channels are mailing list (e-mail based) and so users should always receive
|
||||
updates from public channels until they manually un-subscribe themselves.
|
||||
"""
|
||||
current_cp = self.env['mail.channel.partner'].sudo().search([
|
||||
current_cm = self.env['mail.channel.member'].sudo().search([
|
||||
('partner_id', 'in', self.partner_id.ids),
|
||||
])
|
||||
current_cp.filtered(
|
||||
lambda cp: cp.channel_id.public != 'public' and cp.channel_id.channel_type == 'channel'
|
||||
current_cm.filtered(
|
||||
lambda cm: cm.channel_id.public != 'public' and cm.channel_id.channel_type == 'channel'
|
||||
).unlink()
|
||||
|
||||
def _get_portal_access_update_body(self, access_granted):
|
||||
|
||||
@@ -15,9 +15,9 @@ access_mail_notification_system, mail.notification.system,model_mail_notificatio
|
||||
access_mail_channel_all,mail.group.all,model_mail_channel,,1,0,0,0
|
||||
access_mail_channel_user,mail.group.user,model_mail_channel,base.group_user,1,1,1,0
|
||||
access_mail_channel_admin,mail.group.system,model_mail_channel,base.group_system,1,1,1,1
|
||||
access_mail_channel_partner_public,mail.channel.partner.public,model_mail_channel_partner,base.group_public,1,0,0,0
|
||||
access_mail_channel_partner_portal,mail.channel.partner.portal,model_mail_channel_partner,base.group_portal,1,1,1,1
|
||||
access_mail_channel_partner_user,mail.channel.partner.user,model_mail_channel_partner,base.group_user,1,1,1,1
|
||||
access_mail_channel_member_public,mail.channel.member.public,model_mail_channel_member,base.group_public,1,0,0,0
|
||||
access_mail_channel_member_portal,mail.channel.member.portal,model_mail_channel_member,base.group_portal,1,1,1,1
|
||||
access_mail_channel_member_user,mail.channel.member.user,model_mail_channel_member,base.group_user,1,1,1,1
|
||||
access_mail_channel_rtc_session_all,mail.channel.rtc.session.all,model_mail_channel_rtc_session,,0,0,0,0
|
||||
access_mail_channel_rtc_session_system,mail.channel.rtc.session.system,model_mail_channel_rtc_session,base.group_system,1,1,1,1
|
||||
access_mail_alias_all,mail.alias.all,model_mail_alias,,1,0,0,0
|
||||
|
||||
|
@@ -20,9 +20,9 @@
|
||||
<field name="domain_force">[(1, '=', 1)]</field>
|
||||
</record>
|
||||
|
||||
<record id="ir_rule_mail_channel_partner_group_user" model="ir.rule">
|
||||
<field name="name">mail.channel.partner: write its own entries</field>
|
||||
<field name="model_id" ref="model_mail_channel_partner"/>
|
||||
<record id="ir_rule_mail_channel_member_group_user" model="ir.rule">
|
||||
<field name="name">mail.channel.member: write its own entries</field>
|
||||
<field name="model_id" ref="model_mail_channel_member"/>
|
||||
<field name="groups" eval="[(4, ref('base.group_user')), (4, ref('base.group_portal'))]"/>
|
||||
<field name="domain_force">['|', '|',
|
||||
('channel_id.public', '=', 'public'),
|
||||
@@ -34,9 +34,9 @@
|
||||
<field name="perm_unlink" eval="True"/>
|
||||
</record>
|
||||
|
||||
<record id="ir_rule_mail_channel_partner_group_system" model="ir.rule">
|
||||
<field name="name">mail.channel.partner: admin can manipulate all entries</field>
|
||||
<field name="model_id" ref="model_mail_channel_partner"/>
|
||||
<record id="ir_rule_mail_channel_member_group_system" model="ir.rule">
|
||||
<field name="name">mail.channel.member: admin can manipulate all entries</field>
|
||||
<field name="model_id" ref="model_mail_channel_member"/>
|
||||
<field name="groups" eval="[Command.link(ref('base.group_system'))]"/>
|
||||
<field name="domain_force">[(1, '=', 1)]</field>
|
||||
</record>
|
||||
|
||||
@@ -52,12 +52,12 @@ registerModel({
|
||||
switch (message.type) {
|
||||
case 'ir.attachment/delete':
|
||||
return this._handleNotificationAttachmentDelete(message.payload);
|
||||
case 'mail.channel.partner/seen':
|
||||
return this._handleNotificationChannelPartnerSeen(message.payload);
|
||||
case 'mail.channel.partner/fetched':
|
||||
return this._handleNotificationChannelPartnerFetched(message.payload);
|
||||
case 'mail.channel.partner/typing_status':
|
||||
return this._handleNotificationChannelPartnerTypingStatus(message.payload);
|
||||
case 'mail.channel.member/seen':
|
||||
return this._handleNotificationChannelMemberSeen(message.payload);
|
||||
case 'mail.channel.member/fetched':
|
||||
return this._handleNotificationChannelMemberFetched(message.payload);
|
||||
case 'mail.channel.member/typing_status':
|
||||
return this._handleNotificationChannelMemberTypingStatus(message.payload);
|
||||
case 'mail.channel/new_message':
|
||||
if (channelsLeft.has(message.payload.id)) {
|
||||
/**
|
||||
@@ -148,7 +148,7 @@ registerModel({
|
||||
* @param {integer} param1.last_message_id
|
||||
* @param {integer} param1.partner_id
|
||||
*/
|
||||
async _handleNotificationChannelPartnerFetched({
|
||||
async _handleNotificationChannelMemberFetched({
|
||||
channel_id: channelId,
|
||||
last_message_id,
|
||||
partner_id,
|
||||
@@ -296,7 +296,7 @@ registerModel({
|
||||
* @param {integer} param1.last_message_id
|
||||
* @param {integer} param1.partner_id
|
||||
*/
|
||||
async _handleNotificationChannelPartnerSeen({
|
||||
async _handleNotificationChannelMemberSeen({
|
||||
channel_id: channelId,
|
||||
last_message_id,
|
||||
partner_id,
|
||||
@@ -340,7 +340,7 @@ registerModel({
|
||||
* @param {integer} param1.partner_id
|
||||
* @param {string} param1.partner_name
|
||||
*/
|
||||
_handleNotificationChannelPartnerTypingStatus({ channel_id, is_typing, partner_id, partner_name }) {
|
||||
_handleNotificationChannelMemberTypingStatus({ channel_id, is_typing, partner_id, partner_name }) {
|
||||
const channel = this.messaging.models['Thread'].findFromIdentifyingData({
|
||||
id: channel_id,
|
||||
model: 'mail.channel',
|
||||
|
||||
@@ -781,14 +781,14 @@ patch(MockServer.prototype, 'mail', {
|
||||
*/
|
||||
_mockMailChannelActionUnfollow(ids) {
|
||||
const channel = this.getRecords('mail.channel', [['id', 'in', ids]])[0];
|
||||
const [channelMember] = this.getRecords('mail.channel.partner', [['channel_id', 'in', ids], ['partner_id', '=', this.currentPartnerId]]);
|
||||
const [channelMember] = this.getRecords('mail.channel.member', [['channel_id', 'in', ids], ['partner_id', '=', this.currentPartnerId]]);
|
||||
if (!channelMember) {
|
||||
return true;
|
||||
}
|
||||
this.pyEnv['mail.channel'].write(
|
||||
[channel.id],
|
||||
{
|
||||
channel_last_seen_partner_ids: [[2, channelMember.id]],
|
||||
channel_member_ids: [[2, channelMember.id]],
|
||||
},
|
||||
);
|
||||
this.pyEnv['bus.bus']._sendone(this.currentPartner, 'mail.channel/leave', {
|
||||
@@ -819,7 +819,7 @@ patch(MockServer.prototype, 'mail', {
|
||||
const [channel] = this.getRecords('mail.channel', [['id', 'in', ids]]);
|
||||
const partners = this.getRecords('res.partner', [['id', 'in', partner_ids]]);
|
||||
for (const partner of partners) {
|
||||
this.pyEnv['mail.channel.partner'].create({
|
||||
this.pyEnv['mail.channel.member'].create({
|
||||
channel_id: channel.id,
|
||||
partner_id: partner.id,
|
||||
});
|
||||
@@ -896,12 +896,12 @@ patch(MockServer.prototype, 'mail', {
|
||||
if (!lastMessage) {
|
||||
continue;
|
||||
}
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.partner', [['channel_id', '=', channel.id], ['partner_id', '=', this.currentPartnerId]]);
|
||||
this.pyEnv['mail.channel.partner'].write(
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.member', [['channel_id', '=', channel.id], ['partner_id', '=', this.currentPartnerId]]);
|
||||
this.pyEnv['mail.channel.member'].write(
|
||||
[memberOfCurrentUser.id],
|
||||
{ fetched_message_id: lastMessage.id },
|
||||
);
|
||||
this.pyEnv['bus.bus']._sendone(channel, 'mail.channel.partner/fetched', {
|
||||
this.pyEnv['bus.bus']._sendone(channel, 'mail.channel.member/fetched', {
|
||||
'channel_id': channel.id,
|
||||
'id': memberOfCurrentUser.id,
|
||||
'last_message_id': lastMessage.id,
|
||||
@@ -946,13 +946,13 @@ patch(MockServer.prototype, 'mail', {
|
||||
_mockMailChannelChannelFold(ids, state) {
|
||||
const channels = this.getRecords('mail.channel', [['id', 'in', ids]]);
|
||||
for (const channel of channels) {
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.partner', [['channel_id', '=', channel.id], ['partner_id', '=', this.currentPartnerId]]);
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.member', [['channel_id', '=', channel.id], ['partner_id', '=', this.currentPartnerId]]);
|
||||
const foldState = state ? state : memberOfCurrentUser.fold_state === 'open' ? 'folded' : 'open';
|
||||
const vals = {
|
||||
fold_state: foldState,
|
||||
is_minimized: foldState !== 'closed',
|
||||
};
|
||||
this.pyEnv['mail.channel.partner'].write([memberOfCurrentUser.id], vals);
|
||||
this.pyEnv['mail.channel.member'].write([memberOfCurrentUser.id], vals);
|
||||
this.pyEnv['bus.bus']._sendone(this.currentPartner, 'mail.channel/insert', {
|
||||
'id': channel.id,
|
||||
'serverFoldState': memberOfCurrentUser.fold_state,
|
||||
@@ -981,7 +981,7 @@ patch(MockServer.prototype, 'mail', {
|
||||
// always creating a new chat, because no test is relying on receiving
|
||||
// an existing chat.
|
||||
const id = this.pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: partners.map(partner => [0, 0, {
|
||||
channel_member_ids: partners.map(partner => [0, 0, {
|
||||
partner_id: partner.id,
|
||||
}]),
|
||||
channel_type: 'chat',
|
||||
@@ -1000,7 +1000,7 @@ patch(MockServer.prototype, 'mail', {
|
||||
_mockMailChannelChannelInfo(ids) {
|
||||
const channels = this.getRecords('mail.channel', [['id', 'in', ids]]);
|
||||
return channels.map(channel => {
|
||||
const members = this.getRecords('mail.channel.partner', [['id', 'in', channel.channel_last_seen_partner_ids]]);
|
||||
const members = this.getRecords('mail.channel.member', [['id', 'in', channel.channel_member_ids]]);
|
||||
const partnerIds = members.filter(member => member.partner_id).map(member => member.partner_id);
|
||||
const messages = this.getRecords('mail.message', [
|
||||
['model', '=', 'mail.channel'],
|
||||
@@ -1037,7 +1037,7 @@ patch(MockServer.prototype, 'mail', {
|
||||
};
|
||||
});
|
||||
}
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.partner', [['channel_id', '=', channel.id], ['partner_id', '=', this.currentPartnerId]]);
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.member', [['channel_id', '=', channel.id], ['partner_id', '=', this.currentPartnerId]]);
|
||||
if (memberOfCurrentUser) {
|
||||
Object.assign(res, {
|
||||
custom_channel_name: memberOfCurrentUser.custom_channel_name,
|
||||
@@ -1063,9 +1063,9 @@ patch(MockServer.prototype, 'mail', {
|
||||
*/
|
||||
async _mockMailChannelChannelPin(ids, pinned = false) {
|
||||
const [channel] = this.getRecords('mail.channel', [['id', 'in', ids]]);
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.partner', [['channel_id', '=', channel.id], ['partner_id', '=', this.currentPartnerId], ['is_pinned', '!=', pinned]]);
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.member', [['channel_id', '=', channel.id], ['partner_id', '=', this.currentPartnerId], ['is_pinned', '!=', pinned]]);
|
||||
if (memberOfCurrentUser) {
|
||||
this.pyEnv['mail.channel.partner'].write(
|
||||
this.pyEnv['mail.channel.member'].write(
|
||||
[memberOfCurrentUser.id],
|
||||
{ is_pinned: pinned },
|
||||
);
|
||||
@@ -1103,12 +1103,12 @@ patch(MockServer.prototype, 'mail', {
|
||||
if (!channel) {
|
||||
return;
|
||||
}
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.partner', [['channel_id', '=', channel_id], ['partner_id', '=', this.currentPartnerId]]);
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.member', [['channel_id', '=', channel_id], ['partner_id', '=', this.currentPartnerId]]);
|
||||
if (memberOfCurrentUser.seen_message_id && memberOfCurrentUser.seen_message_id >= last_message_id) {
|
||||
return;
|
||||
}
|
||||
this._mockMailChannel_SetLastSeenMessage([channel.id], last_message_id);
|
||||
this.pyEnv['bus.bus']._sendone(channel.channel_type === 'chat' ? channel : this.currentPartner, 'mail.channel.partner/seen', {
|
||||
this.pyEnv['bus.bus']._sendone(channel.channel_type === 'chat' ? channel : this.currentPartner, 'mail.channel.member/seen', {
|
||||
'channel_id': channel.id,
|
||||
'last_message_id': last_message_id,
|
||||
'partner_id': this.currentPartnerId,
|
||||
@@ -1139,9 +1139,9 @@ patch(MockServer.prototype, 'mail', {
|
||||
*/
|
||||
_mockMailChannelChannelSetCustomName(ids, name) {
|
||||
const channelId = ids[0]; // simulate ensure_one.
|
||||
const [channelPartnerId] = this.pyEnv['mail.channel.partner'].search([['partner_id', '=', this.currentPartnerId], ['channel_id', '=', channelId]]);
|
||||
this.pyEnv['mail.channel.partner'].write(
|
||||
[channelPartnerId],
|
||||
const [memberIdOfCurrentUser] = this.pyEnv['mail.channel.member'].search([['partner_id', '=', this.currentPartnerId], ['channel_id', '=', channelId]]);
|
||||
this.pyEnv['mail.channel.member'].write(
|
||||
[memberIdOfCurrentUser],
|
||||
{ custom_channel_name: name },
|
||||
);
|
||||
this.pyEnv['bus.bus']._sendone(this.currentPartner, 'mail.channel/insert', {
|
||||
@@ -1160,7 +1160,7 @@ patch(MockServer.prototype, 'mail', {
|
||||
const partners = this.getRecords('res.partner', [['id', 'in', partners_to]]);
|
||||
const id = this.pyEnv['mail.channel'].create({
|
||||
channel_type: 'group',
|
||||
channel_last_seen_partner_ids: partners.map(partner => [0, 0, { partner_id: partner.id }]),
|
||||
channel_member_ids: partners.map(partner => [0, 0, { partner_id: partner.id }]),
|
||||
name: '',
|
||||
public: 'private',
|
||||
});
|
||||
@@ -1189,7 +1189,7 @@ patch(MockServer.prototype, 'mail', {
|
||||
const ids = args.args[0];
|
||||
const channels = this.getRecords('mail.channel', [['id', 'in', ids]]);
|
||||
for (const channel of channels) {
|
||||
const members = this.getRecords('mail.channel.partner', [['id', 'in', channel.channel_last_seen_partner_ids]]);
|
||||
const members = this.getRecords('mail.channel.member', [['id', 'in', channel.channel_member_ids]]);
|
||||
const otherPartnerIds = members.filter(member => member.partner_id && member.partner_id !== this.currentPartnerId).map(member => member.partner_id);
|
||||
const otherPartners = this.getRecords('res.partner', [['id', 'in', otherPartnerIds]]);
|
||||
let message = "You are alone in this channel.";
|
||||
@@ -1284,8 +1284,8 @@ patch(MockServer.prototype, 'mail', {
|
||||
const message_type = kwargs.message_type || 'notification';
|
||||
const channel = this.getRecords('mail.channel', [['id', '=', id]])[0];
|
||||
if (channel.channel_type !== 'channel') {
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.partner', [['channel_id', '=', channel.id], ['partner_id', '=', this.currentPartnerId]]);
|
||||
this.pyEnv['mail.channel.partner'].write(
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.member', [['channel_id', '=', channel.id], ['partner_id', '=', this.currentPartnerId]]);
|
||||
this.pyEnv['mail.channel.member'].write(
|
||||
[memberOfCurrentUser.id],
|
||||
{
|
||||
last_interest_dt: datetime_to_str(new Date()),
|
||||
@@ -1305,9 +1305,9 @@ patch(MockServer.prototype, 'mail', {
|
||||
this._mockMailChannel_SetLastSeenMessage([channel.id], messageData.id);
|
||||
}
|
||||
// simulate compute of message_unread_counter
|
||||
const otherMembers = this.getRecords('mail.channel.partner', [['channel_id', '=', channel.id], ['partner_id', '!=', this.currentPartnerId]]);
|
||||
const otherMembers = this.getRecords('mail.channel.member', [['channel_id', '=', channel.id], ['partner_id', '!=', this.currentPartnerId]]);
|
||||
for (const member of otherMembers) {
|
||||
this.pyEnv['mail.channel.partner'].write(
|
||||
this.pyEnv['mail.channel.member'].write(
|
||||
[member.id],
|
||||
{ message_unread_counter: member.message_unread_counter + 1 },
|
||||
);
|
||||
@@ -1322,19 +1322,19 @@ patch(MockServer.prototype, 'mail', {
|
||||
* @param {integer[]} known_member_ids
|
||||
*/
|
||||
_mockMailChannelLoadMoreMembers(channel_ids, known_member_ids) {
|
||||
const channelPartners = this.pyEnv['mail.channel.partner'].searchRead([
|
||||
const members = this.pyEnv['mail.channel.member'].searchRead([
|
||||
['id', 'not in', known_member_ids],
|
||||
['channel_id', 'in', channel_ids],
|
||||
], { limit: 100 });
|
||||
const memberCount = this.pyEnv['mail.channel.partner'].searchCount([
|
||||
const memberCount = this.pyEnv['mail.channel.member'].searchCount([
|
||||
['channel_id', 'in', channel_ids],
|
||||
]);
|
||||
const membersData = [];
|
||||
for (const channelPartner of channelPartners) {
|
||||
for (const member of members) {
|
||||
let persona;
|
||||
if (channelPartner.partner_id) {
|
||||
if (member.partner_id) {
|
||||
const [partner] = this.pyEnv['res.partner'].searchRead(
|
||||
[['id', '=', channelPartner.partner_id[0]]],
|
||||
[['id', '=', member.partner_id[0]]],
|
||||
{ fields: ['id', 'name', 'im_status'] }
|
||||
);
|
||||
persona = {
|
||||
@@ -1345,9 +1345,9 @@ patch(MockServer.prototype, 'mail', {
|
||||
}]],
|
||||
};
|
||||
}
|
||||
if (channelPartner.guest_id) {
|
||||
if (member.guest_id) {
|
||||
const [guest] = this.pyEnv['mail.guest'].searchRead(
|
||||
[['id', '=', channelPartner.guest_id[0]]],
|
||||
[['id', '=', member.guest_id[0]]],
|
||||
{ fields: ['id', 'name'] }
|
||||
);
|
||||
persona = {
|
||||
@@ -1358,7 +1358,7 @@ patch(MockServer.prototype, 'mail', {
|
||||
};
|
||||
}
|
||||
membersData.push({
|
||||
'id': channelPartner.id,
|
||||
'id': member.id,
|
||||
'persona': [['insert-and-replace', persona]],
|
||||
});
|
||||
}
|
||||
@@ -1386,7 +1386,7 @@ patch(MockServer.prototype, 'mail', {
|
||||
const partner = this.getRecords('res.partner', [['id', '=', partner_id]]);
|
||||
const notifications = [];
|
||||
for (const channel of channels) {
|
||||
const data = [channel, 'mail.channel.partner/typing_status', {
|
||||
const data = [channel, 'mail.channel.member/typing_status', {
|
||||
'channel_id': channel.id,
|
||||
'is_typing': is_typing,
|
||||
'partner_id': partner_id,
|
||||
@@ -1404,8 +1404,8 @@ patch(MockServer.prototype, 'mail', {
|
||||
* @param {integer} message_id
|
||||
*/
|
||||
_mockMailChannel_SetLastSeenMessage(ids, message_id) {
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.partner', [['channel_id', 'in', ids], ['partner_id', '=', this.currentPartnerId]]);
|
||||
this.pyEnv['mail.channel.partner'].write([memberOfCurrentUser.id], {
|
||||
const [memberOfCurrentUser] = this.getRecords('mail.channel.member', [['channel_id', 'in', ids], ['partner_id', '=', this.currentPartnerId]]);
|
||||
this.pyEnv['mail.channel.member'].write([memberOfCurrentUser.id], {
|
||||
fetched_message_id: message_id,
|
||||
seen_message_id: message_id,
|
||||
});
|
||||
@@ -1941,8 +1941,8 @@ patch(MockServer.prototype, 'mail', {
|
||||
}]);
|
||||
// notify update of last_interest_dt
|
||||
const now = datetime_to_str(new Date());
|
||||
const members = this.getRecords('mail.channel.partner', [['id', 'in', channel.channel_last_seen_partner_ids]]);
|
||||
this.pyEnv['mail.channel.partner'].write(
|
||||
const members = this.getRecords('mail.channel.member', [['id', 'in', channel.channel_member_ids]]);
|
||||
this.pyEnv['mail.channel.member'].write(
|
||||
members.map(member => member.id),
|
||||
{ last_interest_dt: now },
|
||||
);
|
||||
@@ -2156,15 +2156,15 @@ patch(MockServer.prototype, 'mail', {
|
||||
*/
|
||||
_mockResPartner_GetChannelsAsMember(ids) {
|
||||
const partner = this.getRecords('res.partner', [['id', 'in', ids]])[0];
|
||||
const channelMembers = this.getRecords('mail.channel.partner', [['partner_id', '=', partner.id]]);
|
||||
const channelMembers = this.getRecords('mail.channel.member', [['partner_id', '=', partner.id]]);
|
||||
const channels = this.getRecords('mail.channel', [
|
||||
['channel_type', 'in', ['channel', 'group']],
|
||||
['channel_last_seen_partner_ids', 'in', channelMembers.map(member => member.id)],
|
||||
['channel_member_ids', 'in', channelMembers.map(member => member.id)],
|
||||
]);
|
||||
const directMessagesMembers = this.getRecords('mail.channel.partner', [['partner_id', '=', partner.id], ['is_pinned', '=', true]]);
|
||||
const directMessagesMembers = this.getRecords('mail.channel.member', [['partner_id', '=', partner.id], ['is_pinned', '=', true]]);
|
||||
const directMessages = this.getRecords('mail.channel', [
|
||||
['channel_type', '=', 'chat'],
|
||||
['channel_last_seen_partner_ids', 'in', directMessagesMembers.map(member => member.id)],
|
||||
['channel_member_ids', 'in', directMessagesMembers.map(member => member.id)],
|
||||
]);
|
||||
return [
|
||||
...channels,
|
||||
|
||||
@@ -14,7 +14,7 @@ import {
|
||||
|
||||
addModelNamesToFetch([
|
||||
'ir.attachment', 'ir.model', 'ir.model.fields', 'mail.activity', 'mail.activity.type',
|
||||
'mail.channel', 'mail.channel.partner', 'mail.followers', 'mail.message', 'mail.message.subtype',
|
||||
'mail.channel', 'mail.channel.member', 'mail.followers', 'mail.message', 'mail.message.subtype',
|
||||
'mail.notification', 'mail.shortcode', 'mail.template', 'mail.tracking.value',
|
||||
'res.company', 'res.country', 'res.partner', 'res.users', 'res.users.settings', 'res.groups',
|
||||
'res.users.settings.volumes'
|
||||
@@ -46,7 +46,7 @@ insertModelFields('mail.channel', {
|
||||
},
|
||||
},
|
||||
avatarCacheKey: { string: "Avatar Cache Key", type: "datetime" },
|
||||
channel_last_seen_partner_ids: {
|
||||
channel_member_ids: {
|
||||
default() {
|
||||
return [[0, 0, { partner_id: this.currentPartnerId }]];
|
||||
},
|
||||
@@ -55,7 +55,7 @@ insertModelFields('mail.channel', {
|
||||
group_based_subscription: { string: "Group based subscription", type: "boolean" },
|
||||
uuid: { default: () => _.uniqueId('mail.channel_uuid-') },
|
||||
});
|
||||
insertModelFields('mail.channel.partner', {
|
||||
insertModelFields('mail.channel.member', {
|
||||
fold_state: { default: 'open' },
|
||||
is_pinned: { default: true },
|
||||
message_unread_counter: { default: 0 },
|
||||
|
||||
+4
-4
@@ -19,7 +19,7 @@ QUnit.test('should display the channel invitation form after clicking on the inv
|
||||
});
|
||||
pyEnv['res.users'].create({ partner_id: resPartnerId1 });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -57,7 +57,7 @@ QUnit.test('should be able to search for a new user to invite from an existing c
|
||||
pyEnv['res.users'].create({ partner_id: resPartnerId1 });
|
||||
pyEnv['res.users'].create({ partner_id: resPartnerId2 });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -96,7 +96,7 @@ QUnit.test('should be able to create a new group chat from an existing chat', as
|
||||
pyEnv['res.users'].create({ partner_id: resPartnerId1 });
|
||||
pyEnv['res.users'].create({ partner_id: resPartnerId2 });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -136,7 +136,7 @@ QUnit.test('Invitation form should display channel group restriction', async fun
|
||||
name: "testGroup",
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
],
|
||||
channel_type: 'channel',
|
||||
|
||||
+11
-11
@@ -15,7 +15,7 @@ QUnit.test('there should be a button to show member list in the thread view topb
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo" });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -43,7 +43,7 @@ QUnit.test('should show member list when clicking on show member list button in
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo" });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -72,7 +72,7 @@ QUnit.test('should have correct members in member list', async function (assert)
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo" });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -112,7 +112,7 @@ QUnit.test('there should be a button to hide member list in the thread view topb
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo" });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -139,13 +139,13 @@ QUnit.test('should show a button to load more members if they are not all loaded
|
||||
assert.expect(1);
|
||||
|
||||
const pyEnv = await startServer();
|
||||
const channel_last_seen_partner_ids = [[0, 0, { partner_id: pyEnv.currentPartnerId }]];
|
||||
const channel_member_ids = [[0, 0, { partner_id: pyEnv.currentPartnerId }]];
|
||||
for (let i = 0; i < 101; i++) {
|
||||
const resPartnerId = pyEnv['res.partner'].create({ name: "name" + i });
|
||||
channel_last_seen_partner_ids.push([0, 0, { partner_id: resPartnerId }]);
|
||||
channel_member_ids.push([0, 0, { partner_id: resPartnerId }]);
|
||||
}
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids,
|
||||
channel_member_ids,
|
||||
channel_type: 'group',
|
||||
public: 'private',
|
||||
});
|
||||
@@ -170,13 +170,13 @@ QUnit.test('Load more button should load more members', async function (assert)
|
||||
assert.expect(1);
|
||||
|
||||
const pyEnv = await startServer();
|
||||
const channel_last_seen_partner_ids = [[0, 0, { partner_id: pyEnv.currentPartnerId }]];
|
||||
const channel_member_ids = [[0, 0, { partner_id: pyEnv.currentPartnerId }]];
|
||||
for (let i = 0; i < 101; i++) {
|
||||
const resPartnerId = pyEnv['res.partner'].create({ name: "name" + i });
|
||||
channel_last_seen_partner_ids.push([0, 0, { partner_id: resPartnerId }]);
|
||||
channel_member_ids.push([0, 0, { partner_id: resPartnerId }]);
|
||||
}
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids,
|
||||
channel_member_ids,
|
||||
channel_type: 'group',
|
||||
public: 'private',
|
||||
});
|
||||
@@ -204,7 +204,7 @@ QUnit.test('chat with member should be opened after clicking on channel member',
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo" });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
|
||||
+24
-24
@@ -209,7 +209,7 @@ QUnit.test('open chat from "new message" chat window should open chat in place o
|
||||
const [, mailChannelId2] = pyEnv['mail.channel'].create([
|
||||
{
|
||||
name: 'channel-1',
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
is_minimized: true,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -218,7 +218,7 @@ QUnit.test('open chat from "new message" chat window should open chat in place o
|
||||
},
|
||||
{
|
||||
name: 'channel-2',
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
is_minimized: false,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -330,7 +330,7 @@ QUnit.test('new message chat window should close on selecting the user if chat w
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Partner 131" });
|
||||
pyEnv['res.users'].create({ partner_id: resPartnerId1 });
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'open',
|
||||
is_minimized: true,
|
||||
@@ -608,7 +608,7 @@ QUnit.test('Mobile: opening a chat window should not update channel state on the
|
||||
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'closed',
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -624,7 +624,7 @@ QUnit.test('Mobile: opening a chat window should not update channel state on the
|
||||
'.o_ChatWindow',
|
||||
"should have a chat window after clicking on thread preview"
|
||||
);
|
||||
const [member] = pyEnv['mail.channel.partner'].searchRead([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
const [member] = pyEnv['mail.channel.member'].searchRead([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
assert.strictEqual(
|
||||
member.fold_state,
|
||||
'closed',
|
||||
@@ -637,7 +637,7 @@ QUnit.test('Mobile: closing a chat window should not update channel state on the
|
||||
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'open',
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -660,7 +660,7 @@ QUnit.test('Mobile: closing a chat window should not update channel state on the
|
||||
'.o_ChatWindow',
|
||||
"should not have a chat window after closing it"
|
||||
);
|
||||
const [member] = pyEnv['mail.channel.partner'].searchRead([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
const [member] = pyEnv['mail.channel.member'].searchRead([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
assert.strictEqual(
|
||||
member.fold_state,
|
||||
'open',
|
||||
@@ -676,7 +676,7 @@ QUnit.test("Mobile: chat window shouldn't open automatically after receiving a n
|
||||
const resUsersId1 = pyEnv['res.users'].create({ partner_id: resPartnerId1 });
|
||||
pyEnv['mail.channel'].records = [
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -713,7 +713,7 @@ QUnit.test('chat window: close on ESCAPE', async function (assert) {
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['res.partner'].create({ name: "TestPartner" });
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
is_minimized: true,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -808,7 +808,7 @@ QUnit.test('focus next visible chat window when closing current chat window with
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create([
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'open',
|
||||
is_minimized: true,
|
||||
@@ -817,7 +817,7 @@ QUnit.test('focus next visible chat window when closing current chat window with
|
||||
],
|
||||
},
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'open',
|
||||
is_minimized: true,
|
||||
@@ -1367,7 +1367,7 @@ QUnit.test('chat window: TAB cycle with 3 open chat windows [REQUIRE FOCUS]', as
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create([
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'open',
|
||||
is_minimized: true,
|
||||
@@ -1376,7 +1376,7 @@ QUnit.test('chat window: TAB cycle with 3 open chat windows [REQUIRE FOCUS]', as
|
||||
],
|
||||
},
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'open',
|
||||
is_minimized: true,
|
||||
@@ -1385,7 +1385,7 @@ QUnit.test('chat window: TAB cycle with 3 open chat windows [REQUIRE FOCUS]', as
|
||||
],
|
||||
},
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'open',
|
||||
is_minimized: true,
|
||||
@@ -1541,7 +1541,7 @@ QUnit.test('chat window should scroll to the newly posted message just after pos
|
||||
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'open',
|
||||
is_minimized: true,
|
||||
@@ -1580,7 +1580,7 @@ QUnit.test('chat window: post message on non-mailing channel with "CTRL-Enter" k
|
||||
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
is_minimized: true,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -1700,7 +1700,7 @@ QUnit.test('chat window does not fetch messages if hidden', async function (asse
|
||||
const pyEnv = await startServer();
|
||||
const [mailChannelId1, mailChannelId2, mailChannelId3] = pyEnv['mail.channel'].create([
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'open',
|
||||
is_minimized: true,
|
||||
@@ -1710,7 +1710,7 @@ QUnit.test('chat window does not fetch messages if hidden', async function (asse
|
||||
name: "Channel #10",
|
||||
},
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'open',
|
||||
is_minimized: true,
|
||||
@@ -1720,7 +1720,7 @@ QUnit.test('chat window does not fetch messages if hidden', async function (asse
|
||||
name: "Channel #11",
|
||||
},
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'open',
|
||||
is_minimized: true,
|
||||
@@ -1803,7 +1803,7 @@ QUnit.test('new message separator is shown in a chat window of a chat on receivi
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo" });
|
||||
const resUsersId1 = pyEnv['res.users'].create({ name: "Foreigner user", partner_id: resPartnerId1 });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
is_minimized: true,
|
||||
is_pinned: false,
|
||||
@@ -1857,7 +1857,7 @@ QUnit.test('new message separator is not shown in a chat window of a chat on rec
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo" });
|
||||
const resUsersId1 = pyEnv['res.users'].create({ name: "Foreigner user", partner_id: resPartnerId1 });
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -1891,7 +1891,7 @@ QUnit.test('focusing a chat window of a chat should make new message separator d
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo" });
|
||||
const resUsersId1 = pyEnv['res.users'].create({ name: "Foreigner user", partner_id: resPartnerId1 });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
is_minimized: true,
|
||||
is_pinned: false,
|
||||
@@ -1951,7 +1951,7 @@ QUnit.test('chat window should open when receiving a new DM', async function (as
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({});
|
||||
const resUsersId1 = pyEnv['res.users'].create({ partner_id: resPartnerId1 });
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
is_pinned: false,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -1988,7 +1988,7 @@ QUnit.test('chat window should remain folded when new message is received', asyn
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo" });
|
||||
const resUsersId1 = pyEnv['res.users'].create({ name: "Foreigner user", partner_id: resPartnerId1 });
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
fold_state: 'folded',
|
||||
is_minimized: true,
|
||||
|
||||
@@ -150,7 +150,7 @@ QUnit.test('composer text input placeholder should contain correspondent name wh
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: 'Marc Demo' });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
|
||||
@@ -61,7 +61,7 @@ QUnit.test('sidebar: pinned channel 3: open channel and leave it', async functio
|
||||
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [[0, 0, {
|
||||
channel_member_ids: [[0, 0, {
|
||||
fold_state: 'open',
|
||||
is_minimized: true,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -172,7 +172,7 @@ QUnit.test('[technical] sidebar: channel group_based_subscription: mandatorily p
|
||||
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [[0, 0, {
|
||||
channel_member_ids: [[0, 0, {
|
||||
is_pinned: false,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
}]],
|
||||
|
||||
+3
-3
@@ -89,7 +89,7 @@ QUnit.test('chat - avatar: should have correct avatar', async function (assert)
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo", im_status: 'offline' });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -126,7 +126,7 @@ QUnit.test('chat - sorting: should be sorted by last activity time', async funct
|
||||
const pyEnv = await startServer();
|
||||
const [mailChannelId1, mailChannelId2] = pyEnv['mail.channel'].create([
|
||||
{
|
||||
channel_last_seen_partner_ids: [[0, 0, {
|
||||
channel_member_ids: [[0, 0, {
|
||||
last_interest_dt: datetime_to_str(new Date(2021, 0, 1)),
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
}]],
|
||||
@@ -134,7 +134,7 @@ QUnit.test('chat - sorting: should be sorted by last activity time', async funct
|
||||
public: 'private',
|
||||
},
|
||||
{
|
||||
channel_last_seen_partner_ids: [[0, 0, {
|
||||
channel_member_ids: [[0, 0, {
|
||||
last_interest_dt: datetime_to_str(new Date(2021, 0, 2)),
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
}]],
|
||||
|
||||
+5
-5
@@ -434,7 +434,7 @@ QUnit.test('chat - counter: should not have a counter if the category is unfolde
|
||||
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 0,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -458,7 +458,7 @@ QUnit.test('chat - counter: should not have a counter if the category is unfolde
|
||||
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 10,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -481,7 +481,7 @@ QUnit.test('chat - counter: should not have a counter if category is folded and
|
||||
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 0,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -506,7 +506,7 @@ QUnit.test('chat - counter: should have correct value of unread threads if categ
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create([
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 10,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -516,7 +516,7 @@ QUnit.test('chat - counter: should have correct value of unread threads if categ
|
||||
public: 'private',
|
||||
},
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 20,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
|
||||
@@ -16,7 +16,7 @@ QUnit.test('sidebar find shows channels matching search term', async function (a
|
||||
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [],
|
||||
channel_member_ids: [],
|
||||
channel_type: 'channel',
|
||||
name: 'test',
|
||||
public: 'public',
|
||||
@@ -65,7 +65,7 @@ QUnit.test('sidebar find shows channels matching search term even when user is m
|
||||
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
],
|
||||
channel_type: 'channel',
|
||||
|
||||
@@ -615,7 +615,7 @@ QUnit.test('sidebar: basic chat rendering', async function (assert) {
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo" });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -680,7 +680,7 @@ QUnit.test('sidebar: chat rendering with unread counter', async function (assert
|
||||
|
||||
const pyEnv = await startServer();
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 100,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -725,7 +725,7 @@ QUnit.test('sidebar: chat im_status rendering', async function (assert) {
|
||||
]);
|
||||
const [mailChannelId1, mailChannelId2, mailChannelId3] = pyEnv['mail.channel'].create([
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -733,7 +733,7 @@ QUnit.test('sidebar: chat im_status rendering', async function (assert) {
|
||||
public: 'private',
|
||||
},
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId2 }],
|
||||
],
|
||||
@@ -741,7 +741,7 @@ QUnit.test('sidebar: chat im_status rendering', async function (assert) {
|
||||
public: 'private',
|
||||
},
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId3 }],
|
||||
],
|
||||
@@ -845,7 +845,7 @@ QUnit.test('sidebar: chat custom name', async function (assert) {
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Marc Demo" });
|
||||
pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
custom_channel_name: "Marc",
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -1766,8 +1766,8 @@ QUnit.test('new messages separator [REQUIRE FOCUS]', async function (assert) {
|
||||
res_id: mailChannelId1,
|
||||
});
|
||||
}
|
||||
const [mailChannelPartnerId] = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
pyEnv['mail.channel.partner'].write([mailChannelPartnerId], { seen_message_id: lastMessageId });
|
||||
const [mailChannelMemberId] = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
pyEnv['mail.channel.member'].write([mailChannelMemberId], { seen_message_id: lastMessageId });
|
||||
const { afterEvent, messaging, openDiscuss } = await start({
|
||||
discuss: {
|
||||
params: {
|
||||
@@ -2046,7 +2046,7 @@ QUnit.test('redirect to author (open chat)', async function (assert) {
|
||||
const [mailChannelId1, mailChannelId2] = pyEnv['mail.channel'].create([
|
||||
{ name: "General" },
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -2921,7 +2921,7 @@ QUnit.test('mark channel as seen on last message visible [REQUIRE FOCUS]', async
|
||||
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 1,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -3700,7 +3700,7 @@ QUnit.test('auto-focus composer on opening thread', async function (assert) {
|
||||
pyEnv['mail.channel'].create([
|
||||
{ name: "General" },
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -3804,7 +3804,7 @@ QUnit.test('mark channel as seen if last message is visible when switching chann
|
||||
const pyEnv = await startServer();
|
||||
const [mailChannelId1, mailChannelId2] = pyEnv['mail.channel'].create([
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 1,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -3813,7 +3813,7 @@ QUnit.test('mark channel as seen if last message is visible when switching chann
|
||||
name: 'Bla',
|
||||
},
|
||||
{
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 1,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
|
||||
+17
-17
@@ -17,7 +17,7 @@ QUnit.test('rendering when just one has received the message', async function (a
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo User" });
|
||||
const resPartnerId2 = pyEnv['res.partner'].create({ name: "Other User" });
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
[0, 0, { partner_id: resPartnerId2 }],
|
||||
@@ -30,8 +30,8 @@ QUnit.test('rendering when just one has received the message', async function (a
|
||||
model: 'mail.channel',
|
||||
res_id: mailChannelId,
|
||||
});
|
||||
const [cpId1] = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId], ['partner_id', '=', resPartnerId1]]);
|
||||
pyEnv['mail.channel.partner'].write([cpId1], {
|
||||
const [mailChannelMemberId1] = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId], ['partner_id', '=', resPartnerId1]]);
|
||||
pyEnv['mail.channel.member'].write([mailChannelMemberId1], {
|
||||
fetched_message_id: mailMessageId,
|
||||
seen_message_id: false,
|
||||
});
|
||||
@@ -67,7 +67,7 @@ QUnit.test('rendering when everyone have received the message', async function (
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo User" });
|
||||
const resPartnerId2 = pyEnv['res.partner'].create({ name: "Other User" });
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
[0, 0, { partner_id: resPartnerId2 }],
|
||||
@@ -80,8 +80,8 @@ QUnit.test('rendering when everyone have received the message', async function (
|
||||
model: 'mail.channel',
|
||||
res_id: mailChannelId,
|
||||
});
|
||||
const cpIds = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId]]);
|
||||
pyEnv['mail.channel.partner'].write(cpIds, {
|
||||
const mailChannelMemberIds = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId]]);
|
||||
pyEnv['mail.channel.member'].write(mailChannelMemberIds, {
|
||||
fetched_message_id: mailMessageId,
|
||||
seen_message_id: false,
|
||||
});
|
||||
@@ -117,7 +117,7 @@ QUnit.test('rendering when just one has seen the message', async function (asser
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo User" });
|
||||
const resPartnerId2 = pyEnv['res.partner'].create({ name: "Other User" });
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
[0, 0, { partner_id: resPartnerId2 }],
|
||||
@@ -130,13 +130,13 @@ QUnit.test('rendering when just one has seen the message', async function (asser
|
||||
model: 'mail.channel',
|
||||
res_id: mailChannelId,
|
||||
});
|
||||
const cpIds = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId]]);
|
||||
pyEnv['mail.channel.partner'].write(cpIds, {
|
||||
const mailChannelMemberIds = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId]]);
|
||||
pyEnv['mail.channel.member'].write(mailChannelMemberIds, {
|
||||
fetched_message_id: mailMessageId,
|
||||
seen_message_id: false,
|
||||
});
|
||||
const [seenCpId] = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId], ['partner_id', '=', resPartnerId1]]);
|
||||
pyEnv['mail.channel.partner'].write([seenCpId], {
|
||||
const [mailChannelMemberId1] = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId], ['partner_id', '=', resPartnerId1]]);
|
||||
pyEnv['mail.channel.member'].write([mailChannelMemberId1], {
|
||||
seen_message_id: mailMessageId,
|
||||
});
|
||||
const { openDiscuss } = await start({
|
||||
@@ -172,7 +172,7 @@ QUnit.test('rendering when just one has seen & received the message', async func
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo User" });
|
||||
const resPartnerId2 = pyEnv['res.partner'].create({ name: "Other User" });
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
[0, 0, { partner_id: resPartnerId2 }],
|
||||
@@ -185,8 +185,8 @@ QUnit.test('rendering when just one has seen & received the message', async func
|
||||
model: 'mail.channel',
|
||||
res_id: mailChannelId,
|
||||
});
|
||||
const [seenCpId] = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId], ['partner_id', '=', resPartnerId1]]);
|
||||
pyEnv['mail.channel.partner'].write([seenCpId], {
|
||||
const [mailChannelMemberId1] = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId], ['partner_id', '=', resPartnerId1]]);
|
||||
pyEnv['mail.channel.member'].write([mailChannelMemberId1], {
|
||||
seen_message_id: mailMessageId,
|
||||
fetched_message_id: mailMessageId,
|
||||
});
|
||||
@@ -223,7 +223,7 @@ QUnit.test('rendering when just everyone has seen the message', async function (
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo User" });
|
||||
const resPartnerId2 = pyEnv['res.partner'].create({ name: "Other User" });
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
[0, 0, { partner_id: resPartnerId2 }],
|
||||
@@ -236,8 +236,8 @@ QUnit.test('rendering when just everyone has seen the message', async function (
|
||||
model: 'mail.channel',
|
||||
res_id: mailChannelId,
|
||||
});
|
||||
const cpIds = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId]]);
|
||||
pyEnv['mail.channel.partner'].write(cpIds, {
|
||||
const mailChannelMemberIds = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId]]);
|
||||
pyEnv['mail.channel.member'].write(mailChannelMemberIds, {
|
||||
fetched_message_id: mailMessageId,
|
||||
seen_message_id: mailMessageId,
|
||||
});
|
||||
|
||||
@@ -242,7 +242,7 @@ QUnit.test("'channel_fetch' notification received is correctly handled", async f
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId = pyEnv['res.partner'].create({});
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId }],
|
||||
],
|
||||
@@ -277,7 +277,7 @@ QUnit.test("'channel_fetch' notification received is correctly handled", async f
|
||||
const mailChannel1 = pyEnv['mail.channel'].searchRead([['id', '=', mailChannelId]])[0];
|
||||
// Simulate received channel fetched notification
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/fetched', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/fetched', {
|
||||
'channel_id': mailChannelId,
|
||||
'last_message_id': 100,
|
||||
'partner_id': resPartnerId,
|
||||
@@ -297,7 +297,7 @@ QUnit.test("'channel_seen' notification received is correctly handled", async fu
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId = pyEnv['res.partner'].create({});
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId }],
|
||||
],
|
||||
@@ -332,7 +332,7 @@ QUnit.test("'channel_seen' notification received is correctly handled", async fu
|
||||
const mailChannel1 = pyEnv['mail.channel'].searchRead([['id', '=', mailChannelId]])[0];
|
||||
// Simulate received channel seen notification
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/seen', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/seen', {
|
||||
'channel_id': mailChannelId,
|
||||
'last_message_id': 100,
|
||||
'partner_id': resPartnerId,
|
||||
@@ -352,7 +352,7 @@ QUnit.test("'channel_fetch' notification then 'channel_seen' received are correc
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId = pyEnv['res.partner'].create({ display_name: "Recipient" });
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId }],
|
||||
],
|
||||
@@ -387,7 +387,7 @@ QUnit.test("'channel_fetch' notification then 'channel_seen' received are correc
|
||||
const mailChannel1 = pyEnv['mail.channel'].searchRead([['id', '=', mailChannelId]])[0];
|
||||
// Simulate received channel fetched notification
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/fetched', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/fetched', {
|
||||
'channel_id': mailChannelId,
|
||||
'last_message_id': 100,
|
||||
'partner_id': resPartnerId,
|
||||
@@ -401,7 +401,7 @@ QUnit.test("'channel_fetch' notification then 'channel_seen' received are correc
|
||||
|
||||
// Simulate received channel seen notification
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/seen', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/seen', {
|
||||
'channel_id': mailChannelId,
|
||||
'last_message_id': 100,
|
||||
'partner_id': resPartnerId,
|
||||
@@ -422,7 +422,7 @@ QUnit.test('do not show message seen indicator on the last message seen by every
|
||||
const otherPartnerId = pyEnv['res.partner'].create({ name: 'Demo User' });
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_type: 'chat',
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: otherPartnerId }],
|
||||
],
|
||||
@@ -433,8 +433,8 @@ QUnit.test('do not show message seen indicator on the last message seen by every
|
||||
model: 'mail.channel',
|
||||
res_id: mailChannelId,
|
||||
});
|
||||
const memberIds = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId]]);
|
||||
pyEnv['mail.channel.partner'].write(memberIds, { seen_message_id: mailMessageId });
|
||||
const memberIds = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId]]);
|
||||
pyEnv['mail.channel.member'].write(memberIds, { seen_message_id: mailMessageId });
|
||||
const { openDiscuss } = await start({
|
||||
discuss: {
|
||||
params: {
|
||||
@@ -463,7 +463,7 @@ QUnit.test('do not show message seen indicator on all the messages of the curren
|
||||
const otherPartnerId = pyEnv['res.partner'].create({ name: 'Demo User' });
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_type: 'chat',
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: otherPartnerId }],
|
||||
],
|
||||
@@ -482,8 +482,8 @@ QUnit.test('do not show message seen indicator on all the messages of the curren
|
||||
res_id: mailChannelId,
|
||||
},
|
||||
]);
|
||||
const memberIds = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId]]);
|
||||
pyEnv['mail.channel.partner'].write(memberIds, { seen_message_id: lastMailMessageId });
|
||||
const memberIds = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId]]);
|
||||
pyEnv['mail.channel.member'].write(memberIds, { seen_message_id: lastMailMessageId });
|
||||
const { openDiscuss } = await start({
|
||||
discuss: {
|
||||
params: {
|
||||
@@ -517,7 +517,7 @@ QUnit.test('only show messaging seen indicator if authored by me, after last see
|
||||
const otherPartnerId = pyEnv['res.partner'].create({ name: 'Demo User' });
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_type: 'chat',
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: otherPartnerId }],
|
||||
],
|
||||
@@ -528,8 +528,8 @@ QUnit.test('only show messaging seen indicator if authored by me, after last see
|
||||
res_id: mailChannelId,
|
||||
model: 'mail.channel',
|
||||
});
|
||||
const memberIds = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId]]);
|
||||
pyEnv['mail.channel.partner'].write(memberIds, {
|
||||
const memberIds = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId]]);
|
||||
pyEnv['mail.channel.member'].write(memberIds, {
|
||||
fetched_message_id: mailMessageId,
|
||||
seen_message_id: mailMessageId - 1,
|
||||
});
|
||||
@@ -938,7 +938,7 @@ QUnit.test('open chat with author on avatar click should be disabled when curren
|
||||
const resPartnerId = pyEnv['res.partner'].create({});
|
||||
pyEnv['res.users'].create({ partner_id: resPartnerId });
|
||||
const mailChannelId = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId }],
|
||||
],
|
||||
|
||||
@@ -246,8 +246,8 @@ QUnit.test('counter is taking into account failure notification', async function
|
||||
model: 'mail.channel',
|
||||
res_id: mailChannelId1,
|
||||
});
|
||||
const [mailChannelPartnerId] = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
pyEnv['mail.channel.partner'].write([mailChannelPartnerId], { seen_message_id: mailMessageId1 });
|
||||
const [mailChannelMemberId] = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
pyEnv['mail.channel.member'].write([mailChannelMemberId], { seen_message_id: mailMessageId1 });
|
||||
// failure that is expected to be used in the test
|
||||
pyEnv['mail.notification'].create({
|
||||
mail_message_id: mailMessageId1, // id of the related message
|
||||
|
||||
@@ -19,7 +19,7 @@ QUnit.test('chat: correspondent is typing', async function (assert) {
|
||||
name: 'Demo',
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -46,7 +46,7 @@ QUnit.test('chat: correspondent is typing', async function (assert) {
|
||||
const mailChannel1 = pyEnv['mail.channel'].searchRead([['id', '=', mailChannelId1]])[0];
|
||||
// simulate receive typing notification from demo "is typing"
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': true,
|
||||
'partner_id': resPartnerId1,
|
||||
@@ -66,7 +66,7 @@ QUnit.test('chat: correspondent is typing', async function (assert) {
|
||||
|
||||
// simulate receive typing notification from demo "no longer is typing"
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': false,
|
||||
'partner_id': resPartnerId1,
|
||||
|
||||
@@ -12,7 +12,7 @@ QUnit.test('mark as read', async function (assert) {
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: "Demo" });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 1, // mandatory for good working of test, but ideally should be deduced by other server data
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -26,8 +26,8 @@ QUnit.test('mark as read', async function (assert) {
|
||||
{ author_id: resPartnerId1, model: 'mail.channel', res_id: mailChannelId1 },
|
||||
{ author_id: resPartnerId1, model: 'mail.channel', res_id: mailChannelId1 },
|
||||
]);
|
||||
const [mailChannelPartnerId] = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
pyEnv['mail.channel.partner'].write([mailChannelPartnerId], { seen_message_id: mailMessageId1 });
|
||||
const [mailChannelMemberId] = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
pyEnv['mail.channel.member'].write([mailChannelMemberId], { seen_message_id: mailMessageId1 });
|
||||
|
||||
const { click } = await start({
|
||||
async mockRPC(route, args) {
|
||||
|
||||
+16
-16
@@ -17,7 +17,7 @@ QUnit.test('receive other member typing status "is typing"', async function (ass
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: 'Demo' });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -38,7 +38,7 @@ QUnit.test('receive other member typing status "is typing"', async function (ass
|
||||
const mailChannel1 = pyEnv['mail.channel'].searchRead([['id', '=', mailChannelId1]])[0];
|
||||
// simulate receive typing notification from demo
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
channel_id: mailChannelId1,
|
||||
is_typing: true,
|
||||
partner_id: resPartnerId1,
|
||||
@@ -58,7 +58,7 @@ QUnit.test('receive other member typing status "is typing" then "no longer is ty
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: 'Demo' });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -79,7 +79,7 @@ QUnit.test('receive other member typing status "is typing" then "no longer is ty
|
||||
const mailChannel1 = pyEnv['mail.channel'].searchRead([['id', '=', mailChannelId1]])[0];
|
||||
// simulate receive typing notification from demo "is typing"
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': true,
|
||||
'partner_id': resPartnerId1,
|
||||
@@ -94,7 +94,7 @@ QUnit.test('receive other member typing status "is typing" then "no longer is ty
|
||||
|
||||
// simulate receive typing notification from demo "is no longer typing"
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': false,
|
||||
'partner_id': resPartnerId1,
|
||||
@@ -114,7 +114,7 @@ QUnit.test('assume other member typing status becomes "no longer is typing" afte
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: 'Demo' });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -137,7 +137,7 @@ QUnit.test('assume other member typing status becomes "no longer is typing" afte
|
||||
const mailChannel1 = pyEnv['mail.channel'].searchRead([['id', '=', mailChannelId1]])[0];
|
||||
// simulate receive typing notification from demo "is typing"
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': true,
|
||||
'partner_id': resPartnerId1,
|
||||
@@ -164,7 +164,7 @@ QUnit.test ('other member typing status "is typing" refreshes 60 seconds timer o
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({ name: 'Demo' });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -187,7 +187,7 @@ QUnit.test ('other member typing status "is typing" refreshes 60 seconds timer o
|
||||
const mailChannel1 = pyEnv['mail.channel'].searchRead([['id', '=', mailChannelId1]])[0];
|
||||
// simulate receive typing notification from demo "is typing"
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': true,
|
||||
'partner_id': resPartnerId1,
|
||||
@@ -202,7 +202,7 @@ QUnit.test ('other member typing status "is typing" refreshes 60 seconds timer o
|
||||
|
||||
// simulate receive typing notification from demo "is typing" again after 50s.
|
||||
await advanceTime(50 * 1000);
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': true,
|
||||
'partner_id': resPartnerId1,
|
||||
@@ -234,7 +234,7 @@ QUnit.test('receive several other members typing status "is typing"', async func
|
||||
{ name: 'Other 12' },
|
||||
]);
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
[0, 0, { partner_id: resPartnerId2 }],
|
||||
@@ -257,7 +257,7 @@ QUnit.test('receive several other members typing status "is typing"', async func
|
||||
const mailChannel1 = pyEnv['mail.channel'].searchRead([['id', '=', mailChannelId1]])[0];
|
||||
// simulate receive typing notification from other10 (is typing)
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': true,
|
||||
'partner_id': resPartnerId1,
|
||||
@@ -272,7 +272,7 @@ QUnit.test('receive several other members typing status "is typing"', async func
|
||||
|
||||
// simulate receive typing notification from other11 (is typing)
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': true,
|
||||
'partner_id': resPartnerId2,
|
||||
@@ -287,7 +287,7 @@ QUnit.test('receive several other members typing status "is typing"', async func
|
||||
|
||||
// simulate receive typing notification from other12 (is typing)
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': true,
|
||||
'partner_id': resPartnerId3,
|
||||
@@ -302,7 +302,7 @@ QUnit.test('receive several other members typing status "is typing"', async func
|
||||
|
||||
// simulate receive typing notification from other10 (no longer is typing)
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': false,
|
||||
'partner_id': resPartnerId1,
|
||||
@@ -317,7 +317,7 @@ QUnit.test('receive several other members typing status "is typing"', async func
|
||||
|
||||
// simulate receive typing notification from other10 (is typing again)
|
||||
await afterNextRender(() => {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.partner/typing_status', {
|
||||
pyEnv['bus.bus']._sendone(mailChannel1, 'mail.channel.member/typing_status', {
|
||||
'channel_id': mailChannelId1,
|
||||
'is_typing': true,
|
||||
'partner_id': resPartnerId1,
|
||||
|
||||
@@ -127,7 +127,7 @@ QUnit.test('mark channel as fetched when a new message is loaded and as seen whe
|
||||
partner_id: resPartnerId1,
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -325,7 +325,7 @@ QUnit.test('[technical] new messages separator on posting message', async functi
|
||||
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 0,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -339,8 +339,8 @@ QUnit.test('[technical] new messages separator on posting message', async functi
|
||||
model: "mail.channel",
|
||||
res_id: mailChannelId1,
|
||||
});
|
||||
const [mailChannelPartnerId] = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
pyEnv['mail.channel.partner'].write([mailChannelPartnerId], { seen_message_id: mailMessageId1 });
|
||||
const [mailChannelMemberId] = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
pyEnv['mail.channel.member'].write([mailChannelMemberId], { seen_message_id: mailMessageId1 });
|
||||
const { insertText, openDiscuss } = await start({
|
||||
discuss: {
|
||||
context: { active_id: mailChannelId1 },
|
||||
@@ -391,7 +391,7 @@ QUnit.test('new messages separator on receiving new message [REQUIRE FOCUS]', as
|
||||
partner_id: resPartnerId1,
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 0,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
@@ -406,8 +406,8 @@ QUnit.test('new messages separator on receiving new message [REQUIRE FOCUS]', as
|
||||
model: "mail.channel",
|
||||
res_id: mailChannelId1,
|
||||
});
|
||||
const [mailChannelPartnerId] = pyEnv['mail.channel.partner'].search([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
pyEnv['mail.channel.partner'].write([mailChannelPartnerId], { seen_message_id: mailMessageId1 });
|
||||
const [mailChannelMemberId] = pyEnv['mail.channel.member'].search([['channel_id', '=', mailChannelId1], ['partner_id', '=', pyEnv.currentPartnerId]]);
|
||||
pyEnv['mail.channel.member'].write([mailChannelMemberId], { seen_message_id: mailMessageId1 });
|
||||
const { afterEvent, messaging, openDiscuss } = await start({
|
||||
discuss: {
|
||||
context: { active_id: mailChannelId1 },
|
||||
@@ -495,7 +495,7 @@ QUnit.test('new messages separator on posting message', async function (assert)
|
||||
|
||||
const pyEnv = await startServer();
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, {
|
||||
message_unread_counter: 0,
|
||||
partner_id: pyEnv.currentPartnerId,
|
||||
|
||||
@@ -82,7 +82,7 @@ QUnit.test('openChat: open existing chat for user', async function (assert) {
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({});
|
||||
pyEnv['res.users'].create({ partner_id: resPartnerId1 });
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import test_get_model_definitions
|
||||
from . import test_mail_channel
|
||||
from . import test_mail_channel_as_guest
|
||||
from . import test_mail_channel_partner
|
||||
from . import test_mail_channel_member
|
||||
from . import test_mail_composer
|
||||
from . import test_mail_full_composer
|
||||
from . import test_mail_render
|
||||
|
||||
@@ -142,7 +142,7 @@ class TestChannelAccessRights(MailCommon):
|
||||
group_private.read(['name'])
|
||||
|
||||
with self.assertRaises(AccessError):
|
||||
self.env['mail.channel.partner'].create({
|
||||
self.env['mail.channel.member'].create({
|
||||
'partner_id': self.env.user.partner_id.id,
|
||||
'channel_id': group_private.id,
|
||||
})
|
||||
@@ -194,7 +194,7 @@ class TestChannelInternals(MailCommon):
|
||||
self.assertEqual(channel.message_partner_ids, self.env['res.partner'])
|
||||
self.assertEqual(channel.channel_partner_ids, self.test_partner)
|
||||
|
||||
self.env['mail.channel.partner'].sudo().search([
|
||||
self.env['mail.channel.member'].sudo().search([
|
||||
('partner_id', 'in', self.test_partner.ids),
|
||||
('channel_id', 'in', channel.ids)
|
||||
]).unlink()
|
||||
@@ -215,16 +215,16 @@ class TestChannelInternals(MailCommon):
|
||||
# so we can see if the `last_interest_dt` is updated correctly
|
||||
with patch.object(fields.Datetime, 'now', lambda: post_time):
|
||||
chat.message_post(body="Test", message_type='comment', subtype_xmlid='mail.mt_comment')
|
||||
channel_partner_employee = self.env['mail.channel.partner'].search([
|
||||
channel_member_employee = self.env['mail.channel.member'].search([
|
||||
('partner_id', '=', self.partner_employee.id),
|
||||
('channel_id', '=', chat.id),
|
||||
])
|
||||
channel_partner_admin = self.env['mail.channel.partner'].search([
|
||||
channel_member_admin = self.env['mail.channel.member'].search([
|
||||
('partner_id', '=', self.partner_admin.id),
|
||||
('channel_id', '=', chat.id),
|
||||
])
|
||||
self.assertEqual(channel_partner_employee.last_interest_dt, post_time)
|
||||
self.assertEqual(channel_partner_admin.last_interest_dt, post_time)
|
||||
self.assertEqual(channel_member_employee.last_interest_dt, post_time)
|
||||
self.assertEqual(channel_member_admin.last_interest_dt, post_time)
|
||||
|
||||
@users('employee')
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink')
|
||||
|
||||
+61
-61
@@ -63,7 +63,7 @@ class TestMailChannelMembers(MailCommon):
|
||||
'public': 'public',
|
||||
'channel_type': 'channel',
|
||||
})
|
||||
(cls.private_channel | cls.group_channel | cls.public_channel).channel_last_seen_partner_ids.unlink()
|
||||
(cls.private_channel | cls.group_channel | cls.public_channel).channel_member_ids.unlink()
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# PRIVATE CHANNELS
|
||||
@@ -71,106 +71,106 @@ class TestMailChannelMembers(MailCommon):
|
||||
|
||||
def test_channel_private_01(self):
|
||||
"""Test access on private channel."""
|
||||
res = self.env['mail.channel.partner'].search([('channel_id', '=', self.private_channel.id)])
|
||||
res = self.env['mail.channel.member'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertFalse(res)
|
||||
|
||||
# User 1 can join private channel with SUDO
|
||||
self.private_channel.with_user(self.user_1).sudo().add_members(self.user_1.partner_id.ids)
|
||||
res = self.env['mail.channel.partner'].search([('channel_id', '=', self.private_channel.id)])
|
||||
res = self.env['mail.channel.member'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(res.partner_id, self.user_1.partner_id)
|
||||
|
||||
# User 2 can not join private channel
|
||||
with self.assertRaises(AccessError):
|
||||
self.private_channel.with_user(self.user_2).add_members(self.user_2.partner_id.ids)
|
||||
|
||||
# User 2 can not create a `mail.channel.partner` to join the private channel
|
||||
# User 2 can not create a `mail.channel.member` to join the private channel
|
||||
with self.assertRaises(AccessError):
|
||||
self.env['mail.channel.partner'].with_user(self.user_2).create({
|
||||
self.env['mail.channel.member'].with_user(self.user_2).create({
|
||||
'partner_id': self.user_2.partner_id.id,
|
||||
'channel_id': self.private_channel.id,
|
||||
})
|
||||
|
||||
# User 2 can not write on `mail.channel.partner` to join the private channel
|
||||
channel_partner = self.env['mail.channel.partner'].with_user(self.user_2).search([('partner_id', '=', self.user_2.partner_id.id)])[0]
|
||||
# User 2 can not write on `mail.channel.member` to join the private channel
|
||||
channel_member = self.env['mail.channel.member'].with_user(self.user_2).search([('partner_id', '=', self.user_2.partner_id.id)])[0]
|
||||
with self.assertRaises(AccessError):
|
||||
channel_partner.channel_id = self.private_channel.id
|
||||
channel_member.channel_id = self.private_channel.id
|
||||
with self.assertRaises(AccessError):
|
||||
channel_partner.write({'channel_id': self.private_channel.id})
|
||||
channel_member.write({'channel_id': self.private_channel.id})
|
||||
|
||||
# Even with SUDO, channel_id of channel.partner should not be changed.
|
||||
# Even with SUDO, channel_id of channel.member should not be changed.
|
||||
with self.assertRaises(AccessError):
|
||||
channel_partner.sudo().channel_id = self.private_channel.id
|
||||
channel_member.sudo().channel_id = self.private_channel.id
|
||||
|
||||
# User 2 can not write on the `partner_id` of `mail.channel.partner`
|
||||
# User 2 can not write on the `partner_id` of `mail.channel.member`
|
||||
# of an other partner to join a private channel
|
||||
channel_partner_1 = self.env['mail.channel.partner'].search([('channel_id', '=', self.private_channel.id), ('partner_id', '=', self.user_1.partner_id.id)])
|
||||
channel_member_1 = self.env['mail.channel.member'].search([('channel_id', '=', self.private_channel.id), ('partner_id', '=', self.user_1.partner_id.id)])
|
||||
with self.assertRaises(AccessError):
|
||||
channel_partner_1.with_user(self.user_2).partner_id = self.user_2.partner_id
|
||||
self.assertEqual(channel_partner_1.partner_id, self.user_1.partner_id)
|
||||
channel_member_1.with_user(self.user_2).partner_id = self.user_2.partner_id
|
||||
self.assertEqual(channel_member_1.partner_id, self.user_1.partner_id)
|
||||
|
||||
# Even with SUDO, partner_id of channel.partner should not be changed.
|
||||
# Even with SUDO, partner_id of channel.member should not be changed.
|
||||
with self.assertRaises(AccessError):
|
||||
channel_partner_1.with_user(self.user_2).sudo().partner_id = self.user_2.partner_id
|
||||
channel_member_1.with_user(self.user_2).sudo().partner_id = self.user_2.partner_id
|
||||
|
||||
def test_channel_private_members(self):
|
||||
"""Test invitation in private channel part 1 (invite using crud methods)."""
|
||||
self.private_channel.with_user(self.user_1).sudo().add_members(self.user_1.partner_id.ids)
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(len(channel_partners), 1)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(len(channel_members), 1)
|
||||
|
||||
# User 2 is not in the private channel, they can not invite user 3
|
||||
with self.assertRaises(AccessError):
|
||||
self.env['mail.channel.partner'].with_user(self.user_2).create({
|
||||
self.env['mail.channel.member'].with_user(self.user_2).create({
|
||||
'partner_id': self.user_portal.partner_id.id,
|
||||
'channel_id': self.private_channel.id,
|
||||
})
|
||||
|
||||
# User 1 is in the private channel, they can invite other users
|
||||
self.env['mail.channel.partner'].with_user(self.user_1).create({
|
||||
self.env['mail.channel.member'].with_user(self.user_1).create({
|
||||
'partner_id': self.user_portal.partner_id.id,
|
||||
'channel_id': self.private_channel.id,
|
||||
})
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(channel_partners.mapped('partner_id'), self.user_1.partner_id | self.user_portal.partner_id)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(channel_members.mapped('partner_id'), self.user_1.partner_id | self.user_portal.partner_id)
|
||||
|
||||
# But User 3 can not write on the `mail.channel.partner` of other user
|
||||
channel_partner_1 = self.env['mail.channel.partner'].search([('channel_id', '=', self.private_channel.id), ('partner_id', '=', self.user_1.partner_id.id)])
|
||||
channel_partner_3 = self.env['mail.channel.partner'].search([('channel_id', '=', self.private_channel.id), ('partner_id', '=', self.user_portal.partner_id.id)])
|
||||
channel_partner_3.with_user(self.user_portal).custom_channel_name = 'Test'
|
||||
# But User 3 can not write on the `mail.channel.member` of other user
|
||||
channel_member_1 = self.env['mail.channel.member'].search([('channel_id', '=', self.private_channel.id), ('partner_id', '=', self.user_1.partner_id.id)])
|
||||
channel_member_3 = self.env['mail.channel.member'].search([('channel_id', '=', self.private_channel.id), ('partner_id', '=', self.user_portal.partner_id.id)])
|
||||
channel_member_3.with_user(self.user_portal).custom_channel_name = 'Test'
|
||||
with self.assertRaises(AccessError):
|
||||
channel_partner_1.with_user(self.user_2).custom_channel_name = 'Blabla'
|
||||
self.assertNotEqual(channel_partner_1.custom_channel_name, 'Blabla')
|
||||
channel_member_1.with_user(self.user_2).custom_channel_name = 'Blabla'
|
||||
self.assertNotEqual(channel_member_1.custom_channel_name, 'Blabla')
|
||||
|
||||
def test_channel_private_invite(self):
|
||||
"""Test invitation in private channel part 2 (use `invite` action)."""
|
||||
self.private_channel.with_user(self.user_1).sudo().add_members(self.user_1.partner_id.ids)
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(channel_partners.mapped('partner_id'), self.user_1.partner_id)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(channel_members.mapped('partner_id'), self.user_1.partner_id)
|
||||
|
||||
# User 2 is not in the channel, they can not invite user_portal
|
||||
with self.assertRaises(AccessError):
|
||||
self.private_channel.with_user(self.user_2).add_members(self.user_portal.partner_id.ids)
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(channel_partners.mapped('partner_id'), self.user_1.partner_id)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(channel_members.mapped('partner_id'), self.user_1.partner_id)
|
||||
|
||||
# User 1 is in the channel, they can invite user_portal
|
||||
self.private_channel.with_user(self.user_1).add_members(self.user_portal.partner_id.ids)
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(channel_partners.mapped('partner_id'), self.user_1.partner_id | self.user_portal.partner_id)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(channel_members.mapped('partner_id'), self.user_1.partner_id | self.user_portal.partner_id)
|
||||
|
||||
def test_channel_private_leave(self):
|
||||
"""Test kick/leave channel."""
|
||||
self.private_channel.with_user(self.user_1).sudo().add_members(self.user_1.partner_id.ids)
|
||||
self.private_channel.with_user(self.user_portal).sudo().add_members(self.user_portal.partner_id.ids)
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(len(channel_partners), 2)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.private_channel.id)])
|
||||
self.assertEqual(len(channel_members), 2)
|
||||
|
||||
# User 2 is not in the channel, they can not kick user 1
|
||||
with self.assertRaises(AccessError):
|
||||
channel_partners.with_user(self.user_2).unlink()
|
||||
channel_members.with_user(self.user_2).unlink()
|
||||
|
||||
# User 3 is in the channel, they can kick user 1
|
||||
channel_partners.with_user(self.user_portal).unlink()
|
||||
channel_members.with_user(self.user_portal).unlink()
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# GROUP BASED CHANNELS
|
||||
@@ -178,35 +178,35 @@ class TestMailChannelMembers(MailCommon):
|
||||
|
||||
def test_channel_group(self):
|
||||
"""Test basics on group channel."""
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.group_channel.id)])
|
||||
self.assertFalse(channel_partners)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.group_channel.id)])
|
||||
self.assertFalse(channel_members)
|
||||
|
||||
# user 1 is in the group, they can join the channel
|
||||
self.group_channel.with_user(self.user_1).add_members(self.user_1.partner_id.ids)
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.group_channel.id)])
|
||||
self.assertEqual(channel_partners.mapped('partner_id'), self.user_1.partner_id)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.group_channel.id)])
|
||||
self.assertEqual(channel_members.mapped('partner_id'), self.user_1.partner_id)
|
||||
|
||||
# user 3 is not in the group, they can not join
|
||||
with self.assertRaises(AccessError):
|
||||
self.group_channel.with_user(self.user_portal).add_members(self.user_portal.partner_id.ids)
|
||||
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.group_channel.id)])
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.group_channel.id)])
|
||||
with self.assertRaises(AccessError):
|
||||
channel_partners.with_user(self.user_portal).partner_id = self.user_portal.partner_id
|
||||
channel_members.with_user(self.user_portal).partner_id = self.user_portal.partner_id
|
||||
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.group_channel.id)])
|
||||
self.assertEqual(channel_partners.mapped('partner_id'), self.user_1.partner_id)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.group_channel.id)])
|
||||
self.assertEqual(channel_members.mapped('partner_id'), self.user_1.partner_id)
|
||||
|
||||
# user 1 can not invite user 3 because they are not in the group
|
||||
with self.assertRaises(UserError):
|
||||
self.group_channel.with_user(self.user_1).add_members(self.user_portal.partner_id.ids)
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.group_channel.id)])
|
||||
self.assertEqual(channel_partners.mapped('partner_id'), self.user_1.partner_id)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.group_channel.id)])
|
||||
self.assertEqual(channel_members.mapped('partner_id'), self.user_1.partner_id)
|
||||
|
||||
# but user 2 is in the group and can be invited by user 1
|
||||
self.group_channel.with_user(self.user_1).add_members(self.user_2.partner_id.ids)
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.group_channel.id)])
|
||||
self.assertEqual(channel_partners.mapped('partner_id'), self.user_1.partner_id | self.user_2.partner_id)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.group_channel.id)])
|
||||
self.assertEqual(channel_members.mapped('partner_id'), self.user_1.partner_id | self.user_2.partner_id)
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# PUBLIC CHANNELS
|
||||
@@ -214,16 +214,16 @@ class TestMailChannelMembers(MailCommon):
|
||||
|
||||
def test_channel_public(self):
|
||||
""" Test access on public channels """
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.public_channel.id)])
|
||||
self.assertFalse(channel_partners)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.public_channel.id)])
|
||||
self.assertFalse(channel_members)
|
||||
|
||||
self.public_channel.with_user(self.user_1).add_members(self.user_1.partner_id.ids)
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.public_channel.id)])
|
||||
self.assertEqual(channel_partners.mapped('partner_id'), self.user_1.partner_id)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.public_channel.id)])
|
||||
self.assertEqual(channel_members.mapped('partner_id'), self.user_1.partner_id)
|
||||
|
||||
self.public_channel.with_user(self.user_2).add_members(self.user_2.partner_id.ids)
|
||||
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.public_channel.id)])
|
||||
self.assertEqual(channel_partners.mapped('partner_id'), self.user_1.partner_id | self.user_2.partner_id)
|
||||
channel_members = self.env['mail.channel.member'].search([('channel_id', '=', self.public_channel.id)])
|
||||
self.assertEqual(channel_members.mapped('partner_id'), self.user_1.partner_id | self.user_2.partner_id)
|
||||
|
||||
# portal/public users still cannot join a public channel, should go through dedicated controllers
|
||||
with self.assertRaises(AccessError):
|
||||
@@ -231,7 +231,7 @@ class TestMailChannelMembers(MailCommon):
|
||||
with self.assertRaises(AccessError):
|
||||
self.public_channel.with_user(self.user_public).add_members(self.user_public.partner_id.ids)
|
||||
|
||||
def test_channel_partner_invite_with_guest(self):
|
||||
def test_channel_member_invite_with_guest(self):
|
||||
guest = self.env['mail.guest'].create({'name': 'Guest'})
|
||||
partner = self.env['res.partner'].create({
|
||||
'name': 'ToInvite',
|
||||
@@ -256,14 +256,14 @@ class TestMailChannelMembers(MailCommon):
|
||||
})
|
||||
channel_as_user_1.with_user(self.user_1).add_members(self.user_1.partner_id.ids)
|
||||
channel_as_user_1.with_user(self.user_1).add_members(self.user_2.partner_id.ids)
|
||||
channel_1_rel_user_2 = self.env['mail.channel.partner'].search([
|
||||
channel_1_rel_user_2 = self.env['mail.channel.member'].search([
|
||||
('channel_id', '=', channel_as_user_1.id),
|
||||
('partner_id', '=', self.user_2.partner_id.id)
|
||||
])
|
||||
self.assertEqual(channel_1_rel_user_2.message_unread_counter, 0, "should not have unread message initially as notification type is ignored")
|
||||
|
||||
channel_as_user_1.message_post(body='Test', message_type='comment', subtype_xmlid='mail.mt_comment')
|
||||
channel_1_rel_user_2 = self.env['mail.channel.partner'].search([
|
||||
channel_1_rel_user_2 = self.env['mail.channel.member'].search([
|
||||
('channel_id', '=', channel_as_user_1.id),
|
||||
('partner_id', '=', self.user_2.partner_id.id)
|
||||
])
|
||||
@@ -286,7 +286,7 @@ class TestMailChannelMembers(MailCommon):
|
||||
channel_1_as_user_1.message_post(body='Test', message_type='comment', subtype_xmlid='mail.mt_comment')
|
||||
channel_1_as_user_1.message_post(body='Test 2', message_type='comment', subtype_xmlid='mail.mt_comment')
|
||||
channel_2_as_user_2.message_post(body='Test', message_type='comment', subtype_xmlid='mail.mt_comment')
|
||||
members = self.env['mail.channel.partner'].search([('channel_id', 'in', (channel_1_as_user_1 + channel_2_as_user_2).ids)], order="id")
|
||||
members = self.env['mail.channel.member'].search([('channel_id', 'in', (channel_1_as_user_1 + channel_2_as_user_2).ids)], order="id")
|
||||
self.assertEqual(members.mapped('message_unread_counter'), [
|
||||
0, # channel 1 user 1: posted last message
|
||||
0, # channel 2 user 2: posted last message
|
||||
+137
-137
@@ -18,8 +18,8 @@ class TestChannelInternals(MailCommon):
|
||||
def test_01_join_call(self):
|
||||
"""Join call should remove existing sessions, remove invitation, create a new session, and return data."""
|
||||
channel = self.env['mail.channel'].browse(self.env['mail.channel'].channel_create(name='Test Channel')['id'])
|
||||
channel_partner = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == self.user_employee.partner_id)
|
||||
channel_partner._rtc_join_call()
|
||||
channel_member = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == self.user_employee.partner_id)
|
||||
channel_member._rtc_join_call()
|
||||
self.env['bus.bus'].sudo().search([]).unlink()
|
||||
with self.assertBus(
|
||||
[
|
||||
@@ -31,14 +31,14 @@ class TestChannelInternals(MailCommon):
|
||||
{
|
||||
'type': 'mail.channel.rtc.session/ended',
|
||||
'payload': {
|
||||
'sessionId': channel_partner.rtc_session_ids.id,
|
||||
'sessionId': channel_member.rtc_session_ids.id,
|
||||
},
|
||||
},
|
||||
{
|
||||
'type': 'mail.channel/rtc_sessions_update',
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'rtcSessions': [('insert-and-unlink', [{'id': channel_partner.rtc_session_ids.id}])],
|
||||
'rtcSessions': [('insert-and-unlink', [{'id': channel_member.rtc_session_ids.id}])],
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -46,7 +46,7 @@ class TestChannelInternals(MailCommon):
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'rtcSessions': [('insert', [{
|
||||
'id': channel_partner.rtc_session_ids.id + 1,
|
||||
'id': channel_member.rtc_session_ids.id + 1,
|
||||
'isCameraOn': False,
|
||||
'isDeaf': False,
|
||||
'isSelfMuted': False,
|
||||
@@ -60,12 +60,12 @@ class TestChannelInternals(MailCommon):
|
||||
},
|
||||
]
|
||||
):
|
||||
res = channel_partner._rtc_join_call()
|
||||
res = channel_member._rtc_join_call()
|
||||
self.assertEqual(res, {
|
||||
'iceServers': False,
|
||||
'rtcSessions': [
|
||||
('insert', [{
|
||||
'id': channel_partner.rtc_session_ids.id,
|
||||
'id': channel_member.rtc_session_ids.id,
|
||||
'isCameraOn': False,
|
||||
'isDeaf': False,
|
||||
'isSelfMuted': False,
|
||||
@@ -75,9 +75,9 @@ class TestChannelInternals(MailCommon):
|
||||
'name': "Ernest Employee",
|
||||
})],
|
||||
}]),
|
||||
('insert-and-unlink', [{'id': channel_partner.rtc_session_ids.id - 1}]),
|
||||
('insert-and-unlink', [{'id': channel_member.rtc_session_ids.id - 1}]),
|
||||
],
|
||||
'sessionId': channel_partner.rtc_session_ids.id,
|
||||
'sessionId': channel_member.rtc_session_ids.id,
|
||||
})
|
||||
|
||||
@users('employee')
|
||||
@@ -85,11 +85,11 @@ class TestChannelInternals(MailCommon):
|
||||
def test_10_start_call_in_chat_should_invite_all_members_to_call(self):
|
||||
test_user = self.env['res.users'].sudo().create({'name': "Test User", 'login': 'test'})
|
||||
channel = self.env['mail.channel'].browse(self.env['mail.channel'].channel_get(partners_to=(self.user_employee.partner_id + test_user.partner_id).ids)['id'])
|
||||
channel_partner = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == self.user_employee.partner_id)
|
||||
channel_partner_test_user = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == test_user.partner_id)
|
||||
channel_partner._rtc_join_call()
|
||||
last_rtc_session_id = channel_partner.rtc_session_ids.id
|
||||
channel_partner._rtc_leave_call()
|
||||
channel_member = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == self.user_employee.partner_id)
|
||||
channel_member_test_user = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == test_user.partner_id)
|
||||
channel_member._rtc_join_call()
|
||||
last_rtc_session_id = channel_member.rtc_session_ids.id
|
||||
channel_member._rtc_leave_call()
|
||||
|
||||
self.env['bus.bus'].sudo().search([]).unlink()
|
||||
with self.assertBus(
|
||||
@@ -124,13 +124,13 @@ class TestChannelInternals(MailCommon):
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'invitedMembers': [('insert', [{
|
||||
'id': channel_partner_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_user.channel_id.id})],
|
||||
'id': channel_member_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_user.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'partner': [('insert-and-replace', {
|
||||
'id': channel_partner_test_user.partner_id.id,
|
||||
'name': channel_partner_test_user.partner_id.name,
|
||||
'im_status': channel_partner_test_user.partner_id.im_status,
|
||||
'id': channel_member_test_user.partner_id.id,
|
||||
'name': channel_member_test_user.partner_id.name,
|
||||
'im_status': channel_member_test_user.partner_id.im_status,
|
||||
})],
|
||||
})],
|
||||
}])],
|
||||
@@ -138,16 +138,16 @@ class TestChannelInternals(MailCommon):
|
||||
},
|
||||
]
|
||||
):
|
||||
res = channel_partner._rtc_join_call()
|
||||
res = channel_member._rtc_join_call()
|
||||
self.assertIn('invitedMembers', res)
|
||||
self.assertEqual(res['invitedMembers'], [('insert', [{
|
||||
'id': channel_partner_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_user.channel_id.id})],
|
||||
'id': channel_member_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_user.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'partner': [('insert-and-replace', {
|
||||
'id': channel_partner_test_user.partner_id.id,
|
||||
'name': channel_partner_test_user.partner_id.name,
|
||||
'im_status': channel_partner_test_user.partner_id.im_status,
|
||||
'id': channel_member_test_user.partner_id.id,
|
||||
'name': channel_member_test_user.partner_id.name,
|
||||
'im_status': channel_member_test_user.partner_id.im_status,
|
||||
})],
|
||||
})],
|
||||
}])])
|
||||
@@ -159,12 +159,12 @@ class TestChannelInternals(MailCommon):
|
||||
test_guest = self.env['mail.guest'].sudo().create({'name': "Test Guest"})
|
||||
channel = self.env['mail.channel'].browse(self.env['mail.channel'].create_group(partners_to=(self.user_employee.partner_id + test_user.partner_id).ids)['id'])
|
||||
channel.add_members(guest_ids=test_guest.ids)
|
||||
channel_partner_test_user = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == test_user.partner_id)
|
||||
channel_partner_test_guest = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.guest_id == test_guest)
|
||||
channel_partner = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == self.user_employee.partner_id)
|
||||
channel_partner._rtc_join_call()
|
||||
last_rtc_session_id = channel_partner.rtc_session_ids.id
|
||||
channel_partner._rtc_leave_call()
|
||||
channel_member_test_user = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == test_user.partner_id)
|
||||
channel_member_test_guest = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.guest_id == test_guest)
|
||||
channel_member = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == self.user_employee.partner_id)
|
||||
channel_member._rtc_join_call()
|
||||
last_rtc_session_id = channel_member.rtc_session_ids.id
|
||||
channel_member._rtc_leave_call()
|
||||
|
||||
self.env['bus.bus'].sudo().search([]).unlink()
|
||||
with self.assertBus(
|
||||
@@ -218,23 +218,23 @@ class TestChannelInternals(MailCommon):
|
||||
'id': channel.id,
|
||||
'invitedMembers': [('insert', [
|
||||
{
|
||||
'id': channel_partner_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_user.channel_id.id})],
|
||||
'id': channel_member_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_user.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'partner': [('insert-and-replace', {
|
||||
'id': channel_partner_test_user.partner_id.id,
|
||||
'name': channel_partner_test_user.partner_id.name,
|
||||
'im_status': channel_partner_test_user.partner_id.im_status,
|
||||
'id': channel_member_test_user.partner_id.id,
|
||||
'name': channel_member_test_user.partner_id.name,
|
||||
'im_status': channel_member_test_user.partner_id.im_status,
|
||||
})],
|
||||
})],
|
||||
},
|
||||
{
|
||||
'id': channel_partner_test_guest.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_guest.channel_id.id})],
|
||||
'id': channel_member_test_guest.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_guest.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'guest': [('insert-and-replace', {
|
||||
'id': channel_partner_test_guest.guest_id.id,
|
||||
'name': channel_partner_test_guest.guest_id.name,
|
||||
'id': channel_member_test_guest.guest_id.id,
|
||||
'name': channel_member_test_guest.guest_id.name,
|
||||
})],
|
||||
})],
|
||||
},
|
||||
@@ -243,27 +243,27 @@ class TestChannelInternals(MailCommon):
|
||||
},
|
||||
]
|
||||
):
|
||||
res = channel_partner._rtc_join_call()
|
||||
res = channel_member._rtc_join_call()
|
||||
self.assertIn('invitedMembers', res)
|
||||
self.assertEqual(res['invitedMembers'], [('insert', [
|
||||
{
|
||||
'id': channel_partner_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_user.channel_id.id})],
|
||||
'id': channel_member_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_user.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'partner': [('insert-and-replace', {
|
||||
'id': channel_partner_test_user.partner_id.id,
|
||||
'name': channel_partner_test_user.partner_id.name,
|
||||
'im_status': channel_partner_test_user.partner_id.im_status,
|
||||
'id': channel_member_test_user.partner_id.id,
|
||||
'name': channel_member_test_user.partner_id.name,
|
||||
'im_status': channel_member_test_user.partner_id.im_status,
|
||||
})],
|
||||
})],
|
||||
},
|
||||
{
|
||||
'id': channel_partner_test_guest.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_guest.channel_id.id})],
|
||||
'id': channel_member_test_guest.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_guest.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'guest': [('insert-and-replace', {
|
||||
'id': channel_partner_test_guest.guest_id.id,
|
||||
'name': channel_partner_test_guest.guest_id.name,
|
||||
'id': channel_member_test_guest.guest_id.id,
|
||||
'name': channel_member_test_guest.guest_id.name,
|
||||
})],
|
||||
})],
|
||||
},
|
||||
@@ -276,10 +276,10 @@ class TestChannelInternals(MailCommon):
|
||||
test_guest = self.env['mail.guest'].sudo().create({'name': "Test Guest"})
|
||||
channel = self.env['mail.channel'].browse(self.env['mail.channel'].create_group(partners_to=(self.user_employee.partner_id + test_user.partner_id).ids)['id'])
|
||||
channel.add_members(guest_ids=test_guest.ids)
|
||||
channel_partner = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == self.user_employee.partner_id)
|
||||
channel_partner._rtc_join_call()
|
||||
channel_member = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == self.user_employee.partner_id)
|
||||
channel_member._rtc_join_call()
|
||||
|
||||
channel_partner_test_user = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == test_user.partner_id)
|
||||
channel_member_test_user = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == test_user.partner_id)
|
||||
self.env['bus.bus'].sudo().search([]).unlink()
|
||||
with self.assertBus(
|
||||
[
|
||||
@@ -300,13 +300,13 @@ class TestChannelInternals(MailCommon):
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'invitedMembers': [('insert-and-unlink', [{
|
||||
'id': channel_partner_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_user.channel_id.id})],
|
||||
'id': channel_member_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_user.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'partner': [('insert-and-replace', {
|
||||
'id': channel_partner_test_user.partner_id.id,
|
||||
'name': channel_partner_test_user.partner_id.name,
|
||||
'im_status': channel_partner_test_user.partner_id.im_status,
|
||||
'id': channel_member_test_user.partner_id.id,
|
||||
'name': channel_member_test_user.partner_id.name,
|
||||
'im_status': channel_member_test_user.partner_id.im_status,
|
||||
})],
|
||||
})],
|
||||
}])],
|
||||
@@ -318,7 +318,7 @@ class TestChannelInternals(MailCommon):
|
||||
'id': channel.id,
|
||||
'rtcSessions': [('insert', [
|
||||
{
|
||||
'id': channel_partner.rtc_session_ids.id + 1,
|
||||
'id': channel_member.rtc_session_ids.id + 1,
|
||||
'isCameraOn': False,
|
||||
'isDeaf': False,
|
||||
'isSelfMuted': False,
|
||||
@@ -333,9 +333,9 @@ class TestChannelInternals(MailCommon):
|
||||
},
|
||||
]
|
||||
):
|
||||
channel_partner_test_user._rtc_join_call()
|
||||
channel_member_test_user._rtc_join_call()
|
||||
|
||||
channel_partner_test_guest = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.guest_id == test_guest)
|
||||
channel_member_test_guest = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.guest_id == test_guest)
|
||||
self.env['bus.bus'].sudo().search([]).unlink()
|
||||
with self.assertBus(
|
||||
[
|
||||
@@ -356,12 +356,12 @@ class TestChannelInternals(MailCommon):
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'invitedMembers': [('insert-and-unlink', [{
|
||||
'id': channel_partner_test_guest.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_guest.channel_id.id})],
|
||||
'id': channel_member_test_guest.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_guest.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'guest': [('insert-and-replace', {
|
||||
'id': channel_partner_test_guest.guest_id.id,
|
||||
'name': channel_partner_test_guest.guest_id.name,
|
||||
'id': channel_member_test_guest.guest_id.id,
|
||||
'name': channel_member_test_guest.guest_id.name,
|
||||
})],
|
||||
})],
|
||||
}])],
|
||||
@@ -373,7 +373,7 @@ class TestChannelInternals(MailCommon):
|
||||
'id': channel.id,
|
||||
'rtcSessions': [('insert', [
|
||||
{
|
||||
'id': channel_partner.rtc_session_ids.id + 2,
|
||||
'id': channel_member.rtc_session_ids.id + 2,
|
||||
'isCameraOn': False,
|
||||
'isDeaf': False,
|
||||
'isSelfMuted': False,
|
||||
@@ -388,7 +388,7 @@ class TestChannelInternals(MailCommon):
|
||||
},
|
||||
]
|
||||
):
|
||||
channel_partner_test_guest._rtc_join_call()
|
||||
channel_member_test_guest._rtc_join_call()
|
||||
|
||||
@users('employee')
|
||||
@mute_logger('odoo.models.unlink')
|
||||
@@ -397,10 +397,10 @@ class TestChannelInternals(MailCommon):
|
||||
test_guest = self.env['mail.guest'].sudo().create({'name': "Test Guest"})
|
||||
channel = self.env['mail.channel'].browse(self.env['mail.channel'].create_group(partners_to=(self.user_employee.partner_id + test_user.partner_id).ids)['id'])
|
||||
channel.add_members(guest_ids=test_guest.ids)
|
||||
channel_partner = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == self.user_employee.partner_id)
|
||||
channel_partner._rtc_join_call()
|
||||
channel_member = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == self.user_employee.partner_id)
|
||||
channel_member._rtc_join_call()
|
||||
|
||||
channel_partner_test_user = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == test_user.partner_id)
|
||||
channel_member_test_user = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == test_user.partner_id)
|
||||
self.env['bus.bus'].sudo().search([]).unlink()
|
||||
with self.assertBus(
|
||||
[
|
||||
@@ -420,13 +420,13 @@ class TestChannelInternals(MailCommon):
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'invitedMembers': [('insert-and-unlink', [{
|
||||
'id': channel_partner_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_user.channel_id.id})],
|
||||
'id': channel_member_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_user.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'partner': [('insert-and-replace', {
|
||||
'id': channel_partner_test_user.partner_id.id,
|
||||
'name': channel_partner_test_user.partner_id.name,
|
||||
'im_status': channel_partner_test_user.partner_id.im_status,
|
||||
'id': channel_member_test_user.partner_id.id,
|
||||
'name': channel_member_test_user.partner_id.name,
|
||||
'im_status': channel_member_test_user.partner_id.im_status,
|
||||
})],
|
||||
})],
|
||||
}])],
|
||||
@@ -434,9 +434,9 @@ class TestChannelInternals(MailCommon):
|
||||
},
|
||||
]
|
||||
):
|
||||
channel_partner_test_user._rtc_leave_call()
|
||||
channel_member_test_user._rtc_leave_call()
|
||||
|
||||
channel_partner_test_guest = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.guest_id == test_guest)
|
||||
channel_member_test_guest = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.guest_id == test_guest)
|
||||
self.env['bus.bus'].sudo().search([]).unlink()
|
||||
with self.assertBus(
|
||||
[
|
||||
@@ -456,12 +456,12 @@ class TestChannelInternals(MailCommon):
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'invitedMembers': [('insert-and-unlink', [{
|
||||
'id': channel_partner_test_guest.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_guest.channel_id.id})],
|
||||
'id': channel_member_test_guest.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_guest.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'guest': [('insert-and-replace', {
|
||||
'id': channel_partner_test_guest.guest_id.id,
|
||||
'name': channel_partner_test_guest.guest_id.name,
|
||||
'id': channel_member_test_guest.guest_id.id,
|
||||
'name': channel_member_test_guest.guest_id.name,
|
||||
})],
|
||||
})],
|
||||
}])],
|
||||
@@ -469,7 +469,7 @@ class TestChannelInternals(MailCommon):
|
||||
},
|
||||
]
|
||||
):
|
||||
channel_partner_test_guest._rtc_leave_call()
|
||||
channel_member_test_guest._rtc_leave_call()
|
||||
|
||||
@users('employee')
|
||||
@mute_logger('odoo.models.unlink')
|
||||
@@ -478,10 +478,10 @@ class TestChannelInternals(MailCommon):
|
||||
test_guest = self.env['mail.guest'].sudo().create({'name': "Test Guest"})
|
||||
channel = self.env['mail.channel'].browse(self.env['mail.channel'].create_group(partners_to=(self.user_employee.partner_id + test_user.partner_id).ids)['id'])
|
||||
channel.add_members(guest_ids=test_guest.ids)
|
||||
channel_partner = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == self.user_employee.partner_id)
|
||||
channel_partner_test_user = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == test_user.partner_id)
|
||||
channel_partner_test_guest = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.guest_id == test_guest)
|
||||
channel_partner._rtc_join_call()
|
||||
channel_member = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == self.user_employee.partner_id)
|
||||
channel_member_test_user = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == test_user.partner_id)
|
||||
channel_member_test_guest = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.guest_id == test_guest)
|
||||
channel_member._rtc_join_call()
|
||||
|
||||
self.env['bus.bus'].sudo().search([]).unlink()
|
||||
with self.assertBus(
|
||||
@@ -496,7 +496,7 @@ class TestChannelInternals(MailCommon):
|
||||
{
|
||||
'type': 'mail.channel.rtc.session/ended',
|
||||
'payload': {
|
||||
'sessionId': channel_partner.rtc_session_ids.id,
|
||||
'sessionId': channel_member.rtc_session_ids.id,
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -519,23 +519,23 @@ class TestChannelInternals(MailCommon):
|
||||
'id': channel.id,
|
||||
'invitedMembers': [('insert-and-unlink', [
|
||||
{
|
||||
'id': channel_partner_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_user.channel_id.id})],
|
||||
'id': channel_member_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_user.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'partner': [('insert-and-replace', {
|
||||
'id': channel_partner_test_user.partner_id.id,
|
||||
'name': channel_partner_test_user.partner_id.name,
|
||||
'im_status': channel_partner_test_user.partner_id.im_status,
|
||||
'id': channel_member_test_user.partner_id.id,
|
||||
'name': channel_member_test_user.partner_id.name,
|
||||
'im_status': channel_member_test_user.partner_id.im_status,
|
||||
})],
|
||||
})],
|
||||
},
|
||||
{
|
||||
'id': channel_partner_test_guest.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_guest.channel_id.id})],
|
||||
'id': channel_member_test_guest.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_guest.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'guest': [('insert-and-replace', {
|
||||
'id': channel_partner_test_guest.guest_id.id,
|
||||
'name': channel_partner_test_guest.guest_id.name,
|
||||
'id': channel_member_test_guest.guest_id.id,
|
||||
'name': channel_member_test_guest.guest_id.name,
|
||||
})],
|
||||
})],
|
||||
},
|
||||
@@ -546,12 +546,12 @@ class TestChannelInternals(MailCommon):
|
||||
'type': 'mail.channel/rtc_sessions_update',
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'rtcSessions': [('insert-and-unlink', [{'id': channel_partner.rtc_session_ids.id}])],
|
||||
'rtcSessions': [('insert-and-unlink', [{'id': channel_member.rtc_session_ids.id}])],
|
||||
},
|
||||
},
|
||||
]
|
||||
):
|
||||
channel_partner._rtc_leave_call()
|
||||
channel_member._rtc_leave_call()
|
||||
|
||||
@users('employee')
|
||||
@mute_logger('odoo.models.unlink')
|
||||
@@ -559,16 +559,16 @@ class TestChannelInternals(MailCommon):
|
||||
test_user = self.env['res.users'].sudo().create({'name': "Test User", 'login': 'test'})
|
||||
test_guest = self.env['mail.guest'].sudo().create({'name': "Test Guest"})
|
||||
channel = self.env['mail.channel'].browse(self.env['mail.channel'].create_group(partners_to=self.user_employee.partner_id.ids)['id'])
|
||||
channel_partner = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == self.user_employee.partner_id)
|
||||
channel_partner._rtc_join_call()
|
||||
channel_member = channel.sudo().channel_member_ids.filtered(lambda member: member.partner_id == self.user_employee.partner_id)
|
||||
channel_member._rtc_join_call()
|
||||
self.env['bus.bus'].sudo().search([]).unlink()
|
||||
|
||||
|
||||
with self.mock_bus():
|
||||
channel.add_members(partner_ids=test_user.partner_id.ids, guest_ids=test_guest.ids, invite_to_rtc_call=True)
|
||||
|
||||
channel_partner_test_user = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == test_user.partner_id)
|
||||
channel_partner_test_guest = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.guest_id == test_guest)
|
||||
channel_member_test_user = channel.sudo().channel_member_ids.filtered(lambda member: member.partner_id == test_user.partner_id)
|
||||
channel_member_test_guest = channel.sudo().channel_member_ids.filtered(lambda member: member.guest_id == test_guest)
|
||||
found_bus_notifs = self.assertBusNotifications(
|
||||
[
|
||||
(self.cr.dbname, 'res.partner', test_user.partner_id.id), # channel joined (not asserted below)
|
||||
@@ -590,7 +590,7 @@ class TestChannelInternals(MailCommon):
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'rtcInvitingSession': [('insert', {
|
||||
'id': channel_partner.rtc_session_ids.id,
|
||||
'id': channel_member.rtc_session_ids.id,
|
||||
'isCameraOn': False,
|
||||
'isDeaf': False,
|
||||
'isSelfMuted': False,
|
||||
@@ -607,7 +607,7 @@ class TestChannelInternals(MailCommon):
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'rtcInvitingSession': [('insert', {
|
||||
'id': channel_partner.rtc_session_ids.id,
|
||||
'id': channel_member.rtc_session_ids.id,
|
||||
'isCameraOn': False,
|
||||
'isDeaf': False,
|
||||
'isSelfMuted': False,
|
||||
@@ -625,23 +625,23 @@ class TestChannelInternals(MailCommon):
|
||||
'id': channel.id,
|
||||
'invitedMembers': [('insert', [
|
||||
{
|
||||
'id': channel_partner_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_user.channel_id.id})],
|
||||
'id': channel_member_test_user.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_user.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'partner': [('insert-and-replace', {
|
||||
'id': channel_partner_test_user.partner_id.id,
|
||||
'name': channel_partner_test_user.partner_id.name,
|
||||
'im_status': channel_partner_test_user.partner_id.im_status,
|
||||
'id': channel_member_test_user.partner_id.id,
|
||||
'name': channel_member_test_user.partner_id.name,
|
||||
'im_status': channel_member_test_user.partner_id.im_status,
|
||||
})],
|
||||
})],
|
||||
},
|
||||
{
|
||||
'id': channel_partner_test_guest.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_partner_test_guest.channel_id.id})],
|
||||
'id': channel_member_test_guest.id,
|
||||
'channel': [('insert-and-replace', {'id': channel_member_test_guest.channel_id.id})],
|
||||
'persona': [('insert-and-replace', {
|
||||
'guest': [('insert-and-replace', {
|
||||
'id': channel_partner_test_guest.guest_id.id,
|
||||
'name': channel_partner_test_guest.guest_id.name,
|
||||
'id': channel_member_test_guest.guest_id.id,
|
||||
'name': channel_member_test_guest.guest_id.name,
|
||||
})],
|
||||
})],
|
||||
},
|
||||
@@ -656,8 +656,8 @@ class TestChannelInternals(MailCommon):
|
||||
@mute_logger('odoo.models.unlink')
|
||||
def test_40_leave_call_should_remove_existing_sessions_of_user_in_channel_and_return_data(self):
|
||||
channel = self.env['mail.channel'].browse(self.env['mail.channel'].create_group(partners_to=self.user_employee.partner_id.ids)['id'])
|
||||
channel_partner = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == self.user_employee.partner_id)
|
||||
channel_partner._rtc_join_call()
|
||||
channel_member = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == self.user_employee.partner_id)
|
||||
channel_member._rtc_join_call()
|
||||
self.env['bus.bus'].sudo().search([]).unlink()
|
||||
with self.assertBus(
|
||||
[
|
||||
@@ -668,28 +668,28 @@ class TestChannelInternals(MailCommon):
|
||||
{
|
||||
'type': 'mail.channel.rtc.session/ended',
|
||||
'payload': {
|
||||
'sessionId': channel_partner.rtc_session_ids.id,
|
||||
'sessionId': channel_member.rtc_session_ids.id,
|
||||
},
|
||||
},
|
||||
{
|
||||
'type': 'mail.channel/rtc_sessions_update',
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'rtcSessions': [('insert-and-unlink', [{'id': channel_partner.rtc_session_ids.id}])],
|
||||
'rtcSessions': [('insert-and-unlink', [{'id': channel_member.rtc_session_ids.id}])],
|
||||
},
|
||||
},
|
||||
],
|
||||
):
|
||||
channel_partner._rtc_leave_call()
|
||||
channel_member._rtc_leave_call()
|
||||
|
||||
@users('employee')
|
||||
@mute_logger('odoo.models.unlink')
|
||||
def test_50_garbage_collect_should_remove_old_sessions_and_notify_data(self):
|
||||
channel = self.env['mail.channel'].browse(self.env['mail.channel'].create_group(partners_to=self.user_employee.partner_id.ids)['id'])
|
||||
channel_partner = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == self.user_employee.partner_id)
|
||||
channel_partner._rtc_join_call()
|
||||
channel_partner.rtc_session_ids.flush_model()
|
||||
channel_partner.rtc_session_ids._write({'write_date': fields.Datetime.now() - relativedelta(days=2)})
|
||||
channel_member = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == self.user_employee.partner_id)
|
||||
channel_member._rtc_join_call()
|
||||
channel_member.rtc_session_ids.flush_model()
|
||||
channel_member.rtc_session_ids._write({'write_date': fields.Datetime.now() - relativedelta(days=2)})
|
||||
self.env['bus.bus'].sudo().search([]).unlink()
|
||||
with self.assertBus(
|
||||
[
|
||||
@@ -700,27 +700,27 @@ class TestChannelInternals(MailCommon):
|
||||
{
|
||||
'type': 'mail.channel.rtc.session/ended',
|
||||
'payload': {
|
||||
'sessionId': channel_partner.rtc_session_ids.id,
|
||||
'sessionId': channel_member.rtc_session_ids.id,
|
||||
},
|
||||
},
|
||||
{
|
||||
'type': 'mail.channel/rtc_sessions_update',
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'rtcSessions': [('insert-and-unlink', [{'id': channel_partner.rtc_session_ids.id}])],
|
||||
'rtcSessions': [('insert-and-unlink', [{'id': channel_member.rtc_session_ids.id}])],
|
||||
},
|
||||
},
|
||||
],
|
||||
):
|
||||
self.env['mail.channel.rtc.session'].sudo()._gc_inactive_sessions()
|
||||
self.assertFalse(channel_partner.rtc_session_ids)
|
||||
self.assertFalse(channel_member.rtc_session_ids)
|
||||
|
||||
@users('employee')
|
||||
@mute_logger('odoo.models.unlink')
|
||||
def test_51_action_disconnect_should_remove_selected_session_and_notify_data(self):
|
||||
channel = self.env['mail.channel'].browse(self.env['mail.channel'].create_group(partners_to=self.user_employee.partner_id.ids)['id'])
|
||||
channel_partner = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == self.user_employee.partner_id)
|
||||
channel_partner._rtc_join_call()
|
||||
channel_member = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == self.user_employee.partner_id)
|
||||
channel_member._rtc_join_call()
|
||||
self.env['bus.bus'].sudo().search([]).unlink()
|
||||
with self.assertBus(
|
||||
[
|
||||
@@ -731,33 +731,33 @@ class TestChannelInternals(MailCommon):
|
||||
{
|
||||
'type': 'mail.channel.rtc.session/ended',
|
||||
'payload': {
|
||||
'sessionId': channel_partner.rtc_session_ids.id,
|
||||
'sessionId': channel_member.rtc_session_ids.id,
|
||||
},
|
||||
},
|
||||
{
|
||||
'type': 'mail.channel/rtc_sessions_update',
|
||||
'payload': {
|
||||
'id': channel.id,
|
||||
'rtcSessions': [('insert-and-unlink', [{'id': channel_partner.rtc_session_ids.id}])],
|
||||
'rtcSessions': [('insert-and-unlink', [{'id': channel_member.rtc_session_ids.id}])],
|
||||
},
|
||||
},
|
||||
],
|
||||
):
|
||||
channel_partner.rtc_session_ids.action_disconnect()
|
||||
self.assertFalse(channel_partner.rtc_session_ids)
|
||||
channel_member.rtc_session_ids.action_disconnect()
|
||||
self.assertFalse(channel_member.rtc_session_ids)
|
||||
|
||||
@users('employee')
|
||||
@mute_logger('odoo.models.unlink')
|
||||
def test_60_rtc_sync_sessions_should_gc_and_return_outdated_and_active_sessions(self):
|
||||
channel = self.env['mail.channel'].browse(self.env['mail.channel'].create_group(partners_to=self.user_employee.partner_id.ids)['id'])
|
||||
channel_partner = channel.sudo().channel_last_seen_partner_ids.filtered(lambda channel_partner: channel_partner.partner_id == self.user_employee.partner_id)
|
||||
join_call_values = channel_partner._rtc_join_call()
|
||||
channel_member = channel.sudo().channel_member_ids.filtered(lambda channel_member: channel_member.partner_id == self.user_employee.partner_id)
|
||||
join_call_values = channel_member._rtc_join_call()
|
||||
test_guest = self.env['mail.guest'].sudo().create({'name': "Test Guest"})
|
||||
test_channel_partner = self.env['mail.channel.partner'].create({
|
||||
test_channel_member = self.env['mail.channel.member'].create({
|
||||
'guest_id': test_guest.id,
|
||||
'channel_id': channel.id,
|
||||
})
|
||||
test_session = self.env['mail.channel.rtc.session'].sudo().create({'channel_partner_id': test_channel_partner.id})
|
||||
test_session = self.env['mail.channel.rtc.session'].sudo().create({'channel_member_id': test_channel_member.id})
|
||||
test_session.flush_model()
|
||||
test_session._write({'write_date': fields.Datetime.now() - relativedelta(days=2)})
|
||||
unused_ids = [9998, 9999]
|
||||
@@ -783,7 +783,7 @@ class TestChannelInternals(MailCommon):
|
||||
},
|
||||
],
|
||||
):
|
||||
current_rtc_sessions, outdated_rtc_sessions = channel_partner._rtc_sync_sessions(check_rtc_session_ids=[join_call_values['sessionId']] + unused_ids)
|
||||
self.assertEqual(channel_partner.rtc_session_ids, current_rtc_sessions)
|
||||
current_rtc_sessions, outdated_rtc_sessions = channel_member._rtc_sync_sessions(check_rtc_session_ids=[join_call_values['sessionId']] + unused_ids)
|
||||
self.assertEqual(channel_member.rtc_session_ids, current_rtc_sessions)
|
||||
self.assertEqual(unused_ids, outdated_rtc_sessions.ids)
|
||||
self.assertFalse(outdated_rtc_sessions.exists())
|
||||
|
||||
+9
-9
@@ -1,9 +1,9 @@
|
||||
<?xml version="1.0"?>
|
||||
<odoo><data>
|
||||
<!-- mail.channel.partner -->
|
||||
<record id="mail_channel_partner_view_tree" model="ir.ui.view">
|
||||
<field name="name">mail.channel.partner.tree</field>
|
||||
<field name="model">mail.channel.partner</field>
|
||||
<!-- mail.channel.member -->
|
||||
<record id="mail_channel_member_view_tree" model="ir.ui.view">
|
||||
<field name="name">mail.channel.member.tree</field>
|
||||
<field name="model">mail.channel.member</field>
|
||||
<field name="priority">10</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Channels">
|
||||
@@ -14,9 +14,9 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mail_channel_partner_view_form" model="ir.ui.view">
|
||||
<field name="name">mail.channel.partner.form</field>
|
||||
<field name="model">mail.channel.partner</field>
|
||||
<record id="mail_channel_member_view_form" model="ir.ui.view">
|
||||
<field name="name">mail.channel.member.form</field>
|
||||
<field name="model">mail.channel.member</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Channel">
|
||||
<sheet>
|
||||
@@ -32,9 +32,9 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="mail_channel_partner_action" model="ir.actions.act_window">
|
||||
<record id="mail_channel_member_action" model="ir.actions.act_window">
|
||||
<field name="name">Channels/Partner</field>
|
||||
<field name="res_model">mail.channel.partner</field>
|
||||
<field name="res_model">mail.channel.member</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<field name="model">mail.channel.rtc.session</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search RTC session">
|
||||
<field name="channel_partner_id"/>
|
||||
<field name="channel_member_id"/>
|
||||
<filter name="group_by_channel" string="Channel" domain="[]" context="{'group_by':'channel_id'}"/>
|
||||
</search>
|
||||
</field>
|
||||
@@ -21,7 +21,7 @@
|
||||
<button name="action_disconnect" type="object" string="Disconnect"/>
|
||||
</header>
|
||||
<field name="id"/>
|
||||
<field name="channel_partner_id"/>
|
||||
<field name="channel_member_id"/>
|
||||
<field name="channel_id"/>
|
||||
<field name="write_date"/>
|
||||
</tree>
|
||||
@@ -35,7 +35,7 @@
|
||||
<form string="RTC Session">
|
||||
<sheet>
|
||||
<div class="oe_title">
|
||||
<h1><field name="channel_partner_id"/></h1>
|
||||
<h1><field name="channel_member_id"/></h1>
|
||||
</div>
|
||||
<group>
|
||||
<group string="Identity">
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
</page>
|
||||
<page string="Members" name="members">
|
||||
<field name="channel_type" invisible="1"/>
|
||||
<field name="channel_last_seen_partner_ids" mode="tree" context="{'active_test': False}" attrs="{'readonly': [('channel_type', '=', 'chat')]}">
|
||||
<field name="channel_member_ids" mode="tree" context="{'active_test': False}" attrs="{'readonly': [('channel_type', '=', 'chat')]}">
|
||||
<tree string="Members" editable="bottom">
|
||||
<field name="partner_id" required="1" attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||
<field name="partner_email" readonly="1"/>
|
||||
|
||||
@@ -34,9 +34,9 @@
|
||||
sequence="20"
|
||||
groups="base.group_no_one"/>
|
||||
<menuitem name="Channels/Partner"
|
||||
id="mail_channel_partner_menu"
|
||||
id="mail_channel_member_menu"
|
||||
parent="base.menu_email"
|
||||
action="mail_channel_partner_action"
|
||||
action="mail_channel_member_action"
|
||||
sequence="21"
|
||||
groups="base.group_no_one"/>
|
||||
<menuitem id="mail_gateway_allowed_menu"
|
||||
|
||||
@@ -38,7 +38,7 @@ class PrivacyLookupWizard(models.TransientModel):
|
||||
# Ondelete Cascade
|
||||
'mail.notification',
|
||||
'mail.followers',
|
||||
'mail.channel.partner',
|
||||
'mail.channel.member',
|
||||
# Special case for direct messages
|
||||
'mail.message',
|
||||
]
|
||||
|
||||
@@ -129,7 +129,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_general.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_general.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': next(res['message_id'] for res in self.channel_general._channel_last_message_ids()),
|
||||
'memberCount': len(self.group_user.users | self.user_root),
|
||||
'message_needaction_counter': 0,
|
||||
@@ -154,7 +154,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_channel_public_1.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_channel_public_1.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': next(res['message_id'] for res in self.channel_channel_public_1._channel_last_message_ids()),
|
||||
'message_needaction_counter': 1,
|
||||
'memberCount': 5,
|
||||
@@ -179,7 +179,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_channel_public_2.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_channel_public_2.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': next(res['message_id'] for res in self.channel_channel_public_2._channel_last_message_ids()),
|
||||
'memberCount': 5,
|
||||
'message_needaction_counter': 0,
|
||||
@@ -204,7 +204,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_channel_group_1.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_channel_group_1.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': next(res['message_id'] for res in self.channel_channel_group_1._channel_last_message_ids()),
|
||||
'memberCount': 5,
|
||||
'message_needaction_counter': 0,
|
||||
@@ -229,7 +229,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_channel_group_2.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_channel_group_2.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': next(res['message_id'] for res in self.channel_channel_group_2._channel_last_message_ids()),
|
||||
'memberCount': 5,
|
||||
'message_needaction_counter': 0,
|
||||
@@ -254,7 +254,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_channel_private_1.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_channel_private_1.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': next(res['message_id'] for res in self.channel_channel_private_1._channel_last_message_ids()),
|
||||
'memberCount': 5,
|
||||
'message_needaction_counter': 0,
|
||||
@@ -279,7 +279,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_channel_private_2.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_channel_private_2.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': next(res['message_id'] for res in self.channel_channel_private_2._channel_last_message_ids()),
|
||||
'memberCount': 5,
|
||||
'message_needaction_counter': 0,
|
||||
@@ -305,7 +305,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_group_1.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_group_1.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': False,
|
||||
'memberCount': 2,
|
||||
'members': [
|
||||
@@ -341,13 +341,13 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'seen_partners_info': [
|
||||
{
|
||||
'fetched_message_id': False,
|
||||
'id': self.channel_group_1.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).id,
|
||||
'id': self.channel_group_1.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).id,
|
||||
'partner_id': self.users[0].partner_id.id,
|
||||
'seen_message_id': False,
|
||||
},
|
||||
{
|
||||
'fetched_message_id': False,
|
||||
'id': self.channel_group_1.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[12].partner_id).id,
|
||||
'id': self.channel_group_1.channel_member_ids.filtered(lambda m: m.partner_id == self.users[12].partner_id).id,
|
||||
'partner_id': self.users[12].partner_id.id,
|
||||
'seen_message_id': False,
|
||||
}
|
||||
@@ -369,7 +369,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_chat_1.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_chat_1.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': False,
|
||||
'memberCount': 2,
|
||||
'members': [
|
||||
@@ -404,13 +404,13 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'seen_partners_info': [
|
||||
{
|
||||
'fetched_message_id': False,
|
||||
'id': self.channel_chat_1.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).id,
|
||||
'id': self.channel_chat_1.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).id,
|
||||
'partner_id': self.users[0].partner_id.id,
|
||||
'seen_message_id': False,
|
||||
},
|
||||
{
|
||||
'fetched_message_id': False,
|
||||
'id': self.channel_chat_1.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[14].partner_id).id,
|
||||
'id': self.channel_chat_1.channel_member_ids.filtered(lambda m: m.partner_id == self.users[14].partner_id).id,
|
||||
'partner_id': self.users[14].partner_id.id,
|
||||
'seen_message_id': False,
|
||||
},
|
||||
@@ -433,7 +433,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_chat_2.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_chat_2.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': False,
|
||||
'memberCount': 2,
|
||||
'members': [
|
||||
@@ -468,13 +468,13 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'seen_partners_info': [
|
||||
{
|
||||
'fetched_message_id': False,
|
||||
'id': self.channel_chat_2.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).id,
|
||||
'id': self.channel_chat_2.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).id,
|
||||
'partner_id': self.users[0].partner_id.id,
|
||||
'seen_message_id': False,
|
||||
},
|
||||
{
|
||||
'fetched_message_id': False,
|
||||
'id': self.channel_chat_2.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[15].partner_id).id,
|
||||
'id': self.channel_chat_2.channel_member_ids.filtered(lambda m: m.partner_id == self.users[15].partner_id).id,
|
||||
'partner_id': self.users[15].partner_id.id,
|
||||
'seen_message_id': False,
|
||||
},
|
||||
@@ -497,7 +497,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_chat_3.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_chat_3.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': False,
|
||||
'memberCount': 2,
|
||||
'members': [
|
||||
@@ -532,13 +532,13 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'seen_partners_info': [
|
||||
{
|
||||
'fetched_message_id': False,
|
||||
'id': self.channel_chat_3.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).id,
|
||||
'id': self.channel_chat_3.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).id,
|
||||
'partner_id': self.users[0].partner_id.id,
|
||||
'seen_message_id': False,
|
||||
},
|
||||
{
|
||||
'fetched_message_id': False,
|
||||
'id': self.channel_chat_3.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[2].partner_id).id,
|
||||
'id': self.channel_chat_3.channel_member_ids.filtered(lambda m: m.partner_id == self.users[2].partner_id).id,
|
||||
'partner_id': self.users[2].partner_id.id,
|
||||
'seen_message_id': False,
|
||||
},
|
||||
@@ -561,7 +561,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_chat_4.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_chat_4.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': False,
|
||||
'memberCount': 2,
|
||||
'members': [
|
||||
@@ -596,13 +596,13 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'seen_partners_info': [
|
||||
{
|
||||
'fetched_message_id': False,
|
||||
'id': self.channel_chat_4.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).id,
|
||||
'id': self.channel_chat_4.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).id,
|
||||
'partner_id': self.users[0].partner_id.id,
|
||||
'seen_message_id': False,
|
||||
},
|
||||
{
|
||||
'fetched_message_id': False,
|
||||
'id': self.channel_chat_4.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[3].partner_id).id,
|
||||
'id': self.channel_chat_4.channel_member_ids.filtered(lambda m: m.partner_id == self.users[3].partner_id).id,
|
||||
'partner_id': self.users[3].partner_id.id,
|
||||
'seen_message_id': False,
|
||||
},
|
||||
@@ -625,7 +625,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_livechat_1.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_livechat_1.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': next(res['message_id'] for res in self.channel_livechat_1._channel_last_message_ids()),
|
||||
'memberCount': 2,
|
||||
'livechat_visitor': {
|
||||
@@ -660,13 +660,13 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'seen_partners_info': [
|
||||
{
|
||||
'fetched_message_id': False,
|
||||
'id': self.channel_livechat_1.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).id,
|
||||
'id': self.channel_livechat_1.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).id,
|
||||
'partner_id': self.users[0].partner_id.id,
|
||||
'seen_message_id': False,
|
||||
},
|
||||
{
|
||||
'fetched_message_id': next(res['message_id'] for res in self.channel_livechat_1._channel_last_message_ids()),
|
||||
'id': self.channel_livechat_1.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[1].partner_id).id,
|
||||
'id': self.channel_livechat_1.channel_member_ids.filtered(lambda m: m.partner_id == self.users[1].partner_id).id,
|
||||
'partner_id': self.users[1].partner_id.id,
|
||||
'seen_message_id': next(res['message_id'] for res in self.channel_livechat_1._channel_last_message_ids()),
|
||||
},
|
||||
@@ -689,7 +689,7 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'invitedMembers': [('insert', [])],
|
||||
'is_minimized': False,
|
||||
'is_pinned': True,
|
||||
'last_interest_dt': self.channel_livechat_2.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_interest_dt': self.channel_livechat_2.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
'last_message_id': next(res['message_id'] for res in self.channel_livechat_2._channel_last_message_ids()),
|
||||
'memberCount': 2,
|
||||
'livechat_visitor': {
|
||||
@@ -724,13 +724,13 @@ class TestDiscussFullPerformance(TransactionCase):
|
||||
'seen_partners_info': [
|
||||
{
|
||||
'fetched_message_id': next(res['message_id'] for res in self.channel_livechat_2._channel_last_message_ids()),
|
||||
'id': self.channel_livechat_2.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.env.ref('base.public_partner')).id,
|
||||
'id': self.channel_livechat_2.channel_member_ids.filtered(lambda m: m.partner_id == self.env.ref('base.public_partner')).id,
|
||||
'partner_id': self.env.ref('base.public_user').partner_id.id,
|
||||
'seen_message_id': next(res['message_id'] for res in self.channel_livechat_2._channel_last_message_ids()),
|
||||
},
|
||||
{
|
||||
'fetched_message_id': False,
|
||||
'id': self.channel_livechat_2.channel_last_seen_partner_ids.filtered(lambda p: p.partner_id == self.users[0].partner_id).id,
|
||||
'id': self.channel_livechat_2.channel_member_ids.filtered(lambda m: m.partner_id == self.users[0].partner_id).id,
|
||||
'partner_id': self.users[0].partner_id.id,
|
||||
'seen_message_id': False,
|
||||
},
|
||||
|
||||
@@ -31,7 +31,7 @@ class TestOdoobot(TestMailCommon, TestRecipients):
|
||||
def test_fetch_listener(self):
|
||||
channel = self.user_employee.with_user(self.user_employee)._init_odoobot()
|
||||
odoobot = self.env.ref("base.partner_root")
|
||||
odoobot_in_fetch_listeners = self.env['mail.channel.partner'].search([('channel_id', '=', channel.id), ('partner_id', '=', odoobot.id)])
|
||||
odoobot_in_fetch_listeners = self.env['mail.channel.member'].search([('channel_id', '=', channel.id), ('partner_id', '=', odoobot.id)])
|
||||
self.assertEqual(len(odoobot_in_fetch_listeners), 1, 'odoobot should appear only once in channel_fetch_listeners')
|
||||
|
||||
@mute_logger('odoo.addons.mail.models.mail_mail')
|
||||
|
||||
@@ -14,7 +14,7 @@ class WebsiteLivechatChatbotScriptController(http.Controller):
|
||||
that will hold the conversation between the bot and the user testing the script. """
|
||||
|
||||
mail_channel_values = {
|
||||
'channel_last_seen_partner_ids': [(0, 0, {
|
||||
'channel_member_ids': [(0, 0, {
|
||||
'partner_id': chatbot_script.operator_partner_id.id,
|
||||
'is_pinned': False
|
||||
}, {
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
import json
|
||||
|
||||
from odoo import models, api, fields, _
|
||||
from odoo import api, Command, fields, models, _
|
||||
from odoo.exceptions import UserError
|
||||
from odoo.http import request
|
||||
|
||||
@@ -58,13 +57,13 @@ class WebsiteVisitor(models.Model):
|
||||
operator = self.env.user
|
||||
country = visitor.country_id
|
||||
visitor_name = "%s (%s)" % (visitor.display_name, country.name) if country else visitor.display_name
|
||||
channel_partner_to_add = [(4, operator.partner_id.id)]
|
||||
members_to_add = [Command.link(operator.partner_id.id)]
|
||||
if visitor.partner_id:
|
||||
channel_partner_to_add.append((4, visitor.partner_id.id))
|
||||
members_to_add.append(Command.link(visitor.partner_id.id))
|
||||
else:
|
||||
channel_partner_to_add.append((4, self.env.ref('base.public_partner').id))
|
||||
members_to_add.append(Command.link(self.env.ref('base.public_partner').id))
|
||||
mail_channel_vals_list.append({
|
||||
'channel_partner_ids': channel_partner_to_add,
|
||||
'channel_partner_ids': members_to_add,
|
||||
'livechat_channel_id': visitor.website_id.channel_id.id,
|
||||
'livechat_operator_id': self.env.user.partner_id.id,
|
||||
'channel_type': 'livechat',
|
||||
@@ -78,7 +77,7 @@ class WebsiteVisitor(models.Model):
|
||||
if mail_channel_vals_list:
|
||||
mail_channels = self.env['mail.channel'].create(mail_channel_vals_list)
|
||||
# Open empty chatter to allow the operator to start chatting with the visitor.
|
||||
channel_members = self.env['mail.channel.partner'].sudo().search([
|
||||
channel_members = self.env['mail.channel.member'].sudo().search([
|
||||
('partner_id', '=', self.env.user.partner_id.id),
|
||||
('channel_id', 'in', mail_channels.ids),
|
||||
])
|
||||
|
||||
@@ -72,7 +72,7 @@ patch(MockServer.prototype, 'website_livechat', {
|
||||
}
|
||||
const livechatId = this.pyEnv['mail.channel'].create({
|
||||
anonymous_name: visitor_name,
|
||||
channel_last_seen_partner_ids: membersToAdd,
|
||||
channel_member_ids: membersToAdd,
|
||||
channel_type: 'livechat',
|
||||
livechat_operator_id: this.currentPartnerId,
|
||||
public: 'private',
|
||||
|
||||
@@ -25,7 +25,7 @@ QUnit.test('rendering of visitor banner', async function (assert) {
|
||||
website_name: "General website",
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -124,7 +124,7 @@ QUnit.test('livechat with non-logged visitor should show visitor banner', async
|
||||
website_name: "General website",
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: pyEnv.publicPartnerId }],
|
||||
],
|
||||
@@ -167,7 +167,7 @@ QUnit.test('livechat with logged visitor should show visitor banner', async func
|
||||
website_name: "General website",
|
||||
});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
@@ -201,7 +201,7 @@ QUnit.test('livechat without visitor should not show visitor banner', async func
|
||||
const pyEnv = await startServer();
|
||||
const resPartnerId1 = pyEnv['res.partner'].create({});
|
||||
const mailChannelId1 = pyEnv['mail.channel'].create({
|
||||
channel_last_seen_partner_ids: [
|
||||
channel_member_ids: [
|
||||
[0, 0, { partner_id: pyEnv.currentPartnerId }],
|
||||
[0, 0, { partner_id: resPartnerId1 }],
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user