* 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:
		
				
					committed by
					
						
						Eugen Rochko
					
				
			
			
				
	
			
			
			
						parent
						
							36eac8ba90
						
					
				
				
					commit
					e85cffb236
				
			
							
								
								
									
										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
 | 
			
		||||
      authorize @report, :show?
 | 
			
		||||
      @report_note = @report.notes.new
 | 
			
		||||
      @report_notes = @report.notes.latest
 | 
			
		||||
      @form = Form::StatusBatch.new
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def update
 | 
			
		||||
      authorize @report, :update?
 | 
			
		||||
      process_report
 | 
			
		||||
      redirect_to admin_report_path(@report)
 | 
			
		||||
 | 
			
		||||
      if @report.action_taken?
 | 
			
		||||
        redirect_to admin_reports_path, notice: I18n.t('admin.reports.resolved_msg')
 | 
			
		||||
      else
 | 
			
		||||
        redirect_to admin_report_path(@report)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    private
 | 
			
		||||
 | 
			
		||||
    def process_report
 | 
			
		||||
      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'
 | 
			
		||||
        @report.update!(action_taken_by_current_attributes)
 | 
			
		||||
        log_action :resolve, @report
 | 
			
		||||
@@ -32,11 +48,13 @@ module Admin
 | 
			
		||||
        log_action :resolve, @report
 | 
			
		||||
        log_action :suspend, @report.target_account
 | 
			
		||||
        resolve_all_target_account_reports
 | 
			
		||||
        @report.reload
 | 
			
		||||
      when 'silence'
 | 
			
		||||
        @report.target_account.update!(silenced: true)
 | 
			
		||||
        log_action :resolve, @report
 | 
			
		||||
        log_action :silence, @report.target_account
 | 
			
		||||
        resolve_all_target_account_reports
 | 
			
		||||
        @report.reload
 | 
			
		||||
      else
 | 
			
		||||
        raise ActiveRecord::RecordNotFound
 | 
			
		||||
      end
 | 
			
		||||
 
 | 
			
		||||
@@ -86,7 +86,7 @@ module Admin::ActionLogsHelper
 | 
			
		||||
      opposite_verbs?(log) ? 'negative' : 'positive'
 | 
			
		||||
    when :update, :reset_password, :disable_2fa, :memorialize
 | 
			
		||||
      'neutral'
 | 
			
		||||
    when :demote, :silence, :disable, :suspend, :remove_avatar
 | 
			
		||||
    when :demote, :silence, :disable, :suspend, :remove_avatar, :reopen
 | 
			
		||||
      'negative'
 | 
			
		||||
    when :destroy
 | 
			
		||||
      opposite_verbs?(log) ? 'positive' : 'negative'
 | 
			
		||||
 
 | 
			
		||||
@@ -95,6 +95,8 @@ class Account < ApplicationRecord
 | 
			
		||||
  has_many :reports
 | 
			
		||||
  has_many :targeted_reports, class_name: 'Report', foreign_key: :target_account_id
 | 
			
		||||
 | 
			
		||||
  has_many :report_notes, dependent: :destroy
 | 
			
		||||
 | 
			
		||||
  # Moderation notes
 | 
			
		||||
  has_many :account_moderation_notes, 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
 | 
			
		||||
#  action_taken_by_account_id :integer
 | 
			
		||||
#  target_account_id          :integer          not null
 | 
			
		||||
#  assigned_account_id        :integer
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
class Report < ApplicationRecord
 | 
			
		||||
  belongs_to :account
 | 
			
		||||
  belongs_to :target_account, class_name: 'Account'
 | 
			
		||||
  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 :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') }
 | 
			
		||||
        = fa_icon('camera')
 | 
			
		||||
        = 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
 | 
			
		||||
    = 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.comment.label')
 | 
			
		||||
          %th= t('admin.reports.report_contents')
 | 
			
		||||
          %th= t('admin.reports.assigned')
 | 
			
		||||
          %th
 | 
			
		||||
      %tbody
 | 
			
		||||
        = render @reports
 | 
			
		||||
 
 | 
			
		||||
@@ -4,24 +4,68 @@
 | 
			
		||||
- content_for :page_title do
 | 
			
		||||
  = 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__item
 | 
			
		||||
    %strong= t('admin.reports.reported_account')
 | 
			
		||||
    %h3= t('admin.reports.reported_account')
 | 
			
		||||
    = render 'authorize_follows/card', account: @report.target_account, admin: true
 | 
			
		||||
    = render 'admin/accounts/card', account: @report.target_account
 | 
			
		||||
  .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 'admin/accounts/card', account: @report.account
 | 
			
		||||
 | 
			
		||||
%p
 | 
			
		||||
  %strong= t('admin.reports.comment.label')
 | 
			
		||||
  \:
 | 
			
		||||
  = simple_format(@report.comment.presence || t('admin.reports.comment.none'))
 | 
			
		||||
%h3= t('admin.reports.comment.label')
 | 
			
		||||
 | 
			
		||||
= simple_format(@report.comment.presence || t('admin.reports.comment.none'))
 | 
			
		||||
 | 
			
		||||
- unless @report.statuses.empty?
 | 
			
		||||
  %hr/
 | 
			
		||||
 | 
			
		||||
  %h3= t('admin.reports.statuses')
 | 
			
		||||
 | 
			
		||||
  = form_for(@form, url: admin_report_reported_statuses_path(@report.id)) do |f|
 | 
			
		||||
    .batch-form-box
 | 
			
		||||
      .batch-checkbox-all
 | 
			
		||||
@@ -46,14 +90,20 @@
 | 
			
		||||
 | 
			
		||||
%hr/
 | 
			
		||||
 | 
			
		||||
- if !@report.action_taken?
 | 
			
		||||
  %div{ style: 'overflow: hidden' }
 | 
			
		||||
    %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'
 | 
			
		||||
- elsif !@report.action_taken_by_account.nil?
 | 
			
		||||
  %p
 | 
			
		||||
    %strong #{t('admin.reports.action_taken_by')}:
 | 
			
		||||
    = @report.action_taken_by_account.acct
 | 
			
		||||
%h3= t('admin.reports.notes.label')
 | 
			
		||||
 | 
			
		||||
- if @report_notes.length > 0
 | 
			
		||||
  .table-wrapper
 | 
			
		||||
    %table.table
 | 
			
		||||
      %thead
 | 
			
		||||
        %tr
 | 
			
		||||
          %th
 | 
			
		||||
      %tbody
 | 
			
		||||
        = render @report_notes
 | 
			
		||||
 | 
			
		||||
= 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
 | 
			
		||||
    action_logs:
 | 
			
		||||
      actions:
 | 
			
		||||
        assigned_to_self_report: "%{name} assigned report %{target} to themselves"
 | 
			
		||||
        confirm_user: "%{name} confirmed e-mail address of user %{target}"
 | 
			
		||||
        create_custom_emoji: "%{name} uploaded new emoji %{target}"
 | 
			
		||||
        create_domain_block: "%{name} blocked domain %{target}"
 | 
			
		||||
@@ -153,10 +154,12 @@ en:
 | 
			
		||||
        memorialize_account: "%{name} turned %{target}'s account into a memoriam page"
 | 
			
		||||
        promote_user: "%{name} promoted user %{target}"
 | 
			
		||||
        remove_avatar_user: "%{name} removed %{target}'s avatar"
 | 
			
		||||
        reopen_report: "%{name} reopened report %{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"
 | 
			
		||||
        suspend_account: "%{name} suspended %{target}'s account"
 | 
			
		||||
        unassigned_report: "%{name} unassigned report %{target}"
 | 
			
		||||
        unsilence_account: "%{name} unsilenced %{target}'s account"
 | 
			
		||||
        unsuspend_account: "%{name} unsuspended %{target}'s account"
 | 
			
		||||
        update_custom_emoji: "%{name} updated emoji %{target}"
 | 
			
		||||
@@ -242,15 +245,26 @@ en:
 | 
			
		||||
        expired: Expired
 | 
			
		||||
        title: Filter
 | 
			
		||||
      title: Invites
 | 
			
		||||
    report_notes:
 | 
			
		||||
      created_msg: Moderation note successfully created!
 | 
			
		||||
      destroyed_msg: Moderation note successfully destroyed!
 | 
			
		||||
    reports:
 | 
			
		||||
      action_taken_by: Action taken by
 | 
			
		||||
      are_you_sure: Are you sure?
 | 
			
		||||
      assign_to_self: Assign to me
 | 
			
		||||
      assigned: Assigned Moderator
 | 
			
		||||
      comment:
 | 
			
		||||
        label: Comment
 | 
			
		||||
        label: Report Comment
 | 
			
		||||
        none: None
 | 
			
		||||
      delete: Delete
 | 
			
		||||
      id: ID
 | 
			
		||||
      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:
 | 
			
		||||
        'false': Unhide media attachments
 | 
			
		||||
        'true': Hide media attachments
 | 
			
		||||
@@ -259,12 +273,16 @@ en:
 | 
			
		||||
      reported_account: Reported account
 | 
			
		||||
      reported_by: Reported by
 | 
			
		||||
      resolved: Resolved
 | 
			
		||||
      resolved_msg: Report successfully resolved!
 | 
			
		||||
      silence_account: Silence account
 | 
			
		||||
      status: Status
 | 
			
		||||
      statuses: Reported Toots
 | 
			
		||||
      suspend_account: Suspend account
 | 
			
		||||
      target: Target
 | 
			
		||||
      title: Reports
 | 
			
		||||
      unassign: Unassign
 | 
			
		||||
      unresolved: Unresolved
 | 
			
		||||
      updated_at: Updated
 | 
			
		||||
      view: View
 | 
			
		||||
    settings:
 | 
			
		||||
      activity_api_enabled:
 | 
			
		||||
 
 | 
			
		||||
@@ -137,6 +137,8 @@ Rails.application.routes.draw do
 | 
			
		||||
      resources :reported_statuses, only: [:create, :update, :destroy]
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    resources :report_notes, only: [:create, :destroy]
 | 
			
		||||
 | 
			
		||||
    resources :accounts, only: [:index, :show] do
 | 
			
		||||
      member do
 | 
			
		||||
        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.
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
  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"
 | 
			
		||||
  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|
 | 
			
		||||
    t.bigint "status_ids", default: [], null: false, array: true
 | 
			
		||||
    t.text "comment", default: "", null: false
 | 
			
		||||
@@ -364,6 +374,7 @@ ActiveRecord::Schema.define(version: 20180310000000) do
 | 
			
		||||
    t.bigint "account_id", null: false
 | 
			
		||||
    t.bigint "action_taken_by_account_id"
 | 
			
		||||
    t.bigint "target_account_id", null: false
 | 
			
		||||
    t.bigint "assigned_account_id"
 | 
			
		||||
    t.index ["account_id"], name: "index_reports_on_account_id"
 | 
			
		||||
    t.index ["target_account_id"], name: "index_reports_on_target_account_id"
 | 
			
		||||
  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", "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 "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: "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", name: "fk_4b81f7522c", 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)
 | 
			
		||||
 | 
			
		||||
        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
 | 
			
		||||
        expect(report.action_taken_by_account).to eq user.account
 | 
			
		||||
        expect(report.action_taken).to eq true
 | 
			
		||||
@@ -74,7 +74,7 @@ describe Admin::ReportsController do
 | 
			
		||||
        allow(Admin::SuspensionWorker).to receive(:perform_async)
 | 
			
		||||
 | 
			
		||||
        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
 | 
			
		||||
        expect(report.action_taken_by_account).to eq user.account
 | 
			
		||||
        expect(report.action_taken).to eq true
 | 
			
		||||
@@ -88,12 +88,46 @@ describe Admin::ReportsController do
 | 
			
		||||
        report = Fabricate(:report)
 | 
			
		||||
 | 
			
		||||
        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
 | 
			
		||||
        expect(report.action_taken_by_account).to eq user.account
 | 
			
		||||
        expect(report.action_taken).to eq true
 | 
			
		||||
        expect(report.target_account).to be_silenced
 | 
			
		||||
      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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user