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 3 # view the summary of one category
4 4 def view
5 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 9 end
7 10  
  11 + attr_reader :category
  12 +
8 13 before_filter :load_category, :only => [ :view ]
9 14 def load_category
10 15 path = params[:path].join('/')
... ...
app/models/comment.rb
... ... @@ -15,4 +15,20 @@ class Comment < ActiveRecord::Base
15 15 end
16 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 34 end
... ...
app/views/category/_article.rhtml 0 → 100644
... ... @@ -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 9 <%= render :partial => @category.class.name.underscore %>
10 10  
11 11 <div id="category-childs">
  12 + <h2> <%= _('Sub-categories') %> </h2>
12 13  
13 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 16 <% else %>
16   - <h4> <%= _('Child categories:') %> </h4>
17 17 <ul>
18 18 <% @category.children.each do |c| %>
19 19 <li> <%= link_to_category(c) %> </li>
... ...
app/views/content_viewer/_comment.rhtml
  1 +<%= tag('a', :name => comment.anchor) %>
1 2 <div class="article-comment<%= ' comment-from-owner' if ( comment.author && (@page.profile.name == comment.author.name) ) %> comment-logged-<%= comment.author ? 'in' : 'out' %>">
2 3 <% if logged_in? && (user == @page.profile || user == comment.author) %>
3 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 9 @controller = CategoryController.new
10 10 @request = ActionController::TestRequest.new
11 11 @response = ActionController::TestResponse.new
  12 +
  13 + @category = Category.create!(:name => 'my category', :environment => Environment.default)
12 14 end
13 15  
14 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 49 get :view, :path => [ 'my-category' ]
18   - assert_equal category, assigns(:category)
  50 + assert_same most_commented, assigns(:most_commented_articles)
19 51 end
20 52  
21 53 end
... ...
test/unit/comment_test.rb
... ... @@ -69,4 +69,28 @@ class CommentTest &lt; Test::Unit::TestCase
69 69 assert_equal cc + 1, art.comments_count
70 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 96 end
... ...