diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/stylesheets/application.css.scss
index a26344dda..c167df168 100644
--- a/app/assets/stylesheets/application.css.scss
+++ b/app/assets/stylesheets/application.css.scss
@@ -917,9 +917,10 @@ div#c-wiki-pages {
/*** Post Moderation ***/
-div#c-post-moderation {
+div#c-moderator-post-dashboards {
article {
margin-bottom: 4em;
+ overflow: hidden;
}
aside {
diff --git a/app/controllers/moderator/post/approvals_controller.rb b/app/controllers/moderator/post/approvals_controller.rb
new file mode 100644
index 000000000..dfaa783cb
--- /dev/null
+++ b/app/controllers/moderator/post/approvals_controller.rb
@@ -0,0 +1,10 @@
+module Moderator
+ module Post
+ class ApprovalsController < ApplicationController
+ def create
+ @post = ::Post.find(params[:post_id])
+ @post.approve!
+ end
+ end
+ end
+end
diff --git a/app/controllers/moderator/post/dashboards_controller.rb b/app/controllers/moderator/post/dashboards_controller.rb
new file mode 100644
index 000000000..ab5100d08
--- /dev/null
+++ b/app/controllers/moderator/post/dashboards_controller.rb
@@ -0,0 +1,13 @@
+module Moderator
+ module Post
+ class DashboardsController < ApplicationController
+ respond_to :html, :json
+
+ def show
+ @search = ::Post.order("id asc").pending_or_flagged.available_for_moderation.search(:tag_match => params[:query])
+ @posts = @search.paginate(params[:page])
+ respond_with(@posts)
+ end
+ end
+ end
+end
diff --git a/app/controllers/moderator/post/disapprovals_controller.rb b/app/controllers/moderator/post/disapprovals_controller.rb
new file mode 100644
index 000000000..d1421cec2
--- /dev/null
+++ b/app/controllers/moderator/post/disapprovals_controller.rb
@@ -0,0 +1,15 @@
+module Moderator
+ module Post
+ class DisapprovalsController < ApplicationController
+ def create
+ @post = ::Post.find(params[:post_id])
+ @post_disapproval = PostDisapproval.create(:post => @post, :user => CurrentUser.user)
+ if @post_disapproval.errors.any?
+ raise ::Post::DisapprovalError.new(@post_disapproval.errors.full_messages)
+ end
+
+ # js: redirect to dashboard
+ end
+ end
+ end
+end
diff --git a/app/controllers/moderator/post/posts_controller.rb b/app/controllers/moderator/post/posts_controller.rb
new file mode 100644
index 000000000..914347e83
--- /dev/null
+++ b/app/controllers/moderator/post/posts_controller.rb
@@ -0,0 +1,15 @@
+module Moderator
+ module Post
+ class PostsController < ApplicationController
+ def delete
+ @post = ::Post.find(params[:id])
+ @post.delete!
+ end
+
+ def undelete
+ @post = ::Post.find(params[:id])
+ @post.undelete!
+ end
+ end
+ end
+end
diff --git a/app/controllers/post_moderation_controller.rb b/app/controllers/post_moderation_controller.rb
deleted file mode 100644
index 4e49e7e08..000000000
--- a/app/controllers/post_moderation_controller.rb
+++ /dev/null
@@ -1,60 +0,0 @@
-class PostModerationController < ApplicationController
- # before_filter :janitor_only
- # rescue_from Post::ApprovalError, :with => :approval_error
- # rescue_from Post::DisapprovalError, :with => :disapproval_error
-
- def moderate
- @search = Post.order("id asc").pending_or_flagged.available_for_moderation.search(:tag_match => params[:query])
- @posts = @search.paginate(:page => params[:page])
- respond_to do |format|
- format.html
- format.json {render :json => @posts.to_json}
- end
- end
-
- def approve
- @post = Post.find(params[:post_id])
- @post.approve!
- respond_to do |format|
- format.html {redirect_to(post_moderation_moderate_path, :notice => "Post approved")}
- format.js
- end
- end
-
- def disapprove
- @post = Post.find(params[:post_id])
- @post_disapproval = PostDisapproval.create(:post => @post, :user => CurrentUser.user)
- if @post_disapproval.errors.any?
- raise Post::DisapprovalError.new(@post_disapproval.errors.full_messages)
- end
- respond_to do |format|
- format.html {redirect_to(post_moderation_moderate_path, :notice => "Post disapproved")}
- format.js
- end
- end
-
- def delete
- @post = Post.find(params[:post_id])
- @post.delete!
- end
-
- def undelete
- @post = Post.find(params[:post_id])
- @post.undelete!
- end
-
-private
- def disapproval_error(e)
- respond_to do |format|
- format.html {redirect_to(post_moderation_moderate_path, :notice => "You have already disapproved this post")}
- format.js {render :action => "disapproval_error"}
- end
- end
-
- def approval_error(e)
- respond_to do |format|
- format.html {redirect_to(post_moderation_moderate_path, :notice => e.message)}
- format.js {@exception = e; render :action => "approval_error"}
- end
- end
-end
diff --git a/app/models/post_disapproval.rb b/app/models/post_disapproval.rb
index 3f5dd5947..18c7cbafc 100644
--- a/app/models/post_disapproval.rb
+++ b/app/models/post_disapproval.rb
@@ -2,9 +2,9 @@ class PostDisapproval < ActiveRecord::Base
belongs_to :post
belongs_to :user
validates_uniqueness_of :post_id, :scope => [:user_id]
-
+
def self.prune!
- joins(:post).where("posts.is_pending = FALSE AND posts.is_flagged = FALSE").select("post_disapprovals.*").each do |post_disapproval|
+ joins(:post).where("posts.is_pending = FALSE AND posts.is_flagged = FALSE").each do |post_disapproval|
post_disapproval.destroy
end
end
diff --git a/app/views/moderator/post/approvals/create.js.erb b/app/views/moderator/post/approvals/create.js.erb
new file mode 100644
index 000000000..9593aaab1
--- /dev/null
+++ b/app/views/moderator/post/approvals/create.js.erb
@@ -0,0 +1 @@
+$("#post-<%= @post.id %>").remove();
diff --git a/app/views/moderator/post/dashboards/show.html.erb b/app/views/moderator/post/dashboards/show.html.erb
new file mode 100644
index 000000000..048917752
--- /dev/null
+++ b/app/views/moderator/post/dashboards/show.html.erb
@@ -0,0 +1,40 @@
+
+
+
+ <%= form_tag(moderator_post_dashboard_path, :method => :get) do %>
+ <%= text_field_tag "query", params[:query], :size => 40 %>
+ <%= submit_tag "Search" %>
+ <% end %>
+
+
+
+
Moderation Queue
+
+ <% @posts.each do |post| %>
+
+
+
+
+
+ - <%= link_to "Approve", moderator_post_approval_path(:post_id => post.id), :remote => true, :method => :post %> | <%= link_to "Disapprove", moderator_post_disapproval_path(:post_id => post.id), :remote => true, :method => :post %>
+ - Rating: <%= post.rating %>
+ - Score: <%= post.score %>
+ - Uploader: <%= link_to(post.uploader.name, user_path(post.uploader_id)) %> <%= time_ago_in_words(post.created_at) %> ago
+ <% if post.is_flagged? %>
+ - Flagged: <%= post_flag_reason(post) %>
+ <% end %>
+ <% if (post.is_flagged? || post.is_deleted?) && post.appeals.any? %>
+ - Appeals: <%= post_appeal_reason(post) %>
+ <% end %>
+ - Disapprovals: <%= post.disapprovals.count %>
+ - Tags: <%= post.tag_string %>
+
+
+
+ <% end %>
+
+
+
+
diff --git a/app/views/moderator/post/disapprovals/create.js.erb b/app/views/moderator/post/disapprovals/create.js.erb
new file mode 100644
index 000000000..9593aaab1
--- /dev/null
+++ b/app/views/moderator/post/disapprovals/create.js.erb
@@ -0,0 +1 @@
+$("#post-<%= @post.id %>").remove();
diff --git a/app/views/moderator/post/posts/delete.js.erb b/app/views/moderator/post/posts/delete.js.erb
new file mode 100644
index 000000000..9593aaab1
--- /dev/null
+++ b/app/views/moderator/post/posts/delete.js.erb
@@ -0,0 +1 @@
+$("#post-<%= @post.id %>").remove();
diff --git a/app/views/moderator/post/posts/undelete.js.erb b/app/views/moderator/post/posts/undelete.js.erb
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/post_votes/create.js.erb b/app/views/post_votes/create.js.erb
new file mode 100644
index 000000000..50b16779c
--- /dev/null
+++ b/app/views/post_votes/create.js.erb
@@ -0,0 +1,5 @@
+<% if @error %>
+ alert("<%= escape_javascript @error.to_s %>");
+<% else %>
+ $("#score-for-post-<%= @post.id %> span").text(<%= @post.score %>);
+<% end %>
diff --git a/config/routes.rb b/config/routes.rb
index 6bdf70ee9..fc1bf6bd8 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -9,6 +9,17 @@ Danbooru::Application.routes.draw do
get :search
end
end
+ namespace :post do
+ resource :dashboard, :only => [:show]
+ resource :approval, :only => [:create]
+ resource :disapproval, :only => [:create]
+ resources :posts, :only => [:delete, :undelete] do
+ member do
+ post :delete
+ post :undelete
+ end
+ end
+ end
end
resources :advertisements do
resources :hits, :controller => "advertisement_hits", :only => [:create]
@@ -113,14 +124,6 @@ Danbooru::Application.routes.draw do
resource :login_reminder, :only => [:new, :create]
end
end
-
- namespace :moderation do
- namespace :post do
- resource :dashboard, :only => [:show]
- resource :approval, :only => [:destroy, :create]
- resource :deletion, :only => [:destroy, :create]
- end
- end
match "/site_map" => "static#site_map", :as => "site_map"
match "/terms_of_service" => "static#terms_of_service", :as => "terms_of_service"
diff --git a/test/functional/moderator/post/approvals_controller_test.rb b/test/functional/moderator/post/approvals_controller_test.rb
new file mode 100644
index 000000000..1551b7665
--- /dev/null
+++ b/test/functional/moderator/post/approvals_controller_test.rb
@@ -0,0 +1,26 @@
+require 'test_helper'
+
+module Moderator
+ module Post
+ class ApprovalsControllerTest < ActionController::TestCase
+ context "The moderator post approvals controller" do
+ setup do
+ @admin = Factory.create(:admin_user)
+ CurrentUser.user = @admin
+ CurrentUser.ip_addr = "127.0.0.1"
+
+ @post = Factory.create(:post, :is_pending => true)
+ end
+
+ context "create action" do
+ should "render" do
+ post :create, {:post_id => @post.id, :format => "js"}, {:user_id => @admin.id}
+ assert_response :success
+ @post.reload
+ assert(!@post.is_pending?)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/test/functional/moderator/post/dashboards_controller_test.rb b/test/functional/moderator/post/dashboards_controller_test.rb
new file mode 100644
index 000000000..af6fe2ff8
--- /dev/null
+++ b/test/functional/moderator/post/dashboards_controller_test.rb
@@ -0,0 +1,24 @@
+require 'test_helper'
+
+module Moderator
+ module Post
+ class DashboardsControllerTest < ActionController::TestCase
+ context "The moderator post dashboards controller" do
+ setup do
+ @admin = Factory.create(:admin_user)
+ CurrentUser.user = @admin
+ CurrentUser.ip_addr = "127.0.0.1"
+
+ @post = Factory.create(:post, :is_pending => true)
+ end
+
+ context "show action" do
+ should "render" do
+ get :show, {}, {:user_id => @admin.id}
+ assert_response :success
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/test/functional/moderator/post/disapprovals_controller_test.rb b/test/functional/moderator/post/disapprovals_controller_test.rb
new file mode 100644
index 000000000..0c20275bc
--- /dev/null
+++ b/test/functional/moderator/post/disapprovals_controller_test.rb
@@ -0,0 +1,26 @@
+require 'test_helper'
+
+module Moderator
+ module Post
+ class DisapprovalsControllerTest < ActionController::TestCase
+ context "The moderator post disapprovals controller" do
+ setup do
+ @admin = Factory.create(:admin_user)
+ CurrentUser.user = @admin
+ CurrentUser.ip_addr = "127.0.0.1"
+
+ @post = Factory.create(:post, :is_pending => true)
+ end
+
+ context "create action" do
+ should "render" do
+ assert_difference("PostDisapproval.count", 1) do
+ post :create, {:post_id => @post.id, :format => "js"}, {:user_id => @admin.id}
+ end
+ assert_response :success
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/test/functional/moderator/post/posts_controller_test.rb b/test/functional/moderator/post/posts_controller_test.rb
new file mode 100644
index 000000000..9759b0533
--- /dev/null
+++ b/test/functional/moderator/post/posts_controller_test.rb
@@ -0,0 +1,41 @@
+require 'test_helper'
+
+module Moderator
+ module Post
+ class PostsControllerTest < ActionController::TestCase
+ context "The moderator post disapprovals controller" do
+ setup do
+ @admin = Factory.create(:admin_user)
+ CurrentUser.user = @admin
+ CurrentUser.ip_addr = "127.0.0.1"
+ end
+
+ context "delete action" do
+ setup do
+ @post = Factory.create(:post)
+ end
+
+ should "render" do
+ post :delete, {:id => @post.id, :format => "js"}, {:user_id => @admin.id}
+ assert_response :success
+ @post.reload
+ assert(@post.is_deleted?)
+ end
+ end
+
+ context "undelete action" do
+ setup do
+ @post = Factory.create(:post, :is_deleted => true)
+ end
+
+ should "render" do
+ post :undelete, {:id => @post.id, :format => "js"}, {:user_id => @admin.id}
+ assert_response :success
+ @post.reload
+ assert(!@post.is_deleted?)
+ end
+ end
+ end
+ end
+ end
+end