]> source.dussan.org Git - redmine.git/commitdiff
Project copy does not update custom field of version type values (#20361).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 20 Sep 2015 12:50:06 +0000 (12:50 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 20 Sep 2015 12:50:06 +0000 (12:50 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@14615 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/project.rb
test/unit/project_copy_test.rb

index 2138773cfabec71af424e4dceade92432a152cd9..8cd2bf993dd1874dc23c57a27e823972999708e5 100644 (file)
@@ -899,6 +899,22 @@ class Project < ActiveRecord::Base
       if issue.fixed_version && issue.fixed_version.project == project
         new_issue.fixed_version = self.versions.detect {|v| v.name == issue.fixed_version.name}
       end
+      # Reassign version custom field values
+      new_issue.custom_field_values.each do |custom_value|
+        if custom_value.custom_field.field_format == 'version' && custom_value.value.present?
+          versions = Version.where(:id => custom_value.value).to_a
+          new_value = versions.map do |version|
+            if version.project == project
+              self.versions.detect {|v| v.name == version.name}.try(:id)
+            else
+              version.id
+            end
+          end
+          new_value.compact!
+          new_value = new_value.first unless custom_value.custom_field.multiple?
+          custom_value.value = new_value
+        end
+      end
       # Reassign the category by name, since names are unique per project
       if issue.category
         new_issue.category = self.issue_categories.detect {|c| c.name == issue.category.name}
index d375d8fbcdfcabd65db7a90ab2da467b0d6aa013..537e39385d0d8b758708468a0926e40d9b2478be 100644 (file)
@@ -139,6 +139,27 @@ class ProjectCopyTest < ActiveSupport::TestCase
     assert_equal assigned_version, copied_issue.fixed_version
   end
 
+  def test_copy_issues_should_reassign_version_custom_fields_to_copied_versions
+    User.current = User.find(1)
+    CustomField.delete_all
+    field = IssueCustomField.generate!(:field_format => 'version', :is_for_all => true, :trackers => Tracker.all)
+    source_project = Project.generate!(:trackers => Tracker.all)
+    source_version = Version.generate!(:project => source_project)
+    source_issue = Issue.generate!(:project => source_project) do |issue|
+      issue.custom_field_values = {field.id.to_s => source_version.id.to_s}
+    end
+    assert_equal source_version.id.to_s, source_issue.custom_field_value(field)
+
+    project = Project.new(:name => 'Copy Test', :identifier => 'copy-test', :trackers => Tracker.all)
+    assert project.copy(source_project)
+    assert_equal 1, project.issues.count
+    issue = project.issues.first
+    assert_equal 1, project.versions.count
+    version = project.versions.first
+
+    assert_equal version.id.to_s, issue.custom_field_value(field)
+  end
+
   test "#copy should copy issue relations" do
     Setting.cross_project_issue_relations = '1'