tag.rb 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Tag < ApplicationModel
  3. belongs_to :tag_object, class_name: 'Tag::Object'
  4. belongs_to :tag_item, class_name: 'Tag::Item'
  5. =begin
  6. add tags for certain object
  7. Tag.tag_add(
  8. object: 'Ticket',
  9. o_id: ticket.id,
  10. item: 'some tag',
  11. created_by_id: current_user.id,
  12. )
  13. =end
  14. def self.tag_add(data)
  15. data[:item].strip!
  16. # lookups
  17. if data[:object]
  18. tag_object_id = Tag::Object.lookup_by_name_and_create(data[:object]).id
  19. end
  20. if data[:item]
  21. tag_item_id = Tag::Item.lookup_by_name_and_create(data[:item]).id
  22. end
  23. # return if duplicate
  24. current_tags = tag_list(data)
  25. return true if current_tags.include?(data[:item])
  26. # create history
  27. Tag.create(
  28. tag_object_id: tag_object_id,
  29. tag_item_id: tag_item_id,
  30. o_id: data[:o_id],
  31. created_by_id: data[:created_by_id],
  32. )
  33. # touch reference
  34. touch_reference_by_params(data)
  35. true
  36. end
  37. =begin
  38. remove tags of certain object
  39. Tag.tag_remove(
  40. object: 'Ticket',
  41. o_id: ticket.id,
  42. item: 'some tag',
  43. created_by_id: current_user.id,
  44. )
  45. or by ids
  46. Tag.tag_remove(
  47. tag_object_id: 123,
  48. o_id: ticket.id,
  49. tag_item_id: 123,
  50. created_by_id: current_user.id,
  51. )
  52. =end
  53. def self.tag_remove(data)
  54. # lookups
  55. if data[:object]
  56. data[:tag_object_id] = Tag::Object.lookup_by_name_and_create(data[:object]).id
  57. else
  58. data[:object] = Tag::Object.lookup(id: data[:tag_object_id]).name
  59. end
  60. if data[:item]
  61. data[:item].strip!
  62. data[:tag_item_id] = Tag::Item.lookup_by_name_and_create(data[:item]).id
  63. end
  64. # create history
  65. result = Tag.where(
  66. tag_object_id: data[:tag_object_id],
  67. tag_item_id: data[:tag_item_id],
  68. o_id: data[:o_id],
  69. )
  70. result.each(&:destroy)
  71. # touch reference
  72. touch_reference_by_params(data)
  73. true
  74. end
  75. =begin
  76. remove all tags of certain object
  77. Tag.tag_destroy(
  78. object: 'Ticket',
  79. o_id: ticket.id,
  80. created_by_id: current_user.id,
  81. )
  82. =end
  83. def self.tag_destroy(data)
  84. # lookups
  85. if data[:object]
  86. data[:tag_object_id] = Tag::Object.lookup_by_name_and_create(data[:object]).id
  87. else
  88. data[:object] = Tag::Object.lookup(id: data[:tag_object_id]).name
  89. end
  90. # create history
  91. result = Tag.where(
  92. tag_object_id: data[:tag_object_id],
  93. o_id: data[:o_id],
  94. )
  95. result.each(&:destroy)
  96. true
  97. end
  98. =begin
  99. tag list for certain object
  100. tags = Tag.tag_list(
  101. object: 'Ticket',
  102. o_id: ticket.id,
  103. )
  104. returns
  105. ['tag 1', 'tag2', ...]
  106. =end
  107. def self.tag_list(data)
  108. tag_object_id_requested = Tag::Object.lookup(name: data[:object])
  109. return [] if !tag_object_id_requested
  110. tag_search = Tag.where(
  111. tag_object_id: tag_object_id_requested,
  112. o_id: data[:o_id],
  113. )
  114. tags = []
  115. tag_search.each do |tag|
  116. tag_item = Tag::Item.lookup(id: tag.tag_item_id)
  117. next if !tag_item
  118. tags.push tag_item.name
  119. end
  120. tags
  121. end
  122. class Object < ApplicationModel
  123. validates :name, presence: true
  124. =begin
  125. lookup by name and create tag item
  126. tag_object = Tag::Object.lookup_by_name_and_create('some tag')
  127. =end
  128. def self.lookup_by_name_and_create(name)
  129. name.strip!
  130. tag_object = Tag::Object.lookup(name: name)
  131. return tag_object if tag_object
  132. Tag::Object.create(name: name)
  133. end
  134. end
  135. class Item < ApplicationModel
  136. validates :name, presence: true
  137. before_save :fill_namedowncase
  138. =begin
  139. lookup by name and create tag item
  140. tag_item = Tag::Item.lookup_by_name_and_create('some tag')
  141. =end
  142. def self.lookup_by_name_and_create(name)
  143. name.strip!
  144. tag_item = Tag::Item.lookup(name: name)
  145. return tag_item if tag_item
  146. Tag::Item.create(name: name)
  147. end
  148. =begin
  149. rename tag items
  150. Tag::Item.rename(
  151. id: existing_tag_item_to_rename,
  152. name: 'new tag item name',
  153. updated_by_id: current_user.id,
  154. )
  155. =end
  156. def self.rename(data)
  157. new_tag_name = data[:name].strip
  158. old_tag_item = Tag::Item.find(data[:id])
  159. already_existing_tag = Tag::Item.lookup(name: new_tag_name)
  160. # check if no remame is needed
  161. return true if new_tag_name == old_tag_item.name
  162. # merge old with new tag if already existing
  163. if already_existing_tag
  164. # re-assign old tag to already existing tag
  165. Tag.where(tag_item_id: old_tag_item.id).each do |tag|
  166. # check if tag already exists on object
  167. if Tag.find_by(tag_object_id: tag.tag_object_id, o_id: tag.o_id, tag_item_id: already_existing_tag.id)
  168. Tag.tag_remove(
  169. tag_object_id: tag.tag_object_id,
  170. o_id: tag.o_id,
  171. tag_item_id: old_tag_item.id,
  172. )
  173. next
  174. end
  175. # re-assign
  176. tag_object = Tag::Object.lookup(id: tag.tag_object_id)
  177. tag.tag_item_id = already_existing_tag.id
  178. tag.save
  179. # touch reference objects
  180. Tag.touch_reference_by_params(
  181. object: tag_object.name,
  182. o_id: tag.o_id,
  183. )
  184. end
  185. # delete not longer used tag
  186. old_tag_item.destroy
  187. return true
  188. end
  189. # update new tag name
  190. old_tag_item.name = new_tag_name
  191. old_tag_item.save
  192. # touch reference objects
  193. Tag.where(tag_item_id: old_tag_item.id).each do |tag|
  194. tag_object = Tag::Object.lookup(id: tag.tag_object_id)
  195. Tag.touch_reference_by_params(
  196. object: tag_object.name,
  197. o_id: tag.o_id,
  198. )
  199. end
  200. true
  201. end
  202. =begin
  203. remove tag item (destroy with reverences)
  204. Tag::Item.remove(id)
  205. =end
  206. def self.remove(id)
  207. # search for references, destroy and touch
  208. Tag.where(tag_item_id: id).each do |tag|
  209. tag_object = Tag::Object.lookup(id: tag.tag_object_id)
  210. tag.destroy
  211. Tag.touch_reference_by_params(
  212. object: tag_object.name,
  213. o_id: tag.o_id,
  214. )
  215. end
  216. Tag::Item.find(id).destroy
  217. true
  218. end
  219. def fill_namedowncase
  220. self.name_downcase = name.downcase
  221. true
  222. end
  223. end
  224. end