summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValery Sizov <vsv2711@gmail.com>2012-10-24 12:56:47 +0000
committerValery Sizov <vsv2711@gmail.com>2012-10-24 12:56:47 +0000
commit38175209c59a10e30d8444f5b90af507d168cc08 (patch)
tree6b12ffde4449bdfca128a92af0381c3ffd8ffbd9
parenta7efeb378135a9d2a263b4d14d24c462d4c8eb29 (diff)
parent6f4576b7436ff4573b28ab8305796e96bb2aed29 (diff)
downloadgitlab-ce-38175209c59a10e30d8444f5b90af507d168cc08.tar.gz
Merge branch 'feature/import_team_from_other_project' of dev.gitlabhq.com:gitlabhq
-rw-r--r--app/controllers/team_members_controller.rb8
-rw-r--r--app/models/users_project.rb29
-rw-r--r--app/views/team_members/import.html.haml17
-rw-r--r--app/views/team_members/index.html.haml9
-rw-r--r--config/routes.rb11
-rw-r--r--features/project/team_management.feature7
-rw-r--r--features/steps/project/project_team_management.rb20
-rw-r--r--spec/models/users_project_spec.rb33
8 files changed, 131 insertions, 3 deletions
diff --git a/app/controllers/team_members_controller.rb b/app/controllers/team_members_controller.rb
index d0b699f61d5..37ed74b231f 100644
--- a/app/controllers/team_members_controller.rb
+++ b/app/controllers/team_members_controller.rb
@@ -43,4 +43,12 @@ class TeamMembersController < ProjectResourceController
format.js { render nothing: true }
end
end
+
+ def apply_import
+ giver = Project.find(params[:source_project_id])
+ status = UsersProject.import_team(giver, project)
+ notice = status ? "Succesfully imported" : "Import failed"
+
+ redirect_to project_team_members_path(project), notice: notice
+ end
end
diff --git a/app/models/users_project.rb b/app/models/users_project.rb
index e336fac3735..967c78f22aa 100644
--- a/app/models/users_project.rb
+++ b/app/models/users_project.rb
@@ -21,6 +21,35 @@ class UsersProject < ActiveRecord::Base
delegate :name, :email, to: :user, prefix: true
class << self
+ def import_team(source_project, target_project)
+ UsersProject.without_repository_callback do
+ UsersProject.transaction do
+ team = source_project.users_projects.all
+
+ team.each do |tm|
+ # Skip if user already present in team
+ next if target_project.users.include?(tm.user)
+
+ new_tm = tm.dup
+ new_tm.id = nil
+ new_tm.project_id = target_project.id
+ new_tm.save
+ end
+ end
+ end
+
+ target_project.update_repository
+ true
+ rescue
+ false
+ end
+
+ def without_repository_callback
+ UsersProject.skip_callback(:destroy, :after, :update_repository)
+ yield
+ UsersProject.set_callback(:destroy, :after, :update_repository)
+ end
+
def bulk_delete(project, user_ids)
UsersProject.transaction do
UsersProject.where(:user_id => user_ids, :project_id => project.id).each do |users_project|
diff --git a/app/views/team_members/import.html.haml b/app/views/team_members/import.html.haml
new file mode 100644
index 00000000000..34f7fb03288
--- /dev/null
+++ b/app/views/team_members/import.html.haml
@@ -0,0 +1,17 @@
+= render "projects/project_head"
+
+%h3.page_title
+ = "Import team from another project"
+%hr
+%p.slead
+ Read more about team import #{link_to "here", '#', class: 'vlink'}.
+= form_tag apply_import_project_team_members_path(@project), method: 'post' do
+ %p.slead Choose project you want to use as team source:
+ .padded
+ = label_tag :source_project_id, "Project"
+ .input= select_tag(:source_project_id, options_from_collection_for_select(current_user.projects, :id, :name), prompt: "Select project", class: "chosen xxlarge", required: true)
+
+ .actions
+ = submit_tag 'Import', class: "btn save-btn"
+ = link_to "Cancel", project_team_index_path(@project), class: "btn cancel-btn"
+
diff --git a/app/views/team_members/index.html.haml b/app/views/team_members/index.html.haml
index b3b7b72a150..ca3edcf7ffb 100644
--- a/app/views/team_members/index.html.haml
+++ b/app/views/team_members/index.html.haml
@@ -5,9 +5,14 @@
- if can? current_user, :admin_team_member, @project
%p.slead
- = link_to new_project_team_member_path(@project), class: "btn small right", title: "New Team Member" do
- New Team Member
Read more about project permissions
%strong= link_to "here", help_permissions_path, class: "vlink"
+ %span.right
+ = link_to import_project_team_members_path(@project), class: "btn small grouped", title: "Import team from another project" do
+ Import team from another project
+ = link_to new_project_team_member_path(@project), class: "btn success small grouped", title: "New Team Member" do
+ New Team Member
+
+ .clearfix
= render partial: "team_members/team", locals: {project: @project}
diff --git a/config/routes.rb b/config/routes.rb
index de5261d2f06..adaf6a1e35e 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -188,7 +188,6 @@ Gitlab::Application.routes.draw do
:via => [:get, :post], constraints: {from: /.+/, to: /.+/}
resources :team, controller: 'team_members', only: [:index]
- resources :team_members
resources :milestones
resources :labels, only: [:index]
resources :issues do
@@ -199,6 +198,16 @@ Gitlab::Application.routes.draw do
end
end
+ resources :team_members do
+ collection do
+
+ # Used for import team
+ # from another project
+ get :import
+ post :apply_import
+ end
+ end
+
resources :notes, only: [:index, :create, :destroy] do
collection do
post :preview
diff --git a/features/project/team_management.feature b/features/project/team_management.feature
index ae0c459f333..0ac37620b4e 100644
--- a/features/project/team_management.feature
+++ b/features/project/team_management.feature
@@ -32,3 +32,10 @@ Feature: Project Team management
And I click link "Remove from team"
Then I visit project "Shop" team page
And I should not see "Sam" in team list
+
+ Scenario: Import team from another project
+ Given I own project "Website"
+ And "Mike" is "Website" reporter
+ And I click link "Import team from another project"
+ When I submit "Website" project for import team
+ Then I should see "Mike" in team list as "Reporter"
diff --git a/features/steps/project/project_team_management.rb b/features/steps/project/project_team_management.rb
index 7beca257e36..5c3a9b31129 100644
--- a/features/steps/project/project_team_management.rb
+++ b/features/steps/project/project_team_management.rb
@@ -86,4 +86,24 @@ class ProjectTeamManagement < Spinach::FeatureSteps
project = Project.find_by_name("Shop")
project.add_access(user, :write)
end
+
+ Given 'I own project "Website"' do
+ @project = Factory :project, :name => "Website"
+ @project.add_access(@user, :admin)
+ end
+
+ And '"Mike" is "Website" reporter' do
+ user = User.find_by_name("Mike")
+ project = Project.find_by_name("Website")
+ project.add_access(user, :read)
+ end
+
+ And 'I click link "Import team from another project"' do
+ click_link "Import team from another project"
+ end
+
+ When 'I submit "Website" project for import team' do
+ select 'Website', from: 'source_project_id'
+ click_button 'Import'
+ end
end
diff --git a/spec/models/users_project_spec.rb b/spec/models/users_project_spec.rb
index 5b6516b32cf..2ad9a0bd909 100644
--- a/spec/models/users_project_spec.rb
+++ b/spec/models/users_project_spec.rb
@@ -35,4 +35,37 @@ describe UsersProject do
it { should respond_to(:user_name) }
it { should respond_to(:user_email) }
end
+
+ describe :import_team do
+ before do
+ @abilities = Six.new
+ @abilities << Ability
+
+ @project_1 = create :project
+ @project_2 = create :project
+
+ @user_1 = create :user
+ @user_2 = create :user
+
+ @project_1.add_access @user_1, :write
+ @project_2.add_access @user_2, :read
+
+ @status = UsersProject.import_team(@project_1, @project_2)
+ end
+
+ it { @status.should be_true }
+
+ describe 'project 2 should get user 1 as developer. user_2 should not be changed' do
+ it { @project_2.users.should include(@user_1) }
+ it { @project_2.users.should include(@user_2) }
+
+ it { @abilities.allowed?(@user_1, :write_project, @project_2).should be_true }
+ it { @abilities.allowed?(@user_2, :read_project, @project_2).should be_true }
+ end
+
+ describe 'project 1 should not be changed' do
+ it { @project_1.users.should include(@user_1) }
+ it { @project_1.users.should_not include(@user_2) }
+ end
+ end
end