diff --git a/taiga/projects/notifications/services.py b/taiga/projects/notifications/services.py index 67d0e352..189d4f6a 100644 --- a/taiga/projects/notifications/services.py +++ b/taiga/projects/notifications/services.py @@ -139,6 +139,10 @@ def _filter_by_permissions(obj, user): return False +def _filter_notificable(user): + return user.is_active and not user.is_system + + def get_users_to_notify(obj, *, discard_users=None) -> list: """ Get filtered set of users to notify for specified @@ -168,7 +172,8 @@ def get_users_to_notify(obj, *, discard_users=None) -> list: candidates = candidates - set(discard_users) candidates = filter(partial(_filter_by_permissions, obj), candidates) - + # Filter disabled and system users + candidates = filter(partial(_filter_notificable), candidates) return frozenset(candidates) diff --git a/tests/integration/test_notifications.py b/tests/integration/test_notifications.py index 5e5986d3..b3874495 100644 --- a/tests/integration/test_notifications.py +++ b/tests/integration/test_notifications.py @@ -109,14 +109,25 @@ def test_users_to_notify(): member3 = f.MembershipFactory.create(project=project, role=role1) member4 = f.MembershipFactory.create(project=project, role=role1) member5 = f.MembershipFactory.create(project=project, role=role2) + inactive_member1 = f.MembershipFactory.create(project=project, role=role1) + inactive_member1.user.is_active = False + inactive_member1.user.save() + system_member1 = f.MembershipFactory.create(project=project, role=role1) + system_member1.user.is_system = True + system_member1.user.save() issue = f.IssueFactory.create(project=project, owner=member4.user) policy_model_cls = apps.get_model("notifications", "NotifyPolicy") policy1 = policy_model_cls.objects.get(user=member1.user) - policy_model_cls.objects.get(user=member2.user) - policy3 = policy_model_cls.objects.get(user=member3.user) + policy2 = policy_model_cls.objects.get(user=member3.user) + policy3 = policy_model_cls.objects.get(user=inactive_member1.user) + policy3.notify_level = NotifyLevel.watch + policy3.save() + policy4 = policy_model_cls.objects.get(user=system_member1.user) + policy4.notify_level = NotifyLevel.watch + policy4.save() history = MagicMock() history.owner = member2.user @@ -144,8 +155,8 @@ def test_users_to_notify(): assert users == {member1.user, member3.user, issue.get_owner()} # Test with watchers with ignore policy - policy3.notify_level = NotifyLevel.ignore - policy3.save() + policy2.notify_level = NotifyLevel.ignore + policy2.save() issue.watchers.add(member3.user) users = services.get_users_to_notify(issue) @@ -158,6 +169,16 @@ def test_users_to_notify(): assert len(users) == 2 assert users == {member1.user, issue.get_owner()} + # Test with inactive user + issue.watchers.add(inactive_member1.user) + assert len(users) == 2 + assert users == {member1.user, issue.get_owner()} + + # Test with system user + issue.watchers.add(system_member1.user) + assert len(users) == 2 + assert users == {member1.user, issue.get_owner()} + def test_send_notifications_using_services_method(settings, mail): settings.CHANGE_NOTIFICATIONS_MIN_INTERVAL = 1