notification.rb 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
  2. require 'event_buffer'
  3. require 'notification_factory'
  4. class Observer::Ticket::Notification < ActiveRecord::Observer
  5. observe :ticket, 'ticket::_article'
  6. def self.transaction
  7. # return if we run import mode
  8. return if Setting.get('import_mode')
  9. # get buffer
  10. list = EventBuffer.list
  11. # reset buffer
  12. EventBuffer.reset
  13. via_web = false
  14. if ENV['RACK_ENV'] || Rails.configuration.webserver_is_active
  15. via_web = true
  16. end
  17. # get uniq objects
  18. list_objects = get_uniq_changes(list)
  19. list_objects.each {|_ticket_id, item|
  20. # send background job
  21. Delayed::Job.enqueue( Observer::Ticket::Notification::BackgroundJob.new( item, via_web ) )
  22. }
  23. end
  24. =begin
  25. result = get_uniq_changes(events)
  26. result = {
  27. :1 => {
  28. :type => 'create',
  29. :ticket_id => 123,
  30. :article_id => 123,
  31. },
  32. :9 = {
  33. :type => 'update',
  34. :ticket_id => 123,
  35. :changes => {
  36. :attribute1 => [before,now],
  37. :attribute2 => [before,now],
  38. }
  39. },
  40. }
  41. =end
  42. def self.get_uniq_changes(events)
  43. list_objects = {}
  44. events.each { |event|
  45. # get current state of objects
  46. if event[:name] == 'Ticket::Article'
  47. article = Ticket::Article.lookup( id: event[:id] )
  48. # next if article is already deleted
  49. next if !article
  50. ticket = article.ticket
  51. if !list_objects[ticket.id]
  52. list_objects[ticket.id] = {}
  53. end
  54. list_objects[ticket.id][:article_id] = article.id
  55. list_objects[ticket.id][:ticket_id] = ticket.id
  56. if !list_objects[ticket.id][:type]
  57. list_objects[ticket.id][:type] = 'update'
  58. end
  59. elsif event[:name] == 'Ticket'
  60. ticket = Ticket.lookup( id: event[:id] )
  61. # next if ticket is already deleted
  62. next if !ticket
  63. if !list_objects[ticket.id]
  64. list_objects[ticket.id] = {}
  65. end
  66. list_objects[ticket.id][:ticket_id] = ticket.id
  67. if !list_objects[ticket.id][:type] || list_objects[ticket.id][:type] == 'update'
  68. list_objects[ticket.id][:type] = event[:type]
  69. end
  70. # merge changes
  71. if event[:changes]
  72. if !list_objects[ticket.id][:changes]
  73. list_objects[ticket.id][:changes] = event[:changes]
  74. else
  75. event[:changes].each {|key, value|
  76. if !list_objects[ticket.id][:changes][key]
  77. list_objects[ticket.id][:changes][key] = value
  78. else
  79. list_objects[ticket.id][:changes][key][1] = value[1]
  80. end
  81. }
  82. end
  83. end
  84. else
  85. fail "unknown object for notification #{event[:name]}"
  86. end
  87. }
  88. list_objects
  89. end
  90. def after_create(record)
  91. # return if we run import mode
  92. return if Setting.get('import_mode')
  93. # Rails.logger.info 'CREATED!!!!'
  94. # Rails.logger.info record.inspect
  95. e = {
  96. name: record.class.name,
  97. type: 'create',
  98. data: record,
  99. id: record.id,
  100. }
  101. EventBuffer.add(e)
  102. end
  103. def before_update(record)
  104. # return if we run import mode
  105. return if Setting.get('import_mode')
  106. # ignore updates on articles / we just want send notifications on ticket updates
  107. return if record.class.name == 'Ticket::Article'
  108. # ignore certain attributes
  109. real_changes = {}
  110. record.changes.each {|key, value|
  111. next if key == 'updated_at'
  112. next if key == 'first_response'
  113. next if key == 'close_time'
  114. next if key == 'last_contact_agent'
  115. next if key == 'last_contact_customer'
  116. next if key == 'last_contact'
  117. next if key == 'article_count'
  118. next if key == 'create_article_type_id'
  119. next if key == 'create_article_sender_id'
  120. real_changes[key] = value
  121. }
  122. # do not send anything if nothing has changed
  123. return if real_changes.empty?
  124. e = {
  125. name: record.class.name,
  126. type: 'update',
  127. data: record,
  128. changes: real_changes,
  129. id: record.id,
  130. }
  131. EventBuffer.add(e)
  132. end
  133. def after_update(_record)
  134. # return if we run import mode
  135. return if Setting.get('import_mode')
  136. # Rails.logger.info 'after_update'
  137. # Rails.logger.info record.inspect
  138. # Rails.logger.info '-----'
  139. # Rails.logger.info @a.inspect
  140. # AuditTrail.new(record, "UPDATED")
  141. end
  142. end