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 @@ |
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 @@ |
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 | 64 | Gitlab::UserTeamManager.remove_member_from_team(self, user) |
65 | 65 | end |
66 | 66 | |
67 | + def update_membership(user, options) | |
68 | + Gitlab::UserTeamManager.update_team_user_membership(self, user, options) | |
69 | + end | |
70 | + | |
67 | 71 | def max_project_access(project) |
68 | 72 | user_team_project_relationships.find_by_project_id(project).greatest_access |
69 | 73 | end | ... | ... |
... | ... | @@ -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 @@ |
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 @@ |
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 | 41 | |
42 | 42 | %fieldset |
43 | 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 | 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 | 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 | 69 | %fieldset |
71 | 70 | %legend Projects (#{@team.projects.count}) | ... | ... |
config/routes.rb
... | ... | @@ -77,6 +77,9 @@ Gitlab::Application.routes.draw do |
77 | 77 | post :add_members |
78 | 78 | delete :remove_member |
79 | 79 | end |
80 | + scope module: :teams do | |
81 | + resources :members, only: [:edit, :update, :destroy, :new, :create] | |
82 | + end | |
80 | 83 | end |
81 | 84 | resources :team_members, only: [:edit, :update, :destroy] |
82 | 85 | resources :hooks, only: [:index, :create, :destroy] do | ... | ... |
lib/gitlab/user_team_manager.rb
... | ... | @@ -22,6 +22,38 @@ module Gitlab |
22 | 22 | update_team_users_access_in_project(team, project) |
23 | 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 | 57 | def update_team_users_access_in_project(team, project) |
26 | 58 | members = team.members |
27 | 59 | members.each do |member| | ... | ... |