mirror of
https://github.com/discourse/discourse.git
synced 2026-08-08 17:53:55 +08:00
- Adds an activation filter (All / Activated / Not activated) to the Admin > Users > New tab so unverified accounts can be isolated in the UI. - Adds a bulk suspend action next to the existing bulk delete, plus a "Select all" / "Clear all" control so a whole page of accounts can be actioned at once. - Shows the suspend reason on the Suspended tab, mirroring the silenced tab. Already-suspended users are excluded from bulk suspension, and the penalty-reason columns are populated from a single batched query instead of one query per row. **SCREENSHOTS** <img width="1400" height="1200" alt="desktop-horizon-light-admin-users-activation-filter" src="https://github.com/user-attachments/assets/31165d10-42cb-479b-897c-fafeb3283526" /> <img width="1400" height="1200" alt="desktop-horizon-light-admin-users-bulk-select" src="https://github.com/user-attachments/assets/037e8149-2ac6-40de-aaae-0d0e443ec143" /> <img width="1400" height="1200" alt="desktop-horizon-light-admin-users-suspended" src="https://github.com/user-attachments/assets/e6dbefed-4aaf-49bb-a9bd-52c7253e14b6" /> <img width="1400" height="1200" alt="desktop-horizon-light-admin-users-bulk-suspend" src="https://github.com/user-attachments/assets/5bdf85ef-4e30-4d8d-b521-d8639c1a2b97" />
35 lines
727 B
Ruby
Vendored
35 lines
727 B
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
class User::Action::SuspendAndPublish < Service::ActionBase
|
|
option :user
|
|
option :position
|
|
option :guardian
|
|
option :total_size
|
|
option :suspend_until
|
|
option :reason
|
|
option :message, default: proc { nil }
|
|
|
|
def call
|
|
data = { position:, username: user.username, total: total_size }
|
|
::MessageBus.publish("/bulk-user-suspend", data.merge(suspend_user!), user_ids: [actor.id])
|
|
end
|
|
|
|
private
|
|
|
|
def actor
|
|
guardian.user
|
|
end
|
|
|
|
def suspend_user!
|
|
UserSuspender.new(
|
|
user,
|
|
suspended_till: suspend_until,
|
|
reason:,
|
|
by_user: actor,
|
|
message:,
|
|
).suspend
|
|
{ success: true }
|
|
rescue => err
|
|
{ failed: true, error: err.message }
|
|
end
|
|
end
|