Add batch actions for approving and rejecting pending accounts (#10469)
This commit is contained in:
		
							parent
							
								
									2c63e0292a
								
							
						
					
					
						commit
						e1d0390e29
					
				
					 8 changed files with 130 additions and 3 deletions
				
			
		
							
								
								
									
										52
									
								
								app/controllers/admin/pending_accounts_controller.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								app/controllers/admin/pending_accounts_controller.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,52 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
module Admin
 | 
			
		||||
  class PendingAccountsController < BaseController
 | 
			
		||||
    before_action :set_accounts, only: :index
 | 
			
		||||
 | 
			
		||||
    def index
 | 
			
		||||
      @form = Form::AccountBatch.new
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def update
 | 
			
		||||
      @form = Form::AccountBatch.new(form_account_batch_params.merge(current_account: current_account, action: action_from_button))
 | 
			
		||||
      @form.save
 | 
			
		||||
    rescue ActionController::ParameterMissing
 | 
			
		||||
      # Do nothing
 | 
			
		||||
    ensure
 | 
			
		||||
      redirect_to admin_pending_accounts_path(current_params)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def approve_all
 | 
			
		||||
      Form::AccountBatch.new(account_ids: User.pending.pluck(:account_id), action: 'approve').save
 | 
			
		||||
      redirect_to admin_pending_accounts_path(current_params)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def reject_all
 | 
			
		||||
      Form::AccountBatch.new(account_ids: User.pending.pluck(:account_id), action: 'reject').save
 | 
			
		||||
      redirect_to admin_pending_accounts_path(current_params)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    private
 | 
			
		||||
 | 
			
		||||
    def set_accounts
 | 
			
		||||
      @accounts = Account.joins(:user).merge(User.pending).page(params[:page])
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def form_account_batch_params
 | 
			
		||||
      params.require(:form_account_batch).permit(:action, account_ids: [])
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def action_from_button
 | 
			
		||||
      if params[:approve]
 | 
			
		||||
        'approve'
 | 
			
		||||
      elsif params[:reject]
 | 
			
		||||
        'reject'
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def current_params
 | 
			
		||||
      params.slice(:page).permit(:page)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
 | 
			
		||||
class Form::AccountBatch
 | 
			
		||||
  include ActiveModel::Model
 | 
			
		||||
  include Authorization
 | 
			
		||||
 | 
			
		||||
  attr_accessor :account_ids, :action, :current_account
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -13,6 +14,10 @@ class Form::AccountBatch
 | 
			
		|||
      remove_from_followers!
 | 
			
		||||
    when 'block_domains'
 | 
			
		||||
      block_domains!
 | 
			
		||||
    when 'approve'
 | 
			
		||||
      approve!
 | 
			
		||||
    when 'reject'
 | 
			
		||||
      reject!
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -57,4 +62,18 @@ class Form::AccountBatch
 | 
			
		|||
 | 
			
		||||
    ActivityPub::DeliveryWorker.perform_async(json, current_account.id, follow.account.inbox_url)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def approve!
 | 
			
		||||
    users = accounts.includes(:user).map(&:user)
 | 
			
		||||
 | 
			
		||||
    users.each { |user| authorize(user, :approve?) }
 | 
			
		||||
         .each(&:approve!)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def reject!
 | 
			
		||||
    records = accounts.includes(:user)
 | 
			
		||||
 | 
			
		||||
    records.each { |account| authorize(account.user, :reject?) }
 | 
			
		||||
           .each { |account| SuspendAccountService.new.call(account, including_user: true, destroy: true, skip_distribution: true) }
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,7 @@
 | 
			
		|||
  .filter-subset
 | 
			
		||||
    %strong= t('admin.accounts.moderation.title')
 | 
			
		||||
    %ul
 | 
			
		||||
      %li= filter_link_to t('admin.accounts.moderation.pending'), pending: '1', silenced: nil, suspended: nil
 | 
			
		||||
      %li= link_to safe_join([t('admin.accounts.moderation.pending'), "(#{number_with_delimiter(User.pending.count)})"], ' '), admin_pending_accounts_path
 | 
			
		||||
      %li= filter_link_to t('admin.accounts.moderation.active'), silenced: nil, suspended: nil, pending: nil
 | 
			
		||||
      %li= filter_link_to t('admin.accounts.moderation.silenced'), silenced: '1', suspended: nil, pending: nil
 | 
			
		||||
      %li= filter_link_to t('admin.accounts.moderation.suspended'), suspended: '1', silenced: nil, pending: nil
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										14
									
								
								app/views/admin/pending_accounts/_account.html.haml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								app/views/admin/pending_accounts/_account.html.haml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
.batch-table__row
 | 
			
		||||
  %label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox
 | 
			
		||||
    = f.check_box :account_ids, { multiple: true, include_hidden: false }, account.id
 | 
			
		||||
  .batch-table__row__content.batch-table__row__content--unpadded
 | 
			
		||||
    %table.accounts-table
 | 
			
		||||
      %tbody
 | 
			
		||||
        %tr
 | 
			
		||||
          %td
 | 
			
		||||
            = account.user_email
 | 
			
		||||
            = "(@#{account.username})"
 | 
			
		||||
            %br/
 | 
			
		||||
            = account.user_current_sign_in_ip
 | 
			
		||||
          %td.accounts-table__count
 | 
			
		||||
            = table_link_to 'pencil', t('admin.accounts.edit'), admin_account_path(account.id)
 | 
			
		||||
							
								
								
									
										33
									
								
								app/views/admin/pending_accounts/index.html.haml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								app/views/admin/pending_accounts/index.html.haml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
- content_for :page_title do
 | 
			
		||||
  = t('admin.pending_accounts.title', count: User.pending.count)
 | 
			
		||||
 | 
			
		||||
- content_for :header_tags do
 | 
			
		||||
  = javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous'
 | 
			
		||||
 | 
			
		||||
= form_for(@form, url: admin_pending_accounts_path, method: :patch) do |f|
 | 
			
		||||
  = hidden_field_tag :page, params[:page] || 1
 | 
			
		||||
 | 
			
		||||
  .batch-table
 | 
			
		||||
    .batch-table__toolbar
 | 
			
		||||
      %label.batch-table__toolbar__select.batch-checkbox-all
 | 
			
		||||
        = check_box_tag :batch_checkbox_all, nil, false
 | 
			
		||||
      .batch-table__toolbar__actions
 | 
			
		||||
        = f.button safe_join([fa_icon('check'), t('admin.accounts.approve')]), name: :approve, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
 | 
			
		||||
 | 
			
		||||
        = f.button safe_join([fa_icon('times'), t('admin.accounts.reject')]), name: :reject, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
 | 
			
		||||
    .batch-table__body
 | 
			
		||||
      - if @accounts.empty?
 | 
			
		||||
        = nothing_here 'nothing-here--under-tabs'
 | 
			
		||||
      - else
 | 
			
		||||
        = render partial: 'account', collection: @accounts, locals: { f: f }
 | 
			
		||||
 | 
			
		||||
= paginate @accounts
 | 
			
		||||
 | 
			
		||||
%hr.spacer/
 | 
			
		||||
 | 
			
		||||
%div{ style: 'overflow: hidden' }
 | 
			
		||||
  %div{ style: 'float: right' }
 | 
			
		||||
    = link_to t('admin.accounts.reject_all'), reject_all_admin_pending_accounts_path, method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive'
 | 
			
		||||
 | 
			
		||||
  %div
 | 
			
		||||
    = link_to t('admin.accounts.approve_all'), approve_all_admin_pending_accounts_path, method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button'
 | 
			
		||||
| 
						 | 
				
			
			@ -330,6 +330,8 @@ en:
 | 
			
		|||
        expired: Expired
 | 
			
		||||
        title: Filter
 | 
			
		||||
      title: Invites
 | 
			
		||||
    pending_accounts:
 | 
			
		||||
      title: Pending accounts (%{count})
 | 
			
		||||
    relays:
 | 
			
		||||
      add_new: Add new relay
 | 
			
		||||
      delete: Delete
 | 
			
		||||
| 
						 | 
				
			
			@ -496,7 +498,7 @@ en:
 | 
			
		|||
    salutation: "%{name},"
 | 
			
		||||
    settings: 'Change e-mail preferences: %{link}'
 | 
			
		||||
    view: 'View:'
 | 
			
		||||
    view_profile: View Profile
 | 
			
		||||
    view_profile: View profile
 | 
			
		||||
    view_status: View status
 | 
			
		||||
  applications:
 | 
			
		||||
    created: Application successfully created
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,7 @@ SimpleNavigation::Configuration.run do |navigation|
 | 
			
		|||
    primary.item :moderation, safe_join([fa_icon('gavel fw'), t('moderation.title')]), admin_reports_url, if: proc { current_user.staff? } do |admin|
 | 
			
		||||
      admin.item :action_logs, safe_join([fa_icon('bars fw'), t('admin.action_logs.title')]), admin_action_logs_url
 | 
			
		||||
      admin.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_url, highlights_on: %r{/admin/reports}
 | 
			
		||||
      admin.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_url, highlights_on: %r{/admin/accounts}
 | 
			
		||||
      admin.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_url, highlights_on: %r{/admin/accounts|/admin/pending_accounts}
 | 
			
		||||
      admin.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path
 | 
			
		||||
      admin.item :tags, safe_join([fa_icon('tag fw'), t('admin.tags.title')]), admin_tags_path
 | 
			
		||||
      admin.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_url(limited: '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks}, if: -> { current_user.admin? }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -214,6 +214,13 @@ Rails.application.routes.draw do
 | 
			
		|||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    resources :pending_accounts, only: [:index, :update] do
 | 
			
		||||
      collection do
 | 
			
		||||
        post :approve_all
 | 
			
		||||
        post :reject_all
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    resources :users, only: [] do
 | 
			
		||||
      resource :two_factor_authentication, only: [:destroy]
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue