Add option to include reported statuses in warning e-mail (#11639)
This commit is contained in:
parent
37f612074e
commit
73ca0bb925
12 changed files with 85 additions and 14 deletions
|
@ -5,7 +5,7 @@ module Admin
|
||||||
before_action :set_account
|
before_action :set_account
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@account_action = Admin::AccountAction.new(type: params[:type], report_id: params[:report_id], send_email_notification: true)
|
@account_action = Admin::AccountAction.new(type: params[:type], report_id: params[:report_id], send_email_notification: true, include_statuses: true)
|
||||||
@warning_presets = AccountWarningPreset.all
|
@warning_presets = AccountWarningPreset.all
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ module Admin
|
||||||
end
|
end
|
||||||
|
|
||||||
def resource_params
|
def resource_params
|
||||||
params.require(:admin_account_action).permit(:type, :report_id, :warning_preset_id, :text, :send_email_notification)
|
params.require(:admin_account_action).permit(:type, :report_id, :warning_preset_id, :text, :send_email_notification, :include_statuses)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -457,6 +457,13 @@ h5 {
|
||||||
.status {
|
.status {
|
||||||
padding-bottom: 32px;
|
padding-bottom: 32px;
|
||||||
|
|
||||||
|
&--highlighted {
|
||||||
|
border: 1px solid lighten($ui-base-color, 8%);
|
||||||
|
border-radius: 4px;
|
||||||
|
padding-bottom: 16px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
.status-header {
|
.status-header {
|
||||||
td {
|
td {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
|
|
@ -5,6 +5,7 @@ class UserMailer < Devise::Mailer
|
||||||
|
|
||||||
helper :application
|
helper :application
|
||||||
helper :instance
|
helper :instance
|
||||||
|
helper :statuses
|
||||||
|
|
||||||
add_template_helper RoutingHelper
|
add_template_helper RoutingHelper
|
||||||
|
|
||||||
|
@ -79,10 +80,11 @@ class UserMailer < Devise::Mailer
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def warning(user, warning)
|
def warning(user, warning, status_ids = nil)
|
||||||
@resource = user
|
@resource = user
|
||||||
@warning = warning
|
@warning = warning
|
||||||
@instance = Rails.configuration.x.local_domain
|
@instance = Rails.configuration.x.local_domain
|
||||||
|
@statuses = Status.where(id: status_ids).includes(:account) if status_ids.is_a?(Array)
|
||||||
|
|
||||||
I18n.with_locale(@resource.locale || I18n.default_locale) do
|
I18n.with_locale(@resource.locale || I18n.default_locale) do
|
||||||
mail to: @resource.email,
|
mail to: @resource.email,
|
||||||
|
|
|
@ -19,20 +19,25 @@ class Admin::AccountAction
|
||||||
:report_id,
|
:report_id,
|
||||||
:warning_preset_id
|
:warning_preset_id
|
||||||
|
|
||||||
attr_reader :warning, :send_email_notification
|
attr_reader :warning, :send_email_notification, :include_statuses
|
||||||
|
|
||||||
def send_email_notification=(value)
|
def send_email_notification=(value)
|
||||||
@send_email_notification = ActiveModel::Type::Boolean.new.cast(value)
|
@send_email_notification = ActiveModel::Type::Boolean.new.cast(value)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def include_statuses=(value)
|
||||||
|
@include_statuses = ActiveModel::Type::Boolean.new.cast(value)
|
||||||
|
end
|
||||||
|
|
||||||
def save!
|
def save!
|
||||||
ApplicationRecord.transaction do
|
ApplicationRecord.transaction do
|
||||||
process_action!
|
process_action!
|
||||||
process_warning!
|
process_warning!
|
||||||
end
|
end
|
||||||
|
|
||||||
queue_email!
|
process_email!
|
||||||
process_reports!
|
process_reports!
|
||||||
|
process_queue!
|
||||||
end
|
end
|
||||||
|
|
||||||
def report
|
def report
|
||||||
|
@ -110,7 +115,6 @@ class Admin::AccountAction
|
||||||
authorize(target_account, :suspend?)
|
authorize(target_account, :suspend?)
|
||||||
log_action(:suspend, target_account)
|
log_action(:suspend, target_account)
|
||||||
target_account.suspend!
|
target_account.suspend!
|
||||||
queue_suspension_worker!
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def text_for_warning
|
def text_for_warning
|
||||||
|
@ -121,16 +125,22 @@ class Admin::AccountAction
|
||||||
Admin::SuspensionWorker.perform_async(target_account.id)
|
Admin::SuspensionWorker.perform_async(target_account.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def queue_email!
|
def process_queue!
|
||||||
return unless warnable?
|
queue_suspension_worker! if type == 'suspend'
|
||||||
|
end
|
||||||
|
|
||||||
UserMailer.warning(target_account.user, warning).deliver_later!
|
def process_email!
|
||||||
|
UserMailer.warning(target_account.user, warning, status_ids).deliver_now! if warnable?
|
||||||
end
|
end
|
||||||
|
|
||||||
def warnable?
|
def warnable?
|
||||||
send_email_notification && target_account.local?
|
send_email_notification && target_account.local?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def status_ids
|
||||||
|
@report.status_ids if @report && include_statuses
|
||||||
|
end
|
||||||
|
|
||||||
def warning_preset
|
def warning_preset
|
||||||
@warning_preset ||= AccountWarningPreset.find(warning_preset_id) if warning_preset_id.present?
|
@warning_preset ||= AccountWarningPreset.find(warning_preset_id) if warning_preset_id.present?
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,6 +13,10 @@
|
||||||
.fields-group
|
.fields-group
|
||||||
= f.input :send_email_notification, as: :boolean, wrapper: :with_label
|
= f.input :send_email_notification, as: :boolean, wrapper: :with_label
|
||||||
|
|
||||||
|
- if params[:report_id].present?
|
||||||
|
.fields-group
|
||||||
|
= f.input :include_statuses, as: :boolean, wrapper: :with_label
|
||||||
|
|
||||||
%hr.spacer/
|
%hr.spacer/
|
||||||
|
|
||||||
- unless @warning_presets.empty?
|
- unless @warning_presets.empty?
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
- i ||= 0
|
- i ||= 0
|
||||||
|
- highlighted ||= false
|
||||||
|
|
||||||
%table.email-table{ cellspacing: 0, cellpadding: 0, dir: 'ltr' }
|
%table.email-table{ cellspacing: 0, cellpadding: 0, dir: 'ltr' }
|
||||||
%tbody
|
%tbody
|
||||||
|
@ -14,7 +15,7 @@
|
||||||
%table.column{ cellspacing: 0, cellpadding: 0 }
|
%table.column{ cellspacing: 0, cellpadding: 0 }
|
||||||
%tbody
|
%tbody
|
||||||
%tr
|
%tr
|
||||||
%td.column-cell.padded.status
|
%td.column-cell.padded.status{ class: highlighted ? 'status--highlighted' : '' }
|
||||||
%table.status-header{ cellspacing: 0, cellpadding: 0 }
|
%table.status-header{ cellspacing: 0, cellpadding: 0 }
|
||||||
%tbody
|
%tbody
|
||||||
%tr
|
%tr
|
||||||
|
@ -32,5 +33,10 @@
|
||||||
%div{ dir: rtl_status?(status) ? 'rtl' : 'ltr' }
|
%div{ dir: rtl_status?(status) ? 'rtl' : 'ltr' }
|
||||||
= Formatter.instance.format(status)
|
= Formatter.instance.format(status)
|
||||||
|
|
||||||
|
- if status.media_attachments.size > 0
|
||||||
|
%p
|
||||||
|
- status.media_attachments.each do |a|
|
||||||
|
= link_to medium_url(a), medium_url(a)
|
||||||
|
|
||||||
%p.status-footer
|
%p.status-footer
|
||||||
= link_to l(status.created_at), web_url("statuses/#{status.id}")
|
= link_to l(status.created_at), web_url("statuses/#{status.id}")
|
||||||
|
|
|
@ -42,6 +42,14 @@
|
||||||
- unless @warning.text.blank?
|
- unless @warning.text.blank?
|
||||||
= Formatter.instance.linkify(@warning.text)
|
= Formatter.instance.linkify(@warning.text)
|
||||||
|
|
||||||
|
- unless @statuses.empty?
|
||||||
|
%p
|
||||||
|
%strong= t('user_mailer.warning.statuses')
|
||||||
|
|
||||||
|
- unless @statuses.empty?
|
||||||
|
- @statuses.each_with_index do |status, i|
|
||||||
|
= render 'notification_mailer/status', status: status, i: i + 1, highlighted: true
|
||||||
|
|
||||||
%table.email-table{ cellspacing: 0, cellpadding: 0 }
|
%table.email-table{ cellspacing: 0, cellpadding: 0 }
|
||||||
%tbody
|
%tbody
|
||||||
%tr
|
%tr
|
||||||
|
@ -50,7 +58,7 @@
|
||||||
%table.content-section{ cellspacing: 0, cellpadding: 0 }
|
%table.content-section{ cellspacing: 0, cellpadding: 0 }
|
||||||
%tbody
|
%tbody
|
||||||
%tr
|
%tr
|
||||||
%td.content-cell
|
%td.content-cell{ class: @statuses.empty? ? '' : 'content-start' }
|
||||||
%table.column{ cellspacing: 0, cellpadding: 0 }
|
%table.column{ cellspacing: 0, cellpadding: 0 }
|
||||||
%tbody
|
%tbody
|
||||||
%tr
|
%tr
|
||||||
|
@ -61,3 +69,20 @@
|
||||||
%td.button-primary
|
%td.button-primary
|
||||||
= link_to about_more_url do
|
= link_to about_more_url do
|
||||||
%span= t 'user_mailer.warning.review_server_policies'
|
%span= t 'user_mailer.warning.review_server_policies'
|
||||||
|
|
||||||
|
%table.email-table{ cellspacing: 0, cellpadding: 0 }
|
||||||
|
%tbody
|
||||||
|
%tr
|
||||||
|
%td.email-body
|
||||||
|
.email-container
|
||||||
|
%table.content-section{ cellspacing: 0, cellpadding: 0 }
|
||||||
|
%tbody
|
||||||
|
%tr
|
||||||
|
%td.content-cell
|
||||||
|
.email-row
|
||||||
|
.col-6
|
||||||
|
%table.column{ cellspacing: 0, cellpadding: 0 }
|
||||||
|
%tbody
|
||||||
|
%tr
|
||||||
|
%td.column-cell.text-center
|
||||||
|
%p= t 'user_mailer.warning.get_in_touch', instance: @instance
|
||||||
|
|
|
@ -7,3 +7,16 @@
|
||||||
|
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= @warning.text %>
|
<%= @warning.text %>
|
||||||
|
<% unless @statuses.empty? %>
|
||||||
|
<%= t('user_mailer.warning.statuses') %>
|
||||||
|
|
||||||
|
<% @statuses.each do |status| %>
|
||||||
|
|
||||||
|
<%= render 'notification_mailer/status', status: status %>
|
||||||
|
---
|
||||||
|
<% end %>
|
||||||
|
<% else %>
|
||||||
|
---
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= t 'user_mailer.warning.get_in_touch', instance: @instance %>
|
||||||
|
|
|
@ -1115,7 +1115,9 @@ en:
|
||||||
disable: While your account is frozen, your account data remains intact, but you cannot perform any actions until it is unlocked.
|
disable: While your account is frozen, your account data remains intact, but you cannot perform any actions until it is unlocked.
|
||||||
silence: While your account is limited, only people who are already following you will see your toots on this server, and you may be excluded from various public listings. However, others may still manually follow you.
|
silence: While your account is limited, only people who are already following you will see your toots on this server, and you may be excluded from various public listings. However, others may still manually follow you.
|
||||||
suspend: Your account has been suspended, and all of your toots and your uploaded media files have been irreversibly removed from this server, and servers where you had followers.
|
suspend: Your account has been suspended, and all of your toots and your uploaded media files have been irreversibly removed from this server, and servers where you had followers.
|
||||||
|
get_in_touch: You can reply to this e-mail to get in touch with the staff of %{instance}.
|
||||||
review_server_policies: Review server policies
|
review_server_policies: Review server policies
|
||||||
|
statuses: 'Specifically, for:'
|
||||||
subject:
|
subject:
|
||||||
disable: Your account %{acct} has been frozen
|
disable: Your account %{acct} has been frozen
|
||||||
none: Warning for %{acct}
|
none: Warning for %{acct}
|
||||||
|
|
|
@ -5,6 +5,7 @@ en:
|
||||||
account_warning_preset:
|
account_warning_preset:
|
||||||
text: You can use toot syntax, such as URLs, hashtags and mentions
|
text: You can use toot syntax, such as URLs, hashtags and mentions
|
||||||
admin_account_action:
|
admin_account_action:
|
||||||
|
include_statuses: The user will see which toots have caused the moderation action or warning
|
||||||
send_email_notification: The user will receive an explanation of what happened with their account
|
send_email_notification: The user will receive an explanation of what happened with their account
|
||||||
text_html: Optional. You can use toot syntax. You can <a href="%{path}">add warning presets</a> to save time
|
text_html: Optional. You can use toot syntax. You can <a href="%{path}">add warning presets</a> to save time
|
||||||
type_html: Choose what to do with <strong>%{acct}</strong>
|
type_html: Choose what to do with <strong>%{acct}</strong>
|
||||||
|
@ -60,6 +61,7 @@ en:
|
||||||
account_warning_preset:
|
account_warning_preset:
|
||||||
text: Preset text
|
text: Preset text
|
||||||
admin_account_action:
|
admin_account_action:
|
||||||
|
include_statuses: Include reported toots in the e-mail
|
||||||
send_email_notification: Notify the user per e-mail
|
send_email_notification: Notify the user per e-mail
|
||||||
text: Custom warning
|
text: Custom warning
|
||||||
type: Action
|
type: Action
|
||||||
|
|
|
@ -42,6 +42,6 @@ class UserMailerPreview < ActionMailer::Preview
|
||||||
|
|
||||||
# Preview this email at http://localhost:3000/rails/mailers/user_mailer/warning
|
# Preview this email at http://localhost:3000/rails/mailers/user_mailer/warning
|
||||||
def warning
|
def warning
|
||||||
UserMailer.warning(User.first, AccountWarning.new(text: '', action: :silence))
|
UserMailer.warning(User.first, AccountWarning.new(text: '', action: :silence), [Status.first.id])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -58,8 +58,8 @@ RSpec.describe Admin::AccountAction, type: :model do
|
||||||
end.to change { Admin::ActionLog.count }.by 1
|
end.to change { Admin::ActionLog.count }.by 1
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'calls queue_email!' do
|
it 'calls process_email!' do
|
||||||
expect(account_action).to receive(:queue_email!)
|
expect(account_action).to receive(:process_email!)
|
||||||
subject
|
subject
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue