tag.rb 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Tag < ApplicationModel
  3. belongs_to :tag_object, class_name: 'Tag::Object', optional: true
  4. belongs_to :tag_item, class_name: 'Tag::Item', optional: true
  5. # the noop is needed since Layout/EmptyLines detects
  6. # the block commend below wrongly as the measurement of
  7. # the wanted indentation of the rubocop re-enabling above
  8. def noop; end
  9. =begin
  10. add tags for certain object
  11. Tag.tag_add(
  12. object: 'Ticket',
  13. o_id: ticket.id,
  14. item: 'some tag',
  15. created_by_id: current_user.id,
  16. )
  17. =end
  18. def self.tag_add(data)
  19. data[:item].strip!
  20. # lookups
  21. if data[:object]
  22. tag_object_id = Tag::Object.lookup_by_name_and_create(data[:object]).id
  23. end
  24. if data[:item]
  25. tag_item_id = Tag::Item.lookup_by_name_and_create(data[:item]).id
  26. end
  27. # return if duplicate
  28. current_tags = tag_list(data)
  29. return true if current_tags.include?(data[:item])
  30. # create history
  31. Tag.create(
  32. tag_object_id: tag_object_id,
  33. tag_item_id: tag_item_id,
  34. o_id: data[:o_id],
  35. created_by_id: data[:created_by_id],
  36. )
  37. # touch reference
  38. touch_reference_by_params(data)
  39. true
  40. end
  41. =begin
  42. remove tags of certain object
  43. Tag.tag_remove(
  44. object: 'Ticket',
  45. o_id: ticket.id,
  46. item: 'some tag',
  47. created_by_id: current_user.id,
  48. )
  49. or by ids
  50. Tag.tag_remove(
  51. tag_object_id: 123,
  52. o_id: ticket.id,
  53. tag_item_id: 123,
  54. created_by_id: current_user.id,
  55. )
  56. =end
  57. def self.tag_remove(data)
  58. # lookups
  59. if data[:object]
  60. data[:tag_object_id] = Tag::Object.lookup_by_name_and_create(data[:object]).id
  61. else
  62. data[:object] = Tag::Object.lookup(id: data[:tag_object_id]).name
  63. end
  64. if data[:item]
  65. data[:item].strip!
  66. data[:tag_item_id] = Tag::Item.lookup_by_name_and_create(data[:item]).id
  67. end
  68. # create history
  69. result = Tag.where(
  70. tag_object_id: data[:tag_object_id],
  71. tag_item_id: data[:tag_item_id],
  72. o_id: data[:o_id],
  73. )
  74. result.each(&:destroy)
  75. # touch reference
  76. touch_reference_by_params(data)
  77. true
  78. end
  79. =begin
  80. remove all tags of certain object
  81. Tag.tag_destroy(
  82. object: 'Ticket',
  83. o_id: ticket.id,
  84. created_by_id: current_user.id,
  85. )
  86. =end
  87. def self.tag_destroy(data)
  88. # lookups
  89. if data[:object]
  90. data[:tag_object_id] = Tag::Object.lookup_by_name_and_create(data[:object]).id
  91. else
  92. data[:object] = Tag::Object.lookup(id: data[:tag_object_id]).name
  93. end
  94. # create history
  95. result = Tag.where(
  96. tag_object_id: data[:tag_object_id],
  97. o_id: data[:o_id],
  98. )
  99. result.each(&:destroy)
  100. true
  101. end
  102. =begin
  103. tag list for certain object
  104. tags = Tag.tag_list(
  105. object: 'Ticket',
  106. o_id: ticket.id,
  107. )
  108. returns
  109. ['tag 1', 'tag2', ...]
  110. =end
  111. def self.tag_list(data)
  112. Tag.joins(:tag_item, :tag_object)
  113. .where(o_id: data[:o_id], tag_objects: { name: data[:object] })
  114. .order(:id)
  115. .pluck('tag_items.name')
  116. end
  117. end