mirror of
https://github.com/redmine/redmine.git
synced 2025-11-08 14:26:04 +01:00
Disallow creating inverse relates issue relations (#27663).
Patch by Gregor Schmidt. git-svn-id: http://svn.redmine.org/redmine/trunk@17056 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -207,13 +207,19 @@ class IssueRelation < ActiveRecord::Base
|
|||||||
|
|
||||||
# Reverses the relation if needed so that it gets stored in the proper way
|
# 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
|
# 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
|
def reverse_if_needed
|
||||||
if TYPES.has_key?(relation_type) && TYPES[relation_type][:reverse]
|
if TYPES.has_key?(relation_type) && TYPES[relation_type][:reverse]
|
||||||
issue_tmp = issue_to
|
issue_tmp = issue_to
|
||||||
self.issue_to = issue_from
|
self.issue_to = issue_from
|
||||||
self.issue_from = issue_tmp
|
self.issue_from = issue_tmp
|
||||||
self.relation_type = TYPES[relation_type][:reverse]
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -228,6 +234,8 @@ class IssueRelation < ActiveRecord::Base
|
|||||||
issue_from.blocks? issue_to
|
issue_from.blocks? issue_to
|
||||||
when 'blocks'
|
when 'blocks'
|
||||||
issue_to.blocks? issue_from
|
issue_to.blocks? issue_from
|
||||||
|
when 'relates'
|
||||||
|
self.class.where(issue_from_id: issue_to, issue_to_id: issue_from).present?
|
||||||
else
|
else
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -82,8 +82,8 @@ class IssueRelationsControllerTest < Redmine::ControllerTest
|
|||||||
assert_equal 'text/javascript', response.content_type
|
assert_equal 'text/javascript', response.content_type
|
||||||
end
|
end
|
||||||
relation = IssueRelation.order('id DESC').first
|
relation = IssueRelation.order('id DESC').first
|
||||||
assert_equal 3, relation.issue_from_id
|
assert_equal 1, relation.issue_from_id
|
||||||
assert_equal 1, relation.issue_to_id
|
assert_equal 3, relation.issue_to_id
|
||||||
|
|
||||||
assert_include 'Bug #1', response.body
|
assert_include 'Bug #1', response.body
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -65,6 +65,20 @@ class IssueRelationTest < ActiveSupport::TestCase
|
|||||||
assert_equal from, relation.issue_to
|
assert_equal from, relation.issue_to
|
||||||
end
|
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
|
def test_follows_relation_should_not_be_reversed_if_validation_fails
|
||||||
from = Issue.find(1)
|
from = Issue.find(1)
|
||||||
to = Issue.find(2)
|
to = Issue.find(2)
|
||||||
|
|||||||
Reference in New Issue
Block a user