notification.rb 4.2 KB

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