Defect #11508 » NestedSetFix.patch
app/models/project.rb Mon Jul 30 01:32:31 2012 +0000 → app/models/project.rb Tue Jul 31 00:42:18 2012 -0400 | ||
---|---|---|
367 | 367 |
end |
368 | 368 |
set_parent!(p) |
369 | 369 |
end |
370 |
|
|
371 |
def nested_set_rebuild(p) |
|
372 |
sibs = (p.nil? ? self.class.roots : p.children) |
|
373 |
to_be_inserted_before = sibs.detect {|c| c.name.to_s.downcase > name.to_s.downcase } |
|
374 |
if to_be_inserted_before |
|
375 |
move_to_left_of(to_be_inserted_before) |
|
376 |
elsif p.nil? |
|
377 |
if sibs.empty? |
|
378 |
# move_to_root adds the project in first (ie. left) position |
|
379 |
move_to_root |
|
380 |
else |
|
381 |
move_to_right_of(sibs.last) unless self == sibs.last |
|
382 |
end |
|
383 |
else |
|
384 |
# move_to_child_of adds the project in last (ie.right) position |
|
385 |
move_to_child_of(p) |
|
386 |
end |
|
387 |
Issue.update_versions_from_hierarchy_change(self) |
|
388 |
end |
|
370 | 389 |
|
371 | 390 |
# Sets the parent of the project |
372 | 391 |
# Argument can be either a Project, a String, a Fixnum or nil |
... | ... | |
384 | 403 |
true |
385 | 404 |
elsif p.nil? || (p.active? && move_possible?(p)) |
386 | 405 |
# Insert the project so that target's children or root projects stay alphabetically sorted |
387 |
sibs = (p.nil? ? self.class.roots : p.children) |
|
388 |
to_be_inserted_before = sibs.detect {|c| c.name.to_s.downcase > name.to_s.downcase } |
|
389 |
if to_be_inserted_before |
|
390 |
move_to_left_of(to_be_inserted_before) |
|
391 |
elsif p.nil? |
|
392 |
if sibs.empty? |
|
393 |
# move_to_root adds the project in first (ie. left) position |
|
394 |
move_to_root |
|
395 |
else |
|
396 |
move_to_right_of(sibs.last) unless self == sibs.last |
|
397 |
end |
|
398 |
else |
|
399 |
# move_to_child_of adds the project in last (ie.right) position |
|
400 |
move_to_child_of(p) |
|
401 |
end |
|
402 |
Issue.update_versions_from_hierarchy_change(self) |
|
406 |
nested_set_rebuild(p) |
|
403 | 407 |
true |
404 | 408 |
else |
405 | 409 |
# Can not move to the given target |
... | ... | |
660 | 664 |
p = Project.find(:first, :order => 'created_on DESC') |
661 | 665 |
p.nil? ? nil : p.identifier.to_s.succ |
662 | 666 |
end |
667 |
|
|
668 |
def save |
|
669 |
changed = name_changed? |
|
670 |
ret_val = super |
|
671 |
if changed |
|
672 |
nested_set_rebuild(parent) |
|
673 |
end |
|
674 |
ret_val |
|
675 |
end |
|
663 | 676 |
|
664 | 677 |
# Copies and saves the Project instance based on the +project+. |
665 | 678 |
# Duplicates the source project's: |
test/unit/project_test.rb Mon Jul 30 01:32:31 2012 +0000 → test/unit/project_test.rb Tue Jul 31 00:42:18 2012 -0400 | ||
---|---|---|
300 | 300 |
assert_equal 4, parent.children.size |
301 | 301 |
assert_equal parent.children.all.sort_by(&:name), parent.children.all |
302 | 302 |
end |
303 |
|
|
304 |
# See issue #11508, updating a project does not reorder sibilings alphabetically. |
|
305 |
def test_rebuild_should_sort_children_alphabetically_on_update |
|
306 |
ProjectCustomField.delete_all |
|
307 |
|
|
308 |
# Create 4 projects under a parent project. |
|
309 |
parent = Project.create!(:name => 'Parent', :identifier => 'parent') |
|
310 |
Project.create!(:name => 'Project C', :identifier => 'project-c').move_to_child_of(parent) |
|
311 |
Project.create!(:name => 'Project B', :identifier => 'project-b').move_to_child_of(parent) |
|
312 |
Project.create!(:name => 'Project D', :identifier => 'project-d').move_to_child_of(parent) |
|
313 |
renamed_project = Project.create!(:name => 'Project A', :identifier => 'project-a').move_to_child_of(parent) |
|
303 | 314 |
|
315 |
# Rebuild them all. |
|
316 |
Project.update_all("lft = NULL, rgt = NULL") |
|
317 |
Project.rebuild! |
|
304 | 318 |
|
319 |
# Confirm that everything is as expected. |
|
320 |
all_projects = Project.find(:all, :order => 'lft') |
|
321 |
assert_equal 'Project D', all_projects.last.name |
|
322 |
|
|
323 |
# Load and modify project-a, which causes defect #11508 |
|
324 |
project = Project.find_by_id(renamed_project.id) |
|
325 |
project.name = 'Project E' |
|
326 |
assert_equal true, project.save |
|
327 |
|
|
328 |
# Reload all projects and verify that "Project E" is last. |
|
329 |
all_projects = Project.find(:all, :order => 'lft') |
|
330 |
assert_equal 'Project E', all_projects.last.name |
|
331 |
end |
|
332 |
|
|
333 |
|
|
305 | 334 |
def test_set_parent_should_update_issue_fixed_version_associations_when_a_fixed_version_is_moved_out_of_the_hierarchy |
306 | 335 |
# Parent issue with a hierarchy project's fixed version |
307 | 336 |
parent_issue = Issue.find(1) |