Patch #27663 » 0001-Disallow-creating-inverse-relates-issue-relations.patch
| app/models/issue_relation.rb | ||
|---|---|---|
| 207 | 207 | |
| 208 | 208 |
# Reverses the relation if needed so that it gets stored in the proper way |
| 209 | 209 |
# Should not be reversed before validation so that it can be displayed back |
| 210 |
# as entered on new relation form |
|
| 210 |
# as entered on new relation form. |
|
| 211 |
# |
|
| 212 |
# Orders relates relations by ID, so that uniqueness index in DB is triggered |
|
| 213 |
# on concurrent access. |
|
| 211 | 214 |
def reverse_if_needed |
| 212 | 215 |
if TYPES.has_key?(relation_type) && TYPES[relation_type][:reverse] |
| 213 | 216 |
issue_tmp = issue_to |
| 214 | 217 |
self.issue_to = issue_from |
| 215 | 218 |
self.issue_from = issue_tmp |
| 216 | 219 |
self.relation_type = TYPES[relation_type][:reverse] |
| 220 | ||
| 221 |
elsif relation_type == TYPE_RELATES && issue_from_id > issue_to_id |
|
| 222 |
self.issue_to, self.issue_from = issue_from, issue_to |
|
| 217 | 223 |
end |
| 218 | 224 |
end |
| 219 | 225 | |
| ... | ... | |
| 228 | 234 |
issue_from.blocks? issue_to |
| 229 | 235 |
when 'blocks' |
| 230 | 236 |
issue_to.blocks? issue_from |
| 237 |
when 'relates' |
|
| 238 |
self.class.where(issue_from_id: issue_to, issue_to_id: issue_from).present? |
|
| 231 | 239 |
else |
| 232 | 240 |
false |
| 233 | 241 |
end |
| test/unit/issue_relation_test.rb | ||
|---|---|---|
| 65 | 65 |
assert_equal from, relation.issue_to |
| 66 | 66 |
end |
| 67 | 67 | |
| 68 |
def test_cannot_create_inverse_relates_relations |
|
| 69 |
from = Issue.find(1) |
|
| 70 |
to = Issue.find(2) |
|
| 71 | ||
| 72 |
relation1 = IssueRelation.new :issue_from => from, :issue_to => to, |
|
| 73 |
:relation_type => IssueRelation::TYPE_RELATES |
|
| 74 |
assert relation1.save |
|
| 75 | ||
| 76 |
relation2 = IssueRelation.new :issue_from => to, :issue_to => from, |
|
| 77 |
:relation_type => IssueRelation::TYPE_RELATES |
|
| 78 |
assert !relation2.save |
|
| 79 |
assert_not_equal [], relation2.errors[:base] |
|
| 80 |
end |
|
| 81 | ||
| 68 | 82 |
def test_follows_relation_should_not_be_reversed_if_validation_fails |
| 69 | 83 |
from = Issue.find(1) |
| 70 | 84 |
to = Issue.find(2) |