git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3986 e93f8b46-1217-0410-a6f0-8f06a7374b81pull/351/head
parent
ab5ce45b43
commit
fab5064643
@ -0,0 +1,94 @@ |
||||
class IssueMovesController < ApplicationController |
||||
default_search_scope :issues |
||||
before_filter :find_issues |
||||
before_filter :authorize |
||||
|
||||
def new |
||||
prepare_for_issue_move |
||||
render :layout => false if request.xhr? |
||||
end |
||||
|
||||
def create |
||||
prepare_for_issue_move |
||||
|
||||
if request.post? |
||||
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id]) |
||||
unsaved_issue_ids = [] |
||||
moved_issues = [] |
||||
@issues.each do |issue| |
||||
issue.reload |
||||
issue.init_journal(User.current) |
||||
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy }) |
||||
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)}) |
||||
moved_issues << r |
||||
else |
||||
unsaved_issue_ids << issue.id |
||||
end |
||||
end |
||||
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids) |
||||
|
||||
if params[:follow] |
||||
if @issues.size == 1 && moved_issues.size == 1 |
||||
redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first |
||||
else |
||||
redirect_to :controller => 'issues', :action => 'index', :project_id => (@target_project || @project) |
||||
end |
||||
else |
||||
redirect_to :controller => 'issues', :action => 'index', :project_id => @project |
||||
end |
||||
return |
||||
end |
||||
end |
||||
|
||||
private |
||||
|
||||
def prepare_for_issue_move |
||||
@issues.sort! |
||||
@copy = params[:copy_options] && params[:copy_options][:copy] |
||||
@allowed_projects = Issue.allowed_target_projects_on_move |
||||
@target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id] |
||||
@target_project ||= @project |
||||
@trackers = @target_project.trackers |
||||
@available_statuses = Workflow.available_statuses(@project) |
||||
end |
||||
|
||||
# Filter for bulk operations |
||||
# TODO: duplicated in IssuesController |
||||
def find_issues |
||||
@issues = Issue.find_all_by_id(params[:id] || params[:ids]) |
||||
raise ActiveRecord::RecordNotFound if @issues.empty? |
||||
projects = @issues.collect(&:project).compact.uniq |
||||
if projects.size == 1 |
||||
@project = projects.first |
||||
else |
||||
# TODO: let users bulk edit/move/destroy issues from different projects |
||||
render_error 'Can not bulk edit/move/destroy issues from different projects' |
||||
return false |
||||
end |
||||
rescue ActiveRecord::RecordNotFound |
||||
render_404 |
||||
end |
||||
|
||||
# TODO: duplicated in IssuesController |
||||
def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids) |
||||
if unsaved_issue_ids.empty? |
||||
flash[:notice] = l(:notice_successful_update) unless issues.empty? |
||||
else |
||||
flash[:error] = l(:notice_failed_to_save_issues, |
||||
:count => unsaved_issue_ids.size, |
||||
:total => issues.size, |
||||
:ids => '#' + unsaved_issue_ids.join(', #')) |
||||
end |
||||
end |
||||
|
||||
def extract_changed_attributes_for_move(params) |
||||
changed_attributes = {} |
||||
[:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute| |
||||
unless params[valid_attribute].blank? |
||||
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute]) |
||||
end |
||||
end |
||||
changed_attributes |
||||
end |
||||
|
||||
end |
@ -0,0 +1,2 @@ |
||||
module IssueMovesHelper |
||||
end |
@ -0,0 +1,99 @@ |
||||
require 'test_helper' |
||||
|
||||
class IssueMovesControllerTest < ActionController::TestCase |
||||
fixtures :all |
||||
|
||||
def setup |
||||
User.current = nil |
||||
end |
||||
|
||||
def test_create_one_issue_to_another_project |
||||
@request.session[:user_id] = 2 |
||||
post :create, :id => 1, :new_project_id => 2, :tracker_id => '', :assigned_to_id => '', :status_id => '', :start_date => '', :due_date => '' |
||||
assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' |
||||
assert_equal 2, Issue.find(1).project_id |
||||
end |
||||
|
||||
def test_create_one_issue_to_another_project_should_follow_when_needed |
||||
@request.session[:user_id] = 2 |
||||
post :create, :id => 1, :new_project_id => 2, :follow => '1' |
||||
assert_redirected_to '/issues/1' |
||||
end |
||||
|
||||
def test_bulk_create_to_another_project |
||||
@request.session[:user_id] = 2 |
||||
post :create, :ids => [1, 2], :new_project_id => 2 |
||||
assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' |
||||
# Issues moved to project 2 |
||||
assert_equal 2, Issue.find(1).project_id |
||||
assert_equal 2, Issue.find(2).project_id |
||||
# No tracker change |
||||
assert_equal 1, Issue.find(1).tracker_id |
||||
assert_equal 2, Issue.find(2).tracker_id |
||||
end |
||||
|
||||
def test_bulk_create_to_another_tracker |
||||
@request.session[:user_id] = 2 |
||||
post :create, :ids => [1, 2], :new_tracker_id => 2 |
||||
assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' |
||||
assert_equal 2, Issue.find(1).tracker_id |
||||
assert_equal 2, Issue.find(2).tracker_id |
||||
end |
||||
|
||||
def test_bulk_copy_to_another_project |
||||
@request.session[:user_id] = 2 |
||||
assert_difference 'Issue.count', 2 do |
||||
assert_no_difference 'Project.find(1).issues.count' do |
||||
post :create, :ids => [1, 2], :new_project_id => 2, :copy_options => {:copy => '1'} |
||||
end |
||||
end |
||||
assert_redirected_to 'projects/ecookbook/issues' |
||||
end |
||||
|
||||
context "#create via bulk copy" do |
||||
should "allow not changing the issue's attributes" do |
||||
@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 :create, :ids => [1], :new_project_id => 2, :copy_options => {:copy => '1'}, :new_tracker_id => '', :assigned_to_id => '', :status_id => '', :start_date => '', :due_date => '' |
||||
end |
||||
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 |
||||
|
||||
should "allow changing the issue's attributes" do |
||||
# Fixes random test failure with Mysql |
||||
# where Issue.all(:limit => 2, :order => 'id desc', :conditions => {:project_id => 2}) doesn't return the expected results |
||||
Issue.delete_all("project_id=2") |
||||
|
||||
@request.session[:user_id] = 2 |
||||
assert_difference 'Issue.count', 2 do |
||||
assert_no_difference 'Project.find(1).issues.count' do |
||||
post :create, :ids => [1, 2], :new_project_id => 2, :copy_options => {:copy => '1'}, :new_tracker_id => '', :assigned_to_id => 4, :status_id => 3, :start_date => '2009-12-01', :due_date => '2009-12-31' |
||||
end |
||||
end |
||||
|
||||
copied_issues = Issue.all(:limit => 2, :order => 'id desc', :conditions => {:project_id => 2}) |
||||
assert_equal 2, copied_issues.size |
||||
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 '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 |
||||
end |
||||
end |
||||
|
||||
def test_copy_to_another_project_should_follow_when_needed |
||||
@request.session[:user_id] = 2 |
||||
post :create, :ids => [1], :new_project_id => 2, :copy_options => {:copy => '1'}, :follow => '1' |
||||
issue = Issue.first(:order => 'id DESC') |
||||
assert_redirected_to :controller => 'issues', :action => 'show', :id => issue |
||||
end |
||||
|
||||
end |
@ -0,0 +1,4 @@ |
||||
require 'test_helper' |
||||
|
||||
class IssueMovesHelperTest < ActionView::TestCase |
||||
end |
Loading…
Reference in new issue