mirror of
https://github.com/discourse/discourse.git
synced 2025-02-27 12:00:54 +08:00

Before, whispers were only available for staff members. Config has been changed to allow to configure privileged groups with access to whispers. Post migration was added to move from the old setting into the new one. I considered having a boolean column `whisperer` on user model similar to `admin/moderator` for performance reason. Finally, I decided to keep looking for groups as queries are only done for current user and didn't notice any N+1 queries.
91 lines
2.2 KiB
Ruby
91 lines
2.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Roleable
|
|
extend ActiveSupport::Concern
|
|
|
|
included do
|
|
scope :admins, -> { where(admin: true) }
|
|
scope :moderators, -> { where(moderator: true) }
|
|
scope :staff, -> { where("moderator or admin ") }
|
|
end
|
|
|
|
# any user that is either a moderator or an admin
|
|
def staff?
|
|
admin || moderator
|
|
end
|
|
|
|
def regular?
|
|
!staff?
|
|
end
|
|
|
|
def whisperer?
|
|
@whisperer ||= begin
|
|
return false if !SiteSetting.enable_whispers?
|
|
return true if staff?
|
|
whispers_allowed_group_ids = SiteSetting.whispers_allowed_group_ids
|
|
return false if whispers_allowed_group_ids.blank?
|
|
return true if whispers_allowed_group_ids.include?(primary_group_id)
|
|
group_users&.exists?(group_id: whispers_allowed_group_ids)
|
|
end
|
|
end
|
|
|
|
def grant_moderation!
|
|
return if moderator
|
|
set_permission('moderator', true)
|
|
auto_approve_user
|
|
enqueue_staff_welcome_message(:moderator)
|
|
set_default_notification_levels(:moderators)
|
|
end
|
|
|
|
def revoke_moderation!
|
|
set_permission('moderator', false)
|
|
end
|
|
|
|
def grant_admin!
|
|
return if admin
|
|
set_permission('admin', true)
|
|
auto_approve_user
|
|
enqueue_staff_welcome_message(:admin)
|
|
set_default_notification_levels(:admins)
|
|
end
|
|
|
|
def revoke_admin!
|
|
set_permission('admin', false)
|
|
end
|
|
|
|
def save_and_refresh_staff_groups!
|
|
transaction do
|
|
self.save!
|
|
Group.refresh_automatic_groups!(:admins, :moderators, :staff)
|
|
end
|
|
end
|
|
|
|
def set_permission(permission_name, value)
|
|
self.public_send("#{permission_name}=", value)
|
|
save_and_refresh_staff_groups!
|
|
end
|
|
|
|
def set_default_notification_levels(group_name)
|
|
Group.set_category_and_tag_default_notification_levels!(self, group_name)
|
|
if group_name == :admins || group_name == :moderators
|
|
Group.set_category_and_tag_default_notification_levels!(self, :staff)
|
|
end
|
|
end
|
|
|
|
def reload(options = nil)
|
|
@whisperer = nil
|
|
super(options)
|
|
end
|
|
|
|
private
|
|
|
|
def auto_approve_user
|
|
if reviewable = ReviewableUser.find_by(target: self, status: Reviewable.statuses[:pending])
|
|
reviewable.perform(Discourse.system_user, :approve_user, send_email: false)
|
|
else
|
|
ReviewableUser.set_approved_fields!(self, Discourse.system_user)
|
|
self.save!
|
|
end
|
|
end
|
|
end
|