Commit 331b9925213373466d6bb0e8f3d775cb6a932bea

Authored by AntonioTerceiro
1 parent dfeb7c34

ActionItem154: creating a home page and a RSS feed for new profiles


git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1365 3f533792-8f58-4932-b0fe-aaf55b0a4547
app/models/article.rb
@@ -7,7 +7,7 @@ class Article < ActiveRecord::Base @@ -7,7 +7,7 @@ class Article < ActiveRecord::Base
7 7
8 belongs_to :last_changed_by, :class_name => Person.name, :foreign_key => 'last_changed_by_id' 8 belongs_to :last_changed_by, :class_name => Person.name, :foreign_key => 'last_changed_by_id'
9 9
10 - has_many :comments 10 + has_many :comments, :dependent => :destroy
11 11
12 has_and_belongs_to_many :categories 12 has_and_belongs_to_many :categories
13 13
@@ -29,7 +29,7 @@ class Article < ActiveRecord::Base @@ -29,7 +29,7 @@ class Article < ActiveRecord::Base
29 # retrieves the latest +limit+ articles, sorted from the most recent to the 29 # retrieves the latest +limit+ articles, sorted from the most recent to the
30 # oldest. 30 # oldest.
31 def self.recent(limit) 31 def self.recent(limit)
32 - options = { :limit => limit, :order => 'created_on' } 32 + options = { :limit => limit, :order => 'created_on desc, articles.id desc' }
33 self.find(:all, options) 33 self.find(:all, options)
34 end 34 end
35 35
app/models/environment.rb
@@ -31,13 +31,17 @@ class Environment < ActiveRecord::Base @@ -31,13 +31,17 @@ class Environment < ActiveRecord::Base
31 3.times do 31 3.times do
32 env.boxes << Box.new 32 env.boxes << Box.new
33 end 33 end
  34 +
  35 + # main area
34 env.boxes[0].blocks << MainBlock.new 36 env.boxes[0].blocks << MainBlock.new
35 37
  38 + # "left" area
  39 + env.boxes[1].blocks << LoginBlock.new
36 env.boxes[1].blocks << EnvironmentStatisticsBlock.new 40 env.boxes[1].blocks << EnvironmentStatisticsBlock.new
37 env.boxes[1].blocks << RecentDocumentsBlock.new 41 env.boxes[1].blocks << RecentDocumentsBlock.new
38 42
39 - env.boxes[2].blocks << LoginBlock.new  
40 - 43 + # "right" area
  44 + env.boxes[2].blocks << ProfileListBlock.new
41 end 45 end
42 46
43 # One Environment can be reached by many domains 47 # One Environment can be reached by many domains
app/models/person.rb
@@ -64,12 +64,22 @@ class Person &lt; Profile @@ -64,12 +64,22 @@ class Person &lt; Profile
64 3.times do 64 3.times do
65 self.boxes << Box.new 65 self.boxes << Box.new
66 end 66 end
  67 +
  68 + # main area
67 self.boxes.first.blocks << MainBlock.new 69 self.boxes.first.blocks << MainBlock.new
  70 +
  71 + # "left" area
  72 + self.boxes[1].blocks << ProfileInfoBlock.new
  73 +
  74 + # right area
  75 + self.boxes[2].blocks << TagsBlock.new
  76 + self.boxes[2].blocks << RecentDocumentsBlock.new
68 77
69 true 78 true
70 end 79 end
71 80
72 - # FIXME this is *weird*, because this class is not inheriting the callback 81 + # FIXME this is *weird*, because this class is not inheriting the callbacks
73 before_create :set_default_environment 82 before_create :set_default_environment
  83 + after_create :insert_default_homepage_and_feed
74 84
75 end 85 end
app/models/profile.rb
@@ -232,4 +232,16 @@ class Profile &lt; ActiveRecord::Base @@ -232,4 +232,16 @@ class Profile &lt; ActiveRecord::Base
232 false 232 false
233 end 233 end
234 234
  235 + after_create :insert_default_homepage_and_feed
  236 + def insert_default_homepage_and_feed
  237 + hp = self.articles.build(:name => _('Home page'), :body => _("<h1>%s's home page</h1> <p>This is a default homepage created for %s. It can be changed though the control panel.</p>") % [ self.name, self.name])
  238 + hp.save!
  239 + self.home_page = hp
  240 + self.save!
  241 +
  242 + feed = RssFeed.new(:name => 'feed')
  243 + self.articles << feed
  244 + feed.save!
  245 + end
  246 +
235 end 247 end
test/functional/cms_controller_test.rb
@@ -145,7 +145,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase @@ -145,7 +145,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase
145 should 'be able to create a RSS feed' do 145 should 'be able to create a RSS feed' do
146 login_as(profile.identifier) 146 login_as(profile.identifier)
147 assert_difference RssFeed, :count do 147 assert_difference RssFeed, :count do
148 - post :new, :type => RssFeed.name, :profile => profile.identifier, :article => { :name => 'feed', :limit => 15, :include => 'all', :feed_item_description => 'body' } 148 + post :new, :type => RssFeed.name, :profile => profile.identifier, :article => { :name => 'new-feed', :limit => 15, :include => 'all', :feed_item_description => 'body' }
149 assert_response :redirect 149 assert_response :redirect
150 end 150 end
151 end 151 end
@@ -171,7 +171,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase @@ -171,7 +171,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase
171 should 'be able to update an uploaded file' do 171 should 'be able to update an uploaded file' do
172 post :new, :type => UploadedFile.name, :profile => profile.identifier, :article => { :uploaded_data => fixture_file_upload('/files/test.txt', 'text/plain')} 172 post :new, :type => UploadedFile.name, :profile => profile.identifier, :article => { :uploaded_data => fixture_file_upload('/files/test.txt', 'text/plain')}
173 173
174 - file = profile.articles.find(:first) 174 + file = profile.articles.find_by_path('test.txt')
175 assert_equal 'test.txt', file.name 175 assert_equal 'test.txt', file.name
176 176
177 post :edit, :profile => profile.identifier, :id => file.id, :article => { :uploaded_data => fixture_file_upload('/files/test.txt', 'text/plain')} 177 post :edit, :profile => profile.identifier, :id => file.id, :article => { :uploaded_data => fixture_file_upload('/files/test.txt', 'text/plain')}
test/unit/article_test.rb
@@ -133,17 +133,20 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -133,17 +133,20 @@ class ArticleTest &lt; Test::Unit::TestCase
133 end 133 end
134 134
135 should 'search for recent documents' do 135 should 'search for recent documents' do
  136 + other_profile = create_user('otherpropfile').person
  137 +
  138 + Article.destroy_all
  139 +
136 first = profile.articles.build(:name => 'first'); first.save! 140 first = profile.articles.build(:name => 'first'); first.save!
137 second = profile.articles.build(:name => 'second'); second.save! 141 second = profile.articles.build(:name => 'second'); second.save!
138 third = profile.articles.build(:name => 'third'); third.save! 142 third = profile.articles.build(:name => 'third'); third.save!
139 - forth = profile.articles.build(:name => 'forth'); forth.save! 143 + fourth = profile.articles.build(:name => 'fourth'); fourth.save!
140 fifth = profile.articles.build(:name => 'fifth'); fifth.save! 144 fifth = profile.articles.build(:name => 'fifth'); fifth.save!
141 145
142 - other_profile = create_user('otherpropfile').person  
143 other_first = other_profile.articles.build(:name => 'first'); other_first.save! 146 other_first = other_profile.articles.build(:name => 'first'); other_first.save!
144 147
145 - assert_equal [first,second,third], Article.recent(3)  
146 - assert_equal [first,second,third,forth,fifth,other_first], Article.recent(10) 148 + assert_equal [other_first, fifth, fourth], Article.recent(3)
  149 + assert_equal [other_first, fifth, fourth, third, second, first], Article.recent(6)
147 end 150 end
148 151
149 should 'provied proper descriptions' do 152 should 'provied proper descriptions' do
@@ -190,4 +193,21 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -190,4 +193,21 @@ class ArticleTest &lt; Test::Unit::TestCase
190 end 193 end
191 end 194 end
192 195
  196 + should 'remove comments when removing article' do
  197 + assert_no_difference Comment, :count do
  198 + a = profile.articles.build(:name => 'test article')
  199 + a.save!
  200 +
  201 + assert_difference Comment, :count, 1 do
  202 + comment = a.comments.build
  203 + comment.author = profile
  204 + comment.title = 'test comment'
  205 + comment.body = 'you suck!'
  206 + comment.save!
  207 + end
  208 +
  209 + a.destroy
  210 + end
  211 + end
  212 +
193 end 213 end
test/unit/enterprise_test.rb
@@ -55,4 +55,11 @@ class EnterpriseTest &lt; Test::Unit::TestCase @@ -55,4 +55,11 @@ class EnterpriseTest &lt; Test::Unit::TestCase
55 end 55 end
56 end 56 end
57 57
  58 + should 'get a default homepage and RSS feed' do
  59 + enterprise = Enterprise.create!(:name => 'my test enterprise', :identifier => 'myenterprise')
  60 +
  61 + assert_kind_of Article, enterprise.home_page
  62 + assert_kind_of RssFeed, enterprise.articles.find_by_path('feed')
  63 + end
  64 +
58 end 65 end
test/unit/environment_test.rb
@@ -222,22 +222,33 @@ class EnvironmentTest &lt; Test::Unit::TestCase @@ -222,22 +222,33 @@ class EnvironmentTest &lt; Test::Unit::TestCase
222 should 'provide recent_documents' do 222 should 'provide recent_documents' do
223 environment = Environment.create(:name => 'a test environment') 223 environment = Environment.create(:name => 'a test environment')
224 224
  225 + p1 = environment.profiles.build(:identifier => 'testprofile1', :name => 'test profile 1'); p1.save!
  226 + p2 = environment.profiles.build(:identifier => 'testprofile2', :name => 'test profile 2'); p2.save!
  227 +
  228 + # clear the articles
  229 + Article.destroy_all
  230 +
225 # p1 creates one article 231 # p1 creates one article
226 - p1 = environment.profiles.build(:identifier => 'testprofile1', :name => 'test profile 1')  
227 - p1.save!  
228 doc1 = p1.articles.build(:name => 'text 1'); doc1.save! 232 doc1 = p1.articles.build(:name => 'text 1'); doc1.save!
229 233
230 # p2 creates two articles 234 # p2 creates two articles
231 - p2 = environment.profiles.build(:identifier => 'testprofile2', :name => 'test profile 2')  
232 - p2.save!  
233 doc2 = p2.articles.build(:name => 'text 2'); doc2.save! 235 doc2 = p2.articles.build(:name => 'text 2'); doc2.save!
234 doc3 = p2.articles.build(:name => 'text 3'); doc3.save! 236 doc3 = p2.articles.build(:name => 'text 3'); doc3.save!
235 237
236 # p1 creates another article 238 # p1 creates another article
237 doc4 = p1.articles.build(:name => 'text 4'); doc4.save! 239 doc4 = p1.articles.build(:name => 'text 4'); doc4.save!
238 240
239 - assert_equivalent [doc1,doc2,doc3,doc4], environment.recent_documents  
240 - assert_equivalent [doc1,doc2,doc3], environment.recent_documents(3) 241 + all_recent = environment.recent_documents
  242 + [doc1,doc2,doc3,doc4].each do |item|
  243 + assert_includes all_recent, item
  244 + end
  245 +
  246 + last_three = environment.recent_documents(3)
  247 + [doc2, doc3, doc4].each do |item|
  248 + assert_includes last_three, item
  249 + end
  250 + assert_not_includes last_three, doc1
  251 +
241 end 252 end
242 253
243 should 'have a description attribute' do 254 should 'have a description attribute' do
test/unit/person_test.rb
@@ -127,4 +127,11 @@ class PersonTest &lt; Test::Unit::TestCase @@ -127,4 +127,11 @@ class PersonTest &lt; Test::Unit::TestCase
127 assert person.blocks.size > 0, 'Person should have blocks upon creation' 127 assert person.blocks.size > 0, 'Person should have blocks upon creation'
128 end 128 end
129 129
  130 + should 'get a default home page and a RSS feed' do
  131 + person = create_user('mytestuser').person
  132 +
  133 + assert_kind_of Article, person.home_page
  134 + assert_kind_of RssFeed, person.articles.find_by_path('feed')
  135 + end
  136 +
130 end 137 end
test/unit/profile_test.rb
@@ -72,15 +72,7 @@ class ProfileTest &lt; Test::Unit::TestCase @@ -72,15 +72,7 @@ class ProfileTest &lt; Test::Unit::TestCase
72 72
73 should 'provide access to home page' do 73 should 'provide access to home page' do
74 profile = Profile.create!(:identifier => 'newprofile', :name => 'New Profile') 74 profile = Profile.create!(:identifier => 'newprofile', :name => 'New Profile')
75 - assert_nil profile.home_page  
76 -  
77 - page = profile.articles.build(:name => "My custom home page")  
78 - page.save!  
79 -  
80 - profile.home_page = page  
81 - profile.save!  
82 -  
83 - assert_equal page, profile.home_page 75 + assert_kind_of Article, profile.home_page
84 end 76 end
85 77
86 def test_name_should_be_mandatory 78 def test_name_should_be_mandatory
@@ -116,9 +108,10 @@ class ProfileTest &lt; Test::Unit::TestCase @@ -116,9 +108,10 @@ class ProfileTest &lt; Test::Unit::TestCase
116 second = profile.articles.build(:name => 'second'); second.save! 108 second = profile.articles.build(:name => 'second'); second.save!
117 third = profile.articles.build(:name => 'third'); third.save! 109 third = profile.articles.build(:name => 'third'); third.save!
118 110
119 - n = Article.count 111 + total = Article.count
  112 + mine = profile.articles.count
120 profile.destroy 113 profile.destroy
121 - assert_equal n - 3, Article.count 114 + assert_equal total - mine, Article.count
122 end 115 end
123 116
124 def test_should_define_info 117 def test_should_define_info
@@ -139,12 +132,14 @@ class ProfileTest &lt; Test::Unit::TestCase @@ -139,12 +132,14 @@ class ProfileTest &lt; Test::Unit::TestCase
139 132
140 should 'provide recent documents' do 133 should 'provide recent documents' do
141 profile = Profile.create!(:name => 'testing profile', :identifier => 'testingprofile') 134 profile = Profile.create!(:name => 'testing profile', :identifier => 'testingprofile')
  135 + profile.articles.destroy_all
  136 +
142 first = profile.articles.build(:name => 'first'); first.save! 137 first = profile.articles.build(:name => 'first'); first.save!
143 second = profile.articles.build(:name => 'second'); second.save! 138 second = profile.articles.build(:name => 'second'); second.save!
144 third = profile.articles.build(:name => 'third'); third.save! 139 third = profile.articles.build(:name => 'third'); third.save!
145 140
146 - assert_equal [first,second], profile.recent_documents(2)  
147 - assert_equal [first,second,third], profile.recent_documents 141 + assert_equal [third, second], profile.recent_documents(2)
  142 + assert_equal [third, second, first], profile.recent_documents
148 end 143 end
149 144
150 should 'affiliate and provide a list of the affiliated users' do 145 should 'affiliate and provide a list of the affiliated users' do
@@ -318,6 +313,14 @@ class ProfileTest &lt; Test::Unit::TestCase @@ -318,6 +313,14 @@ class ProfileTest &lt; Test::Unit::TestCase
318 assert_equal false, Profile.new.has_members? 313 assert_equal false, Profile.new.has_members?
319 end 314 end
320 315
  316 + should 'create a homepage and a feed on creation' do
  317 + profile = Profile.create!(:name => 'my test profile', :identifier => 'mytestprofile')
  318 +
  319 + assert_kind_of Article, profile.home_page
  320 + assert_kind_of RssFeed, profile.articles.find_by_path('feed')
  321 + end
  322 +
  323 +
321 private 324 private
322 325
323 def assert_invalid_identifier(id) 326 def assert_invalid_identifier(id)
test/unit/recent_documents_block_test.rb
@@ -7,7 +7,7 @@ class RecentDocumentsBlockTest &lt; Test::Unit::TestCase @@ -7,7 +7,7 @@ class RecentDocumentsBlockTest &lt; Test::Unit::TestCase
7 profile.articles.build(:name => 'first').save! 7 profile.articles.build(:name => 'first').save!
8 profile.articles.build(:name => 'second').save! 8 profile.articles.build(:name => 'second').save!
9 profile.articles.build(:name => 'third').save! 9 profile.articles.build(:name => 'third').save!
10 - profile.articles.build(:name => 'forth').save! 10 + profile.articles.build(:name => 'fourth').save!
11 profile.articles.build(:name => 'fifth').save! 11 profile.articles.build(:name => 'fifth').save!
12 12
13 box = Box.create!(:owner => profile) 13 box = Box.create!(:owner => profile)
@@ -26,7 +26,7 @@ class RecentDocumentsBlockTest &lt; Test::Unit::TestCase @@ -26,7 +26,7 @@ class RecentDocumentsBlockTest &lt; Test::Unit::TestCase
26 assert_match /href=.*\/testinguser\/first/, output 26 assert_match /href=.*\/testinguser\/first/, output
27 assert_match /href=.*\/testinguser\/second/, output 27 assert_match /href=.*\/testinguser\/second/, output
28 assert_match /href=.*\/testinguser\/third/, output 28 assert_match /href=.*\/testinguser\/third/, output
29 - assert_match /href=.*\/testinguser\/forth/, output 29 + assert_match /href=.*\/testinguser\/fourth/, output
30 assert_match /href=.*\/testinguser\/fifth/, output 30 assert_match /href=.*\/testinguser\/fifth/, output
31 end 31 end
32 32
@@ -35,11 +35,11 @@ class RecentDocumentsBlockTest &lt; Test::Unit::TestCase @@ -35,11 +35,11 @@ class RecentDocumentsBlockTest &lt; Test::Unit::TestCase
35 35
36 output = block.content 36 output = block.content
37 37
38 - assert_match /href=.*\/testinguser\/first/, output  
39 - assert_match /href=.*\/testinguser\/second/, output 38 + assert_match /href=.*\/testinguser\/fifth/, output
  39 + assert_match /href=.*\/testinguser\/fourth/, output
40 assert_match /href=.*\/testinguser\/third/, output 40 assert_match /href=.*\/testinguser\/third/, output
41 - assert_no_match /href=.*\/testinguser\/forth/, output  
42 - assert_no_match /href=.*\/testinguser\/fifth/, output 41 + assert_no_match /href=.*\/testinguser\/second/, output
  42 + assert_no_match /href=.*\/testinguser\/first/, output
43 end 43 end
44 44
45 end 45 end
test/unit/rss_feed_test.rb
@@ -29,7 +29,7 @@ class RssFeedTest &lt; Test::Unit::TestCase @@ -29,7 +29,7 @@ class RssFeedTest &lt; Test::Unit::TestCase
29 a2 = profile.articles.build(:name => 'article 2'); a2.save! 29 a2 = profile.articles.build(:name => 'article 2'); a2.save!
30 a3 = profile.articles.build(:name => 'article 3'); a3.save! 30 a3 = profile.articles.build(:name => 'article 3'); a3.save!
31 31
32 - feed = RssFeed.new(:name => 'feed') 32 + feed = RssFeed.new(:name => 'testfeed')
33 feed.profile = profile 33 feed.profile = profile
34 feed.save! 34 feed.save!
35 35
@@ -45,12 +45,12 @@ class RssFeedTest &lt; Test::Unit::TestCase @@ -45,12 +45,12 @@ class RssFeedTest &lt; Test::Unit::TestCase
45 a2 = profile.articles.build(:name => 'article 2'); a2.save! 45 a2 = profile.articles.build(:name => 'article 2'); a2.save!
46 a3 = profile.articles.build(:name => 'article 3'); a3.save! 46 a3 = profile.articles.build(:name => 'article 3'); a3.save!
47 47
48 - feed = RssFeed.new(:name => 'feed') 48 + feed = RssFeed.new(:name => 'testfeed')
49 feed.profile = profile 49 feed.profile = profile
50 feed.save! 50 feed.save!
51 51
52 rss = feed.data 52 rss = feed.data
53 - assert_no_match /<item><title>feed<\/title>/, rss 53 + assert_no_match /<item><title>testfeed<\/title>/, rss
54 end 54 end
55 55
56 should 'list recent article from parent article' do 56 should 'list recent article from parent article' do
@@ -66,7 +66,7 @@ class RssFeedTest &lt; Test::Unit::TestCase @@ -66,7 +66,7 @@ class RssFeedTest &lt; Test::Unit::TestCase
66 profile = create_user('testuser').person 66 profile = create_user('testuser').person
67 a1 = profile.articles.build(:name => 'article 1', 'abstract' => 'my abstract', 'body' => 'my text'); a1.save! 67 a1 = profile.articles.build(:name => 'article 1', 'abstract' => 'my abstract', 'body' => 'my text'); a1.save!
68 68
69 - feed = RssFeed.new(:name => 'feed') 69 + feed = RssFeed.new(:name => 'testfeed')
70 feed.profile = profile 70 feed.profile = profile
71 feed.save! 71 feed.save!
72 72
@@ -90,7 +90,7 @@ class RssFeedTest &lt; Test::Unit::TestCase @@ -90,7 +90,7 @@ class RssFeedTest &lt; Test::Unit::TestCase
90 a3_2 = a3.children.build(:name => 'article 3.2', :parent => a3, :profile => profile); a3_2.save! 90 a3_2 = a3.children.build(:name => 'article 3.2', :parent => a3, :profile => profile); a3_2.save!
91 a3_2_1 = a3_2.children.build(:name => 'article 3.2.1', :parent => a3_2, :profile => profile); a3_2_1.save! 91 a3_2_1 = a3_2.children.build(:name => 'article 3.2.1', :parent => a3_2, :profile => profile); a3_2_1.save!
92 92
93 - feed = RssFeed.new(:name => 'feed') 93 + feed = RssFeed.new(:name => 'testfeed')
94 feed.parent = a3 94 feed.parent = a3
95 feed.profile = profile 95 feed.profile = profile
96 feed.include = 'parent_and_children' 96 feed.include = 'parent_and_children'
@@ -108,7 +108,7 @@ class RssFeedTest &lt; Test::Unit::TestCase @@ -108,7 +108,7 @@ class RssFeedTest &lt; Test::Unit::TestCase
108 108
109 should 'provide link to profile' do 109 should 'provide link to profile' do
110 profile = create_user('testuser').person 110 profile = create_user('testuser').person
111 - feed = RssFeed.new(:name => 'feed') 111 + feed = RssFeed.new(:name => 'testfeed')
112 feed.profile = profile 112 feed.profile = profile
113 feed.save! 113 feed.save!
114 114
@@ -118,7 +118,7 @@ class RssFeedTest &lt; Test::Unit::TestCase @@ -118,7 +118,7 @@ class RssFeedTest &lt; Test::Unit::TestCase
118 should 'provide link to each article' do 118 should 'provide link to each article' do
119 profile = create_user('testuser').person 119 profile = create_user('testuser').person
120 art = profile.articles.build(:name => 'myarticle'); art.save! 120 art = profile.articles.build(:name => 'myarticle'); art.save!
121 - feed = RssFeed.new(:name => 'feed') 121 + feed = RssFeed.new(:name => 'testfeed')
122 feed.profile = profile 122 feed.profile = profile
123 feed.save! 123 feed.save!
124 124
@@ -133,7 +133,7 @@ class RssFeedTest &lt; Test::Unit::TestCase @@ -133,7 +133,7 @@ class RssFeedTest &lt; Test::Unit::TestCase
133 a2 = profile.articles.build(:name => 'article 2'); a2.save! 133 a2 = profile.articles.build(:name => 'article 2'); a2.save!
134 a3 = profile.articles.build(:name => 'article 3'); a3.save! 134 a3 = profile.articles.build(:name => 'article 3'); a3.save!
135 135
136 - feed = RssFeed.new(:name => 'feed') 136 + feed = RssFeed.new(:name => 'testfeed')
137 feed.profile = profile 137 feed.profile = profile
138 feed.save! 138 feed.save!
139 139