Commit a61b1b26f877fdce7301360560c92e7c6cbaf3b7

Authored by AntonioTerceiro
1 parent deeae934

ActionItem51:

displaying recent articles/comments and most commented
articles on the category "homepage"


git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1588 3f533792-8f58-4932-b0fe-aaf55b0a4547
app/controllers/public/category_controller.rb
@@ -3,8 +3,13 @@ class CategoryController < PublicController @@ -3,8 +3,13 @@ class CategoryController < PublicController
3 # view the summary of one category 3 # view the summary of one category
4 def view 4 def view
5 # TODO: load articles, documents, etc so the view can list them. 5 # TODO: load articles, documents, etc so the view can list them.
  6 + @recent_articles = category.recent_articles
  7 + @recent_comments = category.recent_comments
  8 + @most_commented_articles = category.most_commented_articles
6 end 9 end
7 10
  11 + attr_reader :category
  12 +
8 before_filter :load_category, :only => [ :view ] 13 before_filter :load_category, :only => [ :view ]
9 def load_category 14 def load_category
10 path = params[:path].join('/') 15 path = params[:path].join('/')
app/models/comment.rb
@@ -15,4 +15,20 @@ class Comment < ActiveRecord::Base @@ -15,4 +15,20 @@ class Comment < ActiveRecord::Base
15 end 15 end
16 end 16 end
17 17
  18 + def author_name
  19 + if author
  20 + author.name
  21 + else
  22 + name
  23 + end
  24 + end
  25 +
  26 + def url
  27 + article.url.merge(:anchor => anchor)
  28 + end
  29 +
  30 + def anchor
  31 + "comment-#{id}"
  32 + end
  33 +
18 end 34 end
app/views/category/_article.rhtml 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +<li><%= _('"%s", by %s. Last update: %s.') % [link_to(article.title, article.url), link_to(article.last_changed_by.name, article.last_changed_by.url), show_date(article.updated_on) ] %></li>
app/views/category/_category.rhtml
1 -<%# FIXME %>  
2 -<p>  
3 -This page will list everything (articles, documents, photos, etc) that is  
4 -related to <%= @category.full_name %>. Actually generating this content is not  
5 -implement yet, though.  
6 -</p> 1 +<h2><%= _('Recent articles') %></h2>
  2 +<ul>
  3 + <%= render :partial => 'article', :collection => @recent_articles %>
  4 +</ul>
7 5
8 -<p>  
9 -And yes, this placeholder text is not translated.  
10 -</p> 6 +<h2><%= _('Recent Comments') %></h2>
  7 +<ul>
  8 +<% @recent_comments.each do |comment| %>
  9 + <li><%= _('"%{comment}" by %{author} on "%{article}"') % { :comment => link_to(comment.title, comment.url), :article => link_to(comment.article.title, comment.article.url), :author => comment.author_name } %></li>
  10 +<% end %>
  11 +</ul>
  12 +
  13 +<h2><%= _('Most commented articles') %></h2>
  14 +<ul>
  15 + <%= render :partial => 'article', :collection => @most_commented_articles %>
  16 +</ul>
app/views/category/view.rhtml
@@ -9,11 +9,11 @@ @@ -9,11 +9,11 @@
9 <%= render :partial => @category.class.name.underscore %> 9 <%= render :partial => @category.class.name.underscore %>
10 10
11 <div id="category-childs"> 11 <div id="category-childs">
  12 + <h2> <%= _('Sub-categories') %> </h2>
12 13
13 <% if @category.children.empty? %> 14 <% if @category.children.empty? %>
14 - <strong id="cat-no-child"><%= _('No children categories') %></strong> 15 + <strong id="cat-no-child"><%= _('No sub-categories') %></strong>
15 <% else %> 16 <% else %>
16 - <h4> <%= _('Child categories:') %> </h4>  
17 <ul> 17 <ul>
18 <% @category.children.each do |c| %> 18 <% @category.children.each do |c| %>
19 <li> <%= link_to_category(c) %> </li> 19 <li> <%= link_to_category(c) %> </li>
app/views/content_viewer/_comment.rhtml
  1 +<%= tag('a', :name => comment.anchor) %>
1 <div class="article-comment<%= ' comment-from-owner' if ( comment.author && (@page.profile.name == comment.author.name) ) %> comment-logged-<%= comment.author ? 'in' : 'out' %>"> 2 <div class="article-comment<%= ' comment-from-owner' if ( comment.author && (@page.profile.name == comment.author.name) ) %> comment-logged-<%= comment.author ? 'in' : 'out' %>">
2 <% if logged_in? && (user == @page.profile || user == comment.author) %> 3 <% if logged_in? && (user == @page.profile || user == comment.author) %>
3 <% button_bar(:style => 'float: right; margin-top: 0;') do %> 4 <% button_bar(:style => 'float: right; margin-top: 0;') do %>
test/functional/category_controller_test.rb
@@ -9,13 +9,45 @@ class CategoryControllerTest &lt; Test::Unit::TestCase @@ -9,13 +9,45 @@ class CategoryControllerTest &lt; Test::Unit::TestCase
9 @controller = CategoryController.new 9 @controller = CategoryController.new
10 @request = ActionController::TestRequest.new 10 @request = ActionController::TestRequest.new
11 @response = ActionController::TestResponse.new 11 @response = ActionController::TestResponse.new
  12 +
  13 + @category = Category.create!(:name => 'my category', :environment => Environment.default)
12 end 14 end
13 15
14 def test_should_display_a_given_category 16 def test_should_display_a_given_category
15 - category = Category.create!(:name => 'my category', :environment => Environment.default) 17 + get :view, :path => [ 'my-category' ]
  18 + assert_equal @category, assigns(:category)
  19 + end
  20 +
  21 + should 'expose category in a method' do
  22 + get :view, :path => [ 'my-category' ]
  23 + assert_same assigns(:category), @controller.category
  24 + end
  25 +
  26 + should 'list recent articles in the category' do
  27 + @controller.expects(:category).returns(@category).at_least_once
  28 + recent = []
  29 + @category.expects(:recent_articles).returns(recent)
  30 +
  31 + get :view, :path => [ 'my-category' ]
  32 + assert_same recent, assigns(:recent_articles)
  33 + end
  34 +
  35 + should 'list recent comments in the category' do
  36 + @controller.expects(:category).returns(@category).at_least_once
  37 + recent = []
  38 + @category.expects(:recent_comments).returns(recent)
  39 +
  40 + get :view, :path => [ 'my-category' ]
  41 + assert_same recent, assigns(:recent_comments)
  42 + end
  43 +
  44 + should 'list most commented articles in the category' do
  45 + @controller.expects(:category).returns(@category).at_least_once
  46 + most_commented = []
  47 + @category.expects(:most_commented_articles).returns(most_commented)
16 48
17 get :view, :path => [ 'my-category' ] 49 get :view, :path => [ 'my-category' ]
18 - assert_equal category, assigns(:category) 50 + assert_same most_commented, assigns(:most_commented_articles)
19 end 51 end
20 52
21 end 53 end
test/unit/comment_test.rb
@@ -69,4 +69,28 @@ class CommentTest &lt; Test::Unit::TestCase @@ -69,4 +69,28 @@ class CommentTest &lt; Test::Unit::TestCase
69 assert_equal cc + 1, art.comments_count 69 assert_equal cc + 1, art.comments_count
70 end 70 end
71 71
  72 + should 'provide author name for authenticated authors' do
  73 + owner = create_user('testuser').person
  74 + assert_equal 'testuser', Comment.new(:author => owner).author_name
  75 + end
  76 +
  77 + should 'provide author name for unauthenticated author' do
  78 + assert_equal 'anonymous coward', Comment.new(:name => 'anonymous coward').author_name
  79 + end
  80 +
  81 + should 'provide url to comment' do
  82 + art = Article.new
  83 + art.expects(:url).returns({ :controller => 'lala', :action => 'something' })
  84 + comment = Comment.new(:article => art)
  85 + comment.expects(:id).returns(9876)
  86 +
  87 + assert_equal({ :controller => 'lala', :action => 'something', :anchor => 'comment-9876'}, comment.url)
  88 + end
  89 +
  90 + should 'provide anchor' do
  91 + comment = Comment.new
  92 + comment.expects(:id).returns(4321)
  93 + assert_equal 'comment-4321', comment.anchor
  94 + end
  95 +
72 end 96 end