From 4828cef27d2ee0400388e51ac7e86cc76c4c8473 Mon Sep 17 00:00:00 2001 From: albert Date: Fri, 22 Jul 2011 13:35:40 -0400 Subject: [PATCH] refactored post mod queue --- app/assets/stylesheets/application.css.scss | 3 +- .../moderator/post/approvals_controller.rb | 10 ++++ .../moderator/post/dashboards_controller.rb | 13 ++++ .../moderator/post/disapprovals_controller.rb | 15 +++++ .../moderator/post/posts_controller.rb | 15 +++++ app/controllers/post_moderation_controller.rb | 60 ------------------- app/models/post_disapproval.rb | 4 +- .../moderator/post/approvals/create.js.erb | 1 + .../moderator/post/dashboards/show.html.erb | 40 +++++++++++++ .../moderator/post/disapprovals/create.js.erb | 1 + app/views/moderator/post/posts/delete.js.erb | 1 + .../moderator/post/posts/undelete.js.erb | 0 app/views/post_votes/create.js.erb | 5 ++ config/routes.rb | 19 +++--- .../post/approvals_controller_test.rb | 26 ++++++++ .../post/dashboards_controller_test.rb | 24 ++++++++ .../post/disapprovals_controller_test.rb | 26 ++++++++ .../moderator/post/posts_controller_test.rb | 41 +++++++++++++ 18 files changed, 233 insertions(+), 71 deletions(-) create mode 100644 app/controllers/moderator/post/approvals_controller.rb create mode 100644 app/controllers/moderator/post/dashboards_controller.rb create mode 100644 app/controllers/moderator/post/disapprovals_controller.rb create mode 100644 app/controllers/moderator/post/posts_controller.rb delete mode 100644 app/controllers/post_moderation_controller.rb create mode 100644 app/views/moderator/post/approvals/create.js.erb create mode 100644 app/views/moderator/post/dashboards/show.html.erb create mode 100644 app/views/moderator/post/disapprovals/create.js.erb create mode 100644 app/views/moderator/post/posts/delete.js.erb create mode 100644 app/views/moderator/post/posts/undelete.js.erb create mode 100644 app/views/post_votes/create.js.erb create mode 100644 test/functional/moderator/post/approvals_controller_test.rb create mode 100644 test/functional/moderator/post/dashboards_controller_test.rb create mode 100644 test/functional/moderator/post/disapprovals_controller_test.rb create mode 100644 test/functional/moderator/post/posts_controller_test.rb 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 @@ +
+
+ + +
+

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