Commit a885775dc584a70845fc82d1a401122fc1e4ea36

Authored by MoisesMachado
1 parent 7311bf84

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
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