discourse/app/serializers/post_serializer.rb

206 lines
4.6 KiB
Ruby
Raw Normal View History

class PostSerializer < BasicPostSerializer
2013-02-06 03:16:51 +08:00
# To pass in additional information we might need
attr_accessor :topic_slug
attr_accessor :topic_view
attr_accessor :parent_post
attr_accessor :add_raw
attr_accessor :single_post_link_counts
attr_accessor :draft_sequence
attr_accessor :post_actions
2013-02-06 03:16:51 +08:00
attributes :post_number,
2013-02-06 03:16:51 +08:00
:post_type,
:updated_at,
2013-02-07 23:45:24 +08:00
:reply_count,
:reply_to_post_number,
2013-02-06 03:16:51 +08:00
:quote_count,
:avg_time,
:incoming_link_count,
:reads,
:score,
:yours,
2013-02-07 23:45:24 +08:00
:topic_slug,
2013-02-06 03:16:51 +08:00
:topic_id,
:display_username,
:version,
:can_edit,
:can_delete,
:can_recover,
2013-02-06 03:16:51 +08:00
:link_counts,
:read,
:user_title,
2013-02-06 03:16:51 +08:00
:reply_to_user,
:bookmarked,
:raw,
:actions_summary,
2013-02-07 06:36:07 +08:00
:moderator?,
:staff?,
2013-02-07 23:45:24 +08:00
:user_id,
2013-02-06 03:16:51 +08:00
:draft_sequence,
:hidden,
2013-02-07 23:45:24 +08:00
:hidden_reason_id,
2013-07-11 02:56:00 +08:00
:trust_level,
:deleted_at,
:deleted_by,
:user_deleted
2013-02-06 03:16:51 +08:00
2013-02-07 06:36:07 +08:00
def moderator?
object.user.try(:moderator?) || false
2013-02-07 06:36:07 +08:00
end
def staff?
object.user.try(:staff?) || false
end
2013-02-06 03:16:51 +08:00
def yours
scope.user == object.user
end
def can_edit
scope.can_edit?(object)
end
def can_delete
scope.can_delete?(object)
end
def can_recover
scope.can_recover_post?(object)
end
def display_username
object.user.try(:name)
end
2013-02-06 03:16:51 +08:00
def link_counts
return @single_post_link_counts if @single_post_link_counts.present?
# TODO: This could be better, just porting the old one over
@topic_view.link_counts[object.id].map do |link|
result = {}
result[:url] = link[:url]
result[:internal] = link[:internal]
result[:reflection] = link[:reflection]
result[:title] = link[:title] if link[:title].present?
result[:clicks] = link[:clicks] || 0
result
end
end
def read
@topic_view.read?(object.post_number)
end
def score
object.score || 0
end
def version
object.cached_version
end
def user_title
object.user.try(:title)
end
def trust_level
object.user.try(:trust_level)
end
2013-02-06 03:16:51 +08:00
def reply_to_user
{
username: object.reply_to_user.username,
2013-08-14 04:08:29 +08:00
avatar_template: object.reply_to_user.avatar_template
2013-02-06 03:16:51 +08:00
}
end
def bookmarked
true
end
2013-07-11 04:19:42 +08:00
def deleted_by
BasicUserSerializer.new(object.deleted_by, root: false).as_json
end
def include_deleted_by?
scope.is_staff? && object.deleted_by.present?
2013-07-11 04:19:42 +08:00
end
2013-02-06 03:16:51 +08:00
# Summary of the actions taken on this post
def actions_summary
result = []
2013-03-01 20:07:44 +08:00
PostActionType.types.each do |sym, id|
2013-02-06 03:16:51 +08:00
next if [:bookmark].include?(sym)
count_col = "#{sym}_count".to_sym
count = object.send(count_col) if object.respond_to?(count_col)
count ||= 0
2013-02-07 23:45:24 +08:00
action_summary = {id: id,
count: count,
2013-02-06 03:16:51 +08:00
hidden: (sym == :vote),
can_act: scope.post_can_act?(object, sym, taken_actions: post_actions)}
2013-02-28 00:21:23 +08:00
# The following only applies if you're logged in
if action_summary[:can_act] && scope.current_user.present?
action_summary[:can_clear_flags] = scope.is_staff? && PostActionType.flag_types.values.include?(id)
end
2013-02-28 00:21:23 +08:00
if post_actions.present? && post_actions.has_key?(id)
action_summary[:acted] = true
action_summary[:can_undo] = scope.can_delete?(post_actions[id])
2013-02-06 03:16:51 +08:00
end
# only show public data
unless scope.is_staff? || PostActionType.public_types.values.include?(id)
2013-02-06 03:16:51 +08:00
action_summary[:count] = action_summary[:acted] ? 1 : 0
end
result << action_summary
end
result
end
2013-02-07 23:45:24 +08:00
def include_draft_sequence?
@draft_sequence.present?
2013-02-06 03:16:51 +08:00
end
def include_slug_title?
@topic_slug.present?
end
def include_raw?
2013-02-07 23:45:24 +08:00
@add_raw.present?
2013-02-06 03:16:51 +08:00
end
def include_link_counts?
return true if @single_post_link_counts.present?
@topic_view.present? && @topic_view.link_counts.present? && @topic_view.link_counts[object.id].present?
2013-02-06 03:16:51 +08:00
end
def include_read?
@topic_view.present?
end
def include_reply_to_user?
object.quoteless? && object.reply_to_user
2013-02-06 03:16:51 +08:00
end
def include_bookmarked?
post_actions.present? && post_actions.keys.include?(PostActionType.types[:bookmark])
2013-02-06 03:16:51 +08:00
end
def include_display_username?
SiteSetting.enable_names?
end
2013-02-06 03:16:51 +08:00
private
def post_actions
2013-02-07 23:45:24 +08:00
@post_actions ||= (@topic_view.present? && @topic_view.all_post_actions.present?) ? @topic_view.all_post_actions[object.id] : nil
2013-02-06 03:16:51 +08:00
end
end