Commit 9a88a3f30ae36b4fa2546e249e5d852f093bd5c0
1 parent
8748da0c
Exists in
master
and in
28 other branches
adding pagination for article's comments
Showing
5 changed files
with
32 additions
and
51 deletions
Show diff stats
app/controllers/public/content_viewer_controller.rb
| ... | ... | @@ -99,9 +99,7 @@ class ContentViewerController < ApplicationController |
| 99 | 99 | end |
| 100 | 100 | end |
| 101 | 101 | |
| 102 | - comments = @page.comments.without_spam | |
| 103 | - @comments = comments.as_thread | |
| 104 | - @comments_count = comments.count | |
| 102 | + @comments = @page.comments.without_spam.without_reply.paginate(:per_page => per_page, :page => params[:comment_page] ) | |
| 105 | 103 | if params[:slideshow] |
| 106 | 104 | render :action => 'slideshow', :layout => 'slideshow' |
| 107 | 105 | end | ... | ... |
app/models/comment.rb
| ... | ... | @@ -17,6 +17,7 @@ class Comment < ActiveRecord::Base |
| 17 | 17 | belongs_to :reply_of, :class_name => 'Comment', :foreign_key => 'reply_of_id' |
| 18 | 18 | |
| 19 | 19 | named_scope :without_spam, :conditions => ['spam IS NULL OR spam = ?', false] |
| 20 | + named_scope :without_reply, :conditions => ['reply_of_id IS NULL'] | |
| 20 | 21 | named_scope :spam, :conditions => ['spam = ?', true] |
| 21 | 22 | |
| 22 | 23 | # unauthenticated authors: |
| ... | ... | @@ -152,21 +153,6 @@ class Comment < ActiveRecord::Base |
| 152 | 153 | @replies = comments_list |
| 153 | 154 | end |
| 154 | 155 | |
| 155 | - def self.as_thread | |
| 156 | - result = {} | |
| 157 | - root = [] | |
| 158 | - order(:id).each do |c| | |
| 159 | - c.replies = [] | |
| 160 | - result[c.id] ||= c | |
| 161 | - if result[c.reply_of_id] | |
| 162 | - result[c.reply_of_id].replies << c | |
| 163 | - else | |
| 164 | - root << c | |
| 165 | - end | |
| 166 | - end | |
| 167 | - root | |
| 168 | - end | |
| 169 | - | |
| 170 | 156 | include ApplicationHelper |
| 171 | 157 | def reported_version(options = {}) |
| 172 | 158 | comment = self | ... | ... |
app/views/content_viewer/view_page.rhtml
| ... | ... | @@ -88,18 +88,19 @@ |
| 88 | 88 | |
| 89 | 89 | <div class="comments" id="comments_list"> |
| 90 | 90 | |
| 91 | - <% if @page.accept_comments? || @comments_count > 0 %> | |
| 92 | - <h3 <%= 'class="no-comments-yet"' if @comments_count == 0 %>> | |
| 91 | + <% if @page.accept_comments? || @comments.count > 0 %> | |
| 92 | + <h3 <%= 'class="no-comments-yet"' if @comments.count == 0 %>> | |
| 93 | 93 | <%= number_of_comments(@page) %> |
| 94 | 94 | </h3> |
| 95 | 95 | <% end %> |
| 96 | 96 | |
| 97 | - <% if @page.accept_comments? && @comments_count > 1 %> | |
| 97 | + <% if @page.accept_comments? && @comments.count > 1 %> | |
| 98 | 98 | <%= link_to(_('Post a comment'), '#', :class => 'display-comment-form', :id => 'top-post-comment-button', :onclick => "jQuery('#page-comment-form .display-comment-form').first().click();") %> |
| 99 | 99 | <% end %> |
| 100 | 100 | |
| 101 | 101 | <ul class="article-comments-list"> |
| 102 | 102 | <%= render :partial => 'comment/comment', :collection => @comments %> |
| 103 | + <%= pagination_links @comments, :param_name => 'comment_page' %> | |
| 103 | 104 | </ul> |
| 104 | 105 | |
| 105 | 106 | <% if @page.accept_comments? %> | ... | ... |
test/functional/content_viewer_controller_test.rb
| ... | ... | @@ -1084,13 +1084,13 @@ class ContentViewerControllerTest < ActionController::TestCase |
| 1084 | 1084 | article.save! |
| 1085 | 1085 | comment1 = article.comments.build(:author => profile, :title => 'hi', :body => 'hello') |
| 1086 | 1086 | comment1.save! |
| 1087 | - comment2 = article.comments.build(:author => profile, :title => 'hi', :body => 'hello', :reply_of_id => comment1.id) | |
| 1087 | + comment2 = article.comments.build(:author => profile, :title => 'hi', :body => 'hello') | |
| 1088 | 1088 | comment2.save! |
| 1089 | 1089 | get :view_page, :profile => 'testuser', :page => [ 'test' ] |
| 1090 | 1090 | assert_tag :tag => 'a', :attributes => { :id => 'top-post-comment-button' } |
| 1091 | 1091 | end |
| 1092 | 1092 | |
| 1093 | - should 'store number of comments' do | |
| 1093 | + should 'not show a post comment button on top if there are one comment and one reply' do | |
| 1094 | 1094 | profile = create_user('testuser').person |
| 1095 | 1095 | article = profile.articles.build(:name => 'test') |
| 1096 | 1096 | article.save! |
| ... | ... | @@ -1099,7 +1099,7 @@ class ContentViewerControllerTest < ActionController::TestCase |
| 1099 | 1099 | comment2 = article.comments.build(:author => profile, :title => 'hi', :body => 'hello', :reply_of_id => comment1.id) |
| 1100 | 1100 | comment2.save! |
| 1101 | 1101 | get :view_page, :profile => 'testuser', :page => [ 'test' ] |
| 1102 | - assert_equal 2, assigns(:comments_count) | |
| 1102 | + assert_no_tag :tag => 'a', :attributes => { :id => 'top-post-comment-button' } | |
| 1103 | 1103 | end |
| 1104 | 1104 | |
| 1105 | 1105 | should 'suggest article link displayed into article-actions div' do |
| ... | ... | @@ -1178,11 +1178,22 @@ class ContentViewerControllerTest < ActionController::TestCase |
| 1178 | 1178 | |
| 1179 | 1179 | should 'not display comments marked as spam' do |
| 1180 | 1180 | article = fast_create(Article, :profile_id => profile.id) |
| 1181 | - ham = fast_create(Comment, :source_id => article.id, :source_type => 'Article') | |
| 1182 | - spam = fast_create(Comment, :source_id => article.id, :source_type => 'Article', :spam => true) | |
| 1181 | + ham = fast_create(Comment, :source_id => article.id, :source_type => 'Article', :title => 'some content') | |
| 1182 | + spam = fast_create(Comment, :source_id => article.id, :source_type => 'Article', :spam => true, :title => 'this is a spam') | |
| 1183 | 1183 | |
| 1184 | 1184 | get 'view_page', :profile => profile.identifier, :page => article.path.split('/') |
| 1185 | - assert_equal 1, assigns(:comments_count) | |
| 1185 | + assert_no_tag :tag => 'h4', :content => /spam/ | |
| 1186 | 1186 | end |
| 1187 | 1187 | |
| 1188 | + should 'display pagination links of comments' do | |
| 1189 | + article = fast_create(Article, :profile_id => profile.id) | |
| 1190 | + for n in 1..15 | |
| 1191 | + article.comments.create!(:author => profile, :title => "some title #{n}", :body => 'some body #{n}') | |
| 1192 | + end | |
| 1193 | + assert_equal 15, article.comments.count | |
| 1194 | + | |
| 1195 | + get 'view_page', :profile => profile.identifier, :page => article.path.split('/') | |
| 1196 | + assert_tag :tag => 'a', :attributes => { :href => "/#{profile.identifier}/#{article.path}?comment_page=2", :rel => 'next' } | |
| 1197 | + end | |
| 1198 | + | |
| 1188 | 1199 | end | ... | ... |
test/unit/comment_test.rb
| ... | ... | @@ -285,21 +285,6 @@ class CommentTest < ActiveSupport::TestCase |
| 285 | 285 | assert_equal [c1,c3], c.reload.children |
| 286 | 286 | end |
| 287 | 287 | |
| 288 | - should "return comments as a thread" do | |
| 289 | - a = fast_create(Article) | |
| 290 | - c0 = fast_create(Comment, :source_id => a.id) | |
| 291 | - c1 = fast_create(Comment, :reply_of_id => c0.id, :source_id => a.id) | |
| 292 | - c2 = fast_create(Comment, :reply_of_id => c1.id, :source_id => a.id) | |
| 293 | - c3 = fast_create(Comment, :reply_of_id => c0.id, :source_id => a.id) | |
| 294 | - c4 = fast_create(Comment, :source_id => a.id) | |
| 295 | - result = a.comments.as_thread | |
| 296 | - assert_equal c0.id, result[0].id | |
| 297 | - assert_equal [c1.id, c3.id], result[0].replies.map(&:id) | |
| 298 | - assert_equal [c2.id], result[0].replies[0].replies.map(&:id) | |
| 299 | - assert_equal c4.id, result[1].id | |
| 300 | - assert result[1].replies.empty? | |
| 301 | - end | |
| 302 | - | |
| 303 | 288 | should "return activities comments as a thread" do |
| 304 | 289 | person = fast_create(Person) |
| 305 | 290 | a = TextileArticle.create!(:profile => person, :name => 'My article', :body => 'Article body') |
| ... | ... | @@ -515,15 +500,6 @@ class CommentTest < ActiveSupport::TestCase |
| 515 | 500 | assert_equal c, SpamNotification.marked_as_ham |
| 516 | 501 | end |
| 517 | 502 | |
| 518 | - should 'ignore spam when constructing threads' do | |
| 519 | - original = create_comment | |
| 520 | - response = create_comment(:reply_of_id => original.id) | |
| 521 | - original.spam! | |
| 522 | - | |
| 523 | - assert_equivalent [response], Comment.without_spam.as_thread | |
| 524 | - end | |
| 525 | - | |
| 526 | - | |
| 527 | 503 | should 'store User-Agent' do |
| 528 | 504 | c = Comment.new(:user_agent => 'foo') |
| 529 | 505 | assert_equal 'foo', c.user_agent |
| ... | ... | @@ -700,6 +676,15 @@ class CommentTest < ActiveSupport::TestCase |
| 700 | 676 | assert_equal c1, c1.comment_root |
| 701 | 677 | end |
| 702 | 678 | |
| 679 | + should 'be able to select non-reply comments' do | |
| 680 | + c1 = fast_create(Comment) | |
| 681 | + c2 = fast_create(Comment, :reply_of_id => c1.id) | |
| 682 | + c3 = fast_create(Comment, :reply_of_id => c2.id) | |
| 683 | + c4 = fast_create(Comment) | |
| 684 | + | |
| 685 | + assert_equivalent [c1,c4], Comment.without_reply | |
| 686 | + end | |
| 687 | + | |
| 703 | 688 | private |
| 704 | 689 | |
| 705 | 690 | def create_comment(args = {}) | ... | ... |