mirror of
https://github.com/discourse/discourse.git
synced 2025-01-24 04:40:09 +08:00
187b0bfb43
* FEATURE: Show similar users when penalizing a user Moderators will be notified if other users with the same IP address exist before penalizing a user. * FEATURE: Allow staff to penalize multiple users This allows staff members to suspend or silence multiple users belonging to the same person.
187 lines
4.2 KiB
Ruby
187 lines
4.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class AdminDetailedUserSerializer < AdminUserSerializer
|
|
|
|
attributes :moderator,
|
|
:can_grant_admin,
|
|
:can_revoke_admin,
|
|
:can_grant_moderation,
|
|
:can_revoke_moderation,
|
|
:can_impersonate,
|
|
:like_count,
|
|
:like_given_count,
|
|
:post_count,
|
|
:topic_count,
|
|
:post_edits_count,
|
|
:flags_given_count,
|
|
:flags_received_count,
|
|
:private_topics_count,
|
|
:can_delete_all_posts,
|
|
:can_be_deleted,
|
|
:can_be_anonymized,
|
|
:can_be_merged,
|
|
:full_suspend_reason,
|
|
:suspended_till,
|
|
:silence_reason,
|
|
:penalty_counts,
|
|
:next_penalty,
|
|
:primary_group_id,
|
|
:badge_count,
|
|
:warnings_received_count,
|
|
:user_fields,
|
|
:bounce_score,
|
|
:reset_bounce_score_after,
|
|
:can_view_action_logs,
|
|
:second_factor_enabled,
|
|
:can_disable_second_factor,
|
|
:can_delete_sso_record,
|
|
:api_key_count,
|
|
:external_ids,
|
|
:similar_users,
|
|
:similar_users_count
|
|
|
|
has_one :approved_by, serializer: BasicUserSerializer, embed: :objects
|
|
has_one :suspended_by, serializer: BasicUserSerializer, embed: :objects
|
|
has_one :silenced_by, serializer: BasicUserSerializer, embed: :objects
|
|
has_one :tl3_requirements, serializer: TrustLevel3RequirementsSerializer, embed: :objects
|
|
has_many :groups, embed: :object, serializer: BasicGroupSerializer
|
|
|
|
def second_factor_enabled
|
|
object.totp_enabled? || object.security_keys_enabled?
|
|
end
|
|
|
|
def can_disable_second_factor
|
|
scope.is_admin? && (object&.id != scope.user.id)
|
|
end
|
|
|
|
def can_revoke_admin
|
|
scope.can_revoke_admin?(object)
|
|
end
|
|
|
|
def can_grant_admin
|
|
scope.can_grant_admin?(object)
|
|
end
|
|
|
|
def can_revoke_moderation
|
|
scope.can_revoke_moderation?(object)
|
|
end
|
|
|
|
def can_grant_moderation
|
|
scope.can_grant_moderation?(object)
|
|
end
|
|
|
|
def can_delete_all_posts
|
|
scope.can_delete_all_posts?(object)
|
|
end
|
|
|
|
def can_be_deleted
|
|
scope.can_delete_user?(object)
|
|
end
|
|
|
|
def can_be_anonymized
|
|
scope.can_anonymize_user?(object)
|
|
end
|
|
|
|
def can_be_merged
|
|
scope.can_merge_user?(object)
|
|
end
|
|
|
|
def topic_count
|
|
object.topics.count
|
|
end
|
|
|
|
def include_api_key?
|
|
scope.is_admin? && api_key.present?
|
|
end
|
|
|
|
def suspended_by
|
|
object.suspend_record.try(:acting_user)
|
|
end
|
|
|
|
def silence_reason
|
|
object.silence_reason
|
|
end
|
|
|
|
def penalty_counts
|
|
TrustLevel3Requirements.new(object).penalty_counts
|
|
end
|
|
|
|
def next_penalty
|
|
step_number = penalty_counts.total
|
|
steps = SiteSetting.penalty_step_hours.split('|')
|
|
step_number = [step_number, steps.length].min
|
|
penalty_hours = steps[step_number]
|
|
Integer(penalty_hours, 10).hours.from_now
|
|
rescue
|
|
nil
|
|
end
|
|
|
|
def silenced_by
|
|
object.silenced_record.try(:acting_user)
|
|
end
|
|
|
|
def include_tl3_requirements?
|
|
object.has_trust_level?(TrustLevel[2])
|
|
end
|
|
|
|
def include_user_fields?
|
|
object.user_fields.present?
|
|
end
|
|
|
|
def bounce_score
|
|
object.user_stat.bounce_score
|
|
end
|
|
|
|
def reset_bounce_score_after
|
|
object.user_stat.reset_bounce_score_after
|
|
end
|
|
|
|
def can_view_action_logs
|
|
scope.can_view_action_logs?(object)
|
|
end
|
|
|
|
def post_count
|
|
object.posts.count
|
|
end
|
|
|
|
def api_key_count
|
|
object.api_keys.active.count
|
|
end
|
|
|
|
def external_ids
|
|
external_ids = {}
|
|
|
|
object.user_associated_accounts.map do |user_associated_account|
|
|
external_ids[user_associated_account.provider_name] = user_associated_account.provider_uid
|
|
end
|
|
|
|
external_ids
|
|
end
|
|
|
|
def similar_users
|
|
ActiveModel::ArraySerializer.new(
|
|
@options[:similar_users],
|
|
each_serializer: AdminUserListSerializer,
|
|
each_serializer: SimilarAdminUserSerializer,
|
|
scope: scope,
|
|
root: false,
|
|
).as_json
|
|
end
|
|
|
|
def include_similar_users?
|
|
@options[:similar_users].present?
|
|
end
|
|
|
|
def similar_users_count
|
|
@options[:similar_users_count]
|
|
end
|
|
|
|
def include_similar_users_count?
|
|
@options[:similar_users].present?
|
|
end
|
|
|
|
def can_delete_sso_record
|
|
scope.can_delete_sso_record?(object)
|
|
end
|
|
end
|