Commit 99d66a607b3f6b72beeb8e2d9fb0a724c2452044

Authored by Rodrigo Souto
1 parent 3d858878

Adding (real) authors to articles

app/controllers/my_profile/cms_controller.rb
@@ -119,6 +119,7 @@ class CmsController < MyProfileController @@ -119,6 +119,7 @@ class CmsController < MyProfileController
119 translations if @article.translatable? 119 translations if @article.translatable?
120 120
121 @article.profile = profile 121 @article.profile = profile
  122 + @article.author = user
122 @article.last_changed_by = user 123 @article.last_changed_by = user
123 124
124 continue = params[:continue] 125 continue = params[:continue]
app/models/article.rb
@@ -13,6 +13,12 @@ class Article < ActiveRecord::Base @@ -13,6 +13,12 @@ class Article < ActiveRecord::Base
13 # xss_terminate plugin can't sanitize array fields 13 # xss_terminate plugin can't sanitize array fields
14 before_save :sanitize_tag_list 14 before_save :sanitize_tag_list
15 15
  16 + before_save do |article|
  17 + if article.author_id
  18 + article.author_name = Person.find(article.author_id).name
  19 + end
  20 + end
  21 +
16 belongs_to :profile 22 belongs_to :profile
17 validates_presence_of :profile_id, :name 23 validates_presence_of :profile_id, :name
18 validates_presence_of :slug, :path, :if => lambda { |article| !article.name.blank? } 24 validates_presence_of :slug, :path, :if => lambda { |article| !article.name.blank? }
@@ -20,6 +26,7 @@ class Article < ActiveRecord::Base @@ -20,6 +26,7 @@ class Article < ActiveRecord::Base
20 validates_uniqueness_of :slug, :scope => ['profile_id', 'parent_id'], :message => N_('The title (article name) is already being used by another article, please use another title.'), :if => lambda { |article| !article.slug.blank? } 26 validates_uniqueness_of :slug, :scope => ['profile_id', 'parent_id'], :message => N_('The title (article name) is already being used by another article, please use another title.'), :if => lambda { |article| !article.slug.blank? }
21 27
22 belongs_to :last_changed_by, :class_name => 'Person', :foreign_key => 'last_changed_by_id' 28 belongs_to :last_changed_by, :class_name => 'Person', :foreign_key => 'last_changed_by_id'
  29 + belongs_to :author, :class_name => 'Person', :foreign_key => 'author_id'
23 30
24 has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc' 31 has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc'
25 32
@@ -278,7 +285,7 @@ class Article < ActiveRecord::Base @@ -278,7 +285,7 @@ class Article < ActiveRecord::Base
278 if last_comment 285 if last_comment
279 {:date => last_comment.created_at, :author_name => last_comment.author_name, :author_url => last_comment.author_url} 286 {:date => last_comment.created_at, :author_name => last_comment.author_name, :author_url => last_comment.author_url}
280 else 287 else
281 - {:date => updated_at, :author_name => author.name, :author_url => author.url} 288 + {:date => updated_at, :author_name => author_name, :author_url => author ? author.url : nil}
282 end 289 end
283 end 290 end
284 291
@@ -430,7 +437,7 @@ class Article < ActiveRecord::Base @@ -430,7 +437,7 @@ class Article < ActiveRecord::Base
430 end 437 end
431 438
432 def allow_post_content?(user = nil) 439 def allow_post_content?(user = nil)
433 - user && (user.has_permission?('post_content', profile) || allow_publish_content?(user) && (user == self.creator)) 440 + user && (user.has_permission?('post_content', profile) || allow_publish_content?(user) && (user == author))
434 end 441 end
435 442
436 def allow_publish_content?(user = nil) 443 def allow_publish_content?(user = nil)
@@ -527,16 +534,8 @@ class Article < ActiveRecord::Base @@ -527,16 +534,8 @@ class Article < ActiveRecord::Base
527 false 534 false
528 end 535 end
529 536
530 - def author  
531 - if reference_article  
532 - reference_article.author  
533 - else  
534 - last_changed_by || profile  
535 - end  
536 - end  
537 -  
538 def author_name 537 def author_name
539 - setting[:author_name].blank? ? author.name : setting[:author_name] 538 + author ? author.name : setting[:author_name]
540 end 539 end
541 540
542 alias :active_record_cache_key :cache_key 541 alias :active_record_cache_key :cache_key
@@ -561,11 +560,6 @@ class Article < ActiveRecord::Base @@ -561,11 +560,6 @@ class Article < ActiveRecord::Base
561 truncate sanitize_html(self.lead), :length => 170, :omission => '...' 560 truncate sanitize_html(self.lead), :length => 170, :omission => '...'
562 end 561 end
563 562
564 - def creator  
565 - creator_id = versions[0][:last_changed_by_id]  
566 - creator_id && Profile.find(creator_id)  
567 - end  
568 -  
569 def notifiable? 563 def notifiable?
570 false 564 false
571 end 565 end
app/models/person.rb
@@ -54,6 +54,8 @@ class Person < Profile @@ -54,6 +54,8 @@ class Person < Profile
54 54
55 has_many :scraps_sent, :class_name => 'Scrap', :foreign_key => :sender_id, :dependent => :destroy 55 has_many :scraps_sent, :class_name => 'Scrap', :foreign_key => :sender_id, :dependent => :destroy
56 56
  57 + has_many :creations, :class_name => 'Article', :foreign_key => :author_id
  58 +
57 named_scope :more_popular, 59 named_scope :more_popular,
58 :select => "#{Profile.qualified_column_names}, count(friend_id) as total", 60 :select => "#{Profile.qualified_column_names}, count(friend_id) as total",
59 :group => Profile.qualified_column_names, 61 :group => Profile.qualified_column_names,
db/migrate/20121024220349_add_author_id_to_article.rb 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +class AddAuthorIdToArticle < ActiveRecord::Migration
  2 + def self.up
  3 + add_column :articles, :author_id, :integer
  4 + add_column :article_versions, :author_id, :integer
  5 + end
  6 +
  7 + def self.down
  8 + remove_column :articles, :author_id
  9 + remove_column :article_versions, :author_id, :integer
  10 + end
  11 +end
db/migrate/20121024222938_set_authors_based_on_article_versions.rb 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +class SetAuthorsBasedOnArticleVersions < ActiveRecord::Migration
  2 + def self.up
  3 + update('UPDATE articles SET author_id = (SELECT profiles.id FROM articles as a INNER JOIN article_versions ON a.id = article_versions.article_id INNER JOIN profiles ON profiles.id = article_versions.last_changed_by_id WHERE article_versions.version = 1 AND articles.id = a.id)')
  4 + end
  5 +
  6 + def self.down
  7 + say "Can not be revesed!"
  8 + end
  9 +end
@@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
9 # 9 #
10 # It's strongly recommended to check this file into your version control system. 10 # It's strongly recommended to check this file into your version control system.
11 11
12 -ActiveRecord::Schema.define(:version => 20120825185219) do 12 +ActiveRecord::Schema.define(:version => 20121024222938) do
13 13
14 create_table "abuse_reports", :force => true do |t| 14 create_table "abuse_reports", :force => true do |t|
15 t.integer "reporter_id" 15 t.integer "reporter_id"
@@ -86,6 +86,7 @@ ActiveRecord::Schema.define(:version =&gt; 20120825185219) do @@ -86,6 +86,7 @@ ActiveRecord::Schema.define(:version =&gt; 20120825185219) do
86 t.string "language" 86 t.string "language"
87 t.string "source_name" 87 t.string "source_name"
88 t.integer "license_id" 88 t.integer "license_id"
  89 + t.integer "author_id"
89 end 90 end
90 91
91 create_table "articles", :force => true do |t| 92 create_table "articles", :force => true do |t|
@@ -127,6 +128,7 @@ ActiveRecord::Schema.define(:version =&gt; 20120825185219) do @@ -127,6 +128,7 @@ ActiveRecord::Schema.define(:version =&gt; 20120825185219) do
127 t.string "language" 128 t.string "language"
128 t.string "source_name" 129 t.string "source_name"
129 t.integer "license_id" 130 t.integer "license_id"
  131 + t.integer "author_id"
130 end 132 end
131 133
132 add_index "articles", ["translation_of_id"], :name => "index_articles_on_translation_of_id" 134 add_index "articles", ["translation_of_id"], :name => "index_articles_on_translation_of_id"
test/functional/cms_controller_test.rb
@@ -1556,6 +1556,16 @@ class CmsControllerTest &lt; ActionController::TestCase @@ -1556,6 +1556,16 @@ class CmsControllerTest &lt; ActionController::TestCase
1556 assert_equal license, article.license 1556 assert_equal license, article.license
1557 end 1557 end
1558 1558
  1559 + should 'set author when creating article' do
  1560 + login_as(profile.identifier)
  1561 +
  1562 + post :new, :type => 'TinyMceArticle', :profile => profile.identifier, :article => { :name => 'Sample Article', :body => 'content ...' }
  1563 +
  1564 + a = profile.articles.find_by_path('sample-article')
  1565 + assert_not_nil a
  1566 + assert_equal profile, a.author
  1567 + end
  1568 +
1559 protected 1569 protected
1560 1570
1561 # FIXME this is to avoid adding an extra dependency for a proper JSON parser. 1571 # FIXME this is to avoid adding an extra dependency for a proper JSON parser.
test/unit/article_test.rb
@@ -708,14 +708,6 @@ class ArticleTest &lt; ActiveSupport::TestCase @@ -708,14 +708,6 @@ class ArticleTest &lt; ActiveSupport::TestCase
708 assert_equal a.url, a.view_url 708 assert_equal a.url, a.view_url
709 end 709 end
710 710
711 - should 'know its author' do  
712 - assert_equal profile, Article.new(:last_changed_by => profile).author  
713 - end  
714 -  
715 - should 'use owning profile as author when we dont know who did the last change' do  
716 - assert_equal profile, Article.new(:last_changed_by => nil, :profile => profile).author  
717 - end  
718 -  
719 should 'have published_at' do 711 should 'have published_at' do
720 assert_respond_to Article.new, :published_at 712 assert_respond_to Article.new, :published_at
721 end 713 end
@@ -1372,7 +1364,7 @@ class ArticleTest &lt; ActiveSupport::TestCase @@ -1372,7 +1364,7 @@ class ArticleTest &lt; ActiveSupport::TestCase
1372 assert Article.method_defined?('author_name') 1364 assert Article.method_defined?('author_name')
1373 end 1365 end
1374 1366
1375 - should "the author_name returns the name od the article's author" do 1367 + should "the author_name returns the name of the article's author" do
1376 author = mock() 1368 author = mock()
1377 author.expects(:name).returns('author name') 1369 author.expects(:name).returns('author name')
1378 a = Article.new 1370 a = Article.new
@@ -1782,4 +1774,25 @@ class ArticleTest &lt; ActiveSupport::TestCase @@ -1782,4 +1774,25 @@ class ArticleTest &lt; ActiveSupport::TestCase
1782 assert_equal license, article.license 1774 assert_equal license, article.license
1783 end 1775 end
1784 1776
  1777 + should 'be able to have an author' do
  1778 + author = fast_create(Person)
  1779 + article = Article.new
  1780 + assert_nothing_raised do
  1781 + article.author = author
  1782 + end
  1783 + end
  1784 +
  1785 + should 'set author_name before saving article if there is an author' do
  1786 + author = fast_create(Person)
  1787 + article = fast_create(Article, :profile_id => fast_create(Profile).id)
  1788 + article.author = author
  1789 + article.save!
  1790 + assert_equal author.name, article.author_name
  1791 +
  1792 + author_name = author.name
  1793 + author.destroy
  1794 + article.reload
  1795 + assert_equal author_name, article.author_name
  1796 + end
  1797 +
1785 end 1798 end
test/unit/person_test.rb
@@ -1262,4 +1262,15 @@ class PersonTest &lt; ActiveSupport::TestCase @@ -1262,4 +1262,15 @@ class PersonTest &lt; ActiveSupport::TestCase
1262 1262
1263 assert person.has_permission?('bli', Profile.new) 1263 assert person.has_permission?('bli', Profile.new)
1264 end 1264 end
  1265 +
  1266 + should 'have creations' do
  1267 + person = create_user('some-user').person
  1268 + a1 = fast_create(Article, :author_id => person.id)
  1269 + a2 = fast_create(Article, :author_id => person.id)
  1270 + a3 = fast_create(Article)
  1271 +
  1272 + assert_includes person.creations, a1
  1273 + assert_includes person.creations, a2
  1274 + assert_not_includes person.creations, a3
  1275 + end
1265 end 1276 end