diff options
| -rw-r--r-- | addons/mail/models/mail_followers.py | 17 | ||||
| -rw-r--r-- | addons/test_mail/tests/test_mail_followers.py | 21 |
2 files changed, 31 insertions, 7 deletions
diff --git a/addons/mail/models/mail_followers.py b/addons/mail/models/mail_followers.py index 6c526375584..8995de70acf 100644 --- a/addons/mail/models/mail_followers.py +++ b/addons/mail/models/mail_followers.py @@ -366,11 +366,15 @@ GROUP BY fol.id%s%s""" % ( elif existing_policy in ('replace', 'update'): fol_id, sids = next(((key, val[3]) for key, val in data_fols.items() if val[0] == res_id and val[1] == partner_id), (False, [])) new_sids = set(partner_subtypes[partner_id]) - set(sids) - old_sids = set(sids if sids[0] is not None else []) - set(partner_subtypes[partner_id]) + old_sids = set(sids) - set(partner_subtypes[partner_id]) + update_cmd = [] if fol_id and new_sids: - update[fol_id] = {'subtype_ids': [(4, sid) for sid in new_sids]} + update_cmd += [(4, sid) for sid in new_sids] if fol_id and old_sids and existing_policy == 'replace': - update[fol_id] = {'subtype_ids': [(3, sid) for sid in old_sids]} + update_cmd += [(3, sid) for sid in old_sids] + if update_cmd: + update[fol_id] = {'subtype_ids': update_cmd} + for channel_id in set(channel_ids or []): if channel_id not in doc_cids[res_id]: new.setdefault(res_id, list()).append({ @@ -382,9 +386,12 @@ GROUP BY fol.id%s%s""" % ( fol_id, sids = next(((key, val[3]) for key, val in data_fols.items() if val[0] == res_id and val[2] == channel_id), (False, [])) new_sids = set(channel_subtypes[channel_id]) - set(sids) old_sids = set(sids) - set(channel_subtypes[channel_id]) + update_cmd = [] if fol_id and new_sids: - update[fol_id] = {'subtype_ids': [(4, sid) for sid in new_sids]} + update_cmd += [(4, sid) for sid in new_sids] if fol_id and old_sids and existing_policy == 'replace': - update[fol_id] = {'subtype_ids': [(3, sid) for sid in old_sids]} + update_cmd += [(3, sid) for sid in old_sids] + if update_cmd: + update[fol_id] = {'subtype_ids': update_cmd} return new, update diff --git a/addons/test_mail/tests/test_mail_followers.py b/addons/test_mail/tests/test_mail_followers.py index de827326d6b..739c210d3e3 100644 --- a/addons/test_mail/tests/test_mail_followers.py +++ b/addons/test_mail/tests/test_mail_followers.py @@ -3,10 +3,10 @@ from psycopg2 import IntegrityError -from odoo.tests import tagged, users from odoo.addons.test_mail.tests.common import TestMailCommon -from odoo.tools.misc import mute_logger from odoo.tests import tagged +from odoo.tests import users +from odoo.tools.misc import mute_logger @tagged('mail_followers') @@ -101,6 +101,7 @@ class BaseFollowersTest(TestMailCommon): self.assertEqual(test_record.message_follower_ids.subtype_ids, self.mt_mg_nodef | self.mt_al_nodef) def test_followers_multiple_subscription_noforce(self): + """ Calling message_subscribe without subtypes on an existing subscription should not do anything (default < existing) """ test_record = self.test_record.with_user(self.user_employee) test_record.message_subscribe(partner_ids=[self.user_admin.partner_id.id], subtype_ids=[self.mt_mg_nodef.id, self.mt_al_nodef.id]) @@ -114,6 +115,22 @@ class BaseFollowersTest(TestMailCommon): self.assertEqual(test_record.message_channel_ids, self.env['mail.channel']) self.assertEqual(test_record.message_follower_ids.subtype_ids, self.mt_mg_nodef | self.mt_al_nodef) + def test_followers_multiple_subscription_update(self): + """ Calling message_subscribe with subtypes on an existing subscription should replace them (new > existing) """ + test_record = self.test_record.with_user(self.user_employee) + test_record.message_subscribe(partner_ids=[self.user_employee.partner_id.id], subtype_ids=[self.mt_mg_def.id, self.mt_cl_def.id]) + self.assertEqual(test_record.message_partner_ids, self.user_employee.partner_id) + follower = self.env['mail.followers'].search([ + ('res_model', '=', 'mail.test.simple'), + ('res_id', '=', test_record.id), + ('partner_id', '=', self.user_employee.partner_id.id)]) + self.assertEqual(follower, test_record.message_follower_ids) + self.assertEqual(follower.subtype_ids, self.mt_mg_def | self.mt_cl_def) + + # remove one subtype `mt_mg_def` and set new subtype `mt_al_def` + test_record.message_subscribe(partner_ids=[self.user_employee.partner_id.id], subtype_ids=[self.mt_cl_def.id, self.mt_al_def.id]) + self.assertEqual(follower.subtype_ids, self.mt_cl_def | self.mt_al_def) + def test_followers_no_DID(self): """Test that a follower cannot suffer from dissociative identity disorder. It cannot be both a partner and a channel. |
