Commit 9804b7df68a0ba4a1b144bc652351ad77a38fc3f

Authored by Andrey Kumanyaev
Committed by Dmitriy Zaporozhets
1 parent 9d318db4

Move admin team members management to own controller

app/controllers/admin/teams/application_controller.rb 0 → 100644
... ... @@ -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
... ...
app/controllers/admin/teams/members_controller.rb 0 → 100644
... ... @@ -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 &lt; 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
... ...
app/views/admin/teams/members/_form.html.haml 0 → 100644
... ... @@ -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"
... ...
app/views/admin/teams/members/edit.html.haml 0 → 100644
... ... @@ -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'
... ...
app/views/admin/teams/members/new.html.haml 0 → 100644
... ... @@ -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 + &nbsp;
  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|
... ...