Commit a885775dc584a70845fc82d1a401122fc1e4ea36
1 parent
7311bf84
Exists in
master
and in
29 other branches
ActionItem510: fixed the query for product categories in enterprises
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2123 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
4 changed files
with
52 additions
and
15 deletions
Show diff stats
app/models/category_finder.rb
@@ -17,12 +17,6 @@ class CategoryFinder | @@ -17,12 +17,6 @@ class CategoryFinder | ||
17 | options.delete(:within) | 17 | options.delete(:within) |
18 | end | 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 | - | ||
26 | if query.blank? | 20 | if query.blank? |
27 | asset_class(asset).find(:all, options_for_find(asset_class(asset), {:order => "created_at desc, #{asset_table(asset)}.id desc"}.merge(options))) | 21 | asset_class(asset).find(:all, options_for_find(asset_class(asset), {:order => "created_at desc, #{asset_table(asset)}.id desc"}.merge(options))) |
28 | else | 22 | else |
@@ -76,7 +70,13 @@ class CategoryFinder | @@ -76,7 +70,13 @@ class CategoryFinder | ||
76 | end | 70 | end |
77 | when 'Article', 'Event' | 71 | when 'Article', 'Event' |
78 | {:joins => 'inner join articles_categories on (articles_categories.article_id = articles.id)', :conditions => ['articles_categories.category_id = (?)', category_id]}.merge!(options) | 72 | {:joins => 'inner join articles_categories on (articles_categories.article_id = articles.id)', :conditions => ['articles_categories.category_id = (?)', category_id]}.merge!(options) |
79 | - when 'Person', 'Community', 'Enterprise' | 73 | + when 'Enterprise' |
74 | + if prod_cat_ids | ||
75 | + {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id) inner join products on (products.enterprise_id = profiles.id)', :conditions => ['categories_profiles.category_id = (?) and products.product_category_id in (?)', category_id, prod_cat_ids]}.merge!(options) | ||
76 | + else | ||
77 | + {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id)', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options) | ||
78 | + end | ||
79 | + when 'Person', 'Community' | ||
80 | {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id)', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options) | 80 | {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id)', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options) |
81 | else | 81 | else |
82 | raise "unreconized class #{klass.name}" | 82 | raise "unreconized class #{klass.name}" |
app/models/environment_finder.rb
@@ -19,7 +19,7 @@ class EnvironmentFinder | @@ -19,7 +19,7 @@ class EnvironmentFinder | ||
19 | if product_category && asset == :products | 19 | if product_category && asset == :products |
20 | @environment.send(asset).find(:all, options.merge({:order => 'created_at desc, id desc', :conditions => ['product_category_id in (?)', product_category_ids]})) | 20 | @environment.send(asset).find(:all, options.merge({:order => 'created_at desc, id desc', :conditions => ['product_category_id in (?)', product_category_ids]})) |
21 | elsif product_category && asset == :enterprises | 21 | elsif product_category && asset == :enterprises |
22 | - @environment.send(asset).find_by_contents("extra_data_for_index:#{product_category.name}", {}, options.merge( {:order => 'created_at desc, id desc'} ) ) | 22 | + @environment.send(asset).find(:all, options.merge(:order => 'profiles.created_at desc, profiles.id desc', :include => 'products', :conditions => ['products.product_category_id in (?)', product_category_ids])) |
23 | else | 23 | else |
24 | @environment.send(asset).find( :all, options.merge( {:order => 'created_at desc, id desc'} ) ) | 24 | @environment.send(asset).find( :all, options.merge( {:order => 'created_at desc, id desc'} ) ) |
25 | end | 25 | end |
test/functional/search_controller_test.rb
@@ -851,28 +851,32 @@ class SearchControllerTest < Test::Unit::TestCase | @@ -851,28 +851,32 @@ class SearchControllerTest < Test::Unit::TestCase | ||
851 | assert_not_includes assigns(:categories_menu).map(&:first), cat2 | 851 | assert_not_includes assigns(:categories_menu).map(&:first), cat2 |
852 | end | 852 | end |
853 | 853 | ||
854 | - should 'display enteprises only within a product category when specified' do | 854 | + should 'display only enterprises in the product category when its specified' do |
855 | prod_cat = ProductCategory.create!(:name => 'prod cat test', :environment => Environment.default) | 855 | prod_cat = ProductCategory.create!(:name => 'prod cat test', :environment => Environment.default) |
856 | - ent = Enterprise.create!(:name => 'test ent', :identifier => 'test_ent') | 856 | + ent1 = Enterprise.create!(:name => 'test ent 1', :identifier => 'test_ent1') |
857 | + p = prod_cat.products.create!(:name => 'prod test 1', :enterprise => ent1) | ||
857 | 858 | ||
858 | - p = prod_cat.products.create!(:name => 'prod test 1', :enterprise => ent) | 859 | + ent2 = Enterprise.create!(:name => 'test ent 2', :identifier => 'test_ent2') |
859 | 860 | ||
860 | get :index, :find_in => 'enterprises', :product_category => prod_cat.id | 861 | get :index, :find_in => 'enterprises', :product_category => prod_cat.id |
861 | 862 | ||
862 | - assert_includes assigns(:results)[:enterprises], ent | 863 | + assert_includes assigns(:results)[:enterprises], ent1 |
864 | + assert_not_includes assigns(:results)[:enterprises], ent2 | ||
863 | end | 865 | end |
864 | 866 | ||
865 | should 'display enterprises properly in conjuntion with a category' do | 867 | should 'display enterprises properly in conjuntion with a category' do |
866 | cat = Category.create(:name => 'cat', :environment => Environment.default) | 868 | cat = Category.create(:name => 'cat', :environment => Environment.default) |
867 | prod_cat1 = ProductCategory.create!(:name => 'prod cat test 1', :environment => Environment.default) | 869 | 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) | 870 | 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]) | 871 | + ent1 = Enterprise.create!(:name => 'test ent 1', :identifier => 'test_ent1', :category_ids => [cat.id]) |
872 | + p = prod_cat2.products.create!(:name => 'prod test 1', :enterprise => ent1) | ||
870 | 873 | ||
871 | - p = prod_cat2.products.create!(:name => 'prod test 1', :enterprise => ent) | 874 | + ent2 = Enterprise.create!(:name => 'test ent 2', :identifier => 'test_ent2', :category_ids => [cat.id]) |
872 | 875 | ||
873 | get :index, :find_in => 'enterprises', :category_path => cat.path.split('/'), :product_category => prod_cat1.id | 876 | get :index, :find_in => 'enterprises', :category_path => cat.path.split('/'), :product_category => prod_cat1.id |
874 | 877 | ||
875 | - assert_includes assigns(:results)[:enterprises], ent | 878 | + assert_includes assigns(:results)[:enterprises], ent1 |
879 | + assert_not_includes assigns(:results)[:enterprises], ent2 | ||
876 | end | 880 | end |
877 | 881 | ||
878 | should 'display only top level product categories that has enterprises when no product category filter is specified' do | 882 | should 'display only top level product categories that has enterprises when no product category filter is specified' do |
test/unit/environment_finder_test.rb
@@ -253,5 +253,38 @@ class EnvironmentFinderTest < ActiveSupport::TestCase | @@ -253,5 +253,38 @@ class EnvironmentFinderTest < ActiveSupport::TestCase | ||
253 | assert_includes ents, ent1 | 253 | assert_includes ents, ent1 |
254 | assert_not_includes ents, ent2 | 254 | assert_not_includes ents, ent2 |
255 | end | 255 | end |
256 | + | ||
257 | + should 'find enterprises by its products categories with query' do | ||
258 | + finder = EnvironmentFinder.new(Environment.default) | ||
259 | + | ||
260 | + pc1 = ProductCategory.create!(:name => 'test_cat1', :environment => Environment.default) | ||
261 | + pc2 = ProductCategory.create!(:name => 'test_cat2', :environment => Environment.default) | ||
262 | + | ||
263 | + ent1 = Enterprise.create!(:name => 'test enterprise 1', :identifier => 'test_ent1') | ||
264 | + ent1.products.create!(:name => 'test product 1', :product_category => pc1) | ||
265 | + ent2 = Enterprise.create!(:name => 'test enterprise 2', :identifier => 'test_ent2') | ||
266 | + ent2.products.create!(:name => 'test product 2', :product_category => pc2) | ||
267 | + | ||
268 | + ents = finder.find(:enterprises, 'test', :product_category => pc1) | ||
269 | + | ||
270 | + assert_includes ents, ent1 | ||
271 | + assert_not_includes ents, ent2 | ||
272 | + end | ||
273 | + | ||
274 | + should 'find enterprises by a product category with name with spaces' do | ||
275 | + finder = EnvironmentFinder.new(Environment.default) | ||
276 | + | ||
277 | + pc1 = ProductCategory.create!(:name => 'test cat1', :environment => Environment.default) | ||
278 | + pc2 = ProductCategory.create!(:name => 'test cat2', :environment => Environment.default) | ||
256 | 279 | ||
280 | + ent1 = Enterprise.create!(:name => 'test enterprise 1', :identifier => 'test_ent1') | ||
281 | + ent1.products.create!(:name => 'test product 1', :product_category => pc1) | ||
282 | + ent2 = Enterprise.create!(:name => 'test enterprise 2', :identifier => 'test_ent2') | ||
283 | + ent2.products.create!(:name => 'test product 2', :product_category => pc2) | ||
284 | + | ||
285 | + ents = finder.find(:enterprises, 'test', :product_category => pc1) | ||
286 | + | ||
287 | + assert_includes ents, ent1 | ||
288 | + assert_not_includes ents, ent2 | ||
289 | + end | ||
257 | end | 290 | end |