]> source.dussan.org Git - redmine.git/commitdiff
Versions that are not shared should not be assignable when selecting another project...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 27 Jul 2012 19:36:53 +0000 (19:36 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 27 Jul 2012 19:36:53 +0000 (19:36 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10086 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/issue.rb
test/unit/issue_test.rb

index a06378a5bac947c6e16b9c9e42ab6e9292d10a0e..e4de32b5363952e910b1f000b2ca2eaa5c6ce6ac 100644 (file)
@@ -148,6 +148,7 @@ class Issue < ActiveRecord::Base
 
   def reload(*args)
     @workflow_rule_by_attribute = nil
+    @assignable_versions = nil
     super
   end
 
@@ -252,6 +253,8 @@ class Issue < ActiveRecord::Base
     write_attribute(:project_id, project ? project.id : nil)
     association_instance_set('project', project)
     if project_was && project && project_was != project
+      @assignable_versions = nil
+
       unless keep_tracker || project.trackers.include?(tracker)
         self.tracker = project.trackers.first
       end
@@ -639,7 +642,21 @@ class Issue < ActiveRecord::Base
 
   # Versions that the issue can be assigned to
   def assignable_versions
-    @assignable_versions ||= (project.shared_versions.open + [Version.find_by_id(fixed_version_id_was)]).compact.uniq.sort
+    return @assignable_versions if @assignable_versions
+
+    versions = project.shared_versions.open.all
+    if fixed_version
+      if fixed_version_id_changed?
+        # nothing to do
+      elsif project_id_changed?
+        if project.shared_versions.include?(fixed_version)
+          versions << fixed_version
+        end
+      else
+        versions << fixed_version
+      end
+    end
+    @assignable_versions = versions.uniq.sort
   end
 
   # Returns true if this issue is blocked by another issue that is still open
index a89b2b31594daa05796027405e88de524fdcbe89..97d0a4829b616d242c6d57077f6abc2dc5621e92 100644 (file)
@@ -760,6 +760,26 @@ class IssueTest < ActiveSupport::TestCase
     assert issue.save
   end
 
+  def test_should_not_be_able_to_keep_unshared_version_when_changing_project
+    issue = Issue.find(2)
+    assert_equal 2, issue.fixed_version_id
+    issue.project_id = 3
+    assert_nil issue.fixed_version_id
+    issue.fixed_version_id = 2
+    assert !issue.save
+    assert_include 'Target version is not included in the list', issue.errors.full_messages
+  end
+
+  def test_should_keep_shared_version_when_changing_project
+    Version.find(2).update_attribute :sharing, 'tree'
+    issue = Issue.find(2)
+    assert_equal 2, issue.fixed_version_id
+    issue.project_id = 3
+    assert_equal 2, issue.fixed_version_id
+    assert issue.save
+  end
+
   def test_allowed_target_projects_on_move_should_include_projects_with_issue_tracking_enabled
     assert_include Project.find(2), Issue.allowed_target_projects_on_move(User.find(2))
   end