Commit c15a029cb596e47d9ecac86edcc59fdaa6a81155
1 parent
dc74649b
Exists in
master
and in
29 other branches
ActionItem616: stop showing private content on seraches
added the common method public? to trace public content and made it not be shown in search results. Know issue: the numbers of total results is wrong when private content would be retrived if it were public git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2398 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
8 changed files
with
110 additions
and
3 deletions
Show diff stats
app/models/article.rb
@@ -42,6 +42,13 @@ class Article < ActiveRecord::Base | @@ -42,6 +42,13 @@ class Article < ActiveRecord::Base | ||
42 | pending_categorizations.clear | 42 | pending_categorizations.clear |
43 | end | 43 | end |
44 | 44 | ||
45 | + before_save do |article| | ||
46 | + if article.parent | ||
47 | + article.public_article = article.parent.public_article | ||
48 | + end | ||
49 | + true | ||
50 | + end | ||
51 | + | ||
45 | acts_as_taggable | 52 | acts_as_taggable |
46 | N_('Tag list') | 53 | N_('Tag list') |
47 | 54 | ||
@@ -156,6 +163,10 @@ class Article < ActiveRecord::Base | @@ -156,6 +163,10 @@ class Article < ActiveRecord::Base | ||
156 | !cat.is_a?(ProductCategory) | 163 | !cat.is_a?(ProductCategory) |
157 | end | 164 | end |
158 | 165 | ||
166 | + def public? | ||
167 | + profile.public? && public_article | ||
168 | + end | ||
169 | + | ||
159 | private | 170 | private |
160 | 171 | ||
161 | def sanitize_tag_list | 172 | def sanitize_tag_list |
app/models/product.rb
@@ -63,4 +63,8 @@ class Product < ActiveRecord::Base | @@ -63,4 +63,8 @@ class Product < ActiveRecord::Base | ||
63 | enterprise.generate_url(:controller => 'catalog', :action => 'show', :id => id) | 63 | enterprise.generate_url(:controller => 'catalog', :action => 'show', :id => id) |
64 | end | 64 | end |
65 | 65 | ||
66 | + def public? | ||
67 | + enterprise.public_profile | ||
68 | + end | ||
69 | + | ||
66 | end | 70 | end |
app/models/profile.rb
@@ -304,16 +304,24 @@ class Profile < ActiveRecord::Base | @@ -304,16 +304,24 @@ class Profile < ActiveRecord::Base | ||
304 | false | 304 | false |
305 | end | 305 | end |
306 | 306 | ||
307 | - after_create :insert_default_homepage_and_feed | ||
308 | - def insert_default_homepage_and_feed | 307 | + after_create :insert_default_article_set |
308 | + def insert_default_article_set | ||
309 | + # a default homepage | ||
309 | hp = default_homepage(:name => _("%s's home page") % self.name, :body => _("<p>This is a default homepage created for %s. It can be changed though the control panel.</p>") % self.name, :advertise => false) | 310 | hp = default_homepage(:name => _("%s's home page") % self.name, :body => _("<p>This is a default homepage created for %s. It can be changed though the control panel.</p>") % self.name, :advertise => false) |
310 | hp.profile = self | 311 | hp.profile = self |
311 | hp.save! | 312 | hp.save! |
312 | self.home_page = hp | 313 | self.home_page = hp |
313 | self.save! | 314 | self.save! |
314 | 315 | ||
316 | + # a default rss feed | ||
315 | feed = RssFeed.new(:name => 'feed') | 317 | feed = RssFeed.new(:name => 'feed') |
316 | self.articles << feed | 318 | self.articles << feed |
319 | + | ||
320 | + # a default private folder if public | ||
321 | + if self.public? | ||
322 | + folder = Folder.new(:name => _("Intranet"), :public_article => false) | ||
323 | + self.articles << folder | ||
324 | + end | ||
317 | end | 325 | end |
318 | 326 | ||
319 | # Adds a person as member of this Profile. | 327 | # Adds a person as member of this Profile. |
@@ -403,4 +411,7 @@ class Profile < ActiveRecord::Base | @@ -403,4 +411,7 @@ class Profile < ActiveRecord::Base | ||
403 | self[:theme] || environment.theme | 411 | self[:theme] || environment.theme |
404 | end | 412 | end |
405 | 413 | ||
414 | + def public? | ||
415 | + public_profile | ||
416 | + end | ||
406 | end | 417 | end |
app/views/search/_display_results.rhtml
@@ -38,7 +38,7 @@ | @@ -38,7 +38,7 @@ | ||
38 | <ul> | 38 | <ul> |
39 | <% hit_pos = 0 %> | 39 | <% hit_pos = 0 %> |
40 | <% results.each do |hit| %> | 40 | <% results.each do |hit| %> |
41 | - <% next if hit.respond_to?(:public_profile) && !hit.public_profile %> | 41 | + <% next if hit.respond_to?(:public?) && !hit.public? %> |
42 | <%= render :partial => partial_for_class(hit.class), | 42 | <%= render :partial => partial_for_class(hit.class), |
43 | 43 | ||
44 | :object => hit, | 44 | :object => hit, |
test/functional/cms_controller_test.rb
@@ -347,6 +347,7 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -347,6 +347,7 @@ class CmsControllerTest < Test::Unit::TestCase | ||
347 | end | 347 | end |
348 | 348 | ||
349 | should 'list folders at top level' do | 349 | should 'list folders at top level' do |
350 | + Folder.destroy_all | ||
350 | f1 = Folder.new(:name => 'f1'); profile.articles << f1; f1.save! | 351 | f1 = Folder.new(:name => 'f1'); profile.articles << f1; f1.save! |
351 | f2 = Folder.new(:name => 'f2'); profile.articles << f2; f2.save! | 352 | f2 = Folder.new(:name => 'f2'); profile.articles << f2; f2.save! |
352 | 353 | ||
@@ -542,4 +543,15 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -542,4 +543,15 @@ class CmsControllerTest < Test::Unit::TestCase | ||
542 | assert_redirected_to @profile.articles.find_by_name('new-article-from-public-view').url | 543 | assert_redirected_to @profile.articles.find_by_name('new-article-from-public-view').url |
543 | end | 544 | end |
544 | 545 | ||
546 | + should 'create a private article child of private folder' do | ||
547 | + folder = Folder.new(:name => 'my intranet', :public_article => false); profile.articles << folder; folder.save! | ||
548 | + | ||
549 | + post :new, :profile => profile.identifier, :type => 'TextileArticle', :parent_id => folder.id, :article => { :name => 'new-private-article'} | ||
550 | + folder.reload | ||
551 | + | ||
552 | + assert !assigns(:article).public? | ||
553 | + assert_equal 'new-private-article', folder.children[0].name | ||
554 | + assert !folder.children[0].public? | ||
555 | + end | ||
556 | + | ||
545 | end | 557 | end |
test/unit/article_test.rb
@@ -364,4 +364,45 @@ class ArticleTest < Test::Unit::TestCase | @@ -364,4 +364,45 @@ class ArticleTest < Test::Unit::TestCase | ||
364 | assert !article.display_to?(person2) | 364 | assert !article.display_to?(person2) |
365 | assert article.display_to?(person1) | 365 | assert article.display_to?(person1) |
366 | end | 366 | end |
367 | + | ||
368 | + should 'make new article private if created inside a private folder' do | ||
369 | + profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') | ||
370 | + folder = Folder.create!(:name => 'my_intranet', :profile => profile, :public_article => false) | ||
371 | + article = Article.create!(:name => 'my private article', :profile => profile, :parent => folder) | ||
372 | + | ||
373 | + assert !article.public_article | ||
374 | + end | ||
375 | + | ||
376 | + should 'respond to public? like public_article if profile is public' do | ||
377 | + p = Profile.create!(:name => 'test profile', :identifier => 'test_profile') | ||
378 | + a1 = Article.create!(:name => 'test public article', :profile => p) | ||
379 | + a2 = Article.create!(:name => 'test private article', :profile => p, :public_article => false) | ||
380 | + | ||
381 | + assert a1.public? | ||
382 | + assert !a2.public? | ||
383 | + end | ||
384 | + | ||
385 | + should 'respond to public? as false if profile is private' do | ||
386 | + p = Profile.create!(:name => 'test profile', :identifier => 'test_profile', :public_profile => false) | ||
387 | + a1 = Article.create!(:name => 'test public article', :profile => p) | ||
388 | + a2 = Article.create!(:name => 'test private article', :profile => p, :public_article => false) | ||
389 | + | ||
390 | + assert !a1.public? | ||
391 | + assert !a2.public? | ||
392 | + end | ||
393 | + | ||
394 | + should 'save as private' do | ||
395 | + profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') | ||
396 | + folder = Folder.create!(:name => 'my_intranet', :profile => profile, :public_article => false) | ||
397 | + article = TextileArticle.new(:name => 'my private article') | ||
398 | + article.profile = profile | ||
399 | + article.parent = folder | ||
400 | + article.save! | ||
401 | + article.reload | ||
402 | + | ||
403 | + assert !article.public_article | ||
404 | + | ||
405 | + | ||
406 | + end | ||
407 | + | ||
367 | end | 408 | end |
test/unit/product_test.rb
@@ -168,4 +168,16 @@ class ProductTest < Test::Unit::TestCase | @@ -168,4 +168,16 @@ class ProductTest < Test::Unit::TestCase | ||
168 | assert !ProductCategorization.find(:first, :conditions => {:product_id => p, :category_id => cat}) | 168 | assert !ProductCategorization.find(:first, :conditions => {:product_id => p, :category_id => cat}) |
169 | end | 169 | end |
170 | 170 | ||
171 | + should 'respond to public? as its enterprise public?' do | ||
172 | + e1 = Enterprise.create!(:name => 'test ent 1', :identifier => 'test_ent1') | ||
173 | + p1 = Product.create!(:name => 'test product 1', :enterprise => e1) | ||
174 | + | ||
175 | + assert p1.public? | ||
176 | + | ||
177 | + e1.public_profile = false | ||
178 | + e1.save! | ||
179 | + | ||
180 | + assert !p1.public? | ||
181 | + end | ||
182 | + | ||
171 | end | 183 | end |
test/unit/profile_test.rb
@@ -794,6 +794,22 @@ class ProfileTest < Test::Unit::TestCase | @@ -794,6 +794,22 @@ class ProfileTest < Test::Unit::TestCase | ||
794 | assert_equal 'environment-stored-theme', p.theme | 794 | assert_equal 'environment-stored-theme', p.theme |
795 | end | 795 | end |
796 | 796 | ||
797 | + should 'respond to public? as public_profile' do | ||
798 | + p1 = Profile.create!(:name => 'test profile 1', :identifier => 'test_profile1') | ||
799 | + p2 = Profile.create!(:name => 'test profile 2', :identifier => 'test_profile2', :public_profile => false) | ||
800 | + | ||
801 | + assert p1.public? | ||
802 | + assert !p2.public? | ||
803 | + end | ||
804 | + | ||
805 | + should 'create a initial private folder when a public profile is created' do | ||
806 | + p1 = Profile.create!(:name => 'test profile 1', :identifier => 'test_profile1') | ||
807 | + p2 = Profile.create!(:name => 'test profile 2', :identifier => 'test_profile2', :public_profile => false) | ||
808 | + | ||
809 | + assert p1.articles.find(:first, :conditions => {:public_article => false}) | ||
810 | + assert !p2.articles.find(:first, :conditions => {:public_article => false}) | ||
811 | + end | ||
812 | + | ||
797 | private | 813 | private |
798 | 814 | ||
799 | def assert_invalid_identifier(id) | 815 | def assert_invalid_identifier(id) |