item.rb 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Tag::Item < ApplicationModel
  3. validates :name, presence: true
  4. before_save :fill_namedowncase
  5. =begin
  6. lookup by name and create tag item
  7. tag_item = Tag::Item.lookup_by_name_and_create('some tag')
  8. =end
  9. def self.lookup_by_name_and_create(name)
  10. name.strip!
  11. tag_item = Tag::Item.lookup(name: name)
  12. return tag_item if tag_item
  13. Tag::Item.create(name: name)
  14. end
  15. =begin
  16. rename tag items
  17. Tag::Item.rename(
  18. id: existing_tag_item_to_rename,
  19. name: 'new tag item name',
  20. updated_by_id: current_user.id,
  21. )
  22. =end
  23. def self.rename(data)
  24. new_tag_name = data[:name].strip
  25. old_tag_item = Tag::Item.find(data[:id])
  26. already_existing_tag = Tag::Item.lookup(name: new_tag_name)
  27. # check if no rename is needed
  28. return true if new_tag_name == old_tag_item.name
  29. # merge old with new tag if already existing
  30. if already_existing_tag
  31. # re-assign old tag to already existing tag
  32. Tag.where(tag_item_id: old_tag_item.id).each do |tag|
  33. # check if tag already exists on object
  34. if Tag.exists?(tag_object_id: tag.tag_object_id, o_id: tag.o_id, tag_item_id: already_existing_tag.id)
  35. Tag.tag_remove(
  36. tag_object_id: tag.tag_object_id,
  37. o_id: tag.o_id,
  38. tag_item_id: old_tag_item.id,
  39. )
  40. next
  41. end
  42. # re-assign
  43. tag_object = Tag::Object.lookup(id: tag.tag_object_id)
  44. tag.tag_item_id = already_existing_tag.id
  45. tag.save
  46. # touch reference objects
  47. Tag.touch_reference_by_params(
  48. object: tag_object.name,
  49. o_id: tag.o_id,
  50. )
  51. end
  52. # delete not longer used tag
  53. old_tag_item.destroy
  54. return true
  55. end
  56. update_referenced_objects(old_tag_item.name, new_tag_name)
  57. # update new tag name
  58. old_tag_item.name = new_tag_name
  59. old_tag_item.save
  60. # touch reference objects
  61. Tag.where(tag_item_id: old_tag_item.id).each do |tag|
  62. tag_object = Tag::Object.lookup(id: tag.tag_object_id)
  63. Tag.touch_reference_by_params(
  64. object: tag_object.name,
  65. o_id: tag.o_id,
  66. )
  67. end
  68. true
  69. end
  70. =begin
  71. remove tag item (destroy with reverences)
  72. Tag::Item.remove(id)
  73. =end
  74. def self.remove(id)
  75. # search for references, destroy and touch
  76. Tag.where(tag_item_id: id).each do |tag|
  77. tag_object = Tag::Object.lookup(id: tag.tag_object_id)
  78. tag.destroy
  79. Tag.touch_reference_by_params(
  80. object: tag_object.name,
  81. o_id: tag.o_id,
  82. )
  83. end
  84. Tag::Item.find(id).destroy
  85. true
  86. end
  87. def fill_namedowncase
  88. self.name_downcase = name.downcase
  89. true
  90. end
  91. =begin
  92. Update referenced objects such as triggers, overviews, schedulers, and postmaster filters
  93. Specifically, the following fields are updated:
  94. Overview.condition
  95. Trigger.condition Trigger.perform
  96. Job.condition Job.perform
  97. PostmasterFilter.perform
  98. =end
  99. def self.update_referenced_objects(old_name, new_name)
  100. objects = Overview.all + Trigger.all + Job.all + PostmasterFilter.all
  101. objects.each do |object|
  102. changed = false
  103. if object.has_attribute?(:condition)
  104. changed |= update_condition_hash object.condition, old_name, new_name
  105. end
  106. if object.has_attribute?(:perform)
  107. changed |= update_condition_hash object.perform, old_name, new_name
  108. end
  109. object.save if changed
  110. end
  111. end
  112. def self.update_condition_hash(hash, old_name, new_name)
  113. changed = false
  114. hash.each do |key, condition|
  115. next if %w[ticket.tags x-zammad-ticket-tags].exclude? key
  116. next if condition[:value].split(', ').exclude? old_name
  117. condition[:value] = update_name(condition[:value], old_name, new_name)
  118. changed = true
  119. end
  120. changed
  121. end
  122. def self.update_name(condition, old_name, new_name)
  123. tags = condition.split(', ')
  124. return new_name if tags.size == 1
  125. tags = tags.map { |t| t == old_name ? new_name : t }
  126. tags.join(', ')
  127. end
  128. end