diff --git a/app/models/article.rb b/app/models/article.rb index 0196eef..2f75234 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -79,6 +79,25 @@ class Article < ActiveRecord::Base validate :native_translation_must_have_language validate :translation_must_have_language + validate :no_self_reference + validate :no_cyclical_reference, :if => 'parent_id.present?' + + def no_self_reference + errors.add(:parent_id, _('self-reference is not allowed.')) if id && parent_id == id + end + + def no_cyclical_reference + current_parent = Article.find(parent_id) + while current_parent + if current_parent == self + errors.add(:parent_id, _('cyclical reference is not allowed.')) + break + end + current_parent = current_parent.parent + end + end + + def is_trackable? self.published? && self.notifiable? && self.advertise? && self.profile.public_profile end diff --git a/test/unit/article_test.rb b/test/unit/article_test.rb index 68b6223..5a91225 100644 --- a/test/unit/article_test.rb +++ b/test/unit/article_test.rb @@ -1800,4 +1800,22 @@ class ArticleTest < ActiveSupport::TestCase assert_equal [f2.path,article.slug].join('/'), article.path end + should 'not allow parent as itself' do + article = Article.create!(:name => 'Sample Article', :profile => profile) + article.parent = article + article.valid? + + assert article.errors.invalid?(:parent_id) + end + + should 'not allow cyclical paternity' do + a1 = Article.create!(:name => 'Sample Article 1', :profile => profile) + a2 = Article.create!(:name => 'Sample Article 2', :profile => profile, :parent => a1) + a3 = Article.create!(:name => 'Sample Article 3', :profile => profile, :parent => a2) + a1.parent = a3 + a1.valid? + + assert a1.errors.invalid?(:parent_id) + end + end -- libgit2 0.21.2