translation.rb 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class KnowledgeBase::Answer::Translation < ApplicationModel
  3. include HasAgentAllowedParams
  4. include HasLinks
  5. include HasSearchIndexBackend
  6. include KnowledgeBase::Search
  7. include KnowledgeBase::HasUniqueTitle
  8. AGENT_ALLOWED_ATTRIBUTES = %i[title kb_locale_id].freeze
  9. AGENT_ALLOWED_NESTED_RELATIONS = %i[content].freeze
  10. belongs_to :kb_locale, class_name: 'KnowledgeBase::Locale', inverse_of: :answer_translations
  11. belongs_to :answer, class_name: 'KnowledgeBase::Answer', inverse_of: :translations, touch: true
  12. #belongs_to :updated_by, class_name: 'User', inverse_of: :answer_translations
  13. belongs_to :content, class_name: 'KnowledgeBase::Answer::Translation::Content', inverse_of: :translation, dependent: :destroy
  14. accepts_nested_attributes_for :content, update_only: true
  15. validates :title, presence: true, length: { maximum: 250 }
  16. validates :content, presence: true
  17. validates :kb_locale_id, uniqueness: { scope: :answer_id }
  18. scope :neighbours_of, ->(translation) { joins(:answer).where(knowledge_base_answers: { category_id: translation.answer&.category_id }) }
  19. alias assets_essential assets
  20. def attributes_with_association_ids
  21. key = "#{self.class}::aws::#{id}"
  22. cache = Cache.get(key)
  23. return cache if cache
  24. attrs = super
  25. attrs[:linked_references] = linked_references
  26. Cache.write(key, attrs)
  27. attrs
  28. end
  29. def assets(data = {})
  30. return data if assets_added_to?(data)
  31. data = super(data)
  32. data = Link.reduce_assets(data, linked_references)
  33. answer.assets(data)
  34. ApplicationModel::CanAssets.reduce inline_linked_objects, data
  35. end
  36. def to_param
  37. [answer_id, title.parameterize].join('-')
  38. end
  39. def search_index_attribute_lookup
  40. attrs = super
  41. attrs['title'] = ActionController::Base.helpers.strip_tags attrs['title']
  42. attrs['content'] = content.search_index_attribute_lookup if content
  43. attrs['scope_id'] = answer.category_id
  44. attrs['attachment'] = answer.attachments_for_search_index_attribute_lookup
  45. attrs
  46. end
  47. def linked_references
  48. Link.list(link_object: self.class.name, link_object_value: id)
  49. end
  50. def inline_linked_objects
  51. output = []
  52. scrubber = Loofah::Scrubber.new do |node|
  53. next if node.name != 'a'
  54. next if !node.key? 'data-target-type'
  55. case node['data-target-type']
  56. when 'knowledge-base-answer'
  57. if (translation = KnowledgeBase::Answer::Translation.find_by(id: node['data-target-id']))
  58. output.push translation
  59. end
  60. end
  61. end
  62. Loofah.scrub_fragment(content.body, scrubber)
  63. output
  64. end
  65. class << self
  66. def search_preferences(current_user)
  67. return false if !KnowledgeBase.exists? || !current_user.permissions?('knowledge_base.*')
  68. {
  69. prio: 1209,
  70. direct_search_index: false,
  71. }
  72. end
  73. def search_es_filter(es_response, _query, kb_locales, options)
  74. return es_response if options[:user]&.permissions?('knowledge_base.editor')
  75. answer_translations_id = es_response.pluck(:id)
  76. allowed_answer_translation_ids = KnowledgeBase::Answer
  77. .internal
  78. .joins(:translations)
  79. .where(knowledge_base_answer_translations: { id: answer_translations_id, kb_locale_id: kb_locales.map(&:id) })
  80. .pluck('knowledge_base_answer_translations.id')
  81. es_response.filter { |elem| allowed_answer_translation_ids.include? elem[:id].to_i }
  82. end
  83. def search_fallback(query, scope = nil, options: {})
  84. fields = %w[title]
  85. fields << KnowledgeBase::Answer::Translation::Content.arel_table[:body]
  86. output = where_or_cis(fields, query)
  87. .joins(:content)
  88. if !options[:user]&.permissions?('knowledge_base.editor')
  89. answer_ids = KnowledgeBase::Answer.internal.pluck(:id)
  90. output = output.where(answer_id: answer_ids)
  91. end
  92. if scope.present?
  93. output = output
  94. .joins(:answer)
  95. .where(knowledge_base_answers: { category_id: scope })
  96. end
  97. output
  98. end
  99. end
  100. end