mirror of
https://github.com/discourse/discourse.git
synced 2024-12-01 11:45:19 +08:00
e52ccaa51f
If a group you're a member of is invited to a PM, you can no longer remove yourself from it. This means you won't be able to remove the message from your inbox, and even if you archive it, it'll come back once someone replies.
184 lines
4.7 KiB
Ruby
184 lines
4.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class TopicViewDetailsSerializer < ApplicationSerializer
|
|
|
|
def self.can_attributes
|
|
[:can_move_posts,
|
|
:can_delete,
|
|
:can_recover,
|
|
:can_remove_allowed_users,
|
|
:can_invite_to,
|
|
:can_invite_via_email,
|
|
:can_create_post,
|
|
:can_reply_as_new_topic,
|
|
:can_flag_topic,
|
|
:can_convert_topic,
|
|
:can_review_topic,
|
|
:can_edit_tags,
|
|
:can_publish_page,
|
|
:can_close_topic,
|
|
:can_archive_topic,
|
|
:can_split_merge_topic,
|
|
:can_edit_staff_notes,
|
|
:can_toggle_topic_visibility,
|
|
:can_moderate_category]
|
|
end
|
|
|
|
# NOTE: `can_edit` is defined as an attribute because we explicitly want
|
|
# it returned even if it has a value of `false`
|
|
attributes(
|
|
:can_edit,
|
|
:notification_level,
|
|
:notifications_reason_id,
|
|
*can_attributes,
|
|
:can_remove_self_id,
|
|
:participants,
|
|
:allowed_users
|
|
)
|
|
|
|
has_one :created_by, serializer: BasicUserSerializer, embed: :objects
|
|
has_one :last_poster, serializer: BasicUserSerializer, embed: :objects
|
|
has_many :links, serializer: TopicLinkSerializer, embed: :objects
|
|
has_many :participants, serializer: TopicPostCountSerializer, embed: :objects
|
|
has_many :allowed_users, serializer: BasicUserSerializer, embed: :objects
|
|
has_many :allowed_groups, serializer: BasicGroupSerializer, embed: :objects
|
|
|
|
def participants
|
|
object.post_counts_by_user.reject { |p| object.participants[p].blank? }.map do |pc|
|
|
{ user: object.participants[pc[0]], post_count: pc[1] }
|
|
end
|
|
end
|
|
|
|
def include_participants?
|
|
object.post_counts_by_user.present?
|
|
end
|
|
|
|
def include_links?
|
|
object.links.present?
|
|
end
|
|
|
|
def created_by
|
|
object.topic.user
|
|
end
|
|
|
|
def last_poster
|
|
object.topic.last_poster
|
|
end
|
|
|
|
def notification_level
|
|
object.topic_user&.notification_level || TopicUser.notification_levels[:regular]
|
|
end
|
|
|
|
def notifications_reason_id
|
|
object.topic_user.notifications_reason_id
|
|
end
|
|
|
|
def include_notifications_reason_id?
|
|
object.topic_user.present?
|
|
end
|
|
|
|
# confusingly this is an id, not a bool like all other `can` methods
|
|
def can_remove_self_id
|
|
scope.user.id
|
|
end
|
|
|
|
def include_can_remove_self_id?
|
|
scope.can_remove_allowed_users?(object.topic, scope.user)
|
|
end
|
|
|
|
can_attributes.each do |ca|
|
|
define_method(ca) { true }
|
|
end
|
|
|
|
# NOTE: A Category Group Moderator moving a topic to a different category
|
|
# may result in the 'can_edit?' result changing from `true` to `false`.
|
|
# Explictly returning a `false` value is required to update the client UI.
|
|
def can_edit
|
|
scope.can_edit?(object.topic)
|
|
end
|
|
|
|
def include_can_review_topic?
|
|
scope.can_review_topic?(object.topic)
|
|
end
|
|
|
|
def include_can_move_posts?
|
|
scope.can_move_posts?(object.topic)
|
|
end
|
|
|
|
def include_can_delete?
|
|
scope.can_delete?(object.topic)
|
|
end
|
|
|
|
def include_can_recover?
|
|
scope.can_recover_topic?(object.topic)
|
|
end
|
|
|
|
def include_can_remove_allowed_users?
|
|
scope.can_remove_allowed_users?(object.topic)
|
|
end
|
|
|
|
def include_can_invite_to?
|
|
scope.can_invite_to?(object.topic)
|
|
end
|
|
|
|
def include_can_invite_via_email?
|
|
scope.can_invite_via_email?(object.topic)
|
|
end
|
|
|
|
def include_can_create_post?
|
|
scope.can_create?(Post, object.topic)
|
|
end
|
|
|
|
def include_can_reply_as_new_topic?
|
|
scope.can_reply_as_new_topic?(object.topic)
|
|
end
|
|
|
|
def include_can_flag_topic?
|
|
object.actions_summary.any? { |a| a[:can_act] }
|
|
end
|
|
|
|
def include_can_convert_topic?
|
|
scope.can_convert_topic?(object.topic)
|
|
end
|
|
|
|
def include_can_edit_tags?
|
|
!scope.can_edit?(object.topic) && scope.can_edit_tags?(object.topic)
|
|
end
|
|
|
|
def include_can_toggle_topic_visibility?
|
|
scope.can_toggle_topic_visibility?(object.topic)
|
|
end
|
|
|
|
def can_perform_action_available_to_group_moderators?
|
|
@can_perform_action_available_to_group_moderators ||= scope.can_perform_action_available_to_group_moderators?(object.topic)
|
|
end
|
|
alias :include_can_close_topic? :can_perform_action_available_to_group_moderators?
|
|
alias :include_can_archive_topic? :can_perform_action_available_to_group_moderators?
|
|
alias :include_can_split_merge_topic? :can_perform_action_available_to_group_moderators?
|
|
alias :include_can_edit_staff_notes? :can_perform_action_available_to_group_moderators?
|
|
alias :include_can_moderate_category? :can_perform_action_available_to_group_moderators?
|
|
|
|
def include_can_publish_page?
|
|
scope.can_publish_page?(object.topic)
|
|
end
|
|
|
|
def allowed_users
|
|
object.topic.allowed_users.reject do |user|
|
|
object.group_allowed_user_ids.include?(user.id) && user != scope.user
|
|
end
|
|
end
|
|
|
|
def include_allowed_users?
|
|
object.personal_message
|
|
end
|
|
|
|
def allowed_groups
|
|
object.topic.allowed_groups
|
|
end
|
|
|
|
def include_allowed_groups?
|
|
object.personal_message
|
|
end
|
|
|
|
end
|