Commit 38da9b9ed0bf2ea087f1ed67984851d2320dbb33

Authored by AntonioTerceiro
1 parent 43a5b255

ActionItem410: refactoring search controller

To unify interface _and_ add the possibility of having specific result
pages for each type of content


git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1881 3f533792-8f58-4932-b0fe-aaf55b0a4547
app/controllers/public/search_controller.rb
... ... @@ -69,6 +69,8 @@ class SearchController < ApplicationController
69 69 def index
70 70 @query = params[:query] || ''
71 71 @filtered_query = remove_stop_words(@query)
  72 +
  73 + # FIXME name is not unique
72 74 @region = Region.find_by_name(params[:region][:name]) if params[:region]
73 75  
74 76 @results = {}
... ... @@ -81,6 +83,12 @@ class SearchController < ApplicationController
81 83 end
82 84 @names[key] = gettext(description)
83 85 end
  86 +
  87 + if @results.keys.size == 1
  88 + specific_action = @results.keys.first
  89 + send(specific_action)
  90 + render :action => specific_action
  91 + end
84 92 end
85 93  
86 94 #######################################################
... ... @@ -90,12 +98,13 @@ class SearchController < ApplicationController
90 98 @results = {}
91 99 @names = {}
92 100 [
93   - [ :recent_people, _('Recently registered people'), @finder.recent('people') ],
94   - [ :recent_communities, _('Recently created communities'), @finder.recent('communities') ],
95   - [ :recent_articles, _('Recent articles'), @finder.recent('articles') ],
  101 + [ :people, _('Recently registered people'), @finder.recent('people') ],
  102 + [ :communities, _('Recently created communities'), @finder.recent('communities') ],
  103 + [ :articles, _('Recent articles'), @finder.recent('articles') ],
96 104 [ :comments, _('Recent comments'), @finder.recent('comments') ],
97 105 [ :most_commented_articles, _('Most commented articles'), @finder.most_commented_articles ],
98   - [ :recent_enterptises, _('Recently created enterprises'), @finder.recent('enterprises') ]
  106 + [ :enterprises, _('Recently created enterprises'), @finder.recent('enterprises') ],
  107 + [ :events, _('Recently added events'), @finder.recent('events') ]
99 108 ].each do |key, name, list|
100 109 @results[key] = list
101 110 @names[key] = name
... ...
app/models/category_finder.rb
... ... @@ -7,12 +7,16 @@ class CategoryFinder
7 7  
8 8 attr_reader :category_ids
9 9  
10   - def find(asset, query, options={})
11   - find_in_categorized(asset.to_s.singularize.camelize.constantize, query, options)
  10 + def find(asset, query = nil, options={}, limit = nil)
  11 + if query.blank?
  12 + asset_class(asset).find(:all, options_for_find(asset_class(asset), {:limit => limit, :order => "created_at desc, #{asset_table(asset)}.id desc"}))
  13 + else
  14 + find_in_categorized(asset.to_s.singularize.camelize.constantize, query, options)
  15 + end
12 16 end
13 17  
14   - def recent(asset, limit = 10)
15   - asset_class(asset).find(:all, options_for_find(asset_class(asset), {:limit => limit, :order => "created_at desc, #{asset_table(asset)}.id desc"}))
  18 + def recent(asset, limit = nil)
  19 + find(asset, nil, {}, limit)
16 20 end
17 21  
18 22 def find_by_initial(asset, initial)
... ...
app/models/environment_finder.rb
... ... @@ -4,22 +4,27 @@ class EnvironmentFinder
4 4 @environment = env
5 5 end
6 6  
7   - def find(asset, query, options={})
8   - @region = Region.find_by_id(options.delete(:region)) if options.has_key?(:region)
  7 + def find(asset, query = nil, options={}, limit = nil)
  8 + @region = Region.find_by_id(options.delete(:region)) if options.has_key?(:region)
9 9 if @region && options[:within]
10 10 options[:origin] = [@region.lat, @region.lng]
11 11 else
12 12 options.delete(:within)
13 13 end
14   - @environment.send(asset).find_by_contents(query, {}, options)
15   - end
16 14  
17   - def recent(asset, limit = 10)
18   - with_options :limit => limit, :order => 'created_at desc, id desc' do |finder|
19   - @environment.send(asset).recent(limit)
  15 + if query.blank?
  16 + with_options :limit => limit, :order => 'created_at desc, id desc' do |finder|
  17 + @environment.send(asset).recent(limit)
  18 + end
  19 + else
  20 + @environment.send(asset).find_by_contents(query, {}, options)
20 21 end
21 22 end
22 23  
  24 + def recent(asset, limit = nil)
  25 + find(asset, nil, {}, limit)
  26 + end
  27 +
23 28 def find_by_initial(asset, initial)
24 29 @environment.send(asset).find_by_initial(initial)
25 30 end
... ...
app/views/search/_display_results.rhtml
... ... @@ -12,7 +12,10 @@
12 12 <% if !results.nil? and !results.empty? %>
13 13 <div class="search-results-<%= name %> search-results-box <%= pos2 %> <%= 'col%s_of3' % pos3.to_s %>">
14 14 <% if @controller.action_name != 'assets' %>
15   - <h3><%= @names[name] %></h3>
  15 + <h3>
  16 + <%= @names[name] %>
  17 + <%= link_to _('(see more ...)'), params.merge(:action => 'index', :find_in => [ name ]) %>
  18 + </h3>
16 19 <% end %>
17 20 <% partial = partial_for_class results.first.class %>
18 21 <div class="search-results-innerbox search-results-type-<%= partial %> <%= 'common-profile-list-block' if partial == 'profile' %>">
... ... @@ -22,6 +25,7 @@
22 25 <% end %>
23 26 </ul>
24 27 </div><!-- end class="search-results-innerbox" -->
  28 +
25 29 </div><!-- end class="search-results-<%= name %>" -->
26 30 <% else %>
27 31 <div class="search-results-<%= name %> search-results-empty search-results-box <%= pos2 %> <%= 'col%s_of3' % pos3.to_s %>">
... ...
test/functional/search_controller_test.rb
... ... @@ -362,7 +362,7 @@ class SearchControllerTest &lt; Test::Unit::TestCase
362 362 :products => 'Products',
363 363 }
364 364 names.each do |thing, description|
365   - assert_tag :tag => 'div', :attributes => { :class => /search-results-#{thing}/ }, :descendant => { :tag => 'h3', :content => description }
  365 + assert_tag :tag => 'div', :attributes => { :class => /search-results-#{thing}/ }, :descendant => { :tag => 'h3', :content => Regexp.new(description) }
366 366 assert_tag :tag => 'a', :content => "display #{thing.to_s.singularize}"
367 367 end
368 368 end
... ... @@ -447,7 +447,7 @@ class SearchControllerTest &lt; Test::Unit::TestCase
447 447 CategoryFinder.expects(:new).with(@category).returns(finger)
448 448  
449 449 get :category_index, :category_path => [ 'my-category' ]
450   - assert_same recent, assigns(:results)[:recent_articles]
  450 + assert_same recent, assigns(:results)[:articles]
451 451 end
452 452  
453 453 should 'list recent comments in the category' do
... ... @@ -479,7 +479,7 @@ class SearchControllerTest &lt; Test::Unit::TestCase
479 479 CategoryFinder.expects(:new).with(@category).returns(finger)
480 480  
481 481 get :category_index, :category_path => [ 'my-category' ]
482   - assert_same recent_people, assigns(:results)[:recent_people]
  482 + assert_same recent_people, assigns(:results)[:people]
483 483 end
484 484  
485 485 should 'list recently registered communities in the category' do
... ... @@ -490,7 +490,7 @@ class SearchControllerTest &lt; Test::Unit::TestCase
490 490 CategoryFinder.expects(:new).with(@category).returns(finger)
491 491  
492 492 get :category_index, :category_path => [ 'my-category' ]
493   - assert_same recent_communities, assigns(:results)[:recent_communities]
  493 + assert_same recent_communities, assigns(:results)[:communities]
494 494 end
495 495  
496 496 should 'list recently registered enterprises in the category' do
... ... @@ -501,7 +501,7 @@ class SearchControllerTest &lt; Test::Unit::TestCase
501 501 CategoryFinder.expects(:new).with(@category).returns(finger)
502 502  
503 503 get :category_index, :category_path => [ 'my-category' ]
504   - assert_same recent_enterptises, assigns(:results)[:recent_enterptises]
  504 + assert_same recent_enterptises, assigns(:results)[:enterprises]
505 505 end
506 506  
507 507 should 'not list "Search for ..." in category_index' do
... ... @@ -900,6 +900,15 @@ class SearchControllerTest &lt; Test::Unit::TestCase
900 900 assert_not_includes assigns(:results)[:events], ev3
901 901 end
902 902  
  903 + %w[ people enterprises articles events communities products comments ].each do |asset|
  904 +
  905 + should "render asset-specific template when searching for #{asset}" do
  906 + get :index, :find_in => [ asset ]
  907 + assert_template asset
  908 + end
  909 +
  910 + end
  911 +
903 912 ##################################################################
904 913 ##################################################################
905 914  
... ...