diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2012-10-10 17:38:17 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2012-10-10 17:38:17 +0000 |
commit | 83bcc1f043511d85414ca3cafc1e10dc84b9da24 (patch) | |
tree | ad4f5fb681005732796c43266467c2e59228db79 /app/models | |
parent | b0013d9f68a0ce4347f568b7f8809ea8ef9f1d8b (diff) | |
download | redmine-83bcc1f043511d85414ca3cafc1e10dc84b9da24.tar.gz redmine-83bcc1f043511d85414ca3cafc1e10dc84b9da24.zip |
Adds a setting to allow subtasks to belong to other projects (#5487).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10587 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/issue.rb | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/app/models/issue.rb b/app/models/issue.rb index 37a19a9c4..520d2c3dc 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -285,7 +285,8 @@ class Issue < ActiveRecord::Base if fixed_version && fixed_version.project != project && !project.shared_versions.include?(fixed_version) self.fixed_version = nil end - if parent && parent.project_id != project_id + # Clear the parent task if it's no longer valid + unless valid_parent_project? self.parent_issue_id = nil end @custom_field_values = nil @@ -550,8 +551,8 @@ class Issue < ActiveRecord::Base # Checks parent issue assignment if @parent_issue - if @parent_issue.project_id != project_id - errors.add :parent_issue_id, :not_same_project + if !valid_parent_project?(@parent_issue) + errors.add :parent_issue_id, :invalid elsif !new_record? # moving an existing issue if @parent_issue.root_id != root_id @@ -559,7 +560,7 @@ class Issue < ActiveRecord::Base elsif move_possible?(@parent_issue) # move accepted inside tree else - errors.add :parent_issue_id, :not_a_valid_parent + errors.add :parent_issue_id, :invalid end end end @@ -963,6 +964,25 @@ class Issue < ActiveRecord::Base end end + # Returns true if issue's project is a valid + # parent issue project + def valid_parent_project?(issue=parent) + return true if issue.nil? || issue.project_id == project_id + + case Setting.cross_project_subtasks + when 'system' + true + when 'tree' + issue.project.root == project.root + when 'hierarchy' + issue.project.is_or_is_ancestor_of?(project) || issue.project.is_descendant_of?(project) + when 'descendants' + issue.project.is_or_is_ancestor_of?(project) + else + false + end + end + # Extracted from the ReportsController. def self.by_tracker(project) count_and_group_by(:project => project, @@ -1042,8 +1062,9 @@ class Issue < ActiveRecord::Base relations_to.clear end - # Move subtasks + # Move subtasks that were in the same project children.each do |child| + next unless child.project_id == project_id_was # Change project and keep project child.send :project=, project, true unless child.save |