summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/models/issue.rb9
-rw-r--r--lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb8
-rw-r--r--test/functional/issues_controller_test.rb18
3 files changed, 32 insertions, 3 deletions
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 5bf845d84..b433da30b 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -302,16 +302,19 @@ class Issue < ActiveRecord::Base
# * or if the status was not part of the new tracker statuses
# * or the status was nil
def tracker=(tracker)
- if tracker != self.tracker
+ tracker_was = self.tracker
+ if tracker != tracker_was
if status == default_status
self.status = nil
elsif status && tracker && !tracker.issue_status_ids.include?(status.id)
self.status = nil
end
- @custom_field_values = nil
@workflow_rule_by_attribute = nil
end
association(:tracker).writer(tracker)
+ if tracker != tracker_was
+ reassign_custom_field_values
+ end
self.status ||= default_status
self.tracker
end
@@ -355,7 +358,7 @@ class Issue < ActiveRecord::Base
unless valid_parent_project?
self.parent_issue_id = nil
end
- @custom_field_values = nil
+ reassign_custom_field_values
@workflow_rule_by_attribute = nil
end
# Set fixed_version to the project default version if it's valid
diff --git a/lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb b/lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb
index 1cde646e9..050e442b4 100644
--- a/lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb
+++ b/lib/plugins/acts_as_customizable/lib/acts_as_customizable.rb
@@ -151,6 +151,14 @@ module Redmine
true
end
+ def reassign_custom_field_values
+ if @custom_field_values
+ values = @custom_field_values.inject({}) {|h,v| h[v.custom_field_id] = v.value; h}
+ @custom_field_values = nil
+ self.custom_field_values = values
+ end
+ end
+
def reset_custom_values!
@custom_field_values = nil
@custom_field_values_changed = true
diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb
index 3021d0f42..38125feee 100644
--- a/test/functional/issues_controller_test.rb
+++ b/test/functional/issues_controller_test.rb
@@ -3001,6 +3001,24 @@ class IssuesControllerTest < ActionController::TestCase
assert_equal issue.descendants.map(&:subject).sort, copy.descendants.map(&:subject).sort
end
+ def test_create_as_copy_to_a_different_project_should_copy_subtask_custom_fields
+ issue = Issue.generate! {|i| i.custom_field_values = {'2' => 'Foo'}}
+ child = Issue.generate!(:parent_issue_id => issue.id) {|i| i.custom_field_values = {'2' => 'Bar'}}
+ @request.session[:user_id] = 1
+
+ assert_difference 'Issue.count', 2 do
+ post :create, :project_id => 'ecookbook', :copy_from => issue.id,
+ :issue => {:project_id => '2', :tracker_id => 1, :status_id => '1',
+ :subject => 'Copy with subtasks', :custom_field_values => {'2' => 'Foo'}},
+ :copy_subtasks => '1'
+ end
+
+ child_copy, issue_copy = Issue.order(:id => :desc).limit(2).to_a
+ assert_equal 2, issue_copy.project_id
+ assert_equal 'Foo', issue_copy.custom_field_value(2)
+ assert_equal 'Bar', child_copy.custom_field_value(2)
+ end
+
def test_create_as_copy_without_copy_subtasks_option_should_not_copy_subtasks
@request.session[:user_id] = 2
issue = Issue.generate_with_descendants!