]> source.dussan.org Git - redmine.git/commitdiff
Disallow creating inverse relates issue relations (#27663).
authorGo MAEDA <maeda@farend.jp>
Wed, 6 Dec 2017 09:01:07 +0000 (09:01 +0000)
committerGo MAEDA <maeda@farend.jp>
Wed, 6 Dec 2017 09:01:07 +0000 (09:01 +0000)
Patch by Gregor Schmidt.

git-svn-id: http://svn.redmine.org/redmine/trunk@17056 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/issue_relation.rb
test/functional/issue_relations_controller_test.rb
test/unit/issue_relation_test.rb

index 44c7c8dbafde942ee400483c32fc65fdee1ea7f0..0a47b134109ce5289f5f45b2a24d4d92787d874c 100644 (file)
@@ -207,13 +207,19 @@ class IssueRelation < ActiveRecord::Base
 
   # Reverses the relation if needed so that it gets stored in the proper way
   # Should not be reversed before validation so that it can be displayed back
-  # as entered on new relation form
+  # as entered on new relation form.
+  #
+  # Orders relates relations by ID, so that uniqueness index in DB is triggered
+  # on concurrent access.
   def reverse_if_needed
     if TYPES.has_key?(relation_type) && TYPES[relation_type][:reverse]
       issue_tmp = issue_to
       self.issue_to = issue_from
       self.issue_from = issue_tmp
       self.relation_type = TYPES[relation_type][:reverse]
+
+    elsif relation_type == TYPE_RELATES && issue_from_id > issue_to_id
+      self.issue_to, self.issue_from = issue_from, issue_to
     end
   end
 
@@ -228,6 +234,8 @@ class IssueRelation < ActiveRecord::Base
       issue_from.blocks? issue_to
     when 'blocks'
       issue_to.blocks? issue_from
+    when 'relates'
+      self.class.where(issue_from_id: issue_to, issue_to_id: issue_from).present?
     else
       false
     end
index 020ff32fd91b128e2201af904e2ea29d6644cee3..1842786d5f363ed0a87e1d5dea91e3707b9b597a 100644 (file)
@@ -82,8 +82,8 @@ class IssueRelationsControllerTest < Redmine::ControllerTest
       assert_equal 'text/javascript', response.content_type
     end
     relation = IssueRelation.order('id DESC').first
-    assert_equal 3, relation.issue_from_id
-    assert_equal 1, relation.issue_to_id
+    assert_equal 1, relation.issue_from_id
+    assert_equal 3, relation.issue_to_id
 
     assert_include 'Bug #1', response.body
   end
index e6d126dcb8bef3f0c087c197b11553430d81d7df..585a8293e721261c3c1cd3b1401b4af06e866c56 100644 (file)
@@ -65,6 +65,20 @@ class IssueRelationTest < ActiveSupport::TestCase
     assert_equal from, relation.issue_to
   end
 
+  def test_cannot_create_inverse_relates_relations
+    from = Issue.find(1)
+    to = Issue.find(2)
+
+    relation1 = IssueRelation.new :issue_from => from, :issue_to => to,
+                                  :relation_type => IssueRelation::TYPE_RELATES
+    assert relation1.save
+
+    relation2 = IssueRelation.new :issue_from => to, :issue_to => from,
+                                  :relation_type => IssueRelation::TYPE_RELATES
+    assert !relation2.save
+    assert_not_equal [], relation2.errors[:base]
+  end
+
   def test_follows_relation_should_not_be_reversed_if_validation_fails
     from = Issue.find(1)
     to = Issue.find(2)