application_model.rb 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. # Copyright (C) 2013-2013 Zammad Foundation, http://zammad-foundation.org/
  2. require 'cache'
  3. require 'user_info'
  4. class ApplicationModel < ActiveRecord::Base
  5. self.abstract_class = true
  6. before_create :cache_delete, :fill_up_user_create
  7. before_update :cache_delete_before, :fill_up_user_update
  8. before_destroy :cache_delete_before
  9. after_create :cache_delete
  10. after_update :cache_delete
  11. after_destroy :cache_delete
  12. @@import_class_list = ['Ticket', 'Ticket::Article', 'History', 'Ticket::State', 'Ticket::Priority', 'Group', 'User' ]
  13. # for import of other objects, remove 'id'
  14. def self.attributes_protected_by_default
  15. if Setting.get('import_mode') && @@import_class_list.include?( self.name.to_s )
  16. ['type']
  17. else
  18. ['id','type']
  19. end
  20. end
  21. def self.param_cleanup(params)
  22. # only use object attributes
  23. data = {}
  24. self.new.attributes.each {|item|
  25. if params.has_key?(item[0])
  26. # puts 'use ' + item[0].to_s + '-' + params[item[0]].to_s
  27. data[item[0].to_sym] = params[item[0]]
  28. end
  29. }
  30. # we do want to set this via database
  31. self.param_validation(data)
  32. end
  33. def self.param_validation(data)
  34. # we do want to set this via database
  35. data.delete( :updated_at )
  36. data.delete( :created_at )
  37. data.delete( :updated_by_id )
  38. data.delete( :created_by_id )
  39. data
  40. end
  41. # set created_by_id & updated_by_id if not given based on UserInfo
  42. def fill_up_user_create
  43. if self.class.column_names.include? 'updated_by_id'
  44. if UserInfo.current_user_id
  45. if self.updated_by_id && self.updated_by_id != UserInfo.current_user_id
  46. puts "NOTICE create - self.updated_by_id is different: #{self.updated_by_id.to_s}/#{UserInfo.current_user_id.to_s}"
  47. end
  48. self.updated_by_id = UserInfo.current_user_id
  49. end
  50. end
  51. if self.class.column_names.include? 'created_by_id'
  52. if UserInfo.current_user_id
  53. if self.created_by_id && self.created_by_id != UserInfo.current_user_id
  54. puts "NOTICE create - self.created_by_id is different: #{self.created_by_id.to_s}/#{UserInfo.current_user_id.to_s}"
  55. end
  56. self.created_by_id = UserInfo.current_user_id
  57. end
  58. end
  59. end
  60. # set updated_by_id if not given based on UserInfo
  61. def fill_up_user_update
  62. return if !self.class.column_names.include? 'updated_by_id'
  63. if UserInfo.current_user_id
  64. self.updated_by_id = UserInfo.current_user_id
  65. end
  66. end
  67. def cache_update(o)
  68. # puts 'u ' + self.class.to_s
  69. if self.respond_to?('cache_delete') then self.cache_delete end
  70. # puts 'g ' + group.class.to_s
  71. if o.respond_to?('cache_delete') then o.cache_delete end
  72. end
  73. def cache_delete_before
  74. old_object = self.class.where( :id => self.id ).first
  75. if old_object
  76. old_object.cache_delete
  77. end
  78. self.cache_delete
  79. end
  80. def cache_delete
  81. key = self.class.to_s + '::' + self.id.to_s
  82. Cache.delete( key.to_s )
  83. key = self.class.to_s + ':f:' + self.id.to_s
  84. Cache.delete( key.to_s )
  85. if self[:name]
  86. key = self.class.to_s + '::' + self.name.to_s
  87. Cache.delete( key.to_s )
  88. key = self.class.to_s + ':f:' + self.name.to_s
  89. Cache.delete( key.to_s )
  90. end
  91. if self[:login]
  92. key = self.class.to_s + '::' + self.login.to_s
  93. Cache.delete( key.to_s )
  94. key = self.class.to_s + ':f:' + self.login.to_s
  95. Cache.delete( key.to_s )
  96. end
  97. end
  98. def self.cache_set(data_id, data, full = false)
  99. if !full
  100. key = self.to_s + '::' + data_id.to_s
  101. else
  102. key = self.to_s + ':f:' + data_id.to_s
  103. end
  104. Cache.write( key.to_s, data )
  105. end
  106. def self.cache_get(data_id, full = false)
  107. if !full
  108. key = self.to_s + '::' + data_id.to_s
  109. else
  110. key = self.to_s + ':f:' + data_id.to_s
  111. end
  112. Cache.get( key.to_s )
  113. end
  114. def self.lookup(data)
  115. if data[:id]
  116. # puts "GET- + #{self.to_s}.#{data[:id].to_s}"
  117. cache = self.cache_get( data[:id] )
  118. return cache if cache
  119. # puts "Fillup- + #{self.to_s}.#{data[:id].to_s}"
  120. record = self.where( :id => data[:id] ).first
  121. self.cache_set( data[:id], record )
  122. return record
  123. elsif data[:name]
  124. cache = self.cache_get( data[:name] )
  125. return cache if cache
  126. records = self.where( :name => data[:name] )
  127. records.each {|record|
  128. if record.name == data[:name]
  129. self.cache_set( data[:name], record )
  130. return record
  131. end
  132. }
  133. return
  134. elsif data[:login]
  135. cache = self.cache_get( data[:login] )
  136. return cache if cache
  137. records = self.where( :login => data[:login] )
  138. records.each {|record|
  139. if record.login == data[:login]
  140. self.cache_set( data[:login], record )
  141. return record
  142. end
  143. }
  144. return
  145. else
  146. raise "Need name, id or login for lookup()"
  147. end
  148. end
  149. def self.create_if_not_exists(data)
  150. if data[:id]
  151. record = self.where( :id => data[:id] ).first
  152. return record if record
  153. elsif data[:name]
  154. records = self.where( :name => data[:name] )
  155. records.each {|record|
  156. return record if record.name == data[:name]
  157. }
  158. elsif data[:login]
  159. records = self.where( :login => data[:login] )
  160. records.each {|record|
  161. return record if record.login == data[:login]
  162. }
  163. elsif data[:locale] && data[:source]
  164. records = self.where( :locale => data[:locale], :source => data[:source] )
  165. records.each {|record|
  166. return record if record.source == data[:source]
  167. }
  168. end
  169. self.create(data)
  170. end
  171. def self.create_or_update(data)
  172. if data[:name]
  173. records = self.where( :name => data[:name] )
  174. records.each {|record|
  175. if record.name == data[:name]
  176. record.update_attributes( data )
  177. return record
  178. end
  179. }
  180. record = self.new( data )
  181. record.save
  182. return record
  183. else
  184. raise "Need name for create_or_update()"
  185. end
  186. end
  187. end