[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:
Louis Wicket (wil)
2022-07-19 11:50:37 +02:00
parent 5fe4303a0d
commit fdcaa53ca0
67 changed files with 707 additions and 713 deletions
+1 -1
View File
@@ -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 }],
],
+1 -1
View File
@@ -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,
+1 -1
View File
@@ -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,
+4 -4
View File
@@ -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):
@@ -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 -2
View File
@@ -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),
@@ -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,
@@ -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 }],
],
@@ -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 }],
],
@@ -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,
@@ -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
+1 -1
View File
@@ -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',
+38 -38
View File
@@ -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):
+1 -1
View File
@@ -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"/>
+1 -1
View File
@@ -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
View File
@@ -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)
@@ -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
+1 -1
View File
@@ -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."""
+2 -2
View File
@@ -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),
])),
+3 -3
View File
@@ -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):
+3 -3
View File
@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
15 access_mail_channel_all mail.group.all model_mail_channel 1 0 0 0
16 access_mail_channel_user mail.group.user model_mail_channel base.group_user 1 1 1 0
17 access_mail_channel_admin mail.group.system model_mail_channel base.group_system 1 1 1 1
18 access_mail_channel_partner_public access_mail_channel_member_public mail.channel.partner.public mail.channel.member.public model_mail_channel_partner model_mail_channel_member base.group_public 1 0 0 0
19 access_mail_channel_partner_portal access_mail_channel_member_portal mail.channel.partner.portal mail.channel.member.portal model_mail_channel_partner model_mail_channel_member base.group_portal 1 1 1 1
20 access_mail_channel_partner_user access_mail_channel_member_user mail.channel.partner.user mail.channel.member.user model_mail_channel_partner model_mail_channel_member base.group_user 1 1 1 1
21 access_mail_channel_rtc_session_all mail.channel.rtc.session.all model_mail_channel_rtc_session 0 0 0 0
22 access_mail_channel_rtc_session_system mail.channel.rtc.session.system model_mail_channel_rtc_session base.group_system 1 1 1 1
23 access_mail_alias_all mail.alias.all model_mail_alias 1 0 0 0
+6 -6
View File
@@ -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',
+41 -41
View File
@@ -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 },
@@ -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',
@@ -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 }],
],
@@ -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,
}]],
@@ -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,
}]],
@@ -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,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) {
@@ -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 -2
View File
@@ -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
+6 -6
View File
@@ -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')
@@ -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
View File
@@ -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())
@@ -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">
+1 -1
View File
@@ -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"/>
+2 -2
View File
@@ -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,
},
+1 -1
View File
@@ -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 }],
],