Commit c4b2472c37dd80340dfa1e5d3ab480594e0e7c5f
1 parent
2ec6c087
Exists in
master
and in
29 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,13 +21,11 @@ class SearchController < ApplicationController | ||
21 | @filtered_query = remove_stop_words(@query) | 21 | @filtered_query = remove_stop_words(@query) |
22 | 22 | ||
23 | @finder ||= @environment | 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 | end | 29 | end |
32 | 30 | ||
33 | before_filter :load_category, :only => :filter | 31 | before_filter :load_category, :only => :filter |
app/models/category.rb
@@ -26,8 +26,11 @@ class Category < ActiveRecord::Base | @@ -26,8 +26,11 @@ class Category < ActiveRecord::Base | ||
26 | has_many :comments, :through => :articles | 26 | has_many :comments, :through => :articles |
27 | 27 | ||
28 | has_many :profile_categorizations | 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 | def recent_articles(limit = 10) | 35 | def recent_articles(limit = 10) |
33 | self.articles.recent(limit) | 36 | self.articles.recent(limit) |
app/models/environment.rb
@@ -56,6 +56,7 @@ class Environment < ActiveRecord::Base | @@ -56,6 +56,7 @@ class Environment < ActiveRecord::Base | ||
56 | 56 | ||
57 | has_many :organizations | 57 | has_many :organizations |
58 | has_many :enterprises | 58 | has_many :enterprises |
59 | + has_many :products, :through => :enterprises | ||
59 | has_many :people | 60 | has_many :people |
60 | has_many :communities | 61 | has_many :communities |
61 | 62 |
test/functional/search_controller_test.rb
@@ -126,16 +126,16 @@ class SearchControllerTest < Test::Unit::TestCase | @@ -126,16 +126,16 @@ class SearchControllerTest < Test::Unit::TestCase | ||
126 | should 'list enterprises in a specified category' | 126 | should 'list enterprises in a specified category' |
127 | 127 | ||
128 | should 'find people' do | 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 | assert_includes assigns(:results)[:people], p1 | 131 | assert_includes assigns(:results)[:people], p1 |
132 | end | 132 | end |
133 | 133 | ||
134 | should 'find people in a specific category' do | 134 | should 'find people in a specific category' do |
135 | c = Category.create!(:name => 'my category', :environment => Environment.default) | 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 | assert_includes assigns(:results)[:people], p1 | 139 | assert_includes assigns(:results)[:people], p1 |
140 | assert_not_includes assigns(:results)[:people], p2 | 140 | assert_not_includes assigns(:results)[:people], p2 |
141 | end | 141 | end |
@@ -143,13 +143,42 @@ class SearchControllerTest < Test::Unit::TestCase | @@ -143,13 +143,42 @@ class SearchControllerTest < Test::Unit::TestCase | ||
143 | # 'assets' menu | 143 | # 'assets' menu |
144 | should 'list people in a specified category' | 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 | # 'assets' menu | 161 | # 'assets' menu |
149 | should 'list communities in a specified category' | 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 | # 'assets' menu | 182 | # 'assets' menu |
154 | should 'list products in a specific category' | 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,4 +295,54 @@ class CategoryTest < Test::Unit::TestCase | ||
295 | assert_equal [p1, p2], c.people | 295 | assert_equal [p1, p2], c.people |
296 | end | 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 | end | 348 | end |
test/unit/environment_test.rb
@@ -277,4 +277,36 @@ class EnvironmentTest < Test::Unit::TestCase | @@ -277,4 +277,36 @@ class EnvironmentTest < Test::Unit::TestCase | ||
277 | assert_equivalent [c1,c2], environment.comments | 277 | assert_equivalent [c1,c2], environment.comments |
278 | end | 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 | end | 312 | end |