Commit 2382a9652197ac247ba2983fe4243cf23e854ac2

Authored by Antonio Terceiro
1 parent 5521d9b4

UI to mark comments as SPAM

Plus a small enhancements on the existing UI for comments: turned the
"delete" button into a text-only label in the bottom, instead of an
annoying icon that shows up when you pass the mouse over the comment
balloon.

ActionItem2306
app/controllers/public/content_viewer_controller.rb
... ... @@ -75,8 +75,14 @@ class ContentViewerController < ApplicationController
75 75 @comment = Comment.new
76 76 end
77 77  
78   - if request.post? && params[:remove_comment]
79   - remove_comment
  78 + if request.post?
  79 + if params[:remove_comment]
  80 + remove_comment
  81 + return
  82 + elsif params[:mark_comment_as_spam]
  83 + mark_comment_as_spam
  84 + return
  85 + end
80 86 end
81 87  
82 88 if @page.has_posts?
... ... @@ -107,8 +113,9 @@ class ContentViewerController < ApplicationController
107 113 end
108 114 end
109 115  
110   - @comments = @page.comments(true).as_thread
111   - @comments_count = @page.comments.count
  116 + comments = @page.comments.without_spam
  117 + @comments = comments.as_thread
  118 + @comments_count = comments.count
112 119 if params[:slideshow]
113 120 render :action => 'slideshow', :layout => 'slideshow'
114 121 end
... ... @@ -151,6 +158,15 @@ class ContentViewerController < ApplicationController
151 158 redirect_to :action => 'view_page', :profile => params[:profile], :page => @page.explode_path, :view => params[:view]
152 159 end
153 160  
  161 + def mark_comment_as_spam
  162 + @comment = @page.comments.find(params[:mark_comment_as_spam])
  163 + if logged_in? && (user == @page.profile || user.has_permission?(:moderate_comments, @page.profile))
  164 + @comment.spam!
  165 + session[:notice] = _('Comment succesfully marked as SPAM')
  166 + end
  167 + redirect_to :action => 'view_page', :profile => params[:profile], :page => @page.explode_path, :view => params[:view]
  168 + end
  169 +
154 170 def per_page
155 171 12
156 172 end
... ...
app/helpers/content_viewer_helper.rb
... ... @@ -4,7 +4,7 @@ module ContentViewerHelper
4 4 include ForumHelper
5 5  
6 6 def number_of_comments(article)
7   - n = article.comments.size
  7 + n = article.comments.without_spam.count
8 8 if n == 0
9 9 _('No comments yet')
10 10 else
... ...
app/models/comment.rb
... ... @@ -198,4 +198,9 @@ class Comment < ActiveRecord::Base
198 198 !spam.nil? && !spam
199 199 end
200 200  
  201 + def spam!
  202 + self.spam = true
  203 + self.save!
  204 + end
  205 +
201 206 end
... ...
app/views/content_viewer/_comment.rhtml
... ... @@ -29,17 +29,12 @@
29 29 <% end %>
30 30  
31 31 <% comment_balloon do %>
32   - <% if logged_in? && (user == @page.profile || user == comment.author || user.has_permission?(:moderate_comments, @page.profile)) %>
33   - <% button_bar(:style => 'float: right; margin-top: 0px;') do %>
34   - <%= icon_button(:delete, _('Remove this comment and all its replies'), { :profile => params[:profile], :remove_comment => comment.id, :view => params[:view] }, :method => :post, :confirm => _('Are you sure you want to remove this comment and all its replies?')) %>
35   - <% end %>
36   - <% end %>
37 32  
38 33 <div class="comment-details">
39 34 <div class="comment-created-at">
40 35 <%= show_time(comment.created_at) %>
41 36 </div>
42   - <h4><%= comment.title %></h4>
  37 + <h4><%= comment.title.blank? && '&nbsp;' || comment.title %></h4>
43 38 <div class="comment-text">
44 39 <p/>
45 40 <%= txt2html comment.body %>
... ... @@ -57,6 +52,17 @@
57 52 </script>
58 53 <% end %>
59 54 <%= report_abuse(comment.author, :comment_link, comment) if comment.author %>
  55 +
  56 + <% if (logged_in? && (user == @page.profile || user.has_permission?(:moderate_comments, @page.profile))) %>
  57 + <%= link_to(_('Mark as SPAM'), { :mark_comment_as_spam => comment.id }, :method => :post, :confirm => _('Are you sure you want to mark this comment as SPAM?'), :class => 'comment-footer comment-footer-link comment-footer-hide') %>
  58 + &nbsp;
  59 + <% end %>
  60 +
  61 + <% if logged_in? && (user == @page.profile || user == comment.author || user.has_permission?(:moderate_comments, @page.profile)) %>
  62 + <%= link_to(_('Remove'), { :profile => params[:profile], :remove_comment => comment.id, :view => params[:view] }, :method => :post, :confirm => _('Are you sure you want to remove this comment and all its replies?'), :class => 'comment-footer comment-footer-link comment-footer-hide') %>
  63 + &nbsp;
  64 + <% end %>
  65 +
60 66 <%= link_to_function _('Reply'),
61 67 "var f = add_comment_reply_form(this, %s); f.find('input[name=comment[title]], textarea').val(''); return false" % comment.id,
62 68 :class => 'comment-footer comment-footer-link comment-footer-hide',
... ...
app/views/content_viewer/view_page.rhtml
... ... @@ -99,12 +99,6 @@
99 99  
100 100 <% if @page.accept_comments? %>
101 101 <div id="page-comment-form"><%= render :partial => 'comment_form' %></div>
102   - <script type="text/javascript">
103   - jQuery( function() {
104   - jQuery('.article-comment').live('mouseover', function() { jQuery(this).find('.icon-delete:first').show(); });
105   - jQuery('.article-comment').live('mouseout', function() { jQuery(this).find('.icon-delete').hide(); });
106   - });
107   - </script>
108 102 <% end %>
109 103 </div><!-- end class="comments" -->
110 104  
... ...
public/stylesheets/application.css
... ... @@ -1069,15 +1069,6 @@ a.comment-picture {
1069 1069 top: 9px;
1070 1070 right: 8px;
1071 1071 }
1072   -#content .comment-balloon a.button.icon-delete {
1073   - border: 0;
1074   - padding-top: 0;
1075   - padding-bottom: 0;
1076   - background-color: transparent;
1077   -}
1078   -#content .comments .comment-balloon a.button.icon-delete {
1079   - display: none;
1080   -}
1081 1072 .msie7 .article-comments-list .comment-balloon {
1082 1073 margin-top: -15px;
1083 1074 }
... ...
test/functional/content_viewer_controller_test.rb
... ... @@ -1407,4 +1407,24 @@ class ContentViewerControllerTest &lt; ActionController::TestCase
1407 1407 assert_not_includes Article.find(article.id).followers, follower_email
1408 1408 end
1409 1409  
  1410 + should 'not display comments marked as spam' do
  1411 + article = fast_create(Article, :profile_id => profile.id)
  1412 + ham = fast_create(Comment, :source_id => article.id)
  1413 + spam = fast_create(Comment, :source_id => article.id, :spam => true)
  1414 +
  1415 + get 'view_page', :profile => profile.identifier, :page => article.path.split('/')
  1416 + assert_equal 1, assigns(:comments_count)
  1417 + end
  1418 +
  1419 + should 'be able to mark comments as spam' do
  1420 + login_as profile.identifier
  1421 + article = fast_create(Article, :profile_id => profile.id)
  1422 + spam = fast_create(Comment, :name => 'foo', :email => 'foo@example.com', :source_id => article.id)
  1423 +
  1424 + post 'view_page', :profile => profile.identifier, :page => article.path.split('/'), :mark_comment_as_spam => spam.id
  1425 +
  1426 + spam.reload
  1427 + assert spam.spam?
  1428 + end
  1429 +
1410 1430 end
... ...
test/unit/comment_test.rb
... ... @@ -445,4 +445,11 @@ class CommentTest &lt; ActiveSupport::TestCase
445 445 assert_equivalent [c1,c2], Comment.without_spam
446 446 end
447 447  
  448 + should 'be able to mark as spam atomically' do
  449 + c1 = fast_create(Comment, :name => 'foo', :email => 'foo@example.com')
  450 + c1.spam!
  451 + c1.reload
  452 + assert c1.spam?
  453 + end
  454 +
448 455 end
... ...