summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDharmraj Jhala <dja@odoo.com>2020-07-09 12:39:48 +0000
committerThibault Delavallée <tde@odoo.com>2020-08-06 06:13:34 +0000
commite25604e597e85cf0b57deaf2645a214fd7dc0553 (patch)
tree89f00a9ed43ff2c61dfd28dfc3613383dbd71ddd
parent2c926abcb3cf07905286bda92d02c77c3c28235c (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.py17
-rw-r--r--addons/test_mail/tests/test_mail_channel.py35
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):