diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2013-10-20 09:25:14 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2013-10-20 09:25:14 +0000 |
commit | 99bf8c95aba29aa2cde30ba8ff39d4d8a37ae9e5 (patch) | |
tree | 34693f101f7d9b58f02392972e59fd3255b89213 /app/models/issue.rb | |
parent | 13e381d31de0055905bd95813fc8034582b2dedc (diff) | |
download | redmine-99bf8c95aba29aa2cde30ba8ff39d4d8a37ae9e5.tar.gz redmine-99bf8c95aba29aa2cde30ba8ff39d4d8a37ae9e5.zip |
Fixed that issue nested set update is triggered even if parent is not changed (#15135).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@12226 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models/issue.rb')
-rw-r--r-- | app/models/issue.rb | 65 |
1 files changed, 37 insertions, 28 deletions
diff --git a/app/models/issue.rb b/app/models/issue.rb index fc25e6620..68381f65f 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -1105,6 +1105,10 @@ class Issue < ActiveRecord::Base s = arg.to_s.strip.presence if s && (m = s.match(%r{\A#?(\d+)\z})) && (@parent_issue = Issue.find_by_id(m[1])) @parent_issue.id + @invalid_parent_issue_id = nil + elsif s.blank? + @parent_issue = nil + @invalid_parent_issue_id = nil else @parent_issue = nil @invalid_parent_issue_id = arg @@ -1280,38 +1284,43 @@ class Issue < ActiveRecord::Base move_to_child_of(@parent_issue) end elsif parent_issue_id != parent_id - former_parent_id = parent_id - # moving an existing issue - if @parent_issue && @parent_issue.root_id == root_id - # inside the same tree + update_nested_set_attributes_on_parent_change + end + remove_instance_variable(:@parent_issue) if instance_variable_defined?(:@parent_issue) + end + + # Updates the nested set for when an existing issue is moved + def update_nested_set_attributes_on_parent_change + former_parent_id = parent_id + # moving an existing issue + if @parent_issue && @parent_issue.root_id == root_id + # inside the same tree + move_to_child_of(@parent_issue) + else + # to another tree + unless root? + move_to_right_of(root) + end + old_root_id = root_id + self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id ) + target_maxright = nested_set_scope.maximum(right_column_name) || 0 + offset = target_maxright + 1 - lft + Issue.update_all(["root_id = ?, lft = lft + ?, rgt = rgt + ?", root_id, offset, offset], + ["root_id = ? AND lft >= ? AND rgt <= ? ", old_root_id, lft, rgt]) + self[left_column_name] = lft + offset + self[right_column_name] = rgt + offset + if @parent_issue move_to_child_of(@parent_issue) - else - # to another tree - unless root? - move_to_right_of(root) - end - old_root_id = root_id - self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id ) - target_maxright = nested_set_scope.maximum(right_column_name) || 0 - offset = target_maxright + 1 - lft - Issue.update_all(["root_id = ?, lft = lft + ?, rgt = rgt + ?", root_id, offset, offset], - ["root_id = ? AND lft >= ? AND rgt <= ? ", old_root_id, lft, rgt]) - self[left_column_name] = lft + offset - self[right_column_name] = rgt + offset - if @parent_issue - move_to_child_of(@parent_issue) - end end - # delete invalid relations of all descendants - self_and_descendants.each do |issue| - issue.relations.each do |relation| - relation.destroy unless relation.valid? - end + end + # delete invalid relations of all descendants + self_and_descendants.each do |issue| + issue.relations.each do |relation| + relation.destroy unless relation.valid? end - # update former parent - recalculate_attributes_for(former_parent_id) if former_parent_id end - remove_instance_variable(:@parent_issue) if instance_variable_defined?(:@parent_issue) + # update former parent + recalculate_attributes_for(former_parent_id) if former_parent_id end def update_parent_attributes |