2019-06-04 03:40:48 +00:00
|
|
|
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
|
|
|
class KnowledgeBase::Answer < ApplicationModel
|
|
|
|
include HasTranslations
|
|
|
|
include HasAgentAllowedParams
|
|
|
|
include CanBePublished
|
|
|
|
include HasKnowledgeBaseAttachmentPermissions
|
|
|
|
include ChecksKbClientNotification
|
|
|
|
|
|
|
|
AGENT_ALLOWED_ATTRIBUTES = %i[category_id promoted internal_note].freeze
|
|
|
|
AGENT_ALLOWED_NESTED_RELATIONS = %i[translations].freeze
|
|
|
|
|
|
|
|
belongs_to :category, class_name: 'KnowledgeBase::Category', inverse_of: :answers, touch: true
|
|
|
|
|
|
|
|
scope :include_contents, -> { eager_load(translations: :content) }
|
|
|
|
scope :sorted, -> { order(position: :asc) }
|
|
|
|
|
|
|
|
acts_as_list scope: :category, top_of_list: 0
|
|
|
|
|
|
|
|
validates :category, presence: true
|
|
|
|
|
|
|
|
alias assets_essential assets
|
|
|
|
|
|
|
|
def attributes_with_association_ids
|
|
|
|
key = "#{self.class}::aws::#{id}"
|
|
|
|
|
|
|
|
cache = Cache.get(key)
|
|
|
|
return cache if cache
|
|
|
|
|
|
|
|
attrs = super
|
|
|
|
|
|
|
|
attrs[:attachments] = attachments_sorted.map { |elem| self.class.attachment_to_hash(elem) }
|
|
|
|
|
|
|
|
Cache.write(key, attrs)
|
|
|
|
|
|
|
|
attrs
|
|
|
|
end
|
|
|
|
|
|
|
|
def assets(data = {})
|
|
|
|
return data if assets_added_to?(data)
|
|
|
|
|
|
|
|
data = super(data)
|
|
|
|
data = category.assets(data)
|
|
|
|
|
|
|
|
# include all siblings to make sure ordering is always up to date. Reader gets only accessible siblings.
|
|
|
|
siblings = category.answers
|
|
|
|
|
|
|
|
if !User.lookup(id: UserInfo.current_user_id)&.permissions?('knowledge_base.editor')
|
|
|
|
siblings = siblings.internal
|
|
|
|
end
|
|
|
|
|
|
|
|
data = ApplicationModel::CanAssets.reduce(siblings, data)
|
2019-06-28 11:38:49 +00:00
|
|
|
ApplicationModel::CanAssets.reduce(translations, data)
|
2019-06-04 03:40:48 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
attachments_cleanup!
|
|
|
|
|
|
|
|
def attachments_sorted
|
|
|
|
attachments.sort_by { |elem| elem.filename.downcase }
|
|
|
|
end
|
|
|
|
|
|
|
|
def api_url
|
|
|
|
Rails.application.routes.url_helpers.knowledge_base_answer_path(category.knowledge_base, self)
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def reordering_callback
|
|
|
|
return if !category_id_changed? && !position_changed?
|
|
|
|
|
|
|
|
# drop siblings cache to make sure orderign is always up to date
|
|
|
|
category.answers.each(&:cache_delete)
|
|
|
|
end
|
|
|
|
before_save :reordering_callback
|
|
|
|
|
|
|
|
class << self
|
|
|
|
def attachment_to_hash(attachment)
|
|
|
|
url = Rails.application.routes.url_helpers.attachment_path(attachment.id)
|
|
|
|
|
|
|
|
{
|
|
|
|
id: attachment.id,
|
|
|
|
url: url,
|
|
|
|
preview_url: url + '?preview=1',
|
|
|
|
filename: attachment.filename,
|
|
|
|
size: attachment.size,
|
|
|
|
preferences: attachment.preferences
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|