Defect #11508 » AwesomeNestedSetOrderUpdatePatch.patch
app/models/project.rb Thu Aug 02 17:37:03 2012 +0000 → app/models/project.rb Sat Aug 04 21:18:46 2012 -0400 | ||
---|---|---|
58 | 58 |
:join_table => "#{table_name_prefix}custom_fields_projects#{table_name_suffix}", |
59 | 59 |
:association_foreign_key => 'custom_field_id' |
60 | 60 |
|
61 |
acts_as_nested_set :order => 'name', :dependent => :destroy |
|
61 |
acts_as_nested_set :order => 'name', :compare_method => lambda { |a,b| a.to_s.downcase > b.to_s.downcase }, :dependent => :destroy
|
|
62 | 62 |
acts_as_attachable :view_permission => :view_files, |
63 | 63 |
:delete_permission => :manage_files |
64 | 64 |
|
... | ... | |
367 | 367 |
end |
368 | 368 |
set_parent!(p) |
369 | 369 |
end |
370 |
|
|
371 |
def nested_set_rebuild(parent_node) |
|
372 |
update_node_order(parent_node) |
|
373 |
Issue.update_versions_from_hierarchy_change(self) |
|
374 |
end |
|
370 | 375 |
|
371 | 376 |
# Sets the parent of the project |
372 | 377 |
# Argument can be either a Project, a String, a Fixnum or nil |
... | ... | |
383 | 388 |
# Nothing to do |
384 | 389 |
true |
385 | 390 |
elsif p.nil? || (p.active? && move_possible?(p)) |
386 |
# 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) |
|
391 |
nested_set_rebuild(p) |
|
403 | 392 |
true |
404 | 393 |
else |
405 | 394 |
# Can not move to the given target |
... | ... | |
407 | 396 |
end |
408 | 397 |
end |
409 | 398 |
|
399 |
def save |
|
400 |
changed = name_changed? |
|
401 |
ret_val = super |
|
402 |
if changed |
|
403 |
nested_set_rebuild(parent) |
|
404 |
end |
|
405 |
ret_val |
|
406 |
end |
|
407 |
|
|
410 | 408 |
# Returns an array of the trackers used by the project and its active sub projects |
411 | 409 |
def rolled_up_trackers |
412 | 410 |
@rolled_up_trackers ||= |
lib/plugins/awesome_nested_set/lib/awesome_nested_set/awesome_nested_set.rb Thu Aug 02 17:37:03 2012 +0000 → lib/plugins/awesome_nested_set/lib/awesome_nested_set/awesome_nested_set.rb Sat Aug 04 21:18:46 2012 -0400 | ||
---|---|---|
380 | 380 |
end.join("\n") |
381 | 381 |
end |
382 | 382 |
|
383 |
def update_node_order(parent_node) |
|
384 |
order = acts_as_nested_set_options[:order] |
|
385 |
method = acts_as_nested_set_options[:compare_method] |
|
386 |
sibs = (parent_node.nil? ? self.class.roots : parent_node.children) |
|
387 |
to_be_inserted_before = sibs.detect {|c| |
|
388 |
a = c.read_attribute("#{order}") |
|
389 |
b = read_attribute("#{order}") |
|
390 |
if method.nil? |
|
391 |
a > b |
|
392 |
else |
|
393 |
method.call(a,b) |
|
394 |
end |
|
395 |
} |
|
396 |
if to_be_inserted_before |
|
397 |
move_to_left_of(to_be_inserted_before) |
|
398 |
elsif parent_node.nil? |
|
399 |
if sibs.empty? |
|
400 |
# move_to_root adds the node in first (ie. left) position |
|
401 |
move_to_root |
|
402 |
else |
|
403 |
move_to_right_of(sibs.last) unless self == sibs.last |
|
404 |
end |
|
405 |
else |
|
406 |
# move_to_child_of adds the node in last (ie.right) position |
|
407 |
move_to_child_of(parent_node) |
|
408 |
end |
|
409 |
end |
|
410 |
|
|
383 | 411 |
protected |
384 | 412 |
|
385 | 413 |
def without_self(scope) |
test/unit/project_test.rb Thu Aug 02 17:37:03 2012 +0000 → test/unit/project_test.rb Sat Aug 04 21:18:46 2012 -0400 | ||
---|---|---|
775 | 775 |
assert !project.activities.include?(system_activity), "System activity found when the project has an inactive override" |
776 | 776 |
end |
777 | 777 |
|
778 |
# See issue #11508, updating a project does not reorder sibilings alphabetically. |
|
779 |
def test_rebuild_should_sort_children_alphabetically_on_update |
|
780 |
ProjectCustomField.delete_all |
|
781 |
|
|
782 |
# Create 4 projects under a parent project. |
|
783 |
parent = Project.create!(:name => 'Parent', :identifier => 'parent') |
|
784 |
Project.create!(:name => 'Project C', :identifier => 'project-c').move_to_child_of(parent) |
|
785 |
Project.create!(:name => 'Project B', :identifier => 'project-b').move_to_child_of(parent) |
|
786 |
Project.create!(:name => 'Project D', :identifier => 'project-d').move_to_child_of(parent) |
|
787 |
renamed_project = Project.create!(:name => 'Project A', :identifier => 'project-a').move_to_child_of(parent) |
|
788 |
|
|
789 |
# Rebuild them all. |
|
790 |
Project.update_all("lft = NULL, rgt = NULL") |
|
791 |
Project.rebuild! |
|
792 |
|
|
793 |
# Confirm that everything is as expected. |
|
794 |
all_projects = Project.find(:all, :order => 'lft') |
|
795 |
assert_equal 'Project D', all_projects.last.name |
|
796 |
|
|
797 |
# Load and modify project-a, which causes defect #11508 |
|
798 |
project = Project.find_by_id(renamed_project.id) |
|
799 |
project.name = 'Project E' |
|
800 |
assert_equal true, project.save |
|
801 |
|
|
802 |
# Reload all projects and verify that "Project E" is last. |
|
803 |
all_projects = Project.find(:all, :order => 'lft') |
|
804 |
assert_equal 'Project E', all_projects.last.name |
|
805 |
end |
|
806 |
|
|
778 | 807 |
def test_close_completed_versions |
779 | 808 |
Version.update_all("status = 'open'") |
780 | 809 |
project = Project.find(1) |
- « Previous
- 1
- …
- 3
- 4
- 5
- Next »