summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/controllers/projects_controller.rb4
-rw-r--r--app/models/project.rb7
-rw-r--r--test/functional/projects_controller_test.rb2
-rw-r--r--test/unit/project_test.rb16
4 files changed, 25 insertions, 4 deletions
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 2547d6166..420801c01 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -124,13 +124,13 @@ class ProjectsController < ApplicationController
if validate_parent_id && @project.copy(@source_project, :only => params[:only])
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
flash[:notice] = l(:notice_successful_create)
- redirect_to :controller => 'projects', :action => 'settings'
+ redirect_to :controller => 'projects', :action => 'settings', :id => @project
elsif !@project.new_record?
# Project was created
# But some objects were not copied due to validation failures
# (eg. issues from disabled trackers)
# TODO: inform about that
- redirect_to :controller => 'projects', :action => 'settings'
+ redirect_to :controller => 'projects', :action => 'settings', :id => @project
end
end
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 4af77d1d9..891db8b8c 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -740,7 +740,12 @@ class Project < ActiveRecord::Base
# Copies members from +project+
def copy_members(project)
- project.memberships.each do |member|
+ # Copy users first, then groups to handle members with inherited and given roles
+ members_to_copy = []
+ members_to_copy += project.memberships.select {|m| m.principal.is_a?(User)}
+ members_to_copy += project.memberships.select {|m| !m.principal.is_a?(User)}
+
+ members_to_copy.each do |member|
new_member = Member.new
new_member.attributes = member.attributes.dup.except("id", "project_id", "created_on")
# only copy non inherited roles
diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb
index 1e0aaaaa3..aaf6e3085 100644
--- a/test/functional/projects_controller_test.rb
+++ b/test/functional/projects_controller_test.rb
@@ -429,7 +429,7 @@ class ProjectsControllerTest < ActionController::TestCase
@request.session[:user_id] = 1 # admin
post :copy, :id => 1, :project => {:name => 'Copy', :identifier => 'unique-copy'}
assert_response :redirect
- assert_redirected_to :controller => 'projects', :action => 'settings'
+ assert_redirected_to :controller => 'projects', :action => 'settings', :id => 'unique-copy'
end
end
diff --git a/test/unit/project_test.rb b/test/unit/project_test.rb
index 61ae3be32..8eb79fdaa 100644
--- a/test/unit/project_test.rb
+++ b/test/unit/project_test.rb
@@ -770,6 +770,22 @@ class ProjectTest < ActiveSupport::TestCase
assert_equal @project, membership.project
end
end
+
+ should "copy memberships with groups and additional roles" do
+ group = Group.create!(:lastname => "Copy group")
+ user = User.find(7)
+ group.users << user
+ # group role
+ Member.create!(:project_id => @source_project.id, :principal => group, :role_ids => [2])
+ member = Member.find_by_user_id_and_project_id(user.id, @source_project.id)
+ # additional role
+ member.role_ids = [1]
+
+ assert @project.copy(@source_project)
+ member = Member.find_by_user_id_and_project_id(user.id, @project.id)
+ assert_not_nil member
+ assert_equal [1, 2], member.role_ids.sort
+ end
should "copy project specific queries" do
assert @project.valid?