link.rb 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Link < ApplicationModel
  3. belongs_to :link_type, class_name: 'Link::Type'
  4. belongs_to :link_object, class_name: 'Link::Object'
  5. @map = {
  6. 'normal' => 'normal',
  7. 'parent' => 'child',
  8. 'child' => 'parent',
  9. }
  10. =begin
  11. links = Link.list(
  12. link_object: 'Ticket',
  13. link_object_value: 1
  14. )
  15. =end
  16. def self.list(data)
  17. linkobject = link_object_get( name: data[:link_object] )
  18. return if !linkobject
  19. items = []
  20. # get links for one site
  21. list = Link.where(
  22. 'link_object_source_id = ? AND link_object_source_value = ?', linkobject.id, data[:link_object_value]
  23. )
  24. list.each { |item|
  25. link = {}
  26. link['link_type'] = @map[ Link::Type.find( item.link_type_id ).name ]
  27. link['link_object'] = Link::Object.find( item.link_object_target_id ).name
  28. link['link_object_value'] = item.link_object_target_value
  29. items.push link
  30. }
  31. # get links for the other site
  32. list = Link.where(
  33. 'link_object_target_id = ? AND link_object_target_value = ?', linkobject.id, data[:link_object_value]
  34. )
  35. list.each { |item|
  36. link = {}
  37. link['link_type'] = Link::Type.find( item.link_type_id ).name
  38. link['link_object'] = Link::Object.find( item.link_object_source_id ).name
  39. link['link_object_value'] = item.link_object_source_value
  40. items.push link
  41. }
  42. items
  43. end
  44. =begin
  45. Link.add(
  46. link_type: 'normal',
  47. link_object_source: 'Ticket',
  48. link_object_source_value: 6,
  49. link_object_target: 'Ticket',
  50. link_object_target_value: 31
  51. )
  52. Link.add(
  53. link_types_id: 12,
  54. link_object_source_id: 1,
  55. link_object_source_value: 1,
  56. link_object_target_id: 1,
  57. link_object_target_value: 1
  58. )
  59. =end
  60. def self.add(data)
  61. if data.key?(:link_type)
  62. linktype = link_type_get(name: data[:link_type])
  63. data[:link_type_id] = linktype.id
  64. data.delete(:link_type)
  65. end
  66. if data.key?(:link_object_source)
  67. linkobject = link_object_get(name: data[:link_object_source])
  68. data[:link_object_source_id] = linkobject.id
  69. touch_reference_by_params(
  70. object: data[:link_object_source],
  71. o_id: data[:link_object_source_value],
  72. )
  73. data.delete(:link_object_source)
  74. end
  75. if data.key?(:link_object_target)
  76. linkobject = link_object_get(name: data[:link_object_target])
  77. data[:link_object_target_id] = linkobject.id
  78. touch_reference_by_params(
  79. object: data[:link_object_target],
  80. o_id: data[:link_object_target_value],
  81. )
  82. data.delete(:link_object_target)
  83. end
  84. Link.create(data)
  85. end
  86. =begin
  87. Link.remove(
  88. link_type: 'normal',
  89. link_object_source: 'Ticket',
  90. link_object_source_value: 6,
  91. link_object_target: 'Ticket',
  92. link_object_target_value: 31
  93. )
  94. =end
  95. def self.remove(data)
  96. if data.key?(:link_object_source)
  97. linkobject = link_object_get(name: data[:link_object_source])
  98. data[:link_object_source_id] = linkobject.id
  99. end
  100. if data.key?(:link_object_target)
  101. linkobject = link_object_get(name: data[:link_object_target])
  102. data[:link_object_target_id] = linkobject.id
  103. end
  104. # from one site
  105. if data.key?(:link_type)
  106. linktype = link_type_get(name: data[:link_type])
  107. data[:link_type_id] = linktype.id
  108. end
  109. links = Link.where(
  110. link_type_id: data[:link_type_id],
  111. link_object_source_id: data[:link_object_source_id],
  112. link_object_source_value: data[:link_object_source_value],
  113. link_object_target_id: data[:link_object_target_id],
  114. link_object_target_value: data[:link_object_target_value]
  115. )
  116. # touch references
  117. links.each { |link|
  118. link.destroy
  119. touch_reference_by_params(
  120. object: Link::Object.lookup(id: link.link_object_source_id).name,
  121. o_id: link.link_object_source_value,
  122. )
  123. touch_reference_by_params(
  124. object: Link::Object.lookup(id: link.link_object_target_id).name,
  125. o_id: link.link_object_target_value,
  126. )
  127. }
  128. # from the other site
  129. if data.key?(:link_type)
  130. linktype = link_type_get(name: @map[ data[:link_type] ])
  131. data[:link_type_id] = linktype.id
  132. end
  133. links = Link.where(
  134. link_type_id: data[:link_type_id],
  135. link_object_target_id: data[:link_object_source_id],
  136. link_object_target_value: data[:link_object_source_value],
  137. link_object_source_id: data[:link_object_target_id],
  138. link_object_source_value: data[:link_object_target_value]
  139. )
  140. # touch references
  141. links.each { |link|
  142. link.destroy
  143. touch_reference_by_params(
  144. object: Link::Object.lookup(id: link.link_object_source_id).name,
  145. o_id: link.link_object_source_value,
  146. )
  147. touch_reference_by_params(
  148. object: Link::Object.lookup(id: link.link_object_target_id).name,
  149. o_id: link.link_object_target_value,
  150. )
  151. }
  152. end
  153. def self.link_type_get(data)
  154. linktype = Link::Type.find_by(name: data[:name])
  155. if !linktype
  156. linktype = Link::Type.create(name: data[:name])
  157. end
  158. linktype
  159. end
  160. def self.link_object_get(data)
  161. linkobject = Link::Object.find_by(name: data[:name])
  162. if !linkobject
  163. linkobject = Link::Object.create(name: data[:name])
  164. end
  165. linkobject
  166. end
  167. end
  168. class Link::Type < ApplicationModel
  169. validates :name, presence: true
  170. end
  171. class Link::Object < ApplicationModel
  172. validates :name, presence: true
  173. end