Commit 99d66a607b3f6b72beeb8e2d9fb0a724c2452044
1 parent
3d858878
Exists in
master
and in
29 other branches
Adding (real) authors to articles
Showing
9 changed files
with
79 additions
and
26 deletions
Show diff stats
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, |
@@ -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 |
db/schema.rb
@@ -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 => 20120825185219) do | @@ -86,6 +86,7 @@ ActiveRecord::Schema.define(:version => 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 => 20120825185219) do | @@ -127,6 +128,7 @@ ActiveRecord::Schema.define(:version => 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 < ActionController::TestCase | @@ -1556,6 +1556,16 @@ class CmsControllerTest < 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 < ActiveSupport::TestCase | @@ -708,14 +708,6 @@ class ArticleTest < 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 < ActiveSupport::TestCase | @@ -1372,7 +1364,7 @@ class ArticleTest < 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 < ActiveSupport::TestCase | @@ -1782,4 +1774,25 @@ class ArticleTest < 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 < ActiveSupport::TestCase | @@ -1262,4 +1262,15 @@ class PersonTest < 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 |