From ded234794e8576e9cfd3bb8b0288f0e6fbe3ca5d Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 2 Jan 2011 11:44:19 +0000 Subject: [PATCH] Merged r4615 and r4616 from trunk. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4617 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/projects_controller.rb | 4 ++-- app/models/project.rb | 7 ++++++- test/functional/projects_controller_test.rb | 2 +- test/unit/project_test.rb | 16 ++++++++++++++++ 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?