##// END OF EJS Templates
Fixed that issue nested set update is triggered even if parent is not changed (#15135)....
Jean-Philippe Lang -
r11996:99bf8c95aba2
parent child
Show More
@@ -1105,6 +1105,10 class Issue < ActiveRecord::Base
1105 s = arg.to_s.strip.presence
1105 s = arg.to_s.strip.presence
1106 if s && (m = s.match(%r{\A#?(\d+)\z})) && (@parent_issue = Issue.find_by_id(m[1]))
1106 if s && (m = s.match(%r{\A#?(\d+)\z})) && (@parent_issue = Issue.find_by_id(m[1]))
1107 @parent_issue.id
1107 @parent_issue.id
1108 @invalid_parent_issue_id = nil
1109 elsif s.blank?
1110 @parent_issue = nil
1111 @invalid_parent_issue_id = nil
1108 else
1112 else
1109 @parent_issue = nil
1113 @parent_issue = nil
1110 @invalid_parent_issue_id = arg
1114 @invalid_parent_issue_id = arg
@@ -1280,38 +1284,43 class Issue < ActiveRecord::Base
1280 move_to_child_of(@parent_issue)
1284 move_to_child_of(@parent_issue)
1281 end
1285 end
1282 elsif parent_issue_id != parent_id
1286 elsif parent_issue_id != parent_id
1283 former_parent_id = parent_id
1287 update_nested_set_attributes_on_parent_change
1284 # moving an existing issue
1288 end
1285 if @parent_issue && @parent_issue.root_id == root_id
1289 remove_instance_variable(:@parent_issue) if instance_variable_defined?(:@parent_issue)
1286 # inside the same tree
1290 end
1291
1292 # Updates the nested set for when an existing issue is moved
1293 def update_nested_set_attributes_on_parent_change
1294 former_parent_id = parent_id
1295 # moving an existing issue
1296 if @parent_issue && @parent_issue.root_id == root_id
1297 # inside the same tree
1298 move_to_child_of(@parent_issue)
1299 else
1300 # to another tree
1301 unless root?
1302 move_to_right_of(root)
1303 end
1304 old_root_id = root_id
1305 self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id )
1306 target_maxright = nested_set_scope.maximum(right_column_name) || 0
1307 offset = target_maxright + 1 - lft
1308 Issue.update_all(["root_id = ?, lft = lft + ?, rgt = rgt + ?", root_id, offset, offset],
1309 ["root_id = ? AND lft >= ? AND rgt <= ? ", old_root_id, lft, rgt])
1310 self[left_column_name] = lft + offset
1311 self[right_column_name] = rgt + offset
1312 if @parent_issue
1287 move_to_child_of(@parent_issue)
1313 move_to_child_of(@parent_issue)
1288 else
1289 # to another tree
1290 unless root?
1291 move_to_right_of(root)
1292 end
1293 old_root_id = root_id
1294 self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id )
1295 target_maxright = nested_set_scope.maximum(right_column_name) || 0
1296 offset = target_maxright + 1 - lft
1297 Issue.update_all(["root_id = ?, lft = lft + ?, rgt = rgt + ?", root_id, offset, offset],
1298 ["root_id = ? AND lft >= ? AND rgt <= ? ", old_root_id, lft, rgt])
1299 self[left_column_name] = lft + offset
1300 self[right_column_name] = rgt + offset
1301 if @parent_issue
1302 move_to_child_of(@parent_issue)
1303 end
1304 end
1314 end
1305 # delete invalid relations of all descendants
1315 end
1306 self_and_descendants.each do |issue|
1316 # delete invalid relations of all descendants
1307 issue.relations.each do |relation|
1317 self_and_descendants.each do |issue|
1308 relation.destroy unless relation.valid?
1318 issue.relations.each do |relation|
1309 end
1319 relation.destroy unless relation.valid?
1310 end
1320 end
1311 # update former parent
1312 recalculate_attributes_for(former_parent_id) if former_parent_id
1313 end
1321 end
1314 remove_instance_variable(:@parent_issue) if instance_variable_defined?(:@parent_issue)
1322 # update former parent
1323 recalculate_attributes_for(former_parent_id) if former_parent_id
1315 end
1324 end
1316
1325
1317 def update_parent_attributes
1326 def update_parent_attributes
@@ -166,6 +166,41 class IssueNestedSetTest < ActiveSupport::TestCase
166 assert_not_equal [], child.errors[:parent_issue_id]
166 assert_not_equal [], child.errors[:parent_issue_id]
167 end
167 end
168
168
169 def test_updating_a_root_issue_should_not_trigger_update_nested_set_attributes_on_parent_change
170 issue = Issue.find(Issue.generate!.id)
171 issue.parent_issue_id = ""
172 issue.expects(:update_nested_set_attributes_on_parent_change).never
173 issue.save!
174 end
175
176 def test_updating_a_child_issue_should_not_trigger_update_nested_set_attributes_on_parent_change
177 issue = Issue.find(Issue.generate!(:parent_issue_id => 1).id)
178 issue.parent_issue_id = "1"
179 issue.expects(:update_nested_set_attributes_on_parent_change).never
180 issue.save!
181 end
182
183 def test_moving_a_root_issue_should_trigger_update_nested_set_attributes_on_parent_change
184 issue = Issue.find(Issue.generate!.id)
185 issue.parent_issue_id = "1"
186 issue.expects(:update_nested_set_attributes_on_parent_change).once
187 issue.save!
188 end
189
190 def test_moving_a_child_issue_to_another_parent_should_trigger_update_nested_set_attributes_on_parent_change
191 issue = Issue.find(Issue.generate!(:parent_issue_id => 1).id)
192 issue.parent_issue_id = "2"
193 issue.expects(:update_nested_set_attributes_on_parent_change).once
194 issue.save!
195 end
196
197 def test_moving_a_child_issue_to_root_should_trigger_update_nested_set_attributes_on_parent_change
198 issue = Issue.find(Issue.generate!(:parent_issue_id => 1).id)
199 issue.parent_issue_id = ""
200 issue.expects(:update_nested_set_attributes_on_parent_change).once
201 issue.save!
202 end
203
169 def test_destroy_should_destroy_children
204 def test_destroy_should_destroy_children
170 issue1 = Issue.generate!
205 issue1 = Issue.generate!
171 issue2 = Issue.generate!
206 issue2 = Issue.generate!
General Comments 0
You need to be logged in to leave comments. Login now