Improved online notification. Just leave unseen if I'm owner and somebody else sets pending_reminder.
This commit is contained in:
parent
4be5e8493d
commit
e2dff052a5
5 changed files with 135 additions and 35 deletions
|
@ -65,7 +65,7 @@ class Observer::Ticket::Notification::BackgroundJob
|
||||||
# create desktop notification
|
# create desktop notification
|
||||||
|
|
||||||
# create online notification
|
# create online notification
|
||||||
seen = ticket.online_notification_seen_state
|
seen = ticket.online_notification_seen_state(user.id)
|
||||||
OnlineNotification.add(
|
OnlineNotification.add(
|
||||||
type: @p[:type],
|
type: @p[:type],
|
||||||
object: 'Ticket',
|
object: 'Ticket',
|
||||||
|
|
|
@ -6,6 +6,16 @@ class Observer::Ticket::OnlineNotificationSeen::BackgroundJob
|
||||||
def perform
|
def perform
|
||||||
|
|
||||||
# set all online notifications to seen
|
# set all online notifications to seen
|
||||||
OnlineNotification.seen_by_object( 'Ticket', @ticket_id )
|
ActiveRecord::Base.transaction do
|
||||||
|
ticket = Ticket.lookup(id: @ticket_id)
|
||||||
|
OnlineNotification.list_by_object('Ticket', @ticket_id).each {|notification|
|
||||||
|
next if notification.seen
|
||||||
|
seen = ticket.online_notification_seen_state(notification.user_id)
|
||||||
|
next if !seen
|
||||||
|
next if seen == notification.seen
|
||||||
|
notification.seen = true
|
||||||
|
notification.save
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,12 +14,12 @@ class OnlineNotification < ApplicationModel
|
||||||
add a new online notification for this user
|
add a new online notification for this user
|
||||||
|
|
||||||
OnlineNotification.add(
|
OnlineNotification.add(
|
||||||
:type => 'Assigned to you',
|
type: 'Assigned to you',
|
||||||
:object => 'Ticket',
|
object: 'Ticket',
|
||||||
:o_id => ticket.id,
|
o_id: ticket.id,
|
||||||
:seen => false,
|
seen: false,
|
||||||
:created_by_id => 1,
|
created_by_id: 1,
|
||||||
:user_id => 2,
|
user_id: 2,
|
||||||
)
|
)
|
||||||
|
|
||||||
=end
|
=end
|
||||||
|
@ -51,7 +51,7 @@ add a new online notification for this user
|
||||||
mark online notification as seen
|
mark online notification as seen
|
||||||
|
|
||||||
OnlineNotification.seen(
|
OnlineNotification.seen(
|
||||||
:id => 2,
|
id: 2,
|
||||||
)
|
)
|
||||||
|
|
||||||
=end
|
=end
|
||||||
|
@ -93,9 +93,9 @@ return all online notifications of an user
|
||||||
.limit( limit )
|
.limit( limit )
|
||||||
list = []
|
list = []
|
||||||
notifications.each do |item|
|
notifications.each do |item|
|
||||||
data = item.attributes
|
data = item.attributes
|
||||||
data['object'] = ObjectLookup.by_id( data['object_lookup_id'] )
|
data['object'] = ObjectLookup.by_id( data['object_lookup_id'] )
|
||||||
data['type'] = TypeLookup.by_id( data['type_lookup_id'] )
|
data['type'] = TypeLookup.by_id( data['type_lookup_id'] )
|
||||||
data.delete('object_lookup_id')
|
data.delete('object_lookup_id')
|
||||||
data.delete('type_lookup_id')
|
data.delete('type_lookup_id')
|
||||||
list.push data
|
list.push data
|
||||||
|
@ -119,24 +119,14 @@ return all online notifications of an object
|
||||||
)
|
)
|
||||||
.order( 'created_at DESC, id DESC' ) # rubocop:disable Style/MultilineOperationIndentation
|
.order( 'created_at DESC, id DESC' ) # rubocop:disable Style/MultilineOperationIndentation
|
||||||
.limit( 10_000 ) # rubocop:disable Style/MultilineOperationIndentation
|
.limit( 10_000 ) # rubocop:disable Style/MultilineOperationIndentation
|
||||||
|
notifications
|
||||||
list = []
|
|
||||||
notifications.each do |item|
|
|
||||||
data = item.attributes
|
|
||||||
data['object'] = ObjectLookup.by_id( data['object_lookup_id'] )
|
|
||||||
data['type'] = TypeLookup.by_id( data['type_lookup_id'] )
|
|
||||||
data.delete('object_lookup_id')
|
|
||||||
data.delete('type_lookup_id')
|
|
||||||
list.push data
|
|
||||||
end
|
|
||||||
list
|
|
||||||
end
|
end
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
mark online notification as seen by object
|
mark online notification as seen by object
|
||||||
|
|
||||||
OnlineNotification.seen_by_object( 'Ticket', 123 )
|
OnlineNotification.seen_by_object( 'Ticket', 123, user_id )
|
||||||
|
|
||||||
=end
|
=end
|
||||||
|
|
||||||
|
@ -163,8 +153,8 @@ return all online notifications of an user with assets
|
||||||
returns:
|
returns:
|
||||||
|
|
||||||
list = {
|
list = {
|
||||||
:stream => notifications,
|
stream: notifications,
|
||||||
:assets => assets
|
assets: assets,
|
||||||
}
|
}
|
||||||
|
|
||||||
=end
|
=end
|
||||||
|
|
|
@ -165,8 +165,8 @@ merge tickets
|
||||||
|
|
||||||
ticket = Ticket.find(123)
|
ticket = Ticket.find(123)
|
||||||
result = ticket.merge_to(
|
result = ticket.merge_to(
|
||||||
:ticket_id => 123,
|
ticket_id: 123,
|
||||||
:user_id => 123,
|
user_id: 123,
|
||||||
)
|
)
|
||||||
|
|
||||||
returns
|
returns
|
||||||
|
@ -222,10 +222,19 @@ returns
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
know if online notifcation should be shown as already seen with current state
|
check if online notifcation should be shown in general as already seen with current state
|
||||||
|
|
||||||
ticket = Ticket.find(1)
|
ticket = Ticket.find(1)
|
||||||
seen = ticket.online_notification_seen_state
|
seen = ticket.online_notification_seen_state(user_id_check)
|
||||||
|
|
||||||
|
returns
|
||||||
|
|
||||||
|
result = true # or false
|
||||||
|
|
||||||
|
check if online notifcation should be shown for this user as already seen with current state
|
||||||
|
|
||||||
|
ticket = Ticket.find(1)
|
||||||
|
seen = ticket.online_notification_seen_state(check_user_id)
|
||||||
|
|
||||||
returns
|
returns
|
||||||
|
|
||||||
|
@ -233,7 +242,7 @@ returns
|
||||||
|
|
||||||
=end
|
=end
|
||||||
|
|
||||||
def online_notification_seen_state
|
def online_notification_seen_state(user_id_check = nil)
|
||||||
state = Ticket::State.lookup( id: state_id )
|
state = Ticket::State.lookup( id: state_id )
|
||||||
state_type = Ticket::StateType.lookup( id: state.state_type_id )
|
state_type = Ticket::StateType.lookup( id: state.state_type_id )
|
||||||
|
|
||||||
|
@ -244,7 +253,14 @@ returns
|
||||||
end
|
end
|
||||||
|
|
||||||
# set all to seen if new state is pending reminder state
|
# set all to seen if new state is pending reminder state
|
||||||
return true if state_type.name == 'pending reminder'
|
if state_type.name == 'pending reminder'
|
||||||
|
if user_id_check
|
||||||
|
return false if owner_id == 1
|
||||||
|
return false if updated_by_id != owner_id && user_id_check == owner_id
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
# set all to seen if new state is a closed or merged state
|
# set all to seen if new state is a closed or merged state
|
||||||
return true if state_type.name == 'closed'
|
return true if state_type.name == 'closed'
|
||||||
|
@ -260,9 +276,7 @@ returns
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_title
|
def check_title
|
||||||
|
|
||||||
return if !title
|
return if !title
|
||||||
|
|
||||||
title.gsub!(/\s|\t|\r/, ' ')
|
title.gsub!(/\s|\t|\r/, ' ')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ class OnlineNotificationTest < ActiveSupport::TestCase
|
||||||
)
|
)
|
||||||
customer_user = User.lookup( login: 'nicole.braun@zammad.org' )
|
customer_user = User.lookup( login: 'nicole.braun@zammad.org' )
|
||||||
|
|
||||||
test 'ticket notifiaction' do
|
test 'ticket notification' do
|
||||||
tests = [
|
tests = [
|
||||||
|
|
||||||
# test 1
|
# test 1
|
||||||
|
@ -321,6 +321,92 @@ class OnlineNotificationTest < ActiveSupport::TestCase
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test 'ticket notification item check' do
|
||||||
|
ticket1 = Ticket.create(
|
||||||
|
title: "some title",
|
||||||
|
group: Group.lookup(name: 'Users'),
|
||||||
|
customer_id: 2,
|
||||||
|
state: Ticket::State.lookup(name: 'new'),
|
||||||
|
priority: Ticket::Priority.lookup(name: '2 normal'),
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
assert( ticket1, 'ticket created' )
|
||||||
|
article_inbound = Ticket::Article.create(
|
||||||
|
ticket_id: ticket1.id,
|
||||||
|
from: 'some_sender@example.com',
|
||||||
|
to: 'some_recipient@example.com',
|
||||||
|
subject: 'some subject',
|
||||||
|
message_id: 'some@id',
|
||||||
|
body: 'some message article_inbound',
|
||||||
|
internal: false,
|
||||||
|
sender: Ticket::Article::Sender.lookup(name: 'Customer'),
|
||||||
|
type: Ticket::Article::Type.lookup(name: 'email'),
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(ticket1.online_notification_seen_state, false)
|
||||||
|
assert_equal(ticket1.online_notification_seen_state(agent_user1), false)
|
||||||
|
assert_equal(ticket1.online_notification_seen_state(agent_user2), false)
|
||||||
|
|
||||||
|
# pending reminder, just let new owner to unseed
|
||||||
|
ticket1.update_attributes(
|
||||||
|
owner_id: agent_user1.id,
|
||||||
|
state: Ticket::State.lookup(name: 'pending reminder'),
|
||||||
|
updated_by_id: agent_user2.id,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(ticket1.online_notification_seen_state, true)
|
||||||
|
assert_equal(ticket1.online_notification_seen_state(agent_user1.id), false)
|
||||||
|
assert_equal(ticket1.online_notification_seen_state(agent_user2.id), true)
|
||||||
|
|
||||||
|
# pending reminder, just let new owner to unseed
|
||||||
|
ticket1.update_attributes(
|
||||||
|
owner_id: 1,
|
||||||
|
state: Ticket::State.lookup(name: 'pending reminder'),
|
||||||
|
updated_by_id: agent_user2.id,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(ticket1.online_notification_seen_state, true)
|
||||||
|
assert_equal(ticket1.online_notification_seen_state(agent_user1.id), false)
|
||||||
|
assert_equal(ticket1.online_notification_seen_state(agent_user2.id), false)
|
||||||
|
|
||||||
|
# pending reminder, self done, all to unseed
|
||||||
|
ticket1.update_attributes(
|
||||||
|
owner_id: agent_user1.id,
|
||||||
|
state: Ticket::State.lookup(name: 'pending reminder'),
|
||||||
|
updated_by_id: agent_user1.id,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(ticket1.online_notification_seen_state, true)
|
||||||
|
assert_equal(ticket1.online_notification_seen_state(agent_user1.id), true)
|
||||||
|
assert_equal(ticket1.online_notification_seen_state(agent_user2.id), true)
|
||||||
|
|
||||||
|
# pending close, all to unseen
|
||||||
|
ticket1.update_attributes(
|
||||||
|
owner_id: agent_user1.id,
|
||||||
|
state: Ticket::State.lookup(name: 'pending close'),
|
||||||
|
updated_by_id: agent_user2.id,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(ticket1.online_notification_seen_state, true)
|
||||||
|
assert_equal(ticket1.online_notification_seen_state(agent_user1.id), true)
|
||||||
|
assert_equal(ticket1.online_notification_seen_state(agent_user2.id), true)
|
||||||
|
|
||||||
|
# to open, all to seen
|
||||||
|
ticket1.update_attributes(
|
||||||
|
owner_id: agent_user1.id,
|
||||||
|
state: Ticket::State.lookup(name: 'open'),
|
||||||
|
updated_by_id: agent_user2.id,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(ticket1.online_notification_seen_state, false)
|
||||||
|
assert_equal(ticket1.online_notification_seen_state(agent_user1.id), false)
|
||||||
|
assert_equal(ticket1.online_notification_seen_state(agent_user2.id), false)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
def notification_check( online_notifications, checks )
|
def notification_check( online_notifications, checks )
|
||||||
checks.each { |check_item|
|
checks.each { |check_item|
|
||||||
hit = false
|
hit = false
|
||||||
|
|
Loading…
Reference in a new issue