summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Delavallée <tde@odoo.com>2020-12-22 09:44:43 +0000
committerThibault Delavallée <tde@odoo.com>2020-12-22 16:24:22 +0000
commitee2ca9cb4c4172479fb949ad7a9726c7aaac6021 (patch)
tree7714b369edd4cfbcc108cad653ec8bee3373bab4
parentb34d27449920cfd683223969fd9d24a19e715d04 (diff)
[FW][FIX] mail: warn about invalid invite instead of crashing
When inviting people to a group-based channel an error may be raised if invite target users not having the right group. Indeed they do not have access to the channel as read access it not given if not belonging to the channel group. We add an UserError so that wrong invites are now pompted to the user instead of crashing. Task ID-2411038 X-Original-Commit odoo/odoo@e4889fbdd975c2ffdd41a78fc16cb91b092c3798 (12) X-Original-Commit odoo/odoo@0c6abe3c33f45566cfdaea0f2bcab934daf89acc (12.3) Forward port of odoo/odoo#63676 Forward port of odoo/odoo#63680 closes odoo/odoo#63715 X-original-commit: aa00d8d010f14e9f801bdd9e957280eaba18ff22 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
-rw-r--r--addons/mail/i18n/mail.pot6
-rw-r--r--addons/mail/models/mail_channel.py16
-rw-r--r--addons/test_mail/tests/test_mail_channel_partner.py4
3 files changed, 24 insertions, 2 deletions
diff --git a/addons/mail/i18n/mail.pot b/addons/mail/i18n/mail.pot
index d42848024a6..cf8eeec5fd8 100644
--- a/addons/mail/i18n/mail.pot
+++ b/addons/mail/i18n/mail.pot
@@ -2462,6 +2462,12 @@ msgid "Following"
msgstr ""
#. module: mail
+#: code:addons/mail/models/mail_channel.py:778
+#, python-format
+msgid "Following invites are invalid as user groups do not match: %s"
+msgstr ""
+
+#. module: mail
#: model:ir.model.fields,help:mail.field_mail_activity__icon
#: model:ir.model.fields,help:mail.field_mail_activity_mixin__activity_type_icon
#: model:ir.model.fields,help:mail.field_mail_activity_type__icon
diff --git a/addons/mail/models/mail_channel.py b/addons/mail/models/mail_channel.py
index e0bfd771de4..6f120f3e72a 100644
--- a/addons/mail/models/mail_channel.py
+++ b/addons/mail/models/mail_channel.py
@@ -861,6 +861,8 @@ class Channel(models.Model):
:param partner_ids : list of partner id to add
"""
partners = self.env['res.partner'].browse(partner_ids)
+ self._invite_check_access(partners)
+
# add the partner
for channel in self:
partners_to_add = partners - channel.channel_partner_ids
@@ -880,6 +882,20 @@ class Channel(models.Model):
# broadcast the channel header to the added partner
self._broadcast(partner_ids)
+ def _invite_check_access(self, partners):
+ """ Check invited partners could match channel access """
+ failed = []
+ if any(channel.public == 'groups' for channel in self):
+ for channel in self.filtered(lambda c: c.public == 'groups'):
+ invalid_partners = [partner for partner in partners if channel.group_public_id not in partner.mapped('user_ids.groups_id')]
+ failed += [(channel, partner) for partner in invalid_partners]
+
+ if failed:
+ raise UserError(
+ _('Following invites are invalid as user groups do not match: %s') %
+ ', '.join('%s (channel %s)' % (partner.name, channel.name) for channel, partner in failed)
+ )
+
def _can_invite(self, partner_id):
"""Return True if the current user can invite the partner to the channel."""
self.ensure_one()
diff --git a/addons/test_mail/tests/test_mail_channel_partner.py b/addons/test_mail/tests/test_mail_channel_partner.py
index d2629b64551..93dd7072154 100644
--- a/addons/test_mail/tests/test_mail_channel_partner.py
+++ b/addons/test_mail/tests/test_mail_channel_partner.py
@@ -3,7 +3,7 @@
from odoo.tests.common import SavepointCase
-from odoo.exceptions import AccessError
+from odoo.exceptions import AccessError, UserError
class TestMailSecurity(SavepointCase):
@@ -187,7 +187,7 @@ class TestMailSecurity(SavepointCase):
self.assertEqual(channel_partners.mapped('partner_id'), self.user_1.partner_id)
# user 1 can not invite user 3 because he's not in the group
- with self.assertRaises(AccessError):
+ with self.assertRaises(UserError):
self.group_channel_1.with_user(self.user_1).channel_invite([self.user_3.partner_id.id])
channel_partners = self.env['mail.channel.partner'].search([('channel_id', '=', self.group_channel_1.id)])
self.assertEqual(channel_partners.mapped('partner_id'), self.user_1.partner_id)