Commit c15a029cb596e47d9ecac86edcc59fdaa6a81155
1 parent
dc74649b
Exists in
master
and in
28 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 | 42 | pending_categorizations.clear |
| 43 | 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 | 52 | acts_as_taggable |
| 46 | 53 | N_('Tag list') |
| 47 | 54 | |
| ... | ... | @@ -156,6 +163,10 @@ class Article < ActiveRecord::Base |
| 156 | 163 | !cat.is_a?(ProductCategory) |
| 157 | 164 | end |
| 158 | 165 | |
| 166 | + def public? | |
| 167 | + profile.public? && public_article | |
| 168 | + end | |
| 169 | + | |
| 159 | 170 | private |
| 160 | 171 | |
| 161 | 172 | def sanitize_tag_list | ... | ... |
app/models/product.rb
app/models/profile.rb
| ... | ... | @@ -304,16 +304,24 @@ class Profile < ActiveRecord::Base |
| 304 | 304 | false |
| 305 | 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 | 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 | 311 | hp.profile = self |
| 311 | 312 | hp.save! |
| 312 | 313 | self.home_page = hp |
| 313 | 314 | self.save! |
| 314 | 315 | |
| 316 | + # a default rss feed | |
| 315 | 317 | feed = RssFeed.new(:name => 'feed') |
| 316 | 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 | 325 | end |
| 318 | 326 | |
| 319 | 327 | # Adds a person as member of this Profile. |
| ... | ... | @@ -403,4 +411,7 @@ class Profile < ActiveRecord::Base |
| 403 | 411 | self[:theme] || environment.theme |
| 404 | 412 | end |
| 405 | 413 | |
| 414 | + def public? | |
| 415 | + public_profile | |
| 416 | + end | |
| 406 | 417 | end | ... | ... |
app/views/search/_display_results.rhtml
| ... | ... | @@ -38,7 +38,7 @@ |
| 38 | 38 | <ul> |
| 39 | 39 | <% hit_pos = 0 %> |
| 40 | 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 | 42 | <%= render :partial => partial_for_class(hit.class), |
| 43 | 43 | |
| 44 | 44 | :object => hit, | ... | ... |
test/functional/cms_controller_test.rb
| ... | ... | @@ -347,6 +347,7 @@ class CmsControllerTest < Test::Unit::TestCase |
| 347 | 347 | end |
| 348 | 348 | |
| 349 | 349 | should 'list folders at top level' do |
| 350 | + Folder.destroy_all | |
| 350 | 351 | f1 = Folder.new(:name => 'f1'); profile.articles << f1; f1.save! |
| 351 | 352 | f2 = Folder.new(:name => 'f2'); profile.articles << f2; f2.save! |
| 352 | 353 | |
| ... | ... | @@ -542,4 +543,15 @@ class CmsControllerTest < Test::Unit::TestCase |
| 542 | 543 | assert_redirected_to @profile.articles.find_by_name('new-article-from-public-view').url |
| 543 | 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 | 557 | end | ... | ... |
test/unit/article_test.rb
| ... | ... | @@ -364,4 +364,45 @@ class ArticleTest < Test::Unit::TestCase |
| 364 | 364 | assert !article.display_to?(person2) |
| 365 | 365 | assert article.display_to?(person1) |
| 366 | 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 | 408 | end | ... | ... |
test/unit/product_test.rb
| ... | ... | @@ -168,4 +168,16 @@ class ProductTest < Test::Unit::TestCase |
| 168 | 168 | assert !ProductCategorization.find(:first, :conditions => {:product_id => p, :category_id => cat}) |
| 169 | 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 | 183 | end | ... | ... |
test/unit/profile_test.rb
| ... | ... | @@ -794,6 +794,22 @@ class ProfileTest < Test::Unit::TestCase |
| 794 | 794 | assert_equal 'environment-stored-theme', p.theme |
| 795 | 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 | 813 | private |
| 798 | 814 | |
| 799 | 815 | def assert_invalid_identifier(id) | ... | ... |