* Implement Assignment of Reports (#6967) * Change translation of admin.report.comment.label to "Report Comment" for clarity As we'll soon add the ability for reports to have comments on them, this clarification makes sense. * Implement notes for Reports This enables moderators to leave comments about a report whilst they work on it * Fix display of report moderation notes * Allow reports to be reopened / marked as unresolved * Redirect to reports listing upon resolution of report * Implement "resolve with note" functionality * Add inverse relationship for report notes * Remove additional database querying when loading report notes * Fix tests for reports * Fix localisations for report notes / reports
This commit is contained in:
parent
36eac8ba90
commit
e85cffb236
17 changed files with 290 additions and 25 deletions
49
app/controllers/admin/report_notes_controller.rb
Normal file
49
app/controllers/admin/report_notes_controller.rb
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Admin
|
||||||
|
class ReportNotesController < BaseController
|
||||||
|
before_action :set_report_note, only: [:destroy]
|
||||||
|
|
||||||
|
def create
|
||||||
|
authorize ReportNote, :create?
|
||||||
|
|
||||||
|
@report_note = current_account.report_notes.new(resource_params)
|
||||||
|
|
||||||
|
if @report_note.save
|
||||||
|
if params[:create_and_resolve]
|
||||||
|
@report_note.report.update!(action_taken: true, action_taken_by_account_id: current_account.id)
|
||||||
|
log_action :resolve, @report_note.report
|
||||||
|
|
||||||
|
redirect_to admin_reports_path, notice: I18n.t('admin.reports.resolved_msg')
|
||||||
|
else
|
||||||
|
redirect_to admin_report_path(@report_note.report_id), notice: I18n.t('admin.report_notes.created_msg')
|
||||||
|
end
|
||||||
|
else
|
||||||
|
@report = @report_note.report
|
||||||
|
@report_notes = @report.notes.latest
|
||||||
|
@form = Form::StatusBatch.new
|
||||||
|
|
||||||
|
render template: 'admin/reports/show'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
authorize @report_note, :destroy?
|
||||||
|
@report_note.destroy!
|
||||||
|
redirect_to admin_report_path(@report_note.report_id), notice: I18n.t('admin.report_notes.destroyed_msg')
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def resource_params
|
||||||
|
params.require(:report_note).permit(
|
||||||
|
:content,
|
||||||
|
:report_id
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_report_note
|
||||||
|
@report_note = ReportNote.find(params[:id])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -11,19 +11,35 @@ module Admin
|
||||||
|
|
||||||
def show
|
def show
|
||||||
authorize @report, :show?
|
authorize @report, :show?
|
||||||
|
@report_note = @report.notes.new
|
||||||
|
@report_notes = @report.notes.latest
|
||||||
@form = Form::StatusBatch.new
|
@form = Form::StatusBatch.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
authorize @report, :update?
|
authorize @report, :update?
|
||||||
process_report
|
process_report
|
||||||
|
|
||||||
|
if @report.action_taken?
|
||||||
|
redirect_to admin_reports_path, notice: I18n.t('admin.reports.resolved_msg')
|
||||||
|
else
|
||||||
redirect_to admin_report_path(@report)
|
redirect_to admin_report_path(@report)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def process_report
|
def process_report
|
||||||
case params[:outcome].to_s
|
case params[:outcome].to_s
|
||||||
|
when 'assign_to_self'
|
||||||
|
@report.update!(assigned_account_id: current_account.id)
|
||||||
|
log_action :assigned_to_self, @report
|
||||||
|
when 'unassign'
|
||||||
|
@report.update!(assigned_account_id: nil)
|
||||||
|
log_action :unassigned, @report
|
||||||
|
when 'reopen'
|
||||||
|
@report.update!(action_taken: false, action_taken_by_account_id: nil)
|
||||||
|
log_action :reopen, @report
|
||||||
when 'resolve'
|
when 'resolve'
|
||||||
@report.update!(action_taken_by_current_attributes)
|
@report.update!(action_taken_by_current_attributes)
|
||||||
log_action :resolve, @report
|
log_action :resolve, @report
|
||||||
|
@ -32,11 +48,13 @@ module Admin
|
||||||
log_action :resolve, @report
|
log_action :resolve, @report
|
||||||
log_action :suspend, @report.target_account
|
log_action :suspend, @report.target_account
|
||||||
resolve_all_target_account_reports
|
resolve_all_target_account_reports
|
||||||
|
@report.reload
|
||||||
when 'silence'
|
when 'silence'
|
||||||
@report.target_account.update!(silenced: true)
|
@report.target_account.update!(silenced: true)
|
||||||
log_action :resolve, @report
|
log_action :resolve, @report
|
||||||
log_action :silence, @report.target_account
|
log_action :silence, @report.target_account
|
||||||
resolve_all_target_account_reports
|
resolve_all_target_account_reports
|
||||||
|
@report.reload
|
||||||
else
|
else
|
||||||
raise ActiveRecord::RecordNotFound
|
raise ActiveRecord::RecordNotFound
|
||||||
end
|
end
|
||||||
|
|
|
@ -86,7 +86,7 @@ module Admin::ActionLogsHelper
|
||||||
opposite_verbs?(log) ? 'negative' : 'positive'
|
opposite_verbs?(log) ? 'negative' : 'positive'
|
||||||
when :update, :reset_password, :disable_2fa, :memorialize
|
when :update, :reset_password, :disable_2fa, :memorialize
|
||||||
'neutral'
|
'neutral'
|
||||||
when :demote, :silence, :disable, :suspend, :remove_avatar
|
when :demote, :silence, :disable, :suspend, :remove_avatar, :reopen
|
||||||
'negative'
|
'negative'
|
||||||
when :destroy
|
when :destroy
|
||||||
opposite_verbs?(log) ? 'positive' : 'negative'
|
opposite_verbs?(log) ? 'positive' : 'negative'
|
||||||
|
|
|
@ -95,6 +95,8 @@ class Account < ApplicationRecord
|
||||||
has_many :reports
|
has_many :reports
|
||||||
has_many :targeted_reports, class_name: 'Report', foreign_key: :target_account_id
|
has_many :targeted_reports, class_name: 'Report', foreign_key: :target_account_id
|
||||||
|
|
||||||
|
has_many :report_notes, dependent: :destroy
|
||||||
|
|
||||||
# Moderation notes
|
# Moderation notes
|
||||||
has_many :account_moderation_notes, dependent: :destroy
|
has_many :account_moderation_notes, dependent: :destroy
|
||||||
has_many :targeted_moderation_notes, class_name: 'AccountModerationNote', foreign_key: :target_account_id, dependent: :destroy
|
has_many :targeted_moderation_notes, class_name: 'AccountModerationNote', foreign_key: :target_account_id, dependent: :destroy
|
||||||
|
|
|
@ -12,12 +12,16 @@
|
||||||
# account_id :integer not null
|
# account_id :integer not null
|
||||||
# action_taken_by_account_id :integer
|
# action_taken_by_account_id :integer
|
||||||
# target_account_id :integer not null
|
# target_account_id :integer not null
|
||||||
|
# assigned_account_id :integer
|
||||||
#
|
#
|
||||||
|
|
||||||
class Report < ApplicationRecord
|
class Report < ApplicationRecord
|
||||||
belongs_to :account
|
belongs_to :account
|
||||||
belongs_to :target_account, class_name: 'Account'
|
belongs_to :target_account, class_name: 'Account'
|
||||||
belongs_to :action_taken_by_account, class_name: 'Account', optional: true
|
belongs_to :action_taken_by_account, class_name: 'Account', optional: true
|
||||||
|
belongs_to :assigned_account, class_name: 'Account', optional: true
|
||||||
|
|
||||||
|
has_many :notes, class_name: 'ReportNote', foreign_key: :report_id, inverse_of: :report, dependent: :destroy
|
||||||
|
|
||||||
scope :unresolved, -> { where(action_taken: false) }
|
scope :unresolved, -> { where(action_taken: false) }
|
||||||
scope :resolved, -> { where(action_taken: true) }
|
scope :resolved, -> { where(action_taken: true) }
|
||||||
|
|
21
app/models/report_note.rb
Normal file
21
app/models/report_note.rb
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: report_notes
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# content :text not null
|
||||||
|
# report_id :integer not null
|
||||||
|
# account_id :integer not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
|
class ReportNote < ApplicationRecord
|
||||||
|
belongs_to :account
|
||||||
|
belongs_to :report, inverse_of: :notes
|
||||||
|
|
||||||
|
scope :latest, -> { reorder('created_at ASC') }
|
||||||
|
|
||||||
|
validates :content, presence: true, length: { maximum: 500 }
|
||||||
|
end
|
17
app/policies/report_note_policy.rb
Normal file
17
app/policies/report_note_policy.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class ReportNotePolicy < ApplicationPolicy
|
||||||
|
def create?
|
||||||
|
staff?
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy?
|
||||||
|
admin? || owner?
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def owner?
|
||||||
|
record.account_id == current_account&.id
|
||||||
|
end
|
||||||
|
end
|
11
app/views/admin/report_notes/_report_note.html.haml
Normal file
11
app/views/admin/report_notes/_report_note.html.haml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
%tr
|
||||||
|
%td
|
||||||
|
%p
|
||||||
|
%strong= report_note.account.acct
|
||||||
|
on
|
||||||
|
%time.formatted{ datetime: report_note.created_at.iso8601, title: l(report_note.created_at) }
|
||||||
|
= l report_note.created_at
|
||||||
|
= table_link_to 'trash', t('admin.reports.notes.delete'), admin_report_note_path(report_note), method: :delete if can?(:destroy, report_note)
|
||||||
|
%br/
|
||||||
|
%br/
|
||||||
|
= simple_format(h(report_note.content))
|
|
@ -17,5 +17,10 @@
|
||||||
%span{ title: t('admin.accounts.media_attachments') }
|
%span{ title: t('admin.accounts.media_attachments') }
|
||||||
= fa_icon('camera')
|
= fa_icon('camera')
|
||||||
= report.media_attachments.count
|
= report.media_attachments.count
|
||||||
|
%td
|
||||||
|
- if report.assigned_account.nil?
|
||||||
|
\-
|
||||||
|
- else
|
||||||
|
= link_to report.assigned_account.acct, admin_account_path(report.assigned_account.id)
|
||||||
%td
|
%td
|
||||||
= table_link_to 'circle', t('admin.reports.view'), admin_report_path(report)
|
= table_link_to 'circle', t('admin.reports.view'), admin_report_path(report)
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
%th= t('admin.reports.reported_by')
|
%th= t('admin.reports.reported_by')
|
||||||
%th= t('admin.reports.comment.label')
|
%th= t('admin.reports.comment.label')
|
||||||
%th= t('admin.reports.report_contents')
|
%th= t('admin.reports.report_contents')
|
||||||
|
%th= t('admin.reports.assigned')
|
||||||
%th
|
%th
|
||||||
%tbody
|
%tbody
|
||||||
= render @reports
|
= render @reports
|
||||||
|
|
|
@ -4,24 +4,68 @@
|
||||||
- content_for :page_title do
|
- content_for :page_title do
|
||||||
= t('admin.reports.report', id: @report.id)
|
= t('admin.reports.report', id: @report.id)
|
||||||
|
|
||||||
|
%div{ style: 'overflow: hidden; margin-bottom: 20px' }
|
||||||
|
- if !@report.action_taken?
|
||||||
|
%div{ style: 'float: right' }
|
||||||
|
= link_to t('admin.reports.silence_account'), admin_report_path(@report, outcome: 'silence'), method: :put, class: 'button'
|
||||||
|
= link_to t('admin.reports.suspend_account'), admin_report_path(@report, outcome: 'suspend'), method: :put, class: 'button'
|
||||||
|
%div{ style: 'float: left' }
|
||||||
|
= link_to t('admin.reports.mark_as_resolved'), admin_report_path(@report, outcome: 'resolve'), method: :put, class: 'button'
|
||||||
|
- else
|
||||||
|
= link_to t('admin.reports.mark_as_unresolved'), admin_report_path(@report, outcome: 'reopen'), method: :put, class: 'button'
|
||||||
|
|
||||||
|
.table-wrapper
|
||||||
|
%table.table.inline-table
|
||||||
|
%tbody
|
||||||
|
%tr
|
||||||
|
%th= t('admin.reports.updated_at')
|
||||||
|
%td{colspan: 2}
|
||||||
|
%time.formatted{ datetime: @report.updated_at.iso8601 }
|
||||||
|
%tr
|
||||||
|
%th= t('admin.reports.status')
|
||||||
|
%td{colspan: 2}
|
||||||
|
- if @report.action_taken?
|
||||||
|
= t('admin.reports.resolved')
|
||||||
|
= table_link_to 'envelope-open', t('admin.reports.reopen'), admin_report_path(@report, outcome: 'reopen'), method: :put
|
||||||
|
- else
|
||||||
|
= t('admin.reports.unresolved')
|
||||||
|
- if !@report.action_taken_by_account.nil?
|
||||||
|
%tr
|
||||||
|
%th= t('admin.reports.action_taken_by')
|
||||||
|
%td= @report.action_taken_by_account.acct
|
||||||
|
- else
|
||||||
|
%tr
|
||||||
|
%th= t('admin.reports.assigned')
|
||||||
|
%td
|
||||||
|
- if @report.assigned_account.nil?
|
||||||
|
\-
|
||||||
|
- else
|
||||||
|
= link_to @report.assigned_account.acct, admin_account_path(@report.assigned_account.id)
|
||||||
|
%td{style: "text-align: right"}
|
||||||
|
- if @report.assigned_account != current_user.account
|
||||||
|
= table_link_to 'user', t('admin.reports.assign_to_self'), admin_report_path(@report, outcome: 'assign_to_self'), method: :put
|
||||||
|
- if !@report.assigned_account.nil?
|
||||||
|
= table_link_to 'trash', t('admin.reports.unassign'), admin_report_path(@report, outcome: 'unassign'), method: :put
|
||||||
|
|
||||||
.report-accounts
|
.report-accounts
|
||||||
.report-accounts__item
|
.report-accounts__item
|
||||||
%strong= t('admin.reports.reported_account')
|
%h3= t('admin.reports.reported_account')
|
||||||
= render 'authorize_follows/card', account: @report.target_account, admin: true
|
= render 'authorize_follows/card', account: @report.target_account, admin: true
|
||||||
= render 'admin/accounts/card', account: @report.target_account
|
= render 'admin/accounts/card', account: @report.target_account
|
||||||
.report-accounts__item
|
.report-accounts__item
|
||||||
%strong= t('admin.reports.reported_by')
|
%h3= t('admin.reports.reported_by')
|
||||||
= render 'authorize_follows/card', account: @report.account, admin: true
|
= render 'authorize_follows/card', account: @report.account, admin: true
|
||||||
= render 'admin/accounts/card', account: @report.account
|
= render 'admin/accounts/card', account: @report.account
|
||||||
|
|
||||||
%p
|
%h3= t('admin.reports.comment.label')
|
||||||
%strong= t('admin.reports.comment.label')
|
|
||||||
\:
|
= simple_format(@report.comment.presence || t('admin.reports.comment.none'))
|
||||||
= simple_format(@report.comment.presence || t('admin.reports.comment.none'))
|
|
||||||
|
|
||||||
- unless @report.statuses.empty?
|
- unless @report.statuses.empty?
|
||||||
%hr/
|
%hr/
|
||||||
|
|
||||||
|
%h3= t('admin.reports.statuses')
|
||||||
|
|
||||||
= form_for(@form, url: admin_report_reported_statuses_path(@report.id)) do |f|
|
= form_for(@form, url: admin_report_reported_statuses_path(@report.id)) do |f|
|
||||||
.batch-form-box
|
.batch-form-box
|
||||||
.batch-checkbox-all
|
.batch-checkbox-all
|
||||||
|
@ -46,14 +90,20 @@
|
||||||
|
|
||||||
%hr/
|
%hr/
|
||||||
|
|
||||||
- if !@report.action_taken?
|
%h3= t('admin.reports.notes.label')
|
||||||
%div{ style: 'overflow: hidden' }
|
|
||||||
%div{ style: 'float: right' }
|
- if @report_notes.length > 0
|
||||||
= link_to t('admin.reports.silence_account'), admin_report_path(@report, outcome: 'silence'), method: :put, class: 'button'
|
.table-wrapper
|
||||||
= link_to t('admin.reports.suspend_account'), admin_report_path(@report, outcome: 'suspend'), method: :put, class: 'button'
|
%table.table
|
||||||
%div{ style: 'float: left' }
|
%thead
|
||||||
= link_to t('admin.reports.mark_as_resolved'), admin_report_path(@report, outcome: 'resolve'), method: :put, class: 'button'
|
%tr
|
||||||
- elsif !@report.action_taken_by_account.nil?
|
%th
|
||||||
%p
|
%tbody
|
||||||
%strong #{t('admin.reports.action_taken_by')}:
|
= render @report_notes
|
||||||
= @report.action_taken_by_account.acct
|
|
||||||
|
= simple_form_for @report_note, url: admin_report_notes_path do |f|
|
||||||
|
= render 'shared/error_messages', object: @report_note
|
||||||
|
= f.input :content
|
||||||
|
= f.hidden_field :report_id
|
||||||
|
= f.button :button, t('admin.reports.notes.create'), type: :submit
|
||||||
|
= f.button :button, t('admin.reports.notes.create_and_resolve'), type: :submit, name: :create_and_resolve
|
||||||
|
|
|
@ -137,6 +137,7 @@ en:
|
||||||
web: Web
|
web: Web
|
||||||
action_logs:
|
action_logs:
|
||||||
actions:
|
actions:
|
||||||
|
assigned_to_self_report: "%{name} assigned report %{target} to themselves"
|
||||||
confirm_user: "%{name} confirmed e-mail address of user %{target}"
|
confirm_user: "%{name} confirmed e-mail address of user %{target}"
|
||||||
create_custom_emoji: "%{name} uploaded new emoji %{target}"
|
create_custom_emoji: "%{name} uploaded new emoji %{target}"
|
||||||
create_domain_block: "%{name} blocked domain %{target}"
|
create_domain_block: "%{name} blocked domain %{target}"
|
||||||
|
@ -153,10 +154,12 @@ en:
|
||||||
memorialize_account: "%{name} turned %{target}'s account into a memoriam page"
|
memorialize_account: "%{name} turned %{target}'s account into a memoriam page"
|
||||||
promote_user: "%{name} promoted user %{target}"
|
promote_user: "%{name} promoted user %{target}"
|
||||||
remove_avatar_user: "%{name} removed %{target}'s avatar"
|
remove_avatar_user: "%{name} removed %{target}'s avatar"
|
||||||
|
reopen_report: "%{name} reopened report %{target}"
|
||||||
reset_password_user: "%{name} reset password of user %{target}"
|
reset_password_user: "%{name} reset password of user %{target}"
|
||||||
resolve_report: "%{name} dismissed report %{target}"
|
resolve_report: "%{name} resolved report %{target}"
|
||||||
silence_account: "%{name} silenced %{target}'s account"
|
silence_account: "%{name} silenced %{target}'s account"
|
||||||
suspend_account: "%{name} suspended %{target}'s account"
|
suspend_account: "%{name} suspended %{target}'s account"
|
||||||
|
unassigned_report: "%{name} unassigned report %{target}"
|
||||||
unsilence_account: "%{name} unsilenced %{target}'s account"
|
unsilence_account: "%{name} unsilenced %{target}'s account"
|
||||||
unsuspend_account: "%{name} unsuspended %{target}'s account"
|
unsuspend_account: "%{name} unsuspended %{target}'s account"
|
||||||
update_custom_emoji: "%{name} updated emoji %{target}"
|
update_custom_emoji: "%{name} updated emoji %{target}"
|
||||||
|
@ -242,15 +245,26 @@ en:
|
||||||
expired: Expired
|
expired: Expired
|
||||||
title: Filter
|
title: Filter
|
||||||
title: Invites
|
title: Invites
|
||||||
|
report_notes:
|
||||||
|
created_msg: Moderation note successfully created!
|
||||||
|
destroyed_msg: Moderation note successfully destroyed!
|
||||||
reports:
|
reports:
|
||||||
action_taken_by: Action taken by
|
action_taken_by: Action taken by
|
||||||
are_you_sure: Are you sure?
|
are_you_sure: Are you sure?
|
||||||
|
assign_to_self: Assign to me
|
||||||
|
assigned: Assigned Moderator
|
||||||
comment:
|
comment:
|
||||||
label: Comment
|
label: Report Comment
|
||||||
none: None
|
none: None
|
||||||
delete: Delete
|
delete: Delete
|
||||||
id: ID
|
id: ID
|
||||||
mark_as_resolved: Mark as resolved
|
mark_as_resolved: Mark as resolved
|
||||||
|
mark_as_unresolved: Mark as unresolved
|
||||||
|
notes:
|
||||||
|
create: Add Note
|
||||||
|
create_and_resolve: Resolve with Note
|
||||||
|
delete: Delete
|
||||||
|
label: Notes
|
||||||
nsfw:
|
nsfw:
|
||||||
'false': Unhide media attachments
|
'false': Unhide media attachments
|
||||||
'true': Hide media attachments
|
'true': Hide media attachments
|
||||||
|
@ -259,12 +273,16 @@ en:
|
||||||
reported_account: Reported account
|
reported_account: Reported account
|
||||||
reported_by: Reported by
|
reported_by: Reported by
|
||||||
resolved: Resolved
|
resolved: Resolved
|
||||||
|
resolved_msg: Report successfully resolved!
|
||||||
silence_account: Silence account
|
silence_account: Silence account
|
||||||
status: Status
|
status: Status
|
||||||
|
statuses: Reported Toots
|
||||||
suspend_account: Suspend account
|
suspend_account: Suspend account
|
||||||
target: Target
|
target: Target
|
||||||
title: Reports
|
title: Reports
|
||||||
|
unassign: Unassign
|
||||||
unresolved: Unresolved
|
unresolved: Unresolved
|
||||||
|
updated_at: Updated
|
||||||
view: View
|
view: View
|
||||||
settings:
|
settings:
|
||||||
activity_api_enabled:
|
activity_api_enabled:
|
||||||
|
|
|
@ -137,6 +137,8 @@ Rails.application.routes.draw do
|
||||||
resources :reported_statuses, only: [:create, :update, :destroy]
|
resources :reported_statuses, only: [:create, :update, :destroy]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
resources :report_notes, only: [:create, :destroy]
|
||||||
|
|
||||||
resources :accounts, only: [:index, :show] do
|
resources :accounts, only: [:index, :show] do
|
||||||
member do
|
member do
|
||||||
post :subscribe
|
post :subscribe
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddAssignedAccountIdToReports < ActiveRecord::Migration[5.1]
|
||||||
|
def change
|
||||||
|
add_reference :reports, :assigned_account, null: true, default: nil, foreign_key: { on_delete: :nullify, to_table: :accounts }, index: false
|
||||||
|
end
|
||||||
|
end
|
14
db/migrate/20180402040909_create_report_notes.rb
Normal file
14
db/migrate/20180402040909_create_report_notes.rb
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
class CreateReportNotes < ActiveRecord::Migration[5.1]
|
||||||
|
def change
|
||||||
|
create_table :report_notes do |t|
|
||||||
|
t.text :content, null: false
|
||||||
|
t.references :report, null: false
|
||||||
|
t.references :account, null: false
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
|
||||||
|
add_foreign_key :report_notes, :reports, column: :report_id, on_delete: :cascade
|
||||||
|
add_foreign_key :report_notes, :accounts, column: :account_id, on_delete: :cascade
|
||||||
|
end
|
||||||
|
end
|
16
db/schema.rb
16
db/schema.rb
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20180310000000) do
|
ActiveRecord::Schema.define(version: 20180402040909) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
|
@ -355,6 +355,16 @@ ActiveRecord::Schema.define(version: 20180310000000) do
|
||||||
t.index ["status_id", "preview_card_id"], name: "index_preview_cards_statuses_on_status_id_and_preview_card_id"
|
t.index ["status_id", "preview_card_id"], name: "index_preview_cards_statuses_on_status_id_and_preview_card_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create_table "report_notes", force: :cascade do |t|
|
||||||
|
t.text "content", null: false
|
||||||
|
t.bigint "report_id", null: false
|
||||||
|
t.bigint "account_id", null: false
|
||||||
|
t.datetime "created_at", null: false
|
||||||
|
t.datetime "updated_at", null: false
|
||||||
|
t.index ["account_id"], name: "index_report_notes_on_account_id"
|
||||||
|
t.index ["report_id"], name: "index_report_notes_on_report_id"
|
||||||
|
end
|
||||||
|
|
||||||
create_table "reports", force: :cascade do |t|
|
create_table "reports", force: :cascade do |t|
|
||||||
t.bigint "status_ids", default: [], null: false, array: true
|
t.bigint "status_ids", default: [], null: false, array: true
|
||||||
t.text "comment", default: "", null: false
|
t.text "comment", default: "", null: false
|
||||||
|
@ -364,6 +374,7 @@ ActiveRecord::Schema.define(version: 20180310000000) do
|
||||||
t.bigint "account_id", null: false
|
t.bigint "account_id", null: false
|
||||||
t.bigint "action_taken_by_account_id"
|
t.bigint "action_taken_by_account_id"
|
||||||
t.bigint "target_account_id", null: false
|
t.bigint "target_account_id", null: false
|
||||||
|
t.bigint "assigned_account_id"
|
||||||
t.index ["account_id"], name: "index_reports_on_account_id"
|
t.index ["account_id"], name: "index_reports_on_account_id"
|
||||||
t.index ["target_account_id"], name: "index_reports_on_target_account_id"
|
t.index ["target_account_id"], name: "index_reports_on_target_account_id"
|
||||||
end
|
end
|
||||||
|
@ -569,7 +580,10 @@ ActiveRecord::Schema.define(version: 20180310000000) do
|
||||||
add_foreign_key "oauth_access_tokens", "oauth_applications", column: "application_id", name: "fk_f5fc4c1ee3", on_delete: :cascade
|
add_foreign_key "oauth_access_tokens", "oauth_applications", column: "application_id", name: "fk_f5fc4c1ee3", on_delete: :cascade
|
||||||
add_foreign_key "oauth_access_tokens", "users", column: "resource_owner_id", name: "fk_e84df68546", on_delete: :cascade
|
add_foreign_key "oauth_access_tokens", "users", column: "resource_owner_id", name: "fk_e84df68546", on_delete: :cascade
|
||||||
add_foreign_key "oauth_applications", "users", column: "owner_id", name: "fk_b0988c7c0a", on_delete: :cascade
|
add_foreign_key "oauth_applications", "users", column: "owner_id", name: "fk_b0988c7c0a", on_delete: :cascade
|
||||||
|
add_foreign_key "report_notes", "accounts", on_delete: :cascade
|
||||||
|
add_foreign_key "report_notes", "reports", on_delete: :cascade
|
||||||
add_foreign_key "reports", "accounts", column: "action_taken_by_account_id", name: "fk_bca45b75fd", on_delete: :nullify
|
add_foreign_key "reports", "accounts", column: "action_taken_by_account_id", name: "fk_bca45b75fd", on_delete: :nullify
|
||||||
|
add_foreign_key "reports", "accounts", column: "assigned_account_id", on_delete: :nullify
|
||||||
add_foreign_key "reports", "accounts", column: "target_account_id", name: "fk_eb37af34f0", on_delete: :cascade
|
add_foreign_key "reports", "accounts", column: "target_account_id", name: "fk_eb37af34f0", on_delete: :cascade
|
||||||
add_foreign_key "reports", "accounts", name: "fk_4b81f7522c", on_delete: :cascade
|
add_foreign_key "reports", "accounts", name: "fk_4b81f7522c", on_delete: :cascade
|
||||||
add_foreign_key "session_activations", "oauth_access_tokens", column: "access_token_id", name: "fk_957e5bda89", on_delete: :cascade
|
add_foreign_key "session_activations", "oauth_access_tokens", column: "access_token_id", name: "fk_957e5bda89", on_delete: :cascade
|
||||||
|
|
|
@ -61,7 +61,7 @@ describe Admin::ReportsController do
|
||||||
report = Fabricate(:report)
|
report = Fabricate(:report)
|
||||||
|
|
||||||
put :update, params: { id: report, outcome: 'resolve' }
|
put :update, params: { id: report, outcome: 'resolve' }
|
||||||
expect(response).to redirect_to(admin_report_path(report))
|
expect(response).to redirect_to(admin_reports_path)
|
||||||
report.reload
|
report.reload
|
||||||
expect(report.action_taken_by_account).to eq user.account
|
expect(report.action_taken_by_account).to eq user.account
|
||||||
expect(report.action_taken).to eq true
|
expect(report.action_taken).to eq true
|
||||||
|
@ -74,7 +74,7 @@ describe Admin::ReportsController do
|
||||||
allow(Admin::SuspensionWorker).to receive(:perform_async)
|
allow(Admin::SuspensionWorker).to receive(:perform_async)
|
||||||
|
|
||||||
put :update, params: { id: report, outcome: 'suspend' }
|
put :update, params: { id: report, outcome: 'suspend' }
|
||||||
expect(response).to redirect_to(admin_report_path(report))
|
expect(response).to redirect_to(admin_reports_path)
|
||||||
report.reload
|
report.reload
|
||||||
expect(report.action_taken_by_account).to eq user.account
|
expect(report.action_taken_by_account).to eq user.account
|
||||||
expect(report.action_taken).to eq true
|
expect(report.action_taken).to eq true
|
||||||
|
@ -88,12 +88,46 @@ describe Admin::ReportsController do
|
||||||
report = Fabricate(:report)
|
report = Fabricate(:report)
|
||||||
|
|
||||||
put :update, params: { id: report, outcome: 'silence' }
|
put :update, params: { id: report, outcome: 'silence' }
|
||||||
expect(response).to redirect_to(admin_report_path(report))
|
expect(response).to redirect_to(admin_reports_path)
|
||||||
report.reload
|
report.reload
|
||||||
expect(report.action_taken_by_account).to eq user.account
|
expect(report.action_taken_by_account).to eq user.account
|
||||||
expect(report.action_taken).to eq true
|
expect(report.action_taken).to eq true
|
||||||
expect(report.target_account).to be_silenced
|
expect(report.target_account).to be_silenced
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'with an outsome of `reopen`' do
|
||||||
|
it 'reopens the report' do
|
||||||
|
report = Fabricate(:report)
|
||||||
|
|
||||||
|
put :update, params: { id: report, outcome: 'reopen' }
|
||||||
|
expect(response).to redirect_to(admin_report_path(report))
|
||||||
|
report.reload
|
||||||
|
expect(report.action_taken_by_account).to eq nil
|
||||||
|
expect(report.action_taken).to eq false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'with an outsome of `assign_to_self`' do
|
||||||
|
it 'reopens the report' do
|
||||||
|
report = Fabricate(:report)
|
||||||
|
|
||||||
|
put :update, params: { id: report, outcome: 'assign_to_self' }
|
||||||
|
expect(response).to redirect_to(admin_report_path(report))
|
||||||
|
report.reload
|
||||||
|
expect(report.assigned_account).to eq user.account
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'with an outsome of `unassign`' do
|
||||||
|
it 'reopens the report' do
|
||||||
|
report = Fabricate(:report)
|
||||||
|
|
||||||
|
put :update, params: { id: report, outcome: 'unassign' }
|
||||||
|
expect(response).to redirect_to(admin_report_path(report))
|
||||||
|
report.reload
|
||||||
|
expect(report.assigned_account).to eq nil
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue