Added tests to check if user want to get notifications based on own notification settings.
This commit is contained in:
parent
77e61c3631
commit
4426e83643
3 changed files with 328 additions and 71 deletions
|
@ -4,9 +4,9 @@ class Observer::Ticket::Notification::BackgroundJob
|
||||||
def initialize(params, via_web = false)
|
def initialize(params, via_web = false)
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
:type => 'update',
|
type: 'update',
|
||||||
:ticket_id => 123,
|
ticket_id: 123,
|
||||||
:changes => {
|
changes: {
|
||||||
'attribute1' => [before,now],
|
'attribute1' => [before,now],
|
||||||
'attribute2' => [before,now],
|
'attribute2' => [before,now],
|
||||||
}
|
}
|
||||||
|
@ -59,55 +59,11 @@ class Observer::Ticket::Notification::BackgroundJob
|
||||||
end
|
end
|
||||||
already_checked_recipient_ids = {}
|
already_checked_recipient_ids = {}
|
||||||
possible_recipients.each {|user|
|
possible_recipients.each {|user|
|
||||||
next if already_checked_recipient_ids[user.id]
|
result = NotificationFactory.notification_settings(user, ticket, @p[:type])
|
||||||
already_checked_recipient_ids[user.id] = true
|
next if !result
|
||||||
next if !user.preferences
|
next if already_checked_recipient_ids[result[:user].id]
|
||||||
next if !user.preferences['notification_config']
|
already_checked_recipient_ids[result[:user].id] = true
|
||||||
matrix = user.preferences['notification_config']['matrix']
|
recipients_and_channels.push result
|
||||||
if ticket.owner_id != user.id
|
|
||||||
if user.preferences['notification_config']['group_ids'] ||
|
|
||||||
(user.preferences['notification_config']['group_ids'].class == Array && (!user.preferences['notification_config']['group_ids'].empty? || user.preferences['notification_config']['group_ids'][0] != '-'))
|
|
||||||
hit = false
|
|
||||||
user.preferences['notification_config']['group_ids'].each {|notify_group_id|
|
|
||||||
user.group_ids.each {|local_group_id|
|
|
||||||
if local_group_id.to_s == notify_group_id.to_s
|
|
||||||
hit = true
|
|
||||||
end
|
|
||||||
}
|
|
||||||
}
|
|
||||||
next if !hit
|
|
||||||
end
|
|
||||||
end
|
|
||||||
next if !matrix
|
|
||||||
next if !matrix[@p[:type]]
|
|
||||||
data = matrix[@p[:type]]
|
|
||||||
next if !data
|
|
||||||
next if !data['criteria']
|
|
||||||
channels = data['channel']
|
|
||||||
next if !channels
|
|
||||||
if data['criteria']['owned_by_me'] && ticket.owner_id == user.id
|
|
||||||
data = {
|
|
||||||
user: user,
|
|
||||||
channels: channels
|
|
||||||
}
|
|
||||||
recipients_and_channels.push data
|
|
||||||
next
|
|
||||||
end
|
|
||||||
if data['criteria']['owned_by_nobody'] && ticket.owner_id == 1
|
|
||||||
data = {
|
|
||||||
user: user,
|
|
||||||
channels: channels
|
|
||||||
}
|
|
||||||
recipients_and_channels.push data
|
|
||||||
next
|
|
||||||
end
|
|
||||||
next unless data['criteria']['no']
|
|
||||||
data = {
|
|
||||||
user: user,
|
|
||||||
channels: channels
|
|
||||||
}
|
|
||||||
recipients_and_channels.push data
|
|
||||||
next
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# send notifications
|
# send notifications
|
||||||
|
|
|
@ -2,6 +2,80 @@ module NotificationFactory
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
|
get notification settings for user and notification type
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(user, ticket, type)
|
||||||
|
|
||||||
|
type: create | update | reminder_reached | pending
|
||||||
|
|
||||||
|
returns
|
||||||
|
|
||||||
|
{
|
||||||
|
user: user,
|
||||||
|
channels: {
|
||||||
|
online: true,
|
||||||
|
email: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
|
def self.notification_settings(user, ticket, type)
|
||||||
|
return if !user.preferences
|
||||||
|
return if !user.preferences['notification_config']
|
||||||
|
matrix = user.preferences['notification_config']['matrix']
|
||||||
|
return if !matrix
|
||||||
|
|
||||||
|
# check if group is in selecd groups
|
||||||
|
if ticket.owner_id != user.id
|
||||||
|
selected_group_ids = user.preferences['notification_config']['group_ids']
|
||||||
|
if selected_group_ids
|
||||||
|
if selected_group_ids.class == Array
|
||||||
|
hit = nil
|
||||||
|
if selected_group_ids.empty?
|
||||||
|
hit = true
|
||||||
|
elsif selected_group_ids[0] == '-' && selected_group_ids.count == 1
|
||||||
|
hit = true
|
||||||
|
else
|
||||||
|
hit = false
|
||||||
|
selected_group_ids.each {|selected_group_id|
|
||||||
|
if selected_group_id.to_s == ticket.group_id.to_s
|
||||||
|
hit = true
|
||||||
|
break
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
|
return if !hit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return if !matrix[type]
|
||||||
|
data = matrix[type]
|
||||||
|
return if !data
|
||||||
|
return if !data['criteria']
|
||||||
|
channels = data['channel']
|
||||||
|
return if !channels
|
||||||
|
if data['criteria']['owned_by_me'] && ticket.owner_id == user.id
|
||||||
|
return {
|
||||||
|
user: user,
|
||||||
|
channels: channels
|
||||||
|
}
|
||||||
|
end
|
||||||
|
if data['criteria']['owned_by_nobody'] && ticket.owner_id == 1
|
||||||
|
return {
|
||||||
|
user: user,
|
||||||
|
channels: channels
|
||||||
|
}
|
||||||
|
end
|
||||||
|
return if !data['criteria']['no']
|
||||||
|
{
|
||||||
|
user: user,
|
||||||
|
channels: channels
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
|
||||||
# deprecated, will be removed with 2.0
|
# deprecated, will be removed with 2.0
|
||||||
|
|
||||||
result_string = NotificationFactory.build(
|
result_string = NotificationFactory.build(
|
||||||
|
|
|
@ -466,4 +466,231 @@ next line, Group: Users',
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test 'notifications settings' do
|
||||||
|
|
||||||
|
groups = Group.all
|
||||||
|
roles = Role.where(name: 'Agent')
|
||||||
|
agent1 = User.create_or_update(
|
||||||
|
login: 'notification-settings-agent1@example.com',
|
||||||
|
firstname: 'Notification<b>xxx</b>',
|
||||||
|
lastname: 'Agent1',
|
||||||
|
email: 'notification-settings-agent1@example.com',
|
||||||
|
password: 'agentpw',
|
||||||
|
active: true,
|
||||||
|
roles: roles,
|
||||||
|
groups: groups,
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
agent2 = User.create_or_update(
|
||||||
|
login: 'notification-settings-agent2@example.com',
|
||||||
|
firstname: 'Notification<b>xxx</b>',
|
||||||
|
lastname: 'Agent2',
|
||||||
|
email: 'notification-settings-agent2@example.com',
|
||||||
|
password: 'agentpw',
|
||||||
|
active: true,
|
||||||
|
roles: roles,
|
||||||
|
groups: groups,
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
group_notification_setting = Group.create_or_update(
|
||||||
|
name: 'NotificationSetting',
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
ticket1 = Ticket.create(
|
||||||
|
group_id: Group.lookup(name: 'Users').id,
|
||||||
|
customer_id: User.lookup(email: 'nicole.braun@zammad.org').id,
|
||||||
|
owner_id: User.lookup(login: '-').id,
|
||||||
|
title: 'Notification Settings Test 1!',
|
||||||
|
state_id: Ticket::State.lookup(name: 'new').id,
|
||||||
|
priority_id: Ticket::Priority.lookup(name: '2 normal').id,
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
ticket2 = Ticket.create(
|
||||||
|
group_id: Group.lookup(name: 'Users').id,
|
||||||
|
customer_id: User.lookup(email: 'nicole.braun@zammad.org').id,
|
||||||
|
owner_id: agent1.id,
|
||||||
|
title: 'Notification Settings Test 2!',
|
||||||
|
state_id: Ticket::State.lookup(name: 'new').id,
|
||||||
|
priority_id: Ticket::Priority.lookup(name: '2 normal').id,
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
ticket3 = Ticket.create(
|
||||||
|
group_id: group_notification_setting.id,
|
||||||
|
customer_id: User.lookup(email: 'nicole.braun@zammad.org').id,
|
||||||
|
owner_id: User.lookup(login: '-').id,
|
||||||
|
title: 'Notification Settings Test 1!',
|
||||||
|
state_id: Ticket::State.lookup(name: 'new').id,
|
||||||
|
priority_id: Ticket::Priority.lookup(name: '2 normal').id,
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
ticket4 = Ticket.create(
|
||||||
|
group_id: group_notification_setting.id,
|
||||||
|
customer_id: User.lookup(email: 'nicole.braun@zammad.org').id,
|
||||||
|
owner_id: agent1.id,
|
||||||
|
title: 'Notification Settings Test 2!',
|
||||||
|
state_id: Ticket::State.lookup(name: 'new').id,
|
||||||
|
priority_id: Ticket::Priority.lookup(name: '2 normal').id,
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
agent1.preferences[:notification_config][:group_ids] = nil
|
||||||
|
agent1.save
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket1, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket2, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket3, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket4, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
agent2.preferences[:notification_config][:group_ids] = nil
|
||||||
|
agent2.save
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket1, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket2, 'create')
|
||||||
|
assert_equal(nil, result)
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket3, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket4, 'create')
|
||||||
|
assert_equal(nil, result)
|
||||||
|
|
||||||
|
# no group selection
|
||||||
|
agent1.preferences[:notification_config][:group_ids] = []
|
||||||
|
agent1.save
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket1, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket2, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket3, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket4, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
agent2.preferences[:notification_config][:group_ids] = []
|
||||||
|
agent2.save
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket1, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket2, 'create')
|
||||||
|
assert_equal(nil, result)
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket3, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket4, 'create')
|
||||||
|
assert_equal(nil, result)
|
||||||
|
|
||||||
|
agent1.preferences[:notification_config][:group_ids] = ['-']
|
||||||
|
agent1.save
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket1, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket2, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket3, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket4, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
agent2.preferences[:notification_config][:group_ids] = ['-']
|
||||||
|
agent2.save
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket1, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket2, 'create')
|
||||||
|
assert_equal(nil, result)
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket3, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket4, 'create')
|
||||||
|
assert_equal(nil, result)
|
||||||
|
|
||||||
|
# dedecated group selection
|
||||||
|
agent1.preferences[:notification_config][:group_ids] = [Group.lookup(name: 'Users').id]
|
||||||
|
agent1.save
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket1, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket2, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket3, 'create')
|
||||||
|
assert_equal(nil, result)
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent1, ticket4, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
agent2.preferences[:notification_config][:group_ids] = [Group.lookup(name: 'Users').id]
|
||||||
|
agent2.save
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket1, 'create')
|
||||||
|
assert_equal(true, result[:channels][:online])
|
||||||
|
assert_equal(true, result[:channels][:email])
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket2, 'create')
|
||||||
|
assert_equal(nil, result)
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket3, 'create')
|
||||||
|
assert_equal(nil, result)
|
||||||
|
assert_equal(nil, result)
|
||||||
|
|
||||||
|
result = NotificationFactory.notification_settings(agent2, ticket4, 'create')
|
||||||
|
assert_equal(nil, result)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue