Commit c4b2472c37dd80340dfa1e5d3ab480594e0e7c5f
1 parent
2ec6c087
Exists in
master
and in
23 other branches
ActionItem243: implemented finding communities, products, the :find_in and fixed…
… a bug where searching for people returned enterprises git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1606 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
6 changed files
with
131 additions
and
18 deletions
Show diff stats
app/controllers/public/search_controller.rb
| ... | ... | @@ -21,13 +21,11 @@ class SearchController < ApplicationController |
| 21 | 21 | @filtered_query = remove_stop_words(@query) |
| 22 | 22 | |
| 23 | 23 | @finder ||= @environment |
| 24 | - | |
| 25 | - @results = { | |
| 26 | - :articles => search(@finder.articles, @filtered_query), | |
| 27 | - :comments => search(@finder.comments, @filtered_query), | |
| 28 | - :enterprises => search(@finder.enterprises, @filtered_query), | |
| 29 | - :people => search(@finder.people, @filtered_query), | |
| 30 | - } | |
| 24 | + | |
| 25 | + @results = {} | |
| 26 | + [:articles, :comments, :enterprises, :people, :communities, :products].each do |key| | |
| 27 | + @results[key] = search(@finder.send(key), @filtered_query) if params[:find_in].nil? || params[:find_in].empty? || params[:find_in].include?(key.to_s) | |
| 28 | + end | |
| 31 | 29 | end |
| 32 | 30 | |
| 33 | 31 | before_filter :load_category, :only => :filter | ... | ... |
app/models/category.rb
| ... | ... | @@ -26,8 +26,11 @@ class Category < ActiveRecord::Base |
| 26 | 26 | has_many :comments, :through => :articles |
| 27 | 27 | |
| 28 | 28 | has_many :profile_categorizations |
| 29 | - has_many :enterprises, :through => :profile_categorizations, :source => :profile | |
| 30 | - has_many :people, :through => :profile_categorizations, :source => :profile | |
| 29 | + has_many :enterprises, :through => :profile_categorizations, :source => :profile, :class_name => 'Enterprise' | |
| 30 | + has_many :people, :through => :profile_categorizations, :source => :profile, :class_name => 'Person' | |
| 31 | + has_many :communities, :through => :profile_categorizations, :source => :profile, :class_name => 'Community' | |
| 32 | + | |
| 33 | + has_many :products, :through => :enterprises | |
| 31 | 34 | |
| 32 | 35 | def recent_articles(limit = 10) |
| 33 | 36 | self.articles.recent(limit) | ... | ... |
app/models/environment.rb
test/functional/search_controller_test.rb
| ... | ... | @@ -126,16 +126,16 @@ class SearchControllerTest < Test::Unit::TestCase |
| 126 | 126 | should 'list enterprises in a specified category' |
| 127 | 127 | |
| 128 | 128 | should 'find people' do |
| 129 | - p1 = create_user('people_1').person; p1.name = 'a beatiful person'; p1.save! | |
| 130 | - get :index, :query => 'beatiful', :find_in => [ 'people' ] | |
| 129 | + p1 = create_user('people_1').person; p1.name = 'a beautiful person'; p1.save! | |
| 130 | + get :index, :query => 'beautiful', :find_in => [ 'people' ] | |
| 131 | 131 | assert_includes assigns(:results)[:people], p1 |
| 132 | 132 | end |
| 133 | 133 | |
| 134 | 134 | should 'find people in a specific category' do |
| 135 | 135 | c = Category.create!(:name => 'my category', :environment => Environment.default) |
| 136 | - p1 = create_user('people_1').person; p1.name = 'a beatiful person'; p1.categories << c; p1.save! | |
| 137 | - p2 = create_user('people_2').person; p2.name = 'another beatiful person'; p2.save! | |
| 138 | - get :filter, :category_path => [ 'my-category' ], :query => 'beatiful', :find_in => [ 'people' ] | |
| 136 | + p1 = create_user('people_1').person; p1.name = 'a beautiful person'; p1.categories << c; p1.save! | |
| 137 | + p2 = create_user('people_2').person; p2.name = 'another beautiful person'; p2.save! | |
| 138 | + get :filter, :category_path => [ 'my-category' ], :query => 'beautiful', :find_in => [ 'people' ] | |
| 139 | 139 | assert_includes assigns(:results)[:people], p1 |
| 140 | 140 | assert_not_includes assigns(:results)[:people], p2 |
| 141 | 141 | end |
| ... | ... | @@ -143,13 +143,42 @@ class SearchControllerTest < Test::Unit::TestCase |
| 143 | 143 | # 'assets' menu |
| 144 | 144 | should 'list people in a specified category' |
| 145 | 145 | |
| 146 | - should 'find communities' | |
| 147 | - should 'find communities in a specified category' | |
| 146 | + should 'find communities' do | |
| 147 | + c1 = Community.create!(:name => 'a beautiful community', :identifier => 'bea_comm', :environment => Environment.default) | |
| 148 | + get :index, :query => 'beautiful', :find_in => [ 'communities' ] | |
| 149 | + assert_includes assigns(:results)[:communities], c1 | |
| 150 | + end | |
| 151 | + | |
| 152 | + should 'find communities in a specified category' do | |
| 153 | + c = Category.create!(:name => 'my category', :environment => Environment.default) | |
| 154 | + c1 = Community.create!(:name => 'a beautiful community', :identifier => 'bea_comm', :environment => Environment.default) | |
| 155 | + c2 = Community.create!(:name => 'another beautiful community', :identifier => 'an_bea_comm', :environment => Environment.default) | |
| 156 | + c1.categories << c; c1.save! | |
| 157 | + get :filter, :category_path => [ 'my-category' ], :query => 'beautiful', :find_in => [ 'communities' ] | |
| 158 | + assert_includes assigns(:results)[:communities], c1 | |
| 159 | + assert_not_includes assigns(:results)[:communities], c2 | |
| 160 | + end | |
| 148 | 161 | # 'assets' menu |
| 149 | 162 | should 'list communities in a specified category' |
| 150 | 163 | |
| 151 | - should 'find products' | |
| 152 | - should 'find products in a specific category' | |
| 164 | + should 'find products' do | |
| 165 | + ent = Enterprise.create!(:name => 'teste', :identifier => 'teste') | |
| 166 | + prod = ent.products.create!(:name => 'a beautiful product') | |
| 167 | + get 'index', :query => 'beautiful', :find_in => ['products'] | |
| 168 | + assert_includes assigns(:results)[:products], prod | |
| 169 | + end | |
| 170 | + | |
| 171 | + should 'find products in a specific category' do | |
| 172 | + c = Category.create!(:name => 'my category', :environment => Environment.default) | |
| 173 | + ent1 = Enterprise.create!(:name => 'teste1', :identifier => 'teste1'); ent1.categories << c | |
| 174 | + ent2 = Enterprise.create!(:name => 'teste2', :identifier => 'teste2') | |
| 175 | + prod1 = ent1.products.create!(:name => 'a beautiful product') | |
| 176 | + prod2 = ent2.products.create!(:name => 'another beautiful product') | |
| 177 | + get 'filter', :category_path => ['my-category'], :query => 'beautiful', :find_in => ['products'] | |
| 178 | + assert_includes assigns(:results)[:products], prod1 | |
| 179 | + assert_not_includes assigns(:results)[:products], prod2 | |
| 180 | + end | |
| 181 | + | |
| 153 | 182 | # 'assets' menu |
| 154 | 183 | should 'list products in a specific category' |
| 155 | 184 | ... | ... |
test/unit/category_test.rb
| ... | ... | @@ -295,4 +295,54 @@ class CategoryTest < Test::Unit::TestCase |
| 295 | 295 | assert_equal [p1, p2], c.people |
| 296 | 296 | end |
| 297 | 297 | |
| 298 | + should 'have communities' do | |
| 299 | + c = @env.categories.build(:name => 'my category'); c.save! | |
| 300 | + c1 = Environment.default.communities.create!(:name => 'testcommunity_1') | |
| 301 | + c1.categories << c | |
| 302 | + c2 = Environment.default.communities.create!(:name => 'testcommunity_2') | |
| 303 | + c2.categories << c | |
| 304 | + assert_equal [c1, c2], c.communities | |
| 305 | + end | |
| 306 | + | |
| 307 | + should 'have products through enteprises' do | |
| 308 | + c = @env.categories.build(:name => 'my category'); c.save! | |
| 309 | + ent1 = Enterprise.create!(:identifier => 'enterprise_1', :name => 'Enterprise one') | |
| 310 | + ent1.categories << c | |
| 311 | + ent2 = Enterprise.create!(:identifier => 'enterprise_2', :name => 'Enterprise one') | |
| 312 | + ent2.categories << c | |
| 313 | + prod1 = ent1.products.create!(:name => 'test_prod1') | |
| 314 | + prod2 = ent2.products.create!(:name => 'test_prod2') | |
| 315 | + assert_includes c.products, prod1 | |
| 316 | + assert_includes c.products, prod2 | |
| 317 | + end | |
| 318 | + | |
| 319 | + should 'not have person through communities' do | |
| 320 | + c = @env.categories.build(:name => 'my category'); c.save! | |
| 321 | + com = Community.create!(:identifier => 'community_1', :name => 'Community one') | |
| 322 | + com.categories << c | |
| 323 | + person = create_user('test_user').person | |
| 324 | + person.categories << c | |
| 325 | + assert_includes c.communities, com | |
| 326 | + assert_not_includes c.communities, person | |
| 327 | + end | |
| 328 | + | |
| 329 | + should 'not have person through enterprises' do | |
| 330 | + c = @env.categories.build(:name => 'my category'); c.save! | |
| 331 | + ent = Enterprise.create!(:identifier => 'enterprise_1', :name => 'Enterprise one') | |
| 332 | + ent.categories << c | |
| 333 | + person = create_user('test_user').person | |
| 334 | + person.categories << c | |
| 335 | + assert_includes c.enterprises, ent | |
| 336 | + assert_not_includes c.enterprises, person | |
| 337 | + end | |
| 338 | + | |
| 339 | + should 'not have enterprises through people' do | |
| 340 | + c = @env.categories.build(:name => 'my category'); c.save! | |
| 341 | + person = create_user('test_user').person | |
| 342 | + person.categories << c | |
| 343 | + ent = Enterprise.create!(:identifier => 'enterprise_1', :name => 'Enterprise one') | |
| 344 | + ent.categories << c | |
| 345 | + assert_includes c.people, person | |
| 346 | + assert_not_includes c.people, ent | |
| 347 | + end | |
| 298 | 348 | end | ... | ... |
test/unit/environment_test.rb
| ... | ... | @@ -277,4 +277,36 @@ class EnvironmentTest < Test::Unit::TestCase |
| 277 | 277 | assert_equivalent [c1,c2], environment.comments |
| 278 | 278 | end |
| 279 | 279 | |
| 280 | + should 'have products through enterprises' do | |
| 281 | + env = Environment.default | |
| 282 | + e1 = Enterprise.create!(:name => 'test_ent1', :identifier => 'test_ent1') | |
| 283 | + p1 = e1.products.create!(:name => 'test_prod1') | |
| 284 | + | |
| 285 | + assert_includes env.products, p1 | |
| 286 | + end | |
| 287 | + | |
| 288 | + should 'not have person through communities' do | |
| 289 | + env = Environment.default | |
| 290 | + com = Community.create!(:identifier => 'community_1', :name => 'Community one') | |
| 291 | + person = create_user('test_user').person | |
| 292 | + assert_includes env.communities, com | |
| 293 | + assert_not_includes env.communities, person | |
| 294 | + end | |
| 295 | + | |
| 296 | + should 'not have person through enterprises' do | |
| 297 | + env = Environment.default | |
| 298 | + ent = Enterprise.create!(:identifier => 'enterprise_1', :name => 'Enterprise one') | |
| 299 | + person = create_user('test_user').person | |
| 300 | + assert_includes env.enterprises, ent | |
| 301 | + assert_not_includes env.enterprises, person | |
| 302 | + end | |
| 303 | + | |
| 304 | + should 'not have enterprises through people' do | |
| 305 | + env = Environment.default | |
| 306 | + person = create_user('test_user').person | |
| 307 | + ent = Enterprise.create!(:identifier => 'enterprise_1', :name => 'Enterprise one') | |
| 308 | + assert_includes env.people, person | |
| 309 | + assert_not_includes env.people, ent | |
| 310 | + end | |
| 311 | + | |
| 280 | 312 | end | ... | ... |