Improved notification generation (add changed attributes based on object manager settings).
This commit is contained in:
parent
bf32f09208
commit
de92c4a816
3 changed files with 156 additions and 76 deletions
|
@ -123,9 +123,7 @@ class Observer::Ticket::Notification < ActiveRecord::Observer
|
|||
# return if we run import mode
|
||||
return if Setting.get('import_mode')
|
||||
|
||||
#puts 'before_update'
|
||||
#current = record.class.find(record.id)
|
||||
|
||||
# ignore certain attributes
|
||||
real_changes = {}
|
||||
record.changes.each {|key, value|
|
||||
next if key == 'updated_at'
|
||||
|
@ -140,68 +138,14 @@ class Observer::Ticket::Notification < ActiveRecord::Observer
|
|||
real_changes[key] = value
|
||||
}
|
||||
|
||||
return if real_changes.empty?
|
||||
|
||||
human_changes = {}
|
||||
real_changes.each {|key, value|
|
||||
|
||||
# get attribute name
|
||||
attribute_name = key.to_s
|
||||
if attribute_name[-3,3] == '_id'
|
||||
attribute_name = attribute_name[ 0, attribute_name.length-3 ]
|
||||
end
|
||||
if key == attribute_name
|
||||
human_changes[key] = value
|
||||
end
|
||||
|
||||
value_id = []
|
||||
value_str = [ value[0], value[1] ]
|
||||
if key.to_s[-3,3] == '_id'
|
||||
value_id[0] = value[0]
|
||||
value_id[1] = value[1]
|
||||
|
||||
if record.respond_to?( attribute_name ) && record.send(attribute_name)
|
||||
relation_class = record.send(attribute_name).class
|
||||
if relation_class && value_id[0]
|
||||
relation_model = relation_class.lookup( :id => value_id[0] )
|
||||
if relation_model
|
||||
if relation_model['name']
|
||||
value_str[0] = relation_model['name']
|
||||
elsif relation_model.respond_to?('fullname')
|
||||
value_str[0] = relation_model.send('fullname')
|
||||
end
|
||||
end
|
||||
end
|
||||
if relation_class && value_id[1]
|
||||
relation_model = relation_class.lookup( :id => value_id[1] )
|
||||
if relation_model
|
||||
if relation_model['name']
|
||||
value_str[1] = relation_model['name']
|
||||
elsif relation_model.respond_to?('fullname')
|
||||
value_str[1] = relation_model.send('fullname')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
human_changes[attribute_name] = [value_str[0].to_s, value_str[1].to_s]
|
||||
}
|
||||
|
||||
# do not send anything if nothing has changed
|
||||
return if human_changes.empty?
|
||||
|
||||
# puts 'UPDATE!!!!!!!!'
|
||||
# puts "changes #{record.changes.inspect}"
|
||||
# puts 'current'
|
||||
# puts current.inspect
|
||||
# puts 'record'
|
||||
# puts record.inspect
|
||||
return if real_changes.empty?
|
||||
|
||||
e = {
|
||||
:name => record.class.name,
|
||||
:type => 'update',
|
||||
:data => record,
|
||||
:changes => human_changes,
|
||||
:changes => real_changes,
|
||||
:id => record.id,
|
||||
}
|
||||
EventBuffer.add(e)
|
||||
|
|
|
@ -78,12 +78,15 @@ class Observer::Ticket::Notification::BackgroundJob
|
|||
end
|
||||
recipient_list += user.email.to_s
|
||||
|
||||
changes = self.human_changes(user, ticket)
|
||||
next if !changes || changes.empty?
|
||||
|
||||
# get user based notification template
|
||||
# if create, send create message / block update messages
|
||||
if @type == 'create'
|
||||
template = self.template_create(user.preferences[:locale], ticket, article, @changes)
|
||||
template = self.template_create(user, ticket, article, changes)
|
||||
elsif @type == 'update'
|
||||
template = self.template_update(user.preferences[:locale], ticket, article, @changes)
|
||||
template = self.template_update(user, ticket, article, changes)
|
||||
else
|
||||
raise "unknown type for notification #{@type}"
|
||||
end
|
||||
|
@ -127,7 +130,77 @@ class Observer::Ticket::Notification::BackgroundJob
|
|||
end
|
||||
end
|
||||
|
||||
def template_create(lang, ticket, article, ticket_changes)
|
||||
def human_changes(user, record)
|
||||
|
||||
return {} if !@changes
|
||||
|
||||
# only show allowed attributes
|
||||
attribute_list = ObjectManager::Attribute.by_object_as_hash('Ticket', user)
|
||||
user_related_changes = {}
|
||||
@changes.each {|key,value|
|
||||
#user_related_changes[key] = value
|
||||
if attribute_list[key.to_s]
|
||||
user_related_changes[key] = value
|
||||
end
|
||||
}
|
||||
|
||||
changes = {}
|
||||
user_related_changes.each {|key, value|
|
||||
|
||||
# get attribute name
|
||||
attribute_name = key.to_s
|
||||
object_manager_attribute = attribute_list[attribute_name]
|
||||
if attribute_name[-3,3] == '_id'
|
||||
attribute_name = attribute_name[ 0, attribute_name.length-3 ]
|
||||
end
|
||||
if key == attribute_name
|
||||
changes[key] = value
|
||||
end
|
||||
|
||||
value_id = []
|
||||
value_str = [ value[0], value[1] ]
|
||||
if key.to_s[-3,3] == '_id'
|
||||
value_id[0] = value[0]
|
||||
value_id[1] = value[1]
|
||||
|
||||
if record.respond_to?( attribute_name ) && record.send(attribute_name)
|
||||
relation_class = record.send(attribute_name).class
|
||||
if relation_class && value_id[0]
|
||||
relation_model = relation_class.lookup( :id => value_id[0] )
|
||||
if relation_model
|
||||
if relation_model['name']
|
||||
value_str[0] = relation_model['name']
|
||||
elsif relation_model.respond_to?('fullname')
|
||||
value_str[0] = relation_model.send('fullname')
|
||||
end
|
||||
end
|
||||
end
|
||||
if relation_class && value_id[1]
|
||||
relation_model = relation_class.lookup( :id => value_id[1] )
|
||||
if relation_model
|
||||
if relation_model['name']
|
||||
value_str[1] = relation_model['name']
|
||||
elsif relation_model.respond_to?('fullname')
|
||||
value_str[1] = relation_model.send('fullname')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
display = attribute_name
|
||||
if object_manager_attribute && object_manager_attribute[:display]
|
||||
display = object_manager_attribute[:display]
|
||||
end
|
||||
if object_manager_attribute && object_manager_attribute[:translate]
|
||||
changes[display] = ["i18n(#{value_str[0].to_s})", "i18n(#{value_str[1].to_s})"]
|
||||
else
|
||||
changes[display] = [value_str[0].to_s, value_str[1].to_s]
|
||||
end
|
||||
}
|
||||
changes
|
||||
end
|
||||
|
||||
def template_create(user, ticket, article, ticket_changes)
|
||||
article_content = ''
|
||||
if article
|
||||
article_content = '<snip>
|
||||
|
@ -135,7 +208,7 @@ class Observer::Ticket::Notification::BackgroundJob
|
|||
</snip>'
|
||||
end
|
||||
|
||||
if lang =~ /^de/i
|
||||
if user.preferences[:locale] =~ /^de/i
|
||||
subject = 'Neues Ticket (#{ticket.title})'
|
||||
body = 'Hallo #{recipient.firstname},
|
||||
|
||||
|
@ -165,8 +238,8 @@ State: i18n(#{ticket.state.name})
|
|||
|
||||
end
|
||||
|
||||
body = template_header(lang) + body.chomp.text2html
|
||||
body += template_footer(lang, ticket, article)
|
||||
body = template_header(user) + body.chomp.text2html
|
||||
body += template_footer(user, ticket, article)
|
||||
|
||||
template = {
|
||||
:subject => subject,
|
||||
|
@ -175,10 +248,10 @@ State: i18n(#{ticket.state.name})
|
|||
template
|
||||
end
|
||||
|
||||
def template_update(lang, ticket, article, ticket_changes)
|
||||
def template_update(user, ticket, article, ticket_changes)
|
||||
changes = ''
|
||||
ticket_changes.each {|key,value|
|
||||
changes += "#{key}: #{value[0]} -> #{value[1]}\n"
|
||||
changes += "i18n(#{key}): #{value[0]} -> #{value[1]}\n"
|
||||
}
|
||||
article_content = ''
|
||||
if article
|
||||
|
@ -186,7 +259,7 @@ State: i18n(#{ticket.state.name})
|
|||
#{article.body}
|
||||
</snip>'
|
||||
end
|
||||
if lang =~ /^de/i
|
||||
if user.preferences[:locale] =~ /^de/i
|
||||
subject = 'Ticket aktualisiert (#{ticket.title})'
|
||||
body = 'Hallo #{recipient.firstname},
|
||||
|
||||
|
@ -212,8 +285,8 @@ Changes:
|
|||
'
|
||||
end
|
||||
|
||||
body = template_header(lang) + body.chomp.text2html
|
||||
body += template_footer(lang,ticket, article)
|
||||
body = template_header(user) + body.chomp.text2html
|
||||
body += template_footer(user,ticket, article)
|
||||
|
||||
template = {
|
||||
:subject => subject,
|
||||
|
@ -222,7 +295,7 @@ Changes:
|
|||
template
|
||||
end
|
||||
|
||||
def template_header(lang)
|
||||
def template_header(user)
|
||||
'
|
||||
<style type="text/css">
|
||||
p, table, div, td {
|
||||
|
@ -282,7 +355,7 @@ Changes:
|
|||
'
|
||||
end
|
||||
|
||||
def template_footer(lang, ticket, article)
|
||||
def template_footer(user, ticket, article)
|
||||
'
|
||||
<a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">i18n(View the Ticket directly here)</a>
|
||||
|
||||
|
|
|
@ -15,6 +15,9 @@ class TicketNotificationTest < ActiveSupport::TestCase
|
|||
:active => true,
|
||||
:roles => roles,
|
||||
:groups => groups,
|
||||
:preferences => {
|
||||
:locale => 'de',
|
||||
},
|
||||
:updated_by_id => 1,
|
||||
:created_by_id => 1,
|
||||
)
|
||||
|
@ -27,6 +30,9 @@ class TicketNotificationTest < ActiveSupport::TestCase
|
|||
:active => true,
|
||||
:roles => roles,
|
||||
:groups => groups,
|
||||
:preferences => {
|
||||
:locale => 'en_CA',
|
||||
},
|
||||
:updated_by_id => 1,
|
||||
:created_by_id => 1,
|
||||
)
|
||||
|
@ -303,8 +309,9 @@ class TicketNotificationTest < ActiveSupport::TestCase
|
|||
|
||||
assert_equal( 'some notification event test 1', listObjects[ticket1.id][:changes]['title'][0] )
|
||||
assert_equal( 'some notification event test 1 - #2', listObjects[ticket1.id][:changes]['title'][1] )
|
||||
assert_equal( '2 normal', listObjects[ticket1.id][:changes]['priority'][0] )
|
||||
assert_equal( '3 high', listObjects[ticket1.id][:changes]['priority'][1] )
|
||||
assert_not( listObjects[ticket1.id][:changes]['priority'] )
|
||||
assert_equal( 2, listObjects[ticket1.id][:changes]['priority_id'][0] )
|
||||
assert_equal( 3, listObjects[ticket1.id][:changes]['priority_id'][1] )
|
||||
|
||||
# update ticket attributes
|
||||
ticket1.title = "#{ticket1.title} - #3"
|
||||
|
@ -316,8 +323,64 @@ class TicketNotificationTest < ActiveSupport::TestCase
|
|||
|
||||
assert_equal( 'some notification event test 1', listObjects[ticket1.id][:changes]['title'][0] )
|
||||
assert_equal( 'some notification event test 1 - #2 - #3', listObjects[ticket1.id][:changes]['title'][1] )
|
||||
assert_equal( '2 normal', listObjects[ticket1.id][:changes]['priority'][0] )
|
||||
assert_equal( '1 low', listObjects[ticket1.id][:changes]['priority'][1] )
|
||||
assert_not( listObjects[ticket1.id][:changes]['priority'] )
|
||||
assert_equal( 2, listObjects[ticket1.id][:changes]['priority_id'][0] )
|
||||
assert_equal( 1, listObjects[ticket1.id][:changes]['priority_id'][1] )
|
||||
|
||||
end
|
||||
|
||||
|
||||
test 'ticket notification template' do
|
||||
|
||||
# create ticket in group
|
||||
ticket1 = Ticket.create(
|
||||
:title => 'some notification template test 1',
|
||||
:group => Group.lookup( :name => 'Users'),
|
||||
:customer => customer,
|
||||
:state => Ticket::State.lookup( :name => 'new' ),
|
||||
:priority => Ticket::Priority.lookup( :name => '2 normal' ),
|
||||
:updated_by_id => customer.id,
|
||||
:created_by_id => customer.id,
|
||||
)
|
||||
article = 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',
|
||||
:internal => false,
|
||||
:sender => Ticket::Article::Sender.where(:name => 'Customer').first,
|
||||
:type => Ticket::Article::Type.where(:name => 'email').first,
|
||||
:updated_by_id => customer.id,
|
||||
:created_by_id => customer.id,
|
||||
)
|
||||
assert( ticket1, "ticket created - ticket notification template" )
|
||||
|
||||
bg = Observer::Ticket::Notification::BackgroundJob.new(
|
||||
:ticket_id => ticket1.id,
|
||||
:article_id => article.id,
|
||||
:type => 'update',
|
||||
:changes => {
|
||||
:priority_id => [1, 2],
|
||||
},
|
||||
)
|
||||
human_changes = bg.human_changes(agent1,ticket1)
|
||||
assert_equal( '1 low', human_changes['priority'][0] )
|
||||
assert_equal( '2 normal', human_changes['priority'][1] )
|
||||
assert_not( human_changes['priority_id'] )
|
||||
|
||||
# en notification
|
||||
template = bg.template_update(agent1, ticket1, article, human_changes)
|
||||
assert( template[:subject] )
|
||||
assert( template[:body] )
|
||||
puts template.inspect
|
||||
|
||||
# de notification
|
||||
template = bg.template_update(agent2, ticket1, article, human_changes)
|
||||
assert( template[:subject] )
|
||||
assert( template[:body] )
|
||||
puts template.inspect
|
||||
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue