123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class KnowledgeBase::Answer::Translation < ApplicationModel
- include HasDefaultModelUserRelations
- include HasAgentAllowedParams
- include HasLinks
- include HasSearchIndexBackend
- include KnowledgeBase::Search
- include KnowledgeBase::HasUniqueTitle
- AGENT_ALLOWED_ATTRIBUTES = %i[title kb_locale_id].freeze
- AGENT_ALLOWED_NESTED_RELATIONS = %i[content].freeze
- belongs_to :kb_locale, class_name: 'KnowledgeBase::Locale', inverse_of: :answer_translations
- belongs_to :answer, class_name: 'KnowledgeBase::Answer', inverse_of: :translations, touch: true
- belongs_to :content, class_name: 'KnowledgeBase::Answer::Translation::Content', inverse_of: :translation, dependent: :destroy
- accepts_nested_attributes_for :content, update_only: true
- validates :title, presence: true, length: { maximum: 250 }
- validates :kb_locale_id, uniqueness: { case_sensitive: true, scope: :answer_id }
- scope :neighbours_of, ->(translation) { joins(:answer).where(knowledge_base_answers: { category_id: translation.answer&.category_id }) }
- alias assets_essential assets
- def assets(data = {})
- return data if assets_added_to?(data)
- data = super
- answer.assets(data)
- ApplicationModel::CanAssets.reduce inline_linked_objects, data
- end
- def to_param
- [answer_id, title.parameterize].join('-')
- end
- def search_index_attribute_lookup(include_references: true)
- attrs = super
- attrs.merge('title' => ActionController::Base.helpers.strip_tags(attrs['title']),
- 'content' => content&.search_index_attribute_lookup,
- 'scope_id' => answer.category_id,
- 'attachment' => answer.attachments_for_search_index_attribute_lookup,
- 'tags' => answer.tag_list)
- end
- def inline_linked_objects
- output = []
- scrubber = Loofah::Scrubber.new do |node|
- next if node.name != 'a'
- next if !node.key? 'data-target-type'
- case node['data-target-type']
- when 'knowledge-base-answer'
- if (translation = KnowledgeBase::Answer::Translation.find_by(id: node['data-target-id']))
- output.push translation
- end
- end
- end
- Loofah.scrub_fragment(content.body, scrubber)
- output
- end
- class << self
- def search_preferences(current_user)
- return false if !KnowledgeBase.exists? || !current_user.permissions?('knowledge_base.*')
- {
- prio: 1209,
- direct_search_index: false,
- }
- end
- def search_es_filter(es_response, _query, kb_locales, options)
- return es_response if options[:user]&.permissions?('knowledge_base.editor')
- answer_translations_id = es_response.pluck(:id)
- allowed_answer_translation_ids = KnowledgeBase::Answer
- .internal
- .joins(:translations)
- .where(knowledge_base_answer_translations: { id: answer_translations_id, kb_locale_id: kb_locales.map(&:id) })
- .pluck('knowledge_base_answer_translations.id')
- es_response.filter { |elem| allowed_answer_translation_ids.include? elem[:id].to_i }
- end
- def search_fallback(query, scope = nil, options: {})
- fields = %w[title]
- fields << KnowledgeBase::Answer::Translation::Content.arel_table[:body]
- output = where_or_cis(fields, query)
- .joins(:content)
- if !options[:user]&.permissions?('knowledge_base.editor')
- answer_ids = KnowledgeBase::Answer.internal.pluck(:id)
- output = output.where(answer_id: answer_ids)
- end
- if scope.present?
- output = output
- .joins(:answer)
- .where(knowledge_base_answers: { category_id: scope })
- end
- output
- end
- end
- end
|