Commit a3bd56ab0500ad9da766bb8d63b3c5924b224fae
1 parent
94f57228
Exists in
staging
and in
42 other branches
ActionItem510: putted the product category menu in the enteprise asset view
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2119 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
7 changed files
with
133 additions
and
21 deletions
Show diff stats
app/controllers/public/search_controller.rb
| ... | ... | @@ -73,7 +73,7 @@ class SearchController < ApplicationController |
| 73 | 73 | #nothing, just to enable |
| 74 | 74 | end |
| 75 | 75 | def enterprises |
| 76 | - #nothing, just to enable | |
| 76 | + load_product_categories_menu(:enterprises) | |
| 77 | 77 | end |
| 78 | 78 | def communities |
| 79 | 79 | #nothing, just to enable |
| ... | ... | @@ -82,6 +82,17 @@ class SearchController < ApplicationController |
| 82 | 82 | #nothins, just to enable |
| 83 | 83 | end |
| 84 | 84 | |
| 85 | + def products | |
| 86 | + load_product_categories_menu(:products) | |
| 87 | + end | |
| 88 | + | |
| 89 | + def load_product_categories_menu(asset) | |
| 90 | + @results[asset].uniq! | |
| 91 | + @categories_menu = ProductCategory.menu_categories(@product_category, environment).map do |cat| | |
| 92 | + [cat, @finder.count(:products, @filtered_query, calculate_find_options(asset, nil, cat, @region, params[:radius]))] | |
| 93 | + end.select{|cat, hits| hits > 0 } | |
| 94 | + end | |
| 95 | + | |
| 85 | 96 | def calculate_find_options(asset, limit, product_category, region, radius) |
| 86 | 97 | |
| 87 | 98 | result = { :limit => limit, :product_category => product_category} |
| ... | ... | @@ -128,7 +139,7 @@ class SearchController < ApplicationController |
| 128 | 139 | number_of_result_assets = @searching.values.select{|v| v}.size |
| 129 | 140 | |
| 130 | 141 | # apply limit when searching for only one type of asset |
| 131 | - limit = (number_of_result_assets == 1) ? LIST_LIMIT : nil | |
| 142 | + limit = (number_of_result_assets == 1) ? nil: LIST_LIMIT | |
| 132 | 143 | # apply limit to all searches |
| 133 | 144 | # limit = nil |
| 134 | 145 | |
| ... | ... | @@ -153,13 +164,6 @@ class SearchController < ApplicationController |
| 153 | 164 | render :action => 'index' |
| 154 | 165 | end |
| 155 | 166 | |
| 156 | - def products | |
| 157 | - @results[:products].uniq! | |
| 158 | - @categories_menu = ProductCategory.menu_categories(@product_category, environment).map do |cat| | |
| 159 | - [cat, @finder.count(:products, @filtered_query, calculate_find_options(:products, nil, cat, @region, params[:radius]))] | |
| 160 | - end.select{|cat, hits| hits > 0 } | |
| 161 | - end | |
| 162 | - | |
| 163 | 167 | alias :assets :index |
| 164 | 168 | |
| 165 | 169 | ####################################################### | ... | ... |
app/models/category_finder.rb
| ... | ... | @@ -9,7 +9,7 @@ class CategoryFinder |
| 9 | 9 | |
| 10 | 10 | |
| 11 | 11 | |
| 12 | - def find(asset, query = nil, options={}) | |
| 12 | + def find(asset, query='', options={}) | |
| 13 | 13 | @region = Region.find_by_id(options.delete(:region)) if options.has_key?(:region) |
| 14 | 14 | if @region && options[:within] |
| 15 | 15 | options[:origin] = [@region.lat, @region.lng] |
| ... | ... | @@ -17,9 +17,15 @@ class CategoryFinder |
| 17 | 17 | options.delete(:within) |
| 18 | 18 | end |
| 19 | 19 | |
| 20 | + # FIXME: can break if more things is added in the extra_data_for_index ferret field in enterprise | |
| 21 | + # this searches for enterprise using its products categories criteria | |
| 22 | + if options[:product_category] && asset.to_s == 'enterprises' | |
| 23 | + query = query.blank? ? "extra_data_for_index:#{options[:product_category].name}" : query + " +extra_data_for_index:#{options[:product_category].name}" | |
| 24 | + end | |
| 25 | + | |
| 20 | 26 | if query.blank? |
| 21 | 27 | asset_class(asset).find(:all, options_for_find(asset_class(asset), {:order => "created_at desc, #{asset_table(asset)}.id desc"}.merge(options))) |
| 22 | - else | |
| 28 | + else | |
| 23 | 29 | asset_class(asset).find_by_contents(query, {}, options_for_find(asset_class(asset), options)).uniq |
| 24 | 30 | end |
| 25 | 31 | end | ... | ... |
app/views/search/enterprises.rhtml
| ... | ... | @@ -0,0 +1,19 @@ |
| 1 | +<h1> | |
| 2 | + <% if !@query.blank? %> | |
| 3 | + <%=h @category ? (_('Enterprise results for "%{query}" in "%{category}"') % { :query => @query, :category => @category.name}) : (_('Enterprise results for "%s"') % @query) %> | |
| 4 | + <% else %> | |
| 5 | + <%=h @category ? (_('Enterprises in "%s"') % @category.name) : _('Enterprise') %> | |
| 6 | + <% end %> | |
| 7 | +</h1> | |
| 8 | + | |
| 9 | +<% if @radius && @region %> | |
| 10 | + <h2><%=h (_('Within %s km from %s') % [@radius, @region.name]) %><h2> | |
| 11 | +<% end %> | |
| 12 | + | |
| 13 | +<%= render :partial => 'search_form', :locals => { :form_title => _("Refine your search"), :simple_search => true } %> | |
| 14 | + | |
| 15 | +<%= render :partial => 'product_categories_menu', :object => @categories_menu %> | |
| 16 | + | |
| 17 | +<%= display_results %> | |
| 18 | + | |
| 19 | +<br style="clear:both" /> | ... | ... |
app/views/search/products.rhtml
| ... | ... | @@ -12,15 +12,7 @@ |
| 12 | 12 | |
| 13 | 13 | <%= render :partial => 'search_form', :locals => { :form_title => _("Refine your search"), :simple_search => true } %> |
| 14 | 14 | |
| 15 | -<% if @categories_menu %> | |
| 16 | - <div id="product-categories-menu" class="product-search-filter"> | |
| 17 | - <ul> | |
| 18 | - <% @categories_menu.each do |cat, hits| %> | |
| 19 | - <li><%= link_to (cat.name + "(#{hits})"), params.merge({:product_category => cat.id}) %> </li> | |
| 20 | - <% end %> | |
| 21 | - </ul> | |
| 22 | - </div> | |
| 23 | -<% end %> | |
| 15 | +<%= render :partial => 'product_categories_menu', :object => @categories_menu %> | |
| 24 | 16 | |
| 25 | 17 | <div id="search-results" class="only-one-result-box"> |
| 26 | 18 | <div class="search-results-products search-results-box"> | ... | ... |
test/functional/search_controller_test.rb
| ... | ... | @@ -838,6 +838,68 @@ class SearchControllerTest < Test::Unit::TestCase |
| 838 | 838 | assert_not_includes assigns(:categories_menu).map(&:first), cat12 |
| 839 | 839 | end |
| 840 | 840 | |
| 841 | + should 'list only product categories with enterprises' do | |
| 842 | + cat1 = ProductCategory.create!(:name => 'pc test 1', :environment => Environment.default) | |
| 843 | + cat2 = ProductCategory.create!(:name => 'pc test 2', :environment => Environment.default) | |
| 844 | + ent = Enterprise.create!(:name => 'test ent', :identifier => 'test_ent') | |
| 845 | + | |
| 846 | + cat1.products.create!(:name => 'prod test 1', :enterprise => ent) | |
| 847 | + | |
| 848 | + get :index, :find_in => 'enterprises', :query => 'test' | |
| 849 | + | |
| 850 | + assert_includes assigns(:categories_menu).map(&:first), cat1 | |
| 851 | + assert_not_includes assigns(:categories_menu).map(&:first), cat2 | |
| 852 | + end | |
| 853 | + | |
| 854 | + should 'display enteprises only within a product category when specified' do | |
| 855 | + prod_cat = ProductCategory.create!(:name => 'prod cat test', :environment => Environment.default) | |
| 856 | + ent = Enterprise.create!(:name => 'test ent', :identifier => 'test_ent') | |
| 857 | + | |
| 858 | + p = prod_cat.products.create!(:name => 'prod test 1', :enterprise => ent) | |
| 859 | + | |
| 860 | + get :index, :find_in => 'enterprises', :product_category => prod_cat.id | |
| 861 | + | |
| 862 | + assert_includes assigns(:results)[:enterprises], ent | |
| 863 | + end | |
| 864 | + | |
| 865 | + should 'display enterprises properly in conjuntion with a category' do | |
| 866 | + cat = Category.create(:name => 'cat', :environment => Environment.default) | |
| 867 | + prod_cat1 = ProductCategory.create!(:name => 'prod cat test 1', :environment => Environment.default) | |
| 868 | + prod_cat2 = ProductCategory.create!(:name => 'prod cat test 2', :environment => Environment.default, :parent => prod_cat1) | |
| 869 | + ent = Enterprise.create!(:name => 'test ent', :identifier => 'test_ent', :category_ids => [cat.id]) | |
| 870 | + | |
| 871 | + p = prod_cat2.products.create!(:name => 'prod test 1', :enterprise => ent) | |
| 872 | + | |
| 873 | + get :index, :find_in => 'enterprises', :category_path => cat.path.split('/'), :product_category => prod_cat1.id | |
| 874 | + | |
| 875 | + assert_includes assigns(:results)[:enterprises], ent | |
| 876 | + end | |
| 877 | + | |
| 878 | + should 'display only top level product categories that has enterprises when no product category filter is specified' do | |
| 879 | + cat1 = ProductCategory.create(:name => 'prod cat 1', :environment => Environment.default) | |
| 880 | + cat2 = ProductCategory.create(:name => 'prod cat 2', :environment => Environment.default) | |
| 881 | + ent = Enterprise.create!(:name => 'test ent', :identifier => 'test_ent') | |
| 882 | + p = cat1.products.create!(:name => 'prod test 1', :enterprise => ent) | |
| 883 | + | |
| 884 | + get :index, :find_in => 'enterprises' | |
| 885 | + | |
| 886 | + assert_includes assigns(:categories_menu).map(&:first), cat1 | |
| 887 | + assert_not_includes assigns(:categories_menu).map(&:first), cat2 | |
| 888 | + end | |
| 889 | + | |
| 890 | + should 'display children categories that has enterprises when product category filter is selected' do | |
| 891 | + cat1 = ProductCategory.create(:name => 'prod cat 1', :environment => Environment.default) | |
| 892 | + cat11 = ProductCategory.create(:name => 'prod cat 11', :environment => Environment.default, :parent => cat1) | |
| 893 | + cat12 = ProductCategory.create(:name => 'prod cat 12', :environment => Environment.default, :parent => cat1) | |
| 894 | + ent = Enterprise.create!(:name => 'test ent', :identifier => 'test_ent') | |
| 895 | + p = cat11.products.create!(:name => 'prod test 1', :enterprise => ent) | |
| 896 | + | |
| 897 | + get :index, :find_in => 'enterprises', :product_category => cat1.id | |
| 898 | + | |
| 899 | + assert_includes assigns(:categories_menu).map(&:first), cat11 | |
| 900 | + assert_not_includes assigns(:categories_menu).map(&:first), cat12 | |
| 901 | + end | |
| 902 | + | |
| 841 | 903 | should 'provide calendar for events' do |
| 842 | 904 | get :index, :find_in => [ 'events' ] |
| 843 | 905 | assert_equal 0, assigns(:calendar).size % 7 | ... | ... |
test/unit/category_finder_test.rb
| ... | ... | @@ -381,4 +381,34 @@ class CategoryFinderTest < ActiveSupport::TestCase |
| 381 | 381 | assert_not_includes prods, prod2 |
| 382 | 382 | end |
| 383 | 383 | |
| 384 | + should 'find enterprises by its products categories without query' do | |
| 385 | + pc1 = ProductCategory.create!(:name => 'test_cat1', :environment => Environment.default) | |
| 386 | + pc2 = ProductCategory.create!(:name => 'test_cat2', :environment => Environment.default) | |
| 387 | + | |
| 388 | + ent1 = Enterprise.create!(:name => 'test enterprise 1', :identifier => 'test_ent1', :category_ids => [@category.id]) | |
| 389 | + ent1.products.create!(:name => 'test product 1', :product_category => pc1) | |
| 390 | + ent2 = Enterprise.create!(:name => 'test enterprise 2', :identifier => 'test_ent2', :category_ids => [@category.id]) | |
| 391 | + ent2.products.create!(:name => 'test product 2', :product_category => pc2) | |
| 392 | + | |
| 393 | + ents = @finder.find(:enterprises, nil, :product_category => pc1) | |
| 394 | + | |
| 395 | + assert_includes ents, ent1 | |
| 396 | + assert_not_includes ents, ent2 | |
| 397 | + end | |
| 398 | + | |
| 399 | + should 'find enterprises by its products categories with query' do | |
| 400 | + pc1 = ProductCategory.create!(:name => 'test_cat1', :environment => Environment.default) | |
| 401 | + pc2 = ProductCategory.create!(:name => 'test_cat2', :environment => Environment.default) | |
| 402 | + | |
| 403 | + ent1 = Enterprise.create!(:name => 'test enterprise 1', :identifier => 'test_ent1', :category_ids => [@category.id]) | |
| 404 | + ent1.products.create!(:name => 'test product 1', :product_category => pc1) | |
| 405 | + ent2 = Enterprise.create!(:name => 'test enterprise 2', :identifier => 'test_ent2', :category_ids => [@category.id]) | |
| 406 | + ent2.products.create!(:name => 'test product 2', :product_category => pc2) | |
| 407 | + | |
| 408 | + ents = @finder.find(:enterprises, 'test', :product_category => pc1) | |
| 409 | + | |
| 410 | + assert_includes ents, ent1 | |
| 411 | + assert_not_includes ents, ent2 | |
| 412 | + end | |
| 413 | + | |
| 384 | 414 | end | ... | ... |