diff options
| author | Thibault Delavallée <tde@odoo.com> | 2020-12-22 09:44:43 +0000 |
|---|---|---|
| committer | Thibault Delavallée <tde@odoo.com> | 2020-12-22 16:24:22 +0000 |
| commit | ee2ca9cb4c4172479fb949ad7a9726c7aaac6021 (patch) | |
| tree | 7714b369edd4cfbcc108cad653ec8bee3373bab4 | |
| parent | b34d27449920cfd683223969fd9d24a19e715d04 (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.pot | 6 | ||||
| -rw-r--r-- | addons/mail/models/mail_channel.py | 16 | ||||
| -rw-r--r-- | addons/test_mail/tests/test_mail_channel_partner.py | 4 |
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) |
