Commit 9a88a3f30ae36b4fa2546e249e5d852f093bd5c0

Authored by Leandro Nunes dos Santos
1 parent 8748da0c

adding pagination for article's comments

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 &lt; 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 &lt; 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 &lt; 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 &lt; 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 &lt; 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 &lt; 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 = {})
... ...