Commit 9804b7df68a0ba4a1b144bc652351ad77a38fc3f
Committed by
Dmitriy Zaporozhets
1 parent
9d318db4
Exists in
master
and in
4 other branches
Move admin team members management to own controller
Showing
9 changed files
with
173 additions
and
23 deletions
Show diff stats
@@ -0,0 +1,12 @@ | @@ -0,0 +1,12 @@ | ||
1 | +# Provides a base class for Admin controllers to subclass | ||
2 | +# | ||
3 | +# Automatically sets the layout and ensures an administrator is logged in | ||
4 | +class Admin::Teams::ApplicationController < Admin::ApplicationController | ||
5 | + before_filter :user_team | ||
6 | + | ||
7 | + private | ||
8 | + | ||
9 | + def user_team | ||
10 | + @team = UserTeam.find_by_path(params[:team_id]) | ||
11 | + end | ||
12 | +end |
@@ -0,0 +1,35 @@ | @@ -0,0 +1,35 @@ | ||
1 | +class Admin::Teams::MembersController < Admin::Teams::ApplicationController | ||
2 | + def new | ||
3 | + @users = User.active | ||
4 | + @users = @users.not_in_team(@team) if @team.members.any? | ||
5 | + @users = UserDecorator.decorate @users | ||
6 | + end | ||
7 | + | ||
8 | + def create | ||
9 | + unless params[:user_ids].blank? | ||
10 | + user_ids = params[:user_ids] | ||
11 | + access = params[:default_project_access] | ||
12 | + is_admin = params[:group_admin] | ||
13 | + @team.add_members(user_ids, access, is_admin) | ||
14 | + end | ||
15 | + | ||
16 | + redirect_to admin_team_path(@team), notice: 'Members was successfully added.' | ||
17 | + end | ||
18 | + | ||
19 | + def edit | ||
20 | + @member = @team.members.find(params[:id]) | ||
21 | + end | ||
22 | + | ||
23 | + def update | ||
24 | + @member = @team.members.find(params[:id]) | ||
25 | + options = {default_projects_access: params[:default_project_access], group_admin: params[:group_admin]} | ||
26 | + if @team.update_membership(@member, options) | ||
27 | + redirect_to admin_team_path(@team), notice: 'Membership was successfully updated.' | ||
28 | + else | ||
29 | + render :edit | ||
30 | + end | ||
31 | + end | ||
32 | + | ||
33 | + def destroy | ||
34 | + end | ||
35 | +end |
app/models/user_team.rb
@@ -64,6 +64,10 @@ class UserTeam < ActiveRecord::Base | @@ -64,6 +64,10 @@ class UserTeam < ActiveRecord::Base | ||
64 | Gitlab::UserTeamManager.remove_member_from_team(self, user) | 64 | Gitlab::UserTeamManager.remove_member_from_team(self, user) |
65 | end | 65 | end |
66 | 66 | ||
67 | + def update_membership(user, options) | ||
68 | + Gitlab::UserTeamManager.update_team_user_membership(self, user, options) | ||
69 | + end | ||
70 | + | ||
67 | def max_project_access(project) | 71 | def max_project_access(project) |
68 | user_team_project_relationships.find_by_project_id(project).greatest_access | 72 | user_team_project_relationships.find_by_project_id(project).greatest_access |
69 | end | 73 | end |
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | += form_tag admin_team_member_path(@team, @member), method: :put do | ||
2 | + -if @member.errors.any? | ||
3 | + .alert-message.block-message.error | ||
4 | + %ul | ||
5 | + - @member.errors.full_messages.each do |msg| | ||
6 | + %li= msg | ||
7 | + | ||
8 | + .clearfix | ||
9 | + %label Default access for Team projects: | ||
10 | + .input | ||
11 | + = select_tag :default_project_access, options_for_select(UserTeam.access_roles, @team.default_projects_access(@member)), class: "project-access-select chosen span3" | ||
12 | + .clearfix | ||
13 | + %label Team admin? | ||
14 | + .input | ||
15 | + = check_box_tag :group_admin, true, @team.admin?(@member) | ||
16 | + | ||
17 | + %br | ||
18 | + .actions | ||
19 | + = submit_tag 'Save', class: "btn primary" | ||
20 | + = link_to 'Cancel', :back, class: "btn" |
@@ -0,0 +1,16 @@ | @@ -0,0 +1,16 @@ | ||
1 | +%h3 | ||
2 | + Edit access #{@member.name} in #{@team.name} team | ||
3 | + | ||
4 | +%hr | ||
5 | +%table.zebra-striped | ||
6 | + %tr | ||
7 | + %td User: | ||
8 | + %td= @member.name | ||
9 | + %tr | ||
10 | + %td Team: | ||
11 | + %td= @team.name | ||
12 | + %tr | ||
13 | + %td Since: | ||
14 | + %td= member_since(@team, @member).stamp("Nov 11, 2010") | ||
15 | + | ||
16 | += render 'form' |
@@ -0,0 +1,29 @@ | @@ -0,0 +1,29 @@ | ||
1 | +%h3.page_title | ||
2 | + Team: #{@team.name} | ||
3 | + | ||
4 | +%fieldset | ||
5 | + %legend Members (#{@team.members.count}) | ||
6 | + = form_tag add_members_admin_team_path(@team), id: "team_members", class: "bulk_import", method: :post do | ||
7 | + %table#members_list | ||
8 | + %thead | ||
9 | + %tr | ||
10 | + %th User name | ||
11 | + %th Default project access | ||
12 | + %th Team access | ||
13 | + %th | ||
14 | + - @team.members.each do |member| | ||
15 | + %tr.member | ||
16 | + %td | ||
17 | + = link_to [:admin, member] do | ||
18 | + = member.name | ||
19 | + %small= "(#{member.email})" | ||
20 | + %td= @team.human_default_projects_access(member) | ||
21 | + %td= @team.admin?(member) ? "Admin" : "Member" | ||
22 | + %td | ||
23 | + %tr | ||
24 | + %td= select_tag :user_ids, options_from_collection_for_select(@users , :id, :name_with_email), multiple: true, data: {placeholder: 'Select users'}, class: 'chosen span5' | ||
25 | + %td= select_tag :default_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" } | ||
26 | + %td | ||
27 | + %span= check_box_tag :group_admin | ||
28 | + %span Admin? | ||
29 | + %td= submit_tag 'Add', class: "btn primary", id: :add_members_to_team |
app/views/admin/teams/show.html.haml
@@ -41,31 +41,30 @@ | @@ -41,31 +41,30 @@ | ||
41 | 41 | ||
42 | %fieldset | 42 | %fieldset |
43 | %legend Members (#{@team.members.count}) | 43 | %legend Members (#{@team.members.count}) |
44 | - = form_tag add_members_admin_team_path(@team), id: "team_members", class: "bulk_import", method: :post do | ||
45 | - %table#members_list | ||
46 | - %thead | ||
47 | - %tr | ||
48 | - %th User name | ||
49 | - %th Default project access | ||
50 | - %th Team access | ||
51 | - %th.cred Danger Zone! | ||
52 | - - @team.members.each do |member| | ||
53 | - %tr.member | ||
54 | - %td | ||
55 | - = link_to [:admin, member] do | ||
56 | - = member.name | ||
57 | - %small= "(#{member.email})" | ||
58 | - %td= @team.human_default_projects_access(member) | ||
59 | - %td= @team.admin?(member) ? "Admin" : "Member" | ||
60 | - %td.bgred | ||
61 | - = link_to 'Remove', remove_member_admin_team_path(@team, member_id: member.id), confirm: 'Remove project from team and move to global namespace. Are you sure?', method: :delete, class: "btn danger small" | 44 | + %table#members_list |
45 | + %thead | ||
62 | %tr | 46 | %tr |
63 | - %td= select_tag :user_ids, options_from_collection_for_select(@users , :id, :name_with_email), multiple: true, data: {placeholder: 'Select users'}, class: 'chosen span5' | ||
64 | - %td= select_tag :default_project_access, options_for_select(Project.access_options), {class: "project-access-select chosen span3" } | 47 | + %th User name |
48 | + %th Default project access | ||
49 | + %th Team access | ||
50 | + %th.cred Danger Zone! | ||
51 | + - @team.members.each do |member| | ||
52 | + %tr.member | ||
65 | %td | 53 | %td |
66 | - %span= check_box_tag :group_admin | ||
67 | - %span Admin? | ||
68 | - %td= submit_tag 'Add', class: "btn primary", id: :add_members_to_team | 54 | + = link_to [:admin, member] do |
55 | + = member.name | ||
56 | + %small= "(#{member.email})" | ||
57 | + %td= @team.human_default_projects_access(member) | ||
58 | + %td= @team.admin?(member) ? "Admin" : "Member" | ||
59 | + %td.bgred | ||
60 | + = link_to 'Edit', edit_admin_team_member_path(@team, member), class: "btn small" | ||
61 | + | ||
62 | + = link_to 'Remove', admin_team_member_path(@team, member), confirm: 'Remove member from team. Are you sure?', method: :delete, class: "btn danger small" | ||
63 | + %tr | ||
64 | + %td | ||
65 | + %td | ||
66 | + %td | ||
67 | + %td= link_to 'Add members', new_admin_team_member_path(@team), class: "btn primary", id: :add_members_to_team | ||
69 | 68 | ||
70 | %fieldset | 69 | %fieldset |
71 | %legend Projects (#{@team.projects.count}) | 70 | %legend Projects (#{@team.projects.count}) |
config/routes.rb
@@ -77,6 +77,9 @@ Gitlab::Application.routes.draw do | @@ -77,6 +77,9 @@ Gitlab::Application.routes.draw do | ||
77 | post :add_members | 77 | post :add_members |
78 | delete :remove_member | 78 | delete :remove_member |
79 | end | 79 | end |
80 | + scope module: :teams do | ||
81 | + resources :members, only: [:edit, :update, :destroy, :new, :create] | ||
82 | + end | ||
80 | end | 83 | end |
81 | resources :team_members, only: [:edit, :update, :destroy] | 84 | resources :team_members, only: [:edit, :update, :destroy] |
82 | resources :hooks, only: [:index, :create, :destroy] do | 85 | resources :hooks, only: [:index, :create, :destroy] do |
lib/gitlab/user_team_manager.rb
@@ -22,6 +22,38 @@ module Gitlab | @@ -22,6 +22,38 @@ module Gitlab | ||
22 | update_team_users_access_in_project(team, project) | 22 | update_team_users_access_in_project(team, project) |
23 | end | 23 | end |
24 | 24 | ||
25 | + def update_team_user_membership(team, member, options) | ||
26 | + updates = {} | ||
27 | + | ||
28 | + if options[:default_projects_access] && options[:default_projects_access] != team.default_projects_access(member) | ||
29 | + updates[:permission] = options[:default_projects_access] | ||
30 | + end | ||
31 | + | ||
32 | + if options[:group_admin].to_s != team.admin?(member).to_s | ||
33 | + updates[:group_admin] = options[:group_admin].present? | ||
34 | + end | ||
35 | + | ||
36 | + unless updates.blank? | ||
37 | + user_team_relationship = team.user_team_user_relationships.find_by_user_id(member) | ||
38 | + if user_team_relationship.update_attributes(updates) | ||
39 | + if updates[:permission] | ||
40 | + rebuild_project_permissions_to_member(team, member) | ||
41 | + end | ||
42 | + true | ||
43 | + else | ||
44 | + false | ||
45 | + end | ||
46 | + else | ||
47 | + true | ||
48 | + end | ||
49 | + end | ||
50 | + | ||
51 | + def rebuild_project_permissions_to_member(team, member) | ||
52 | + team.projects.each do |project| | ||
53 | + update_team_user_access_in_project(team, member, project) | ||
54 | + end | ||
55 | + end | ||
56 | + | ||
25 | def update_team_users_access_in_project(team, project) | 57 | def update_team_users_access_in_project(team, project) |
26 | members = team.members | 58 | members = team.members |
27 | members.each do |member| | 59 | members.each do |member| |