diff options
| author | Dharmraj Jhala <dja@odoo.com> | 2020-07-09 12:39:48 +0000 |
|---|---|---|
| committer | Thibault Delavallée <tde@odoo.com> | 2020-08-06 06:13:34 +0000 |
| commit | e25604e597e85cf0b57deaf2645a214fd7dc0553 (patch) | |
| tree | 89f00a9ed43ff2c61dfd28dfc3613383dbd71ddd | |
| parent | 2c926abcb3cf07905286bda92d02c77c3c28235c (diff) | |
[FIX] mail, test_mail: remove archived/deleted users from mail channels
When users are archived / deleted, they are still listed under the members
of a channel. This means that those users could potentially still receive
internal communications.
This commit fixes the issue by removing archived / deleted users from the
members of the private channels they were part of. However, they are not
automatically removed from the public channels.
Public channels are kepts as in most common cases public channels are
mailing list (e-mail based) and so user's partner should always receive
updates from public channels until they manually un-subscribe themselves.
Task ID-2276681
closes odoo/odoo#55496
X-original-commit: 1a3dc58f3d987054c643556dc4b7c3dbcd3d074c
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
| -rw-r--r-- | addons/mail/models/res_users.py | 17 | ||||
| -rw-r--r-- | addons/test_mail/tests/test_mail_channel.py | 35 |
2 files changed, 52 insertions, 0 deletions
diff --git a/addons/mail/models/res_users.py b/addons/mail/models/res_users.py index ce00a1d2b72..ba8e9def72d 100644 --- a/addons/mail/models/res_users.py +++ b/addons/mail/models/res_users.py @@ -86,6 +86,8 @@ GROUP BY channel_moderator.res_users_id""", [tuple(self.ids)]) def write(self, vals): write_res = super(Users, self).write(vals) + if 'active' in vals and not vals['active']: + self._unsubscribe_from_channels() sel_groups = [vals[k] for k in vals if is_selection_groups(k) and vals[k]] if vals.get('groups_id'): # form: {'group_ids': [(3, 10), (3, 3), (4, 10), (4, 3)]} or {'group_ids': [(6, 0, [ids]} @@ -96,6 +98,21 @@ GROUP BY channel_moderator.res_users_id""", [tuple(self.ids)]) self.env['mail.channel'].search([('group_ids', 'in', sel_groups)])._subscribe_users() return write_res + def unlink(self): + self._unsubscribe_from_channels() + return super().unlink() + + def _unsubscribe_from_channels(self): + """ This method un-subscribes users from private mail channels. Main purpose of this + method is to prevent sending internal communication to archived / deleted users. + We do not un-subscribes users from public channels because in most common cases, + public channels are mailing list (e-mail based) and so users should always receive + updates from public channels until they manually un-subscribe themselves. + """ + self.mapped('partner_id.channel_ids').filtered(lambda c: c.public != 'public').write({ + 'channel_partner_ids': [(3, pid) for pid in self.mapped('partner_id').ids] + }) + @api.model def systray_get_activities(self): query = """SELECT m.id, count(*), act.res_model as model, diff --git a/addons/test_mail/tests/test_mail_channel.py b/addons/test_mail/tests/test_mail_channel.py index 8bbd60c5a9d..e54d90ff8b7 100644 --- a/addons/test_mail/tests/test_mail_channel.py +++ b/addons/test_mail/tests/test_mail_channel.py @@ -191,6 +191,41 @@ class TestChannelFeatures(TestMailCommon): self.test_channel.message_post(body="Test", message_type='comment', subtype_xmlid='mail.mt_comment') self.assertSentEmail(self.test_channel.env.user.partner_id, [self.test_partner]) + @mute_logger('odoo.models.unlink') + def test_channel_auto_unsubscribe_archived_or_deleted_users(self): + """Archiving / deleting a user should automatically unsubscribe related partner from private channels""" + test_channel_private = self.env['mail.channel'].with_context(self._test_context).create({ + 'name': 'Winden caves', + 'description': 'Channel to travel through time', + 'public': 'private', + }) + test_channel_group = self.env['mail.channel'].with_context(self._test_context).create({ + 'name': 'Sic Mundus', + 'public': 'groups', + 'group_public_id': self.env.ref('base.group_user').id}) + + test_user = self.env['res.users'].create({ + "login": "adam", + "name": "Jonas", + }) + test_partner = test_user.partner_id + + self._join_channel(self.test_channel, self.user_employee.partner_id | test_partner) + self._join_channel(test_channel_private, self.user_employee.partner_id | test_partner) + self._join_channel(test_channel_group, self.user_employee.partner_id | test_partner) + + # Unsubscribe archived user from the private channels, but not from public channels + self.user_employee.active = False + self.assertEqual(test_channel_private.channel_partner_ids, test_partner) + self.assertEqual(test_channel_group.channel_partner_ids, test_partner) + self.assertEqual(self.test_channel.channel_partner_ids, self.user_employee.partner_id | test_partner) + + # Unsubscribe deleted user from the private channels, but not from public channels + test_user.unlink() + self.assertEqual(test_channel_private.channel_partner_ids, self.env['res.partner']) + self.assertEqual(test_channel_group.channel_partner_ids, self.env['res.partner']) + self.assertEqual(self.test_channel.channel_partner_ids, self.user_employee.partner_id | test_partner) + @tagged('moderation') class TestChannelModeration(TestMailCommon): |
