Commit d27a79ec04bd611e328d30a976bef7c8ad02526f

Authored by Rodrigo Souto
Committed by Antonio Terceiro
1 parent 8f09db6a

Feed articles are listed even in private profiles

The access to the feed must be controlled by the content viewer access
logic, not by the feed.

P.S.: I'm not pretty sure if my solution have performance issues!

(ActionItem1619)
app/models/profile.rb
... ... @@ -332,6 +332,16 @@ class Profile < ActiveRecord::Base
332 332 self.articles.recent(limit, options)
333 333 end
334 334  
  335 + def last_articles(limit = 10, options = {})
  336 + options = { :limit => limit,
  337 + :conditions => ["advertise = ? AND published = ? AND
  338 + ((articles.type != ? and articles.type != ? and articles.type != ?) OR
  339 + articles.type is NULL)",
  340 + true, true, 'UploadedFile', 'RssFeed', 'Blog'],
  341 + :order => 'articles.published_at desc, articles.id desc' }.merge(options)
  342 + self.articles.find(:all, options)
  343 + end
  344 +
335 345 class << self
336 346  
337 347 # finds a profile by its identifier. This method is a shortcut to
... ...
app/models/rss_feed.rb
... ... @@ -68,7 +68,7 @@ class RssFeed &lt; Article
68 68 if (self.include == 'parent_and_children') && self.parent
69 69 self.parent.map_traversal
70 70 else
71   - profile.recent_documents(self.limit)
  71 + profile.last_articles(self.limit)
72 72 end
73 73 end
74 74 def data
... ...
test/unit/rss_feed_test.rb
... ... @@ -58,7 +58,7 @@ class RssFeedTest &lt; Test::Unit::TestCase
58 58 feed = RssFeed.new
59 59 feed.expects(:profile).returns(profile).at_least_once
60 60 array = []
61   - profile.expects(:recent_documents).returns(array)
  61 + profile.expects(:last_articles).returns(array)
62 62 feed.data
63 63 end
64 64  
... ... @@ -150,11 +150,11 @@ class RssFeedTest &lt; Test::Unit::TestCase
150 150 feed.profile = profile
151 151 feed.save!
152 152  
153   - feed.profile.expects(:recent_documents).with(10).returns([]).once
  153 + feed.profile.expects(:last_articles).with(10).returns([]).once
154 154 feed.data
155 155  
156 156 feed.limit = 5
157   - feed.profile.expects(:recent_documents).with(5).returns([]).once
  157 + feed.profile.expects(:last_articles).with(5).returns([]).once
158 158 feed.data
159 159 end
160 160  
... ... @@ -218,4 +218,22 @@ class RssFeedTest &lt; Test::Unit::TestCase
218 218 assert_match published_article.to_html, feed.data
219 219 end
220 220  
  221 + should 'display articles even within a private profile' do
  222 + profile = create_user('testuser').person
  223 + profile.public_profile = false
  224 + profile.save!
  225 + a1 = profile.articles.build(:name => 'article 1'); a1.save!
  226 + a2 = profile.articles.build(:name => 'article 2'); a2.save!
  227 + a3 = profile.articles.build(:name => 'article 3'); a3.save!
  228 +
  229 + feed = RssFeed.new(:name => 'testfeed')
  230 + feed.profile = profile
  231 + feed.save!
  232 +
  233 + rss = feed.data
  234 + assert_match /<item><title>article 1<\/title>/, rss
  235 + assert_match /<item><title>article 2<\/title>/, rss
  236 + assert_match /<item><title>article 3<\/title>/, rss
  237 + end
  238 +
221 239 end
... ...