From fdcaa53ca0b542ccf11474862c006e2fffa93ade Mon Sep 17 00:00:00 2001 From: "Louis Wicket (wil)" Date: Wed, 13 Jul 2022 08:41:31 +0000 Subject: [PATCH] [IMP] mail, *: rename mail.channel.partner to mail.channel.member MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * = 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) --- addons/crm_livechat/tests/test_crm_lead.py | 2 +- .../components/thread_icon_tests.js | 6 +- .../components/thread_view_tests.js | 2 +- addons/im_livechat/controllers/chatbot.py | 2 +- addons/im_livechat/models/__init__.py | 2 +- .../im_livechat/models/im_livechat_channel.py | 6 +- addons/im_livechat/models/mail_channel.py | 8 +- ...nnel_partner.py => mail_channel_member.py} | 15 +- addons/im_livechat/models/res_partner.py | 3 +- .../src/legacy/widgets/livechat_button.js | 2 +- .../models/messaging_notification_handler.js | 2 +- .../static/tests/helpers/mock_server.js | 8 +- .../components/chat_window_manager_tests.js | 2 +- .../discuss_sidebar_category_item_tests.js | 4 +- .../discuss_sidebar_category_tests.js | 24 +- .../components/discuss_tests.js | 16 +- .../components/messaging_menu_tests.js | 2 +- .../components/thread_icon_tests.js | 4 +- .../thread_textual_typing_status_tests.js | 4 +- .../tests/test_get_mail_channel.py | 10 +- addons/mail/__manifest__.py | 2 +- addons/mail/controllers/discuss.py | 76 ++--- addons/mail/data/mail_channel_data.xml | 2 +- addons/mail/models/__init__.py | 2 +- addons/mail/models/mail_channel.py | 207 +++++++------ ...nnel_partner.py => mail_channel_member.py} | 69 +++-- .../mail/models/mail_channel_rtc_session.py | 12 +- addons/mail/models/mail_guest.py | 2 +- addons/mail/models/res_partner.py | 4 +- addons/mail/models/res_users.py | 6 +- addons/mail/security/ir.model.access.csv | 6 +- addons/mail/security/mail_security.xml | 12 +- .../models/messaging_notification_handler.js | 18 +- .../mail/static/tests/helpers/mock_server.js | 82 +++--- .../tests/helpers/model_definitions_setup.js | 6 +- .../channel_invitation_form_tests.js | 8 +- .../components/channel_member_list_tests.js | 22 +- .../components/chat_window_manager_tests.js | 48 +-- .../components/composer_tests.js | 2 +- .../components/discuss_pinned_tests.js | 4 +- .../discuss_sidebar_category_item_tests.js | 6 +- .../discuss_sidebar_category_tests.js | 10 +- .../components/discuss_sidebar_tests.js | 4 +- .../components/discuss_tests.js | 26 +- .../message_seen_indicator_tests.js | 34 +-- .../components/message_tests.js | 34 +-- .../components/messaging_menu_tests.js | 4 +- .../components/thread_icon_tests.js | 6 +- .../components/thread_preview_tests.js | 6 +- .../thread_textual_typing_status_tests.js | 32 +- .../components/thread_view_tests.js | 16 +- .../models/messaging_tests.js | 2 +- addons/mail/tests/__init__.py | 3 +- addons/mail/tests/test_mail_channel.py | 12 +- ...partner.py => test_mail_channel_member.py} | 122 ++++---- addons/mail/tests/test_rtc.py | 274 +++++++++--------- ...iews.xml => mail_channel_member_views.xml} | 18 +- .../views/mail_channel_rtc_session_views.xml | 6 +- addons/mail/views/mail_channel_views.xml | 2 +- addons/mail/views/mail_menus.xml | 4 +- .../wizard/privacy_lookup_wizard.py | 2 +- .../tests/test_performance.py | 56 ++-- addons/test_mail_full/tests/test_odoobot.py | 2 +- .../website_livechat/controllers/chatbot.py | 2 +- .../models/website_visitor.py | 13 +- .../static/tests/helpers/mock_server.js | 2 +- .../components/discuss_tests.js | 8 +- 67 files changed, 707 insertions(+), 713 deletions(-) rename addons/im_livechat/models/{mail_channel_partner.py => mail_channel_member.py} (53%) rename addons/mail/models/{mail_channel_partner.py => mail_channel_member.py} (80%) rename addons/mail/tests/{test_mail_channel_partner.py => test_mail_channel_member.py} (64%) rename addons/mail/views/{mail_channel_partner_views.xml => mail_channel_member_views.xml} (64%) diff --git a/addons/crm_livechat/tests/test_crm_lead.py b/addons/crm_livechat/tests/test_crm_lead.py index 73523ee8828..06f736c22a3 100644 --- a/addons/crm_livechat/tests/test_crm_lead.py +++ b/addons/crm_livechat/tests/test_crm_lead.py @@ -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') diff --git a/addons/hr_holidays/static/tests/qunit_suite_tests/components/thread_icon_tests.js b/addons/hr_holidays/static/tests/qunit_suite_tests/components/thread_icon_tests.js index a7f015144e9..1094c3e21f8 100644 --- a/addons/hr_holidays/static/tests/qunit_suite_tests/components/thread_icon_tests.js +++ b/addons/hr_holidays/static/tests/qunit_suite_tests/components/thread_icon_tests.js @@ -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 }], ], diff --git a/addons/hr_holidays/static/tests/qunit_suite_tests/components/thread_view_tests.js b/addons/hr_holidays/static/tests/qunit_suite_tests/components/thread_view_tests.js index e5eadada567..b3bd4c892f2 100644 --- a/addons/hr_holidays/static/tests/qunit_suite_tests/components/thread_view_tests.js +++ b/addons/hr_holidays/static/tests/qunit_suite_tests/components/thread_view_tests.js @@ -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 }], ], diff --git a/addons/im_livechat/controllers/chatbot.py b/addons/im_livechat/controllers/chatbot.py index df945067842..4b1e204b1f8 100644 --- a/addons/im_livechat/controllers/chatbot.py +++ b/addons/im_livechat/controllers/chatbot.py @@ -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, diff --git a/addons/im_livechat/models/__init__.py b/addons/im_livechat/models/__init__.py index f42a56d173e..069dc2a6422 100644 --- a/addons/im_livechat/models/__init__.py +++ b/addons/im_livechat/models/__init__.py @@ -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 diff --git a/addons/im_livechat/models/im_livechat_channel.py b/addons/im_livechat/models/im_livechat_channel.py index 833016d6c0e..b0505bbc2e3 100644 --- a/addons/im_livechat/models/im_livechat_channel.py +++ b/addons/im_livechat/models/im_livechat_channel.py @@ -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, diff --git a/addons/im_livechat/models/mail_channel.py b/addons/im_livechat/models/mail_channel.py index 6c10fd2c303..f9bc0cd55a6 100644 --- a/addons/im_livechat/models/mail_channel.py +++ b/addons/im_livechat/models/mail_channel.py @@ -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): diff --git a/addons/im_livechat/models/mail_channel_partner.py b/addons/im_livechat/models/mail_channel_member.py similarity index 53% rename from addons/im_livechat/models/mail_channel_partner.py rename to addons/im_livechat/models/mail_channel_member.py index f1a2369fb00..4b5764738ce 100644 --- a/addons/im_livechat/models/mail_channel_partner.py +++ b/addons/im_livechat/models/mail_channel_member.py @@ -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' ) """) diff --git a/addons/im_livechat/models/res_partner.py b/addons/im_livechat/models/res_partner.py index b3b85cf898f..ffc59e1a49f 100644 --- a/addons/im_livechat/models/res_partner.py +++ b/addons/im_livechat/models/res_partner.py @@ -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), ])), diff --git a/addons/im_livechat/static/src/legacy/widgets/livechat_button.js b/addons/im_livechat/static/src/legacy/widgets/livechat_button.js index d7dc787b9a6..fc95ea0e9ca 100644 --- a/addons/im_livechat/static/src/legacy/widgets/livechat_button.js +++ b/addons/im_livechat/static/src/legacy/widgets/livechat_button.js @@ -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; } diff --git a/addons/im_livechat/static/src/models/messaging_notification_handler.js b/addons/im_livechat/static/src/models/messaging_notification_handler.js index 2dccaeab74c..61927817fa2 100644 --- a/addons/im_livechat/static/src/models/messaging_notification_handler.js +++ b/addons/im_livechat/static/src/models/messaging_notification_handler.js @@ -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', diff --git a/addons/im_livechat/static/tests/helpers/mock_server.js b/addons/im_livechat/static/tests/helpers/mock_server.js index 381a44263ef..6b4088812ef 100644 --- a/addons/im_livechat/static/tests/helpers/mock_server.js +++ b/addons/im_livechat/static/tests/helpers/mock_server.js @@ -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), diff --git a/addons/im_livechat/static/tests/qunit_suite_tests/components/chat_window_manager_tests.js b/addons/im_livechat/static/tests/qunit_suite_tests/components/chat_window_manager_tests.js index d5fad1d3403..c88451b7baf 100644 --- a/addons/im_livechat/static/tests/qunit_suite_tests/components/chat_window_manager_tests.js +++ b/addons/im_livechat/static/tests/qunit_suite_tests/components/chat_window_manager_tests.js @@ -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, diff --git a/addons/im_livechat/static/tests/qunit_suite_tests/components/discuss_sidebar_category_item_tests.js b/addons/im_livechat/static/tests/qunit_suite_tests/components/discuss_sidebar_category_item_tests.js index 1aab6ec09aa..e4c6222e6f9 100644 --- a/addons/im_livechat/static/tests/qunit_suite_tests/components/discuss_sidebar_category_item_tests.js +++ b/addons/im_livechat/static/tests/qunit_suite_tests/components/discuss_sidebar_category_item_tests.js @@ -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 }], ], diff --git a/addons/im_livechat/static/tests/qunit_suite_tests/components/discuss_sidebar_category_tests.js b/addons/im_livechat/static/tests/qunit_suite_tests/components/discuss_sidebar_category_tests.js index 3ffe7a1f66a..36e3d3cfb63 100644 --- a/addons/im_livechat/static/tests/qunit_suite_tests/components/discuss_sidebar_category_tests.js +++ b/addons/im_livechat/static/tests/qunit_suite_tests/components/discuss_sidebar_category_tests.js @@ -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 }], ], diff --git a/addons/im_livechat/static/tests/qunit_suite_tests/components/discuss_tests.js b/addons/im_livechat/static/tests/qunit_suite_tests/components/discuss_tests.js index b5ac6372ed5..b9037586d37 100644 --- a/addons/im_livechat/static/tests/qunit_suite_tests/components/discuss_tests.js +++ b/addons/im_livechat/static/tests/qunit_suite_tests/components/discuss_tests.js @@ -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 }], ], diff --git a/addons/im_livechat/static/tests/qunit_suite_tests/components/messaging_menu_tests.js b/addons/im_livechat/static/tests/qunit_suite_tests/components/messaging_menu_tests.js index c41a1231838..bb0685a313d 100644 --- a/addons/im_livechat/static/tests/qunit_suite_tests/components/messaging_menu_tests.js +++ b/addons/im_livechat/static/tests/qunit_suite_tests/components/messaging_menu_tests.js @@ -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 }], ], diff --git a/addons/im_livechat/static/tests/qunit_suite_tests/components/thread_icon_tests.js b/addons/im_livechat/static/tests/qunit_suite_tests/components/thread_icon_tests.js index 07f4d3deb3d..b8bc790be25 100644 --- a/addons/im_livechat/static/tests/qunit_suite_tests/components/thread_icon_tests.js +++ b/addons/im_livechat/static/tests/qunit_suite_tests/components/thread_icon_tests.js @@ -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, diff --git a/addons/im_livechat/static/tests/qunit_suite_tests/components/thread_textual_typing_status_tests.js b/addons/im_livechat/static/tests/qunit_suite_tests/components/thread_textual_typing_status_tests.js index 1f317ea2ff8..17ce40e7b2c 100644 --- a/addons/im_livechat/static/tests/qunit_suite_tests/components/thread_textual_typing_status_tests.js +++ b/addons/im_livechat/static/tests/qunit_suite_tests/components/thread_textual_typing_status_tests.js @@ -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, diff --git a/addons/im_livechat/tests/test_get_mail_channel.py b/addons/im_livechat/tests/test_get_mail_channel.py index 42a6ed7ca6b..18117d64c9f 100644 --- a/addons/im_livechat/tests/test_get_mail_channel.py +++ b/addons/im_livechat/tests/test_get_mail_channel.py @@ -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 diff --git a/addons/mail/__manifest__.py b/addons/mail/__manifest__.py index adadf33d654..74480953a18 100644 --- a/addons/mail/__manifest__.py +++ b/addons/mail/__manifest__.py @@ -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', diff --git a/addons/mail/controllers/discuss.py b/addons/mail/controllers/discuss.py index ccd11018158..1e85c383555 100644 --- a/addons/mail/controllers/discuss.py +++ b/addons/mail/controllers/discuss.py @@ -45,8 +45,8 @@ class DiscussController(http.Controller): @http.route('/discuss/channel/', 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//partner//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//guest//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//attachment/', 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//image//x', ], 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): diff --git a/addons/mail/data/mail_channel_data.xml b/addons/mail/data/mail_channel_data.xml index 7a8e4b0b628..2035507c62a 100644 --- a/addons/mail/data/mail_channel_data.xml +++ b/addons/mail/data/mail_channel_data.xml @@ -18,7 +18,7 @@

This channel is accessible to all users to easily share company information.

]]> - + diff --git a/addons/mail/models/__init__.py b/addons/mail/models/__init__.py index f4f938ab218..b927b65f6ca 100644 --- a/addons/mail/models/__init__.py +++ b/addons/mail/models/__init__.py @@ -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 diff --git a/addons/mail/models/mail_channel.py b/addons/mail/models/mail_channel.py index 24e546e89f1..2d26b58e17e 100644 --- a/addons/mail/models/mail_channel.py +++ b/addons/mail/models/mail_channel.py @@ -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 = _('
joined the channel
') else: notification = _( '
invited %s to the channel
', - 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=_('
joined the channel
'), 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=_('
joined the channel
'), 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 @%s.", 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 @%s.", 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) diff --git a/addons/mail/models/mail_channel_partner.py b/addons/mail/models/mail_channel_member.py similarity index 80% rename from addons/mail/models/mail_channel_partner.py rename to addons/mail/models/mail_channel_member.py index d57b4b714b0..cdbecc8eb56 100644 --- a/addons/mail/models/mail_channel_partner.py +++ b/addons/mail/models/mail_channel_member.py @@ -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: diff --git a/addons/mail/models/mail_channel_rtc_session.py b/addons/mail/models/mail_channel_rtc_session.py index e61277cc676..e50450f14ea 100644 --- a/addons/mail/models/mail_channel_rtc_session.py +++ b/addons/mail/models/mail_channel_rtc_session.py @@ -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 diff --git a/addons/mail/models/mail_guest.py b/addons/mail/models/mail_guest.py index 6ef3a155af3..3722346e772 100644 --- a/addons/mail/models/mail_guest.py +++ b/addons/mail/models/mail_guest.py @@ -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.""" diff --git a/addons/mail/models/res_partner.py b/addons/mail/models/res_partner.py index 0f75b10b772..c01f17a1d47 100644 --- a/addons/mail/models/res_partner.py +++ b/addons/mail/models/res_partner.py @@ -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), ])), diff --git a/addons/mail/models/res_users.py b/addons/mail/models/res_users.py index 37090716507..5bc103465a9 100644 --- a/addons/mail/models/res_users.py +++ b/addons/mail/models/res_users.py @@ -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): diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index ee4e996cd23..c2dc32113af 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -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 diff --git a/addons/mail/security/mail_security.xml b/addons/mail/security/mail_security.xml index cc6fca4671a..8a47ad2b406 100644 --- a/addons/mail/security/mail_security.xml +++ b/addons/mail/security/mail_security.xml @@ -20,9 +20,9 @@ [(1, '=', 1)]
- - mail.channel.partner: write its own entries - + + mail.channel.member: write its own entries + ['|', '|', ('channel_id.public', '=', 'public'), @@ -34,9 +34,9 @@ - - mail.channel.partner: admin can manipulate all entries - + + mail.channel.member: admin can manipulate all entries + [(1, '=', 1)] diff --git a/addons/mail/static/src/models/messaging_notification_handler.js b/addons/mail/static/src/models/messaging_notification_handler.js index bd8b879c96d..499bc1439de 100644 --- a/addons/mail/static/src/models/messaging_notification_handler.js +++ b/addons/mail/static/src/models/messaging_notification_handler.js @@ -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', diff --git a/addons/mail/static/tests/helpers/mock_server.js b/addons/mail/static/tests/helpers/mock_server.js index f47625a32f2..8b9fcd9be48 100644 --- a/addons/mail/static/tests/helpers/mock_server.js +++ b/addons/mail/static/tests/helpers/mock_server.js @@ -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, diff --git a/addons/mail/static/tests/helpers/model_definitions_setup.js b/addons/mail/static/tests/helpers/model_definitions_setup.js index 8f461d4fbdd..ca73e6cf496 100644 --- a/addons/mail/static/tests/helpers/model_definitions_setup.js +++ b/addons/mail/static/tests/helpers/model_definitions_setup.js @@ -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 }, diff --git a/addons/mail/static/tests/qunit_suite_tests/components/channel_invitation_form_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/channel_invitation_form_tests.js index 0b2a483213d..9abc0f2c5b7 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/channel_invitation_form_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/channel_invitation_form_tests.js @@ -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', diff --git a/addons/mail/static/tests/qunit_suite_tests/components/channel_member_list_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/channel_member_list_tests.js index e858776e0dc..e9c711bd90c 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/channel_member_list_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/channel_member_list_tests.js @@ -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 }], ], diff --git a/addons/mail/static/tests/qunit_suite_tests/components/chat_window_manager_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/chat_window_manager_tests.js index cb958f3a7bb..010d23d2fe4 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/chat_window_manager_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/chat_window_manager_tests.js @@ -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, diff --git a/addons/mail/static/tests/qunit_suite_tests/components/composer_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/composer_tests.js index 30e94e6823b..987519241ba 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/composer_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/composer_tests.js @@ -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 }], ], diff --git a/addons/mail/static/tests/qunit_suite_tests/components/discuss_pinned_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/discuss_pinned_tests.js index 85ede15d979..954548e64cb 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/discuss_pinned_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/discuss_pinned_tests.js @@ -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, }]], diff --git a/addons/mail/static/tests/qunit_suite_tests/components/discuss_sidebar_category_item_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/discuss_sidebar_category_item_tests.js index 6766609165d..5f9265b5463 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/discuss_sidebar_category_item_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/discuss_sidebar_category_item_tests.js @@ -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, }]], diff --git a/addons/mail/static/tests/qunit_suite_tests/components/discuss_sidebar_category_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/discuss_sidebar_category_tests.js index ac659249ca9..9b3240bd337 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/discuss_sidebar_category_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/discuss_sidebar_category_tests.js @@ -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, diff --git a/addons/mail/static/tests/qunit_suite_tests/components/discuss_sidebar_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/discuss_sidebar_tests.js index f05b6859f7c..da15ec803fb 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/discuss_sidebar_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/discuss_sidebar_tests.js @@ -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', diff --git a/addons/mail/static/tests/qunit_suite_tests/components/discuss_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/discuss_tests.js index d16538f7c9e..66d2e1417fd 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/discuss_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/discuss_tests.js @@ -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, diff --git a/addons/mail/static/tests/qunit_suite_tests/components/message_seen_indicator_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/message_seen_indicator_tests.js index 1c3fe115846..8d1a58d60ad 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/message_seen_indicator_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/message_seen_indicator_tests.js @@ -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, }); diff --git a/addons/mail/static/tests/qunit_suite_tests/components/message_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/message_tests.js index 68aa7e4b59d..ba623813aa7 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/message_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/message_tests.js @@ -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 }], ], diff --git a/addons/mail/static/tests/qunit_suite_tests/components/messaging_menu_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/messaging_menu_tests.js index e701400302c..32129192956 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/messaging_menu_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/messaging_menu_tests.js @@ -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 diff --git a/addons/mail/static/tests/qunit_suite_tests/components/thread_icon_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/thread_icon_tests.js index 4211454671c..a4b285d8bfe 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/thread_icon_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/thread_icon_tests.js @@ -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, diff --git a/addons/mail/static/tests/qunit_suite_tests/components/thread_preview_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/thread_preview_tests.js index a203bd3ae17..c32d7dd58b4 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/thread_preview_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/thread_preview_tests.js @@ -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) { diff --git a/addons/mail/static/tests/qunit_suite_tests/components/thread_textual_typing_status_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/thread_textual_typing_status_tests.js index 7f73563ffce..8e915777aaa 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/thread_textual_typing_status_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/thread_textual_typing_status_tests.js @@ -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, diff --git a/addons/mail/static/tests/qunit_suite_tests/components/thread_view_tests.js b/addons/mail/static/tests/qunit_suite_tests/components/thread_view_tests.js index f6ebd2fa7e9..3abdb527d1e 100644 --- a/addons/mail/static/tests/qunit_suite_tests/components/thread_view_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/components/thread_view_tests.js @@ -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, diff --git a/addons/mail/static/tests/qunit_suite_tests/models/messaging_tests.js b/addons/mail/static/tests/qunit_suite_tests/models/messaging_tests.js index b688a0a4b44..1c27a3f8029 100644 --- a/addons/mail/static/tests/qunit_suite_tests/models/messaging_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/models/messaging_tests.js @@ -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 }], ], diff --git a/addons/mail/tests/__init__.py b/addons/mail/tests/__init__.py index b30abb0ead6..4f5ca3cec3d 100644 --- a/addons/mail/tests/__init__.py +++ b/addons/mail/tests/__init__.py @@ -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 diff --git a/addons/mail/tests/test_mail_channel.py b/addons/mail/tests/test_mail_channel.py index a8e37b4524b..3c28fdd6933 100644 --- a/addons/mail/tests/test_mail_channel.py +++ b/addons/mail/tests/test_mail_channel.py @@ -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') diff --git a/addons/mail/tests/test_mail_channel_partner.py b/addons/mail/tests/test_mail_channel_member.py similarity index 64% rename from addons/mail/tests/test_mail_channel_partner.py rename to addons/mail/tests/test_mail_channel_member.py index b8d380da26c..64002456a18 100644 --- a/addons/mail/tests/test_mail_channel_partner.py +++ b/addons/mail/tests/test_mail_channel_member.py @@ -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 diff --git a/addons/mail/tests/test_rtc.py b/addons/mail/tests/test_rtc.py index b90538ae36e..360dcd5eb6d 100644 --- a/addons/mail/tests/test_rtc.py +++ b/addons/mail/tests/test_rtc.py @@ -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()) diff --git a/addons/mail/views/mail_channel_partner_views.xml b/addons/mail/views/mail_channel_member_views.xml similarity index 64% rename from addons/mail/views/mail_channel_partner_views.xml rename to addons/mail/views/mail_channel_member_views.xml index 32bb2891da7..e08f07d6e34 100644 --- a/addons/mail/views/mail_channel_partner_views.xml +++ b/addons/mail/views/mail_channel_member_views.xml @@ -1,9 +1,9 @@ - - - mail.channel.partner.tree - mail.channel.partner + + + mail.channel.member.tree + mail.channel.member 10 @@ -14,9 +14,9 @@ - - mail.channel.partner.form - mail.channel.partner + + mail.channel.member.form + mail.channel.member
@@ -32,9 +32,9 @@ - + Channels/Partner - mail.channel.partner + mail.channel.member tree,form diff --git a/addons/mail/views/mail_channel_rtc_session_views.xml b/addons/mail/views/mail_channel_rtc_session_views.xml index b7b436ba433..831590fb047 100644 --- a/addons/mail/views/mail_channel_rtc_session_views.xml +++ b/addons/mail/views/mail_channel_rtc_session_views.xml @@ -6,7 +6,7 @@ mail.channel.rtc.session - + @@ -21,7 +21,7 @@