Added event module to set online notifications of merged and close tickets to seen.

This commit is contained in:
Martin Edenhofer 2015-04-01 16:33:24 +02:00
parent e43f9a81e4
commit f7b0473daa
6 changed files with 212 additions and 38 deletions

View file

@ -64,11 +64,12 @@ class Observer::Ticket::Notification::BackgroundJob
# create desktop notification # create desktop notification
# create online notification # create online notification
seen = ticket.online_notification_seen_state
OnlineNotification.add( OnlineNotification.add(
:type => @p[:type], :type => @p[:type],
:object => 'Ticket', :object => 'Ticket',
:o_id => ticket.id, :o_id => ticket.id,
:seen => false, :seen => seen,
:created_by_id => ticket.updated_by_id || 1, :created_by_id => ticket.updated_by_id || 1,
:user_id => user.id, :user_id => user.id,
) )

View file

@ -0,0 +1,26 @@
# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
class Observer::Ticket::OnlineNotificationSeen < ActiveRecord::Observer
observe 'ticket'
def after_create(record)
_check(record)
end
def after_update(record)
_check(record)
end
private
def _check(record)
# return if we run import mode
return if Setting.get('import_mode')
# check if existing online notifications for this ticket should be set to seen
return true if !record.online_notification_seen_state
# set all online notifications to seen
OnlineNotification.seen_by_object( 'Ticket', record.id )
end
end

View file

@ -108,31 +108,16 @@ return all online notifications of an object
notifications = OnlineNotification.list_by_object( 'Ticket', 123 ) notifications = OnlineNotification.list_by_object( 'Ticket', 123 )
optional with seend attribute
notifications = OnlineNotification.list_by_object( 'Ticket', 123, false )
=end =end
def self.list_by_object( object_name, o_id, seen = nil) def self.list_by_object( object_name, o_id)
object_id = ObjectLookup.by_name( object_name ) object_id = ObjectLookup.by_name( object_name )
if seen == nil notifications = OnlineNotification.where(
notifications = OnlineNotification.where( :object_lookup_id => object_id,
:object_lookup_id => object_id, :o_id => o_id,
:o_id => o_id, ).
). order( 'created_at DESC, id DESC' ).
order( 'created_at DESC, id DESC' ). limit( 10_000 )
limit( 10_000 )
else
notifications = OnlineNotification.where(
:object_lookup_id => object_id,
:o_id => o_id,
:seen => seen,
).
order( 'created_at DESC, id DESC' ).
limit( 10_000 )
end
list = [] list = []
notifications.each do |item| notifications.each do |item|
data = item.attributes data = item.attributes
@ -164,6 +149,7 @@ mark online notification as seen by object
notification.seen = true notification.seen = true
notification.save notification.save
end end
true
end end
=begin =begin

View file

@ -170,11 +170,27 @@ returns
# save ticket # save ticket
self.save self.save
end
# set all online notifications to seen =begin
OnlineNotification.seen_by_object( 'Ticket', self.id )
true know if online notifcation should be shown as already seen
ticket = Ticket.find(1)
seen = ticket.online_notification_seen_state
returns
result = [user1, user2, ...]
=end
def online_notification_seen_state
state = Ticket::State.lookup( :id => self.state_id )
state_type = Ticket::StateType.lookup( :id => state.state_type_id )
return true if state_type.name == 'closed'
return true if state_type.name == 'merged'
false
end end
private private

View file

@ -41,6 +41,7 @@ module Zammad
'observer::_ticket::_reset_new_state', 'observer::_ticket::_reset_new_state',
'observer::_ticket::_escalation_calculation', 'observer::_ticket::_escalation_calculation',
'observer::_ticket::_ref_object_touch', 'observer::_ticket::_ref_object_touch',
'observer::_ticket::_online_notification_seen',
'observer::_tag::_ticket_history', 'observer::_tag::_ticket_history',
'observer::_user::_ref_object_touch', 'observer::_user::_ref_object_touch',
'observer::_user::_geo', 'observer::_user::_geo',

View file

@ -41,7 +41,7 @@ class OnlineNotificationTest < ActiveSupport::TestCase
:customer_id => customer_user.id, :customer_id => customer_user.id,
:owner_id => User.lookup( :login => '-' ).id, :owner_id => User.lookup( :login => '-' ).id,
:title => 'Unit Test 1 (äöüß)!', :title => 'Unit Test 1 (äöüß)!',
:state_id => Ticket::State.lookup( :name => 'new' ).id, :state_id => Ticket::State.lookup( :name => 'closed' ).id,
:priority_id => Ticket::Priority.lookup( :name => '2 normal' ).id, :priority_id => Ticket::Priority.lookup( :name => '2 normal' ).id,
:updated_by_id => agent_user1.id, :updated_by_id => agent_user1.id,
:created_by_id => agent_user1.id, :created_by_id => agent_user1.id,
@ -55,6 +55,9 @@ class OnlineNotificationTest < ActiveSupport::TestCase
:body => 'Unit Test 123', :body => 'Unit Test 123',
:internal => false :internal => false
}, },
:online_notification => {
:seen_only_exists => true,
},
}, },
:update => { :update => {
:ticket => { :ticket => {
@ -63,6 +66,9 @@ class OnlineNotificationTest < ActiveSupport::TestCase
:priority_id => Ticket::Priority.lookup( :name => '1 low' ).id, :priority_id => Ticket::Priority.lookup( :name => '1 low' ).id,
:updated_by_id => customer_user.id, :updated_by_id => customer_user.id,
}, },
:online_notification => {
:seen_only_exists => false,
},
}, },
:check => [ :check => [
{ {
@ -75,7 +81,7 @@ class OnlineNotificationTest < ActiveSupport::TestCase
:object => 'Ticket', :object => 'Ticket',
:created_by_id => customer_user.id, :created_by_id => customer_user.id,
}, },
] ],
}, },
# test 2 # test 2
@ -100,14 +106,20 @@ class OnlineNotificationTest < ActiveSupport::TestCase
:body => 'Unit Test 123', :body => 'Unit Test 123',
:internal => false :internal => false
}, },
:online_notification => {
:seen_only_exists => false,
},
}, },
:update => { :update => {
:ticket => { :ticket => {
:title => 'Unit Test 2 (äöüß) - update!', :title => 'Unit Test 2 (äöüß) - update!',
:state_id => Ticket::State.lookup( :name => 'open' ).id, :state_id => Ticket::State.lookup( :name => 'closed' ).id,
:priority_id => Ticket::Priority.lookup( :name => '1 low' ).id, :priority_id => Ticket::Priority.lookup( :name => '1 low' ).id,
:updated_by_id => customer_user.id, :updated_by_id => customer_user.id,
}, },
:online_notification => {
:seen_only_exists => true,
},
}, },
:check => [ :check => [
{ {
@ -120,7 +132,109 @@ class OnlineNotificationTest < ActiveSupport::TestCase
:object => 'Ticket', :object => 'Ticket',
:created_by_id => customer_user.id, :created_by_id => customer_user.id,
}, },
] ],
},
# test 3
{
:create => {
:ticket => {
:group_id => Group.lookup( :name => 'Users' ).id,
:customer_id => customer_user.id,
:owner_id => User.lookup( :login => '-' ).id,
:title => 'Unit Test 3 (äöüß)!',
:state_id => Ticket::State.lookup( :name => 'new' ).id,
:priority_id => Ticket::Priority.lookup( :name => '2 normal' ).id,
:updated_by_id => agent_user1.id,
:created_by_id => agent_user1.id,
},
:article => {
:updated_by_id => agent_user1.id,
:created_by_id => agent_user1.id,
:type_id => Ticket::Article::Type.lookup( :name => 'phone' ).id,
:sender_id => Ticket::Article::Sender.lookup( :name => 'Customer' ).id,
:from => 'Unit Test <unittest@example.com>',
:body => 'Unit Test 123',
:internal => false
},
:online_notification => {
:seen_only_exists => false,
},
},
:update => {
:ticket => {
:title => 'Unit Test 3 (äöüß) - update!',
:state_id => Ticket::State.lookup( :name => 'open' ).id,
:priority_id => Ticket::Priority.lookup( :name => '1 low' ).id,
:updated_by_id => customer_user.id,
},
:online_notification => {
:seen_only_exists => false,
},
},
:check => [
{
:type => 'create',
:object => 'Ticket',
:created_by_id => agent_user1.id,
},
{
:type => 'update',
:object => 'Ticket',
:created_by_id => customer_user.id,
},
],
},
# test 4
{
:create => {
:ticket => {
:group_id => Group.lookup( :name => 'Users' ).id,
:customer_id => customer_user.id,
:owner_id => User.lookup( :login => '-' ).id,
:title => 'Unit Test 4 (äöüß)!',
:state_id => Ticket::State.lookup( :name => 'new' ).id,
:priority_id => Ticket::Priority.lookup( :name => '2 normal' ).id,
:updated_by_id => agent_user1.id,
:created_by_id => agent_user1.id,
},
:article => {
:updated_by_id => agent_user1.id,
:created_by_id => agent_user1.id,
:type_id => Ticket::Article::Type.lookup( :name => 'phone' ).id,
:sender_id => Ticket::Article::Sender.lookup( :name => 'Customer' ).id,
:from => 'Unit Test <unittest@example.com>',
:body => 'Unit Test 123',
:internal => false
},
:online_notification => {
:seen_only_exists => false,
},
},
:update => {
:ticket => {
:title => 'Unit Test 4 (äöüß) - update!',
:state_id => Ticket::State.lookup( :name => 'open' ).id,
:priority_id => Ticket::Priority.lookup( :name => '1 low' ).id,
:updated_by_id => customer_user.id,
},
:online_notification => {
:seen_only_exists => false,
},
},
:check => [
{
:type => 'create',
:object => 'Ticket',
:created_by_id => agent_user1.id,
},
{
:type => 'update',
:object => 'Ticket',
:created_by_id => customer_user.id,
},
],
}, },
] ]
tickets = [] tickets = []
@ -140,6 +254,17 @@ class OnlineNotificationTest < ActiveSupport::TestCase
#puts Delayed::Job.all.inspect #puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off Delayed::Worker.new.work_off
# check online notifications
if test[:create][:online_notification]
if test[:create][:online_notification][:seen_only_exists]
notifications = OnlineNotification.list_by_object( 'Ticket', ticket.id )
assert( notification_seen_only_exists_exists( notifications ), "not seen notifications for ticket available")
else
notifications = OnlineNotification.list_by_object( 'Ticket', ticket.id )
assert( !notification_seen_only_exists_exists( notifications ), "seen notifications for ticket available")
end
end
# update ticket # update ticket
if test[:update][:ticket] if test[:update][:ticket]
ticket.update_attributes( test[:update][:ticket] ) ticket.update_attributes( test[:update][:ticket] )
@ -155,19 +280,31 @@ class OnlineNotificationTest < ActiveSupport::TestCase
# check online notifications # check online notifications
notification_check( OnlineNotification.list(agent_user2, 10), test[:check] ) notification_check( OnlineNotification.list(agent_user2, 10), test[:check] )
# check online notifications
if test[:update][:online_notification]
if test[:update][:online_notification][:seen_only_exists]
notifications = OnlineNotification.list_by_object( 'Ticket', ticket.id )
assert( notification_seen_only_exists_exists( notifications ), "not seen notifications for ticket available")
else
notifications = OnlineNotification.list_by_object( 'Ticket', ticket.id )
assert( !notification_seen_only_exists_exists( notifications ), "seen notifications for ticket available")
end
end
} }
# merge tickets - also remove notifications of merged tickets # merge tickets - also remove notifications of merged tickets
tickets[0].merge_to( tickets[2].merge_to(
:ticket_id => tickets[1].id, :ticket_id => tickets[3].id,
:user_id => 1, :user_id => 1,
) )
notifications = OnlineNotification.list_by_object( 'Ticket', tickets[0].id, false ) notifications = OnlineNotification.list_by_object( 'Ticket', tickets[2].id )
assert( notifications.empty?, "still not seen notifications for merged ticket available") assert( !notifications.empty?, "should have notifications")
assert( notification_seen_only_exists_exists(notifications), "still not seen notifications for merged ticket available")
notifications = OnlineNotification.list_by_object( 'Ticket', tickets[1].id, true )
assert( notifications.empty?, "no notifications for master ticket available")
notifications = OnlineNotification.list_by_object( 'Ticket', tickets[3].id )
assert( !notifications.empty?, "should have notifications")
assert( !notification_seen_only_exists_exists(notifications), "no notifications for master ticket available")
# delete tickets # delete tickets
tickets.each { |ticket| tickets.each { |ticket|
@ -196,8 +333,15 @@ class OnlineNotificationTest < ActiveSupport::TestCase
end end
end end
} }
assert( hit, "online notification exists #{ check_item.inspect }" ) #puts "--- #{onine_notifications.inspect}"
assert( hit, "online notification exists not #{ check_item.inspect }" )
} }
end end
def notification_seen_only_exists_exists( onine_notifications )
onine_notifications.each {|onine_notification|
return false if !onine_notification['seen']
}
true
end
end end