OSDN Git Service

Feature implemented
authorDmitriy Zaporozhets <dzaporozhets@sphereconsultinginc.com>
Wed, 24 Oct 2012 11:20:53 +0000 (14:20 +0300)
committerDmitriy Zaporozhets <dzaporozhets@sphereconsultinginc.com>
Wed, 24 Oct 2012 11:20:53 +0000 (14:20 +0300)
app/controllers/team_members_controller.rb
app/models/users_project.rb
app/views/team_members/import.html.haml [new file with mode: 0644]
app/views/team_members/index.html.haml
config/routes.rb

index d0b699f..37ed74b 100644 (file)
@@ -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
index e336fac..3c1fe21 100644 (file)
@@ -21,6 +21,22 @@ class UsersProject < ActiveRecord::Base
   delegate :name, :email, to: :user, prefix: true
 
   class << self
+    def import_team(source_project, target_project)
+      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
+
     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 (file)
index 0000000..59a27fd
--- /dev/null
@@ -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 'Save', class: "btn save-btn"
+    = link_to "Cancel", project_team_index_path(@project), class: "btn cancel-btn"
+
index b3b7b72..ca3edcf 100644 (file)
@@ -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}
index de5261d..adaf6a1 100644 (file)
@@ -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