Fix notificacion when change assignement and they are disabled
parent
26e45907d7
commit
e3226f4cb9
|
@ -131,7 +131,7 @@ def _filter_notificable(user):
|
||||||
return user.is_active and not user.is_system
|
return user.is_active and not user.is_system
|
||||||
|
|
||||||
|
|
||||||
def get_users_to_notify(obj, *, discard_users=None) -> list:
|
def get_users_to_notify(obj, *, history=None, discard_users=None) -> list:
|
||||||
"""
|
"""
|
||||||
Get filtered set of users to notify for specified
|
Get filtered set of users to notify for specified
|
||||||
model instance and changer.
|
model instance and changer.
|
||||||
|
@ -156,13 +156,21 @@ def get_users_to_notify(obj, *, discard_users=None) -> list:
|
||||||
candidates.update(filter(_can_notify_light, obj.get_watchers()))
|
candidates.update(filter(_can_notify_light, obj.get_watchers()))
|
||||||
candidates.update(filter(_can_notify_light, obj.get_participants()))
|
candidates.update(filter(_can_notify_light, obj.get_participants()))
|
||||||
|
|
||||||
|
# If the history is an unassignment change we should notify that user too
|
||||||
|
if history and history.type == HistoryType.change and "assigned_to" in history.diff:
|
||||||
|
assigned_to_users = get_user_model().objects.filter(id__in=history.diff["assigned_to"])
|
||||||
|
candidates.update(filter(_can_notify_light, assigned_to_users))
|
||||||
|
|
||||||
# Remove the changer from candidates
|
# Remove the changer from candidates
|
||||||
if discard_users:
|
if discard_users:
|
||||||
candidates = candidates - set(discard_users)
|
candidates = candidates - set(discard_users)
|
||||||
|
|
||||||
|
# Filter by object permissions
|
||||||
candidates = set(filter(partial(_filter_by_permissions, obj), candidates))
|
candidates = set(filter(partial(_filter_by_permissions, obj), candidates))
|
||||||
|
|
||||||
# Filter disabled and system users
|
# Filter disabled and system users
|
||||||
candidates = set(filter(partial(_filter_notificable), candidates))
|
candidates = set(filter(partial(_filter_notificable), candidates))
|
||||||
|
|
||||||
return frozenset(candidates)
|
return frozenset(candidates)
|
||||||
|
|
||||||
|
|
||||||
|
@ -218,15 +226,9 @@ def send_notifications(obj, *, history):
|
||||||
|
|
||||||
# Get a complete list of notifiable users for current
|
# Get a complete list of notifiable users for current
|
||||||
# object and send the change notification to them.
|
# object and send the change notification to them.
|
||||||
notify_users = get_users_to_notify(obj, discard_users=[notification.owner])
|
notify_users = get_users_to_notify(obj, history=history, discard_users=[notification.owner])
|
||||||
notification.notify_users.add(*notify_users)
|
notification.notify_users.add(*notify_users)
|
||||||
|
|
||||||
# If the history is an unassignment change we should notify that user too
|
|
||||||
if history.type == HistoryType.change and "assigned_to" in history.diff:
|
|
||||||
for assigned_to in history.diff["assigned_to"]:
|
|
||||||
if assigned_to is not None and owner.id != assigned_to:
|
|
||||||
notification.notify_users.add(assigned_to)
|
|
||||||
|
|
||||||
# If we are the min interval is 0 it just work in a synchronous and spamming way
|
# If we are the min interval is 0 it just work in a synchronous and spamming way
|
||||||
if settings.CHANGE_NOTIFICATIONS_MIN_INTERVAL == 0:
|
if settings.CHANGE_NOTIFICATIONS_MIN_INTERVAL == 0:
|
||||||
send_sync_notifications(notification.id)
|
send_sync_notifications(notification.id)
|
||||||
|
|
|
@ -762,6 +762,46 @@ def test_send_notifications_on_unassigned(client, mail):
|
||||||
assert mail.outbox[0].to == [member2.user.email]
|
assert mail.outbox[0].to == [member2.user.email]
|
||||||
|
|
||||||
|
|
||||||
|
def test_send_notifications_on_unassigned_and_notifications_are_disabled(client, mail):
|
||||||
|
project = f.ProjectFactory.create()
|
||||||
|
role = f.RoleFactory.create(project=project, permissions=['modify_issue', 'view_issues', 'view_us', 'view_tasks', 'view_wiki_pages'])
|
||||||
|
member1 = f.MembershipFactory.create(project=project, role=role)
|
||||||
|
member2 = f.MembershipFactory.create(project=project, role=role)
|
||||||
|
|
||||||
|
member2_notify_policy = member2.user.notify_policies.get(project=project)
|
||||||
|
member2_notify_policy.notify_level = NotifyLevel.none
|
||||||
|
member2_notify_policy.save()
|
||||||
|
|
||||||
|
issue = f.IssueFactory.create(project=project,
|
||||||
|
owner=member1.user,
|
||||||
|
milestone=None,
|
||||||
|
status=project.default_issue_status,
|
||||||
|
severity=project.default_severity,
|
||||||
|
priority=project.default_priority,
|
||||||
|
type=project.default_issue_type)
|
||||||
|
|
||||||
|
take_snapshot(issue, user=issue.owner)
|
||||||
|
|
||||||
|
client.login(member1.user)
|
||||||
|
url = reverse("issues-detail", args=[issue.pk])
|
||||||
|
data = {
|
||||||
|
"assigned_to": member2.user.id,
|
||||||
|
"version": issue.version
|
||||||
|
}
|
||||||
|
response = client.json.patch(url, json.dumps(data))
|
||||||
|
assert len(mail.outbox) == 0
|
||||||
|
|
||||||
|
mail.outbox = []
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"assigned_to": None,
|
||||||
|
"version": issue.version + 1
|
||||||
|
}
|
||||||
|
response = client.json.patch(url, json.dumps(data))
|
||||||
|
assert len(mail.outbox) == 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def test_not_send_notifications_on_unassigned_if_executer_and_unassigned_match(client, mail):
|
def test_not_send_notifications_on_unassigned_if_executer_and_unassigned_match(client, mail):
|
||||||
project = f.ProjectFactory.create()
|
project = f.ProjectFactory.create()
|
||||||
role = f.RoleFactory.create(project=project, permissions=['modify_issue', 'view_issues', 'view_us', 'view_tasks', 'view_wiki_pages'])
|
role = f.RoleFactory.create(project=project, permissions=['modify_issue', 'view_issues', 'view_us', 'view_tasks', 'view_wiki_pages'])
|
||||||
|
|
Loading…
Reference in New Issue