From 773f0e5f07008e563c15e762eccae5c58e3673ea Mon Sep 17 00:00:00 2001 From: BernatPForgeFlow Date: Thu, 4 Jul 2024 09:58:04 +0200 Subject: [PATCH] [IMP] base_tier_validation_waiting: Use message_notify for notifications --- .../models/tier_validation.py | 32 ++++++----- .../tests/test_tier_validation.py | 55 +++++++++++++------ 2 files changed, 56 insertions(+), 31 deletions(-) diff --git a/base_tier_validation_waiting/models/tier_validation.py b/base_tier_validation_waiting/models/tier_validation.py index 61f3665682..53e33ad410 100644 --- a/base_tier_validation_waiting/models/tier_validation.py +++ b/base_tier_validation_waiting/models/tier_validation.py @@ -9,20 +9,18 @@ class TierValidation(models.AbstractModel): def _notify_review_available(self, tier_reviews): """method to notify when reaching pending""" - subscribe = "message_subscribe" - post = "message_post" - if hasattr(self, post) and hasattr(self, subscribe): - for rec in self.sudo(): - users_to_notify = tier_reviews.filtered( - lambda r: r.definition_id.notify_on_pending and r.res_id == rec.id - ).mapped("reviewer_ids") - # Subscribe reviewers and notify - getattr(rec, subscribe)( - partner_ids=users_to_notify.mapped("partner_id").ids - ) - getattr(rec, post)( - subtype_xmlid=self._get_requested_notification_subtype(), - body=rec._notify_requested_review_body(), + for rec in self: + users_to_notify = tier_reviews.filtered( + lambda r: r.definition_id.notify_on_pending and r.res_id == rec.id + ).mapped("reviewer_ids") + if users_to_notify: + self.env["mail.thread"].message_notify( + body=self._notify_requested_review_body(), + subject=self.display_name and "Re: %s" % self.display_name, + partner_ids=users_to_notify.mapped("partner_id.id"), + subtype_id=self.env.ref("mail.mt_comment").id, + mail_auto_delete=False, + email_layout_xmlid="mail.mail_notification_light", ) def _validate_tier_waiting_reviews(self, tiers=False): @@ -42,7 +40,11 @@ def _validate_tier_waiting_reviews(self, tiers=False): ) for review in waiting_reviews: rec = self.env[review.model].browse(review.res_id) - rec._notify_accepted_reviews() + users_to_notify = tier_reviews.filtered( + lambda r: r.definition_id.notify_on_accepted + ).mapped("reviewer_ids") + if users_to_notify: + rec._notify_accepted_reviews(users_to_notify) def _validate_tier(self, tiers=False): """extend base tier validation method to allow bypass of waiting diff --git a/base_tier_validation_waiting/tests/test_tier_validation.py b/base_tier_validation_waiting/tests/test_tier_validation.py index c0f3a2da86..f7eb8b8050 100644 --- a/base_tier_validation_waiting/tests/test_tier_validation.py +++ b/base_tier_validation_waiting/tests/test_tier_validation.py @@ -6,6 +6,9 @@ from odoo.tests.common import TransactionCase, tagged from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT +from odoo.addons.base_tier_validation.tests.tier_validation_tester import ( + TierValidationTester, +) @tagged("post_install", "-at_install") @@ -22,9 +25,6 @@ def setUpClass(cls): ) cls.loader = FakeModelLoader(cls.env, cls.__module__) cls.loader.backup_registry() - from odoo.addons.base_tier_validation.tests.tier_validation_tester import ( - TierValidationTester, - ) cls.loader.update_registry((TierValidationTester,)) cls.test_model = cls.env[TierValidationTester._name].with_context( @@ -121,24 +121,39 @@ def test_01_waiting_tier(self): self.assertTrue(review_1.status == "waiting") self.assertTrue(review_2.status == "waiting") # and then normal workflow will follow... + notifications_user_1_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) review_1._compute_can_review() self.assertTrue(review_1.status == "pending") - # first reviewer does not want notifications - # chatter should be empty - self.assertFalse(test_record.message_ids) self.assertTrue(review_2.status == "waiting") + # first reviewer does not want notifications + notifications_user_1_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_user_1_no_2, notifications_user_1_no_1) + # First reviewer will approve and second will receive a pending notification + notifications_user_2_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_2.partner_id.id)] + ) + ) record = test_record.with_user(self.test_user_1.id) record.invalidate_model() record.validate_tier() self.assertTrue(review_1.status == "approved") self.assertTrue(review_2.status == "pending") - # Check notify - msg = test_record.message_ids[0].body - request = test_record.with_user( - self.test_user_1.id - )._notify_requested_review_body() - self.assertIn(request, msg) - record.invalidate_model() + notifications_user_2_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_2.partner_id.id)] + ) + ) + self.assertEqual(notifications_user_2_no_2, notifications_user_2_no_1 + 1) + # Second approver will approve record = test_record.with_user(self.test_user_2.id) record.invalidate_model() record.validate_tier() @@ -153,8 +168,16 @@ def test_02_no_sequence(self): self.assertTrue(review) review_1 = tier_review_obj.browse(review.ids[0]) self.assertTrue(review_1.status == "waiting") + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) review_1._compute_can_review() self.assertTrue(review_1.status == "pending") - msg2 = test_record2.message_ids[0].body - request = test_record2._notify_requested_review_body() - self.assertIn(request, msg2) + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1)