diff --git a/app/controllers/post_approvals_controller.rb b/app/controllers/post_approvals_controller.rb
new file mode 100644
index 000000000..ed2262e24
--- /dev/null
+++ b/app/controllers/post_approvals_controller.rb
@@ -0,0 +1,8 @@
+class PostApprovalsController < ApplicationController
+ respond_to :html, :xml, :json
+
+ def index
+ @post_approvals = PostApproval.includes(:post, :user).search(search_params).paginate(params[:page], limit: params[:limit])
+ respond_with(@post_approvals)
+ end
+end
diff --git a/app/models/post_approval.rb b/app/models/post_approval.rb
index e93c99077..ce1e5d7f5 100644
--- a/app/models/post_approval.rb
+++ b/app/models/post_approval.rb
@@ -5,10 +5,6 @@ class PostApproval < ApplicationRecord
validate :validate_approval
after_create :approve_post
- def self.prune!
- where("created_at < ?", 1.month.ago).delete_all
- end
-
def validate_approval
if post.is_status_locked?
errors.add(:post, "is locked and cannot be approved")
@@ -33,4 +29,26 @@ class PostApproval < ApplicationRecord
post.flags.each(&:resolve!)
post.update(approver: user, is_flagged: false, is_pending: false, is_deleted: false)
end
+
+ concerning :SearchMethods do
+ class_methods do
+ def post_tags_match(query)
+ PostQueryBuilder.new(query).build(self.joins(:post))
+ end
+
+ def search(params)
+ q = super
+ params[:user_id] = User.name_to_id(params[:user_name]) if params[:user_name]
+
+ if params[:post_tags_match].present?
+ q = q.post_tags_match(params[:post_tags_match])
+ end
+
+ q = q.attribute_matches(:user_id, params[:user_id])
+ q = q.attribute_matches(:post_id, params[:post_id])
+
+ q.apply_default_order(params)
+ end
+ end
+ end
end
diff --git a/app/models/post_event.rb b/app/models/post_event.rb
index 8c57bb8ab..26a8cd1af 100644
--- a/app/models/post_event.rb
+++ b/app/models/post_event.rb
@@ -4,11 +4,11 @@ class PostEvent
include ActiveModel::Serializers::Xml
attr_accessor :event
- delegate :creator, :creator_id, :reason, :is_resolved, :created_at, to: :event
+ delegate :created_at, to: :event
def self.find_for_post(post_id)
post = Post.find(post_id)
- (post.appeals + post.flags).sort_by(&:created_at).reverse.map { |e| new(event: e) }
+ (post.appeals + post.flags + post.approvals).sort_by(&:created_at).reverse.map { |e| new(event: e) }
end
def type_name
@@ -17,6 +17,8 @@ class PostEvent
"flag"
when PostAppeal
"appeal"
+ when PostApproval
+ "approval"
end
end
@@ -24,9 +26,25 @@ class PostEvent
type_name.first
end
+ def reason
+ event.try(:reason) || ""
+ end
+
+ def is_resolved
+ event.try(:is_resolved) || false
+ end
+
+ def creator_id
+ event.try(:creator_id) || event.try(:user_id)
+ end
+
+ def creator
+ event.try(:creator) || event.try(:user)
+ end
+
def is_creator_visible?(user = CurrentUser.user)
case event
- when PostAppeal
+ when PostAppeal, PostApproval
true
when PostFlag
flag = event
diff --git a/app/views/post_approvals/index.html.erb b/app/views/post_approvals/index.html.erb
new file mode 100644
index 000000000..1c7d2e13b
--- /dev/null
+++ b/app/views/post_approvals/index.html.erb
@@ -0,0 +1,42 @@
+
+
+
Approvals
+ <%= render "posts/partials/common/inline_blacklist" %>
+
+ <%= simple_form_for(:search, url: post_approvals_path, method: :get, defaults: { required: false }, html: { class: "inline-form" }) do |f| %>
+ <%= f.input :user_name, label: "Approver", input_html: { value: params[:search][:user_name] } %>
+ <%= f.input :post_tags_match, label: "Tags", input_html: { value: params[:search][:post_tags_match], data: { autocomplete: "tag-query" } } %>
+ <%= f.submit "Search" %>
+ <% end %>
+
+
+
+
+ | Post |
+ Approver |
+
+
+
+ <% @post_approvals.each do |post_approval| %>
+
+ |
+ <%= PostPresenter.preview(post_approval.post, :tags => "status:any") %>
+ |
+
+
+ <%= link_to_user post_approval.user %>
+ <%= link_to "ยป", post_approvals_path(search: params[:search].merge(user_name: post_approval.user.name)) %>
+ <%= time_ago_in_words_tagged post_approval.created_at %>
+ |
+
+ <% end %>
+
+
+
+ <%= numbered_paginator(@post_approvals) %>
+
+
+
+<% content_for(:page_title) do %>
+ Approvals - <%= Danbooru.config.app_name %>
+<% end %>
diff --git a/app/views/post_events/index.html.erb b/app/views/post_events/index.html.erb
index c04d46fd6..8ea0685d8 100644
--- a/app/views/post_events/index.html.erb
+++ b/app/views/post_events/index.html.erb
@@ -1,15 +1,14 @@
-
Flags & Appeals
+
Post Events
-
+
- | Type |
- Creator |
- Reason |
- Resolved? |
- Date |
+ Type |
+ User |
+ Description |
+ Resolved? |
@@ -22,16 +21,10 @@
<% else %>
hidden
<% end %>
+
<%= time_ago_in_words_tagged event.created_at %>
- <%= format_text event.reason %> |
-
- <% if event.is_resolved %>
- yes
- <% else %>
- no
- <% end %>
- |
- <%= compact_time event.created_at %> |
+ <%= format_text event.reason %> |
+ <%= event.is_resolved %> |
<% end %>
diff --git a/app/views/static/site_map.html.erb b/app/views/static/site_map.html.erb
index 3dbeb4168..731ac92c7 100644
--- a/app/views/static/site_map.html.erb
+++ b/app/views/static/site_map.html.erb
@@ -6,12 +6,8 @@
Posts
<%= link_to("Help", wiki_pages_path(:title => "help:posts")) %>
<%= link_to("Listing", posts_path) %>
- <%= link_to("Changes", post_versions_path) %>
<%= link_to("Upload", new_upload_path) %>
<%= link_to("Upload Listing", uploads_path) %>
- <%= link_to("Appeals", post_appeals_path) %>
- <%= link_to("Flags", post_flags_path) %>
- <%= link_to("Replacements", post_replacements_path) %>
<%= link_to("Popular", popular_explore_posts_path) %>
<%= link_to("Most Viewed", viewed_explore_posts_path) %>
<% if CurrentUser.can_approve_posts? %>
@@ -21,6 +17,14 @@
<%= link_to("Mass Edit", edit_moderator_tag_path) %>
<% end %>
+
+ Post Events
+ - <%= link_to("Changes", post_versions_path) %>
+ - <%= link_to("Approvals", post_approvals_path) %>
+ - <%= link_to("Appeals", post_appeals_path) %>
+ - <%= link_to("Flags", post_flags_path) %>
+ - <%= link_to("Replacements", post_replacements_path) %>
+
Tools
- <%= link_to("Source Code", Danbooru.config.source_code_url) %>
diff --git a/config/routes.rb b/config/routes.rb
index 2c67a6c38..bb31bb3ce 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -220,6 +220,7 @@ Rails.application.routes.draw do
end
resources :post_appeals
resources :post_flags
+ resources :post_approvals, only: [:index]
resources :post_versions, :only => [:index, :search] do
member do
put :undo
diff --git a/test/factories/post_approval.rb b/test/factories/post_approval.rb
new file mode 100644
index 000000000..6f3eaf824
--- /dev/null
+++ b/test/factories/post_approval.rb
@@ -0,0 +1,6 @@
+FactoryBot.define do
+ factory(:post_approval) do
+ user factory: :moderator_user
+ post factory: :post, is_pending: true
+ end
+end
diff --git a/test/functional/post_approvals_controller_test.rb b/test/functional/post_approvals_controller_test.rb
new file mode 100644
index 000000000..55caec659
--- /dev/null
+++ b/test/functional/post_approvals_controller_test.rb
@@ -0,0 +1,16 @@
+require 'test_helper'
+
+class PostApprovalsControllerTest < ActionDispatch::IntegrationTest
+ context "The post approvals controller" do
+ setup do
+ @approval = FactoryBot.create(:post_approval)
+ end
+
+ context "index action" do
+ should "render" do
+ get post_approvals_path
+ assert_response :success
+ end
+ end
+ end
+end
diff --git a/test/functional/post_events_controller_test.rb b/test/functional/post_events_controller_test.rb
index d8805fbff..3bd1cbfa7 100644
--- a/test/functional/post_events_controller_test.rb
+++ b/test/functional/post_events_controller_test.rb
@@ -9,15 +9,16 @@ class PostEventsControllerTest < ActionDispatch::IntegrationTest
as_user do
@post = create(:post)
- @post_flag = PostFlag.create(:post => @post, :reason => "aaa", :is_resolved => false)
- @post_appeal = PostAppeal.create(:post => @post, :reason => "aaa")
+ @post.flag!("aaa")
+ @post.appeal!("aaa")
+ @post.approve!(@mod)
end
end
context "get /posts/:post_id/events" do
should "render" do
get_auth post_events_path(post_id: @post.id), @user
- assert_response :ok
+ assert_response :ok
end
should "render for mods" do
diff --git a/test/unit/post_approval_test.rb b/test/unit/post_approval_test.rb
index f6a82ba8b..5453b6e0e 100644
--- a/test/unit/post_approval_test.rb
+++ b/test/unit/post_approval_test.rb
@@ -7,7 +7,7 @@ class PostApprovalTest < ActiveSupport::TestCase
CurrentUser.user = @user
CurrentUser.ip_addr = "127.0.0.1"
- @post = FactoryBot.create(:post, uploader_id: @user.id, is_pending: true)
+ @post = FactoryBot.create(:post, uploader_id: @user.id, tag_string: "touhou", is_pending: true)
@approver = FactoryBot.create(:user)
@approver.can_approve_posts = true
@@ -58,5 +58,14 @@ class PostApprovalTest < ActiveSupport::TestCase
end
end
end
+
+ context "#search method" do
+ should "work" do
+ @approval = @post.approve!(@approver)
+ @approvals = PostApproval.search(user_name: @approver.name, post_tags_match: "touhou", post_id: @post.id)
+
+ assert_equal([@approval.id], @approvals.map(&:id))
+ end
+ end
end
end