diff --git a/addons/mail/models/mail_channel.py b/addons/mail/models/mail_channel.py index 2aaee5ca1a8..9c53a7c4f56 100644 --- a/addons/mail/models/mail_channel.py +++ b/addons/mail/models/mail_channel.py @@ -58,7 +58,7 @@ class Channel(models.Model): ('chat', 'Chat'), ('channel', 'Channel'), ('group', 'Group')], - string='Channel Type', required=True, default='channel', help="Chat is private and unique between 2 persons. Group is private among invited persons. Channel can be freely joined (depending on its configuration).") + string='Channel Type', required=True, default='channel', readonly=True, help="Chat is private and unique between 2 persons. Group is private among invited persons. Channel can be freely joined (depending on its configuration).") is_chat = fields.Boolean(string='Is a chat', compute='_compute_is_chat') default_display_mode = fields.Selection(string="Default Display Mode", selection=[('video_full_screen', "Full screen video")], help="Determines how the channel will be displayed by default when opening it from its invitation link. No value means display text (no voice/video).") description = fields.Text('Description') @@ -240,6 +240,10 @@ class Channel(models.Model): raise UserError(_('You cannot delete those groups, as the Whole Company group is required by other modules.')) def write(self, vals): + if 'channel_type' in vals: + failing_channels = self.sudo().filtered(lambda channel: channel.channel_type != vals.get('channel_type')) + if failing_channels: + raise UserError(_('Cannot change the channel type of: %(channel_names)s'), channel_names=', '.join(failing_channels.mapped('name'))) result = super(Channel, self).write(vals) if vals.get('group_ids'): self._subscribe_users_automatically() diff --git a/addons/mail/tests/test_mail_channel.py b/addons/mail/tests/test_mail_channel.py index fa25834a28a..2b6338f38a7 100644 --- a/addons/mail/tests/test_mail_channel.py +++ b/addons/mail/tests/test_mail_channel.py @@ -237,20 +237,18 @@ class TestChannelInternals(MailCommon): self.assertEqual(new_msg.partner_ids, self.env['res.partner']) self.assertEqual(new_msg.notified_partner_ids, self.env['res.partner']) + @users('employee') @mute_logger('odoo.addons.mail.models.mail_mail', 'odoo.models.unlink') def test_channel_recipients_chat(self): """ Posting a message on a chat should not send emails """ - self.test_channel.write({ - 'channel_type': 'chat', - }) - self.test_channel.add_members((self.partner_employee | self.partner_admin | self.test_partner).ids) + channel_info = self.env['mail.channel'].with_user(self.user_admin).channel_get((self.partner_employee | self.user_admin.partner_id).ids) + chat = self.env['mail.channel'].with_user(self.user_admin).browse(channel_info['id']) with self.mock_mail_gateway(): with self.with_user('employee'): - channel = self.env['mail.channel'].browse(self.test_channel.ids) - new_msg = channel.message_post(body="Test", message_type='comment', subtype_xmlid='mail.mt_comment') + new_msg = chat.message_post(body="Test", message_type='comment', subtype_xmlid='mail.mt_comment') self.assertNotSentEmail() - self.assertEqual(new_msg.model, self.test_channel._name) - self.assertEqual(new_msg.res_id, self.test_channel.id) + self.assertEqual(new_msg.model, chat._name) + self.assertEqual(new_msg.res_id, chat.id) self.assertEqual(new_msg.partner_ids, self.env['res.partner']) self.assertEqual(new_msg.notified_partner_ids, self.env['res.partner']) @@ -333,23 +331,21 @@ class TestChannelInternals(MailCommon): @users('employee') def test_channel_info_seen(self): """ In case of concurrent channel_seen RPC, ensure the oldest call has no effect. """ - channel = self.env['mail.channel'].browse(self.test_channel.id) - channel.write({'channel_type': 'chat'}) - channel.add_members(self.env.user.partner_id.ids) + channel_info = self.env['mail.channel'].with_user(self.user_admin).channel_get((self.partner_employee | self.user_admin.partner_id).ids) + chat = self.env['mail.channel'].with_user(self.user_admin).browse(channel_info['id']) + msg_1 = self._add_messages(chat, 'Body1', author=self.user_employee.partner_id) + msg_2 = self._add_messages(chat, 'Body2', author=self.user_employee.partner_id) - msg_1 = self._add_messages(self.test_channel, 'Body1', author=self.user_employee.partner_id) - msg_2 = self._add_messages(self.test_channel, 'Body2', author=self.user_employee.partner_id) - - self.test_channel._channel_seen(msg_2.id) + chat._channel_seen(msg_2.id) self.assertEqual( - channel.channel_info()[0]['seen_partners_info'][0]['seen_message_id'], + chat.channel_info()[0]['seen_partners_info'][0]['seen_message_id'], msg_2.id, "Last message id should have been updated" ) - self.test_channel._channel_seen(msg_1.id) + chat._channel_seen(msg_1.id) self.assertEqual( - channel.channel_info()[0]['seen_partners_info'][0]['seen_message_id'], + chat.channel_info()[0]['seen_partners_info'][0]['seen_message_id'], msg_2.id, "Last message id should stay the same after mark channel as seen with an older message" ) @@ -448,19 +444,20 @@ class TestChannelInternals(MailCommon): self.assertEqual(messages_1, messages_2) def test_channel_should_generate_correct_default_avatar(self): - channel = self.env['mail.channel'].create({'name': '', 'uuid': 'test-uuid'}) - bgcolor = html_escape('hsl(288, 51%, 45%)') # depends on uuid - expceted_avatar_channel = (channel_avatar.replace('fill="#875a7b"', f'fill="{bgcolor}"')).encode() - expected_avatar_group = (group_avatar.replace('fill="#875a7b"', f'fill="{bgcolor}"')).encode() + test_channel = self.env['mail.channel'].browse(self.env['mail.channel'].channel_create(name='Channel')['id']) + test_channel.uuid = 'channel-uuid' + test_group = self.env['mail.channel'].browse(self.env['mail.channel'].create_group(partners_to=self.user_employee.partner_id.ids)['id']) + test_group.uuid = 'group-uuid' + bgcolor_channel = html_escape('hsl(316, 61%, 45%)') # depends on uuid + bgcolor_group = html_escape('hsl(17, 60%, 45%)') # depends on uuid + expceted_avatar_channel = (channel_avatar.replace('fill="#875a7b"', f'fill="{bgcolor_channel}"')).encode() + expected_avatar_group = (group_avatar.replace('fill="#875a7b"', f'fill="{bgcolor_group}"')).encode() - channel.channel_type = 'group' - self.assertEqual(base64.b64decode(channel.avatar_128), expected_avatar_group) + self.assertEqual(base64.b64decode(test_channel.avatar_128), expceted_avatar_channel) + self.assertEqual(base64.b64decode(test_group.avatar_128), expected_avatar_group) - channel.channel_type = 'channel' - self.assertEqual(base64.b64decode(channel.avatar_128), expceted_avatar_channel) - - channel.image_128 = base64.b64encode(("").encode()) - self.assertEqual(channel.avatar_128, channel.image_128) + test_channel.image_128 = base64.b64encode(("").encode()) + self.assertEqual(test_channel.avatar_128, test_channel.image_128) def test_channel_write_should_send_notification_if_image_128_changed(self): channel = self.env['mail.channel'].create({'name': '', 'uuid': 'test-uuid'})