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 119 translations if @article.translatable?
120 120  
121 121 @article.profile = profile
  122 + @article.author = user
122 123 @article.last_changed_by = user
123 124  
124 125 continue = params[:continue]
... ...
app/models/article.rb
... ... @@ -13,6 +13,12 @@ class Article < ActiveRecord::Base
13 13 # xss_terminate plugin can't sanitize array fields
14 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 22 belongs_to :profile
17 23 validates_presence_of :profile_id, :name
18 24 validates_presence_of :slug, :path, :if => lambda { |article| !article.name.blank? }
... ... @@ -20,6 +26,7 @@ class Article < ActiveRecord::Base
20 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 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 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 285 if last_comment
279 286 {:date => last_comment.created_at, :author_name => last_comment.author_name, :author_url => last_comment.author_url}
280 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 289 end
283 290 end
284 291  
... ... @@ -430,7 +437,7 @@ class Article < ActiveRecord::Base
430 437 end
431 438  
432 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 441 end
435 442  
436 443 def allow_publish_content?(user = nil)
... ... @@ -527,16 +534,8 @@ class Article < ActiveRecord::Base
527 534 false
528 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 537 def author_name
539   - setting[:author_name].blank? ? author.name : setting[:author_name]
  538 + author ? author.name : setting[:author_name]
540 539 end
541 540  
542 541 alias :active_record_cache_key :cache_key
... ... @@ -561,11 +560,6 @@ class Article < ActiveRecord::Base
561 560 truncate sanitize_html(self.lead), :length => 170, :omission => '...'
562 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 563 def notifiable?
570 564 false
571 565 end
... ...
app/models/person.rb
... ... @@ -54,6 +54,8 @@ class Person < Profile
54 54  
55 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 59 named_scope :more_popular,
58 60 :select => "#{Profile.qualified_column_names}, count(friend_id) as total",
59 61 :group => Profile.qualified_column_names,
... ...
db/migrate/20121024220349_add_author_id_to_article.rb 0 → 100644
... ... @@ -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 @@
  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
... ...
db/schema.rb
... ... @@ -9,7 +9,7 @@
9 9 #
10 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 14 create_table "abuse_reports", :force => true do |t|
15 15 t.integer "reporter_id"
... ... @@ -86,6 +86,7 @@ ActiveRecord::Schema.define(:version =&gt; 20120825185219) do
86 86 t.string "language"
87 87 t.string "source_name"
88 88 t.integer "license_id"
  89 + t.integer "author_id"
89 90 end
90 91  
91 92 create_table "articles", :force => true do |t|
... ... @@ -127,6 +128,7 @@ ActiveRecord::Schema.define(:version =&gt; 20120825185219) do
127 128 t.string "language"
128 129 t.string "source_name"
129 130 t.integer "license_id"
  131 + t.integer "author_id"
130 132 end
131 133  
132 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 1556 assert_equal license, article.license
1557 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 1569 protected
1560 1570  
1561 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 708 assert_equal a.url, a.view_url
709 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 711 should 'have published_at' do
720 712 assert_respond_to Article.new, :published_at
721 713 end
... ... @@ -1372,7 +1364,7 @@ class ArticleTest &lt; ActiveSupport::TestCase
1372 1364 assert Article.method_defined?('author_name')
1373 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 1368 author = mock()
1377 1369 author.expects(:name).returns('author name')
1378 1370 a = Article.new
... ... @@ -1782,4 +1774,25 @@ class ArticleTest &lt; ActiveSupport::TestCase
1782 1774 assert_equal license, article.license
1783 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 1798 end
... ...
test/unit/person_test.rb
... ... @@ -1262,4 +1262,15 @@ class PersonTest &lt; ActiveSupport::TestCase
1262 1262  
1263 1263 assert person.has_permission?('bli', Profile.new)
1264 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 1276 end
... ...