]> source.dussan.org Git - redmine.git/commitdiff
When copying issues, let the status be changed to default or left unchanged.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 14 Apr 2012 05:45:16 +0000 (05:45 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 14 Apr 2012 05:45:16 +0000 (05:45 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@9404 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/issues_controller.rb
app/models/issue.rb
test/functional/issues_controller_test.rb
test/unit/issue_test.rb

index dfec893d6f66af3308e4abaf3adea608a9a6f59c..84ff8fd236e5bc2b28d420e496735c53d38fe5ce 100644 (file)
@@ -225,7 +225,11 @@ class IssuesController < ApplicationController
     end
     target_projects ||= @projects
 
-    @available_statuses = @issues.map(&:new_statuses_allowed_to).reduce(:&)
+    if @copy
+      @available_statuses = [IssueStatus.default]
+    else
+      @available_statuses = @issues.map(&:new_statuses_allowed_to).reduce(:&)
+    end
     @custom_fields = target_projects.map{|p|p.all_issue_custom_fields}.reduce(:&)
     @assignables = target_projects.map(&:assignable_users).reduce(:&)
     @trackers = target_projects.map(&:trackers).reduce(:&)
index ec8c45d34f024982408c51f86183cd2bbc5a218a..8ebc20fc00dd29ba83b7966957d721b8b88a31b0 100644 (file)
@@ -511,24 +511,28 @@ class Issue < ActiveRecord::Base
 
   # Returns an array of statuses that user is able to apply
   def new_statuses_allowed_to(user=User.current, include_default=false)
-    initial_status = nil
-    if new_record?
-      initial_status = IssueStatus.default
-    elsif status_id_was
-      initial_status = IssueStatus.find_by_id(status_id_was)
+    if new_record? && @copied_from
+      [IssueStatus.default, @copied_from.status].compact.uniq.sort
+    else
+      initial_status = nil
+      if new_record?
+        initial_status = IssueStatus.default
+      elsif status_id_was
+        initial_status = IssueStatus.find_by_id(status_id_was)
+      end
+      initial_status ||= status
+  
+      statuses = initial_status.find_new_statuses_allowed_to(
+        user.admin ? Role.all : user.roles_for_project(project),
+        tracker,
+        author == user,
+        assigned_to_id_changed? ? assigned_to_id_was == user.id : assigned_to_id == user.id
+        )
+      statuses << initial_status unless statuses.empty?
+      statuses << IssueStatus.default if include_default
+      statuses = statuses.compact.uniq.sort
+      blocked? ? statuses.reject {|s| s.is_closed?} : statuses
     end
-    initial_status ||= status
-
-    statuses = initial_status.find_new_statuses_allowed_to(
-      user.admin ? Role.all : user.roles_for_project(project),
-      tracker,
-      author == user,
-      assigned_to_id_changed? ? assigned_to_id_was == user.id : assigned_to_id == user.id
-      )
-    statuses << initial_status unless statuses.empty?
-    statuses << IssueStatus.default if include_default
-    statuses = statuses.compact.uniq.sort
-    blocked? ? statuses.reject {|s| s.is_closed?} : statuses
   end
 
   def assigned_to_was
index 484880cc70228953a6ad133e34cb3dafa56ac901..1b0224dfbfef7f15e8540ba15ba86af1c85fe6ba 100644 (file)
@@ -3065,24 +3065,38 @@ class IssuesControllerTest < ActionController::TestCase
       end
     end
     assert_redirected_to '/projects/ecookbook/issues'
+
+    copies = Issue.all(:order => 'id DESC', :limit => issues.size)
+    copies.each do |copy|
+      assert_equal 2, copy.project_id
+    end
   end
 
   def test_bulk_copy_should_allow_not_changing_the_issue_attributes
     @request.session[:user_id] = 2
-    issue_before_move = Issue.find(1)
-    assert_difference 'Issue.count', 1 do
-      assert_no_difference 'Project.find(1).issues.count' do
-        post :bulk_update, :ids => [1], :copy => '1', 
-             :issue => {
-               :project_id => '2', :tracker_id => '', :assigned_to_id => '',
-               :status_id => '', :start_date => '', :due_date => ''
-             }
-      end
+    issues = [
+      Issue.create!(:project_id => 1, :tracker_id => 1, :status_id => 1, :priority_id => 2, :subject => 'issue 1', :author_id => 1, :assigned_to_id => nil),
+      Issue.create!(:project_id => 2, :tracker_id => 3, :status_id => 2, :priority_id => 1, :subject => 'issue 2', :author_id => 2, :assigned_to_id => 3)
+    ]
+
+    assert_difference 'Issue.count', issues.size do
+      post :bulk_update, :ids => issues.map(&:id), :copy => '1', 
+           :issue => {
+             :project_id => '', :tracker_id => '', :assigned_to_id => '',
+             :status_id => '', :start_date => '', :due_date => ''
+           }
+    end
+
+    copies = Issue.all(:order => 'id DESC', :limit => issues.size)
+    issues.each do |orig|
+      copy = copies.detect {|c| c.subject == orig.subject}
+      assert_not_nil copy
+      assert_equal orig.project_id, copy.project_id
+      assert_equal orig.tracker_id, copy.tracker_id
+      assert_equal orig.status_id, copy.status_id
+      assert_equal orig.assigned_to_id, copy.assigned_to_id
+      assert_equal orig.priority_id, copy.priority_id
     end
-    issue_after_move = Issue.first(:order => 'id desc', :conditions => {:project_id => 2})
-    assert_equal issue_before_move.tracker_id, issue_after_move.tracker_id
-    assert_equal issue_before_move.status_id, issue_after_move.status_id
-    assert_equal issue_before_move.assigned_to_id, issue_after_move.assigned_to_id
   end
 
  def test_bulk_copy_should_allow_changing_the_issue_attributes
@@ -3097,7 +3111,7 @@ class IssuesControllerTest < ActionController::TestCase
         post :bulk_update, :ids => [1, 2], :copy => '1', 
              :issue => {
                :project_id => '2', :tracker_id => '', :assigned_to_id => '4',
-               :status_id => '3', :start_date => '2009-12-01', :due_date => '2009-12-31'
+               :status_id => '1', :start_date => '2009-12-01', :due_date => '2009-12-31'
              }
       end
     end
@@ -3107,7 +3121,7 @@ class IssuesControllerTest < ActionController::TestCase
     copied_issues.each do |issue|
       assert_equal 2, issue.project_id, "Project is incorrect"
       assert_equal 4, issue.assigned_to_id, "Assigned to is incorrect"
-      assert_equal 3, issue.status_id, "Status is incorrect"
+      assert_equal 1, issue.status_id, "Status is incorrect"
       assert_equal '2009-12-01', issue.start_date.to_s, "Start date is incorrect"
       assert_equal '2009-12-31', issue.due_date.to_s, "Due date is incorrect"
     end
index ddebbee193a600df20efa39a317b2ec90e338d5a..b55b3d065419fd9821157da50e51195011dd95f2 100644 (file)
@@ -395,6 +395,14 @@ class IssueTest < ActiveSupport::TestCase
     assert_equal expected_statuses, issue.new_statuses_allowed_to(admin)
   end
 
+  def test_new_statuses_allowed_to_should_return_default_and_current_status_when_copying
+    issue = Issue.find(1).copy
+    assert_equal [1], issue.new_statuses_allowed_to(User.find(2)).map(&:id)
+
+    issue = Issue.find(2).copy
+    assert_equal [1, 2], issue.new_statuses_allowed_to(User.find(2)).map(&:id)
+  end
+
   def test_copy
     issue = Issue.new.copy_from(1)
     assert issue.copy?