Commit e6002bdaffc819ea3b743955315cf50eb804dbdb
1 parent
591e094e
Exists in
master
and in
4 other branches
Ability to manage and remove group as owner outside of admin area
Showing
9 changed files
with
117 additions
and
8 deletions
Show diff stats
app/controllers/groups_controller.rb
| @@ -6,6 +6,7 @@ class GroupsController < ApplicationController | @@ -6,6 +6,7 @@ class GroupsController < ApplicationController | ||
| 6 | 6 | ||
| 7 | # Authorize | 7 | # Authorize |
| 8 | before_filter :authorize_read_group!, except: [:new, :create] | 8 | before_filter :authorize_read_group!, except: [:new, :create] |
| 9 | + before_filter :authorize_admin_group!, only: [:edit, :update, :destroy] | ||
| 9 | before_filter :authorize_create_group!, only: [:new, :create] | 10 | before_filter :authorize_create_group!, only: [:new, :create] |
| 10 | 11 | ||
| 11 | # Load group projects | 12 | # Load group projects |
| @@ -84,6 +85,31 @@ class GroupsController < ApplicationController | @@ -84,6 +85,31 @@ class GroupsController < ApplicationController | ||
| 84 | redirect_to people_group_path(@group), notice: 'Users was successfully added.' | 85 | redirect_to people_group_path(@group), notice: 'Users was successfully added.' |
| 85 | end | 86 | end |
| 86 | 87 | ||
| 88 | + def edit | ||
| 89 | + end | ||
| 90 | + | ||
| 91 | + def update | ||
| 92 | + group_params = params[:group].dup | ||
| 93 | + owner_id =group_params.delete(:owner_id) | ||
| 94 | + | ||
| 95 | + if owner_id | ||
| 96 | + @group.owner = User.find(owner_id) | ||
| 97 | + end | ||
| 98 | + | ||
| 99 | + if @group.update_attributes(group_params) | ||
| 100 | + redirect_to @group, notice: 'Group was successfully updated.' | ||
| 101 | + else | ||
| 102 | + render action: "edit" | ||
| 103 | + end | ||
| 104 | + end | ||
| 105 | + | ||
| 106 | + def destroy | ||
| 107 | + @group.truncate_teams | ||
| 108 | + @group.destroy | ||
| 109 | + | ||
| 110 | + redirect_to root_path, notice: 'Group was removed.' | ||
| 111 | + end | ||
| 112 | + | ||
| 87 | protected | 113 | protected |
| 88 | 114 | ||
| 89 | def group | 115 | def group |
| @@ -106,6 +132,14 @@ class GroupsController < ApplicationController | @@ -106,6 +132,14 @@ class GroupsController < ApplicationController | ||
| 106 | end | 132 | end |
| 107 | 133 | ||
| 108 | def authorize_create_group! | 134 | def authorize_create_group! |
| 109 | - can?(current_user, :create_group, nil) | 135 | + unless can?(current_user, :create_group, nil) |
| 136 | + return render_404 | ||
| 137 | + end | ||
| 138 | + end | ||
| 139 | + | ||
| 140 | + def authorize_admin_group! | ||
| 141 | + unless can?(current_user, :manage_group, group) | ||
| 142 | + return render_404 | ||
| 143 | + end | ||
| 110 | end | 144 | end |
| 111 | end | 145 | end |
| @@ -0,0 +1,50 @@ | @@ -0,0 +1,50 @@ | ||
| 1 | +%h3.page_title Edit Group | ||
| 2 | +%hr | ||
| 3 | += form_for @group do |f| | ||
| 4 | + - if @group.errors.any? | ||
| 5 | + .alert.alert-error | ||
| 6 | + %span= @group.errors.full_messages.first | ||
| 7 | + .clearfix | ||
| 8 | + = f.label :name do | ||
| 9 | + Group name is | ||
| 10 | + .input | ||
| 11 | + = f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left" | ||
| 12 | + | ||
| 13 | + = f.submit 'Save group', class: "btn btn-save" | ||
| 14 | +%hr | ||
| 15 | + | ||
| 16 | + | ||
| 17 | +.row | ||
| 18 | + .span7 | ||
| 19 | + .ui-box | ||
| 20 | + %h5.title Projects | ||
| 21 | + %ul.well-list | ||
| 22 | + - @group.projects.each do |project| | ||
| 23 | + %li | ||
| 24 | + - if project.public | ||
| 25 | + %i.icon-share | ||
| 26 | + - else | ||
| 27 | + %i.icon-lock.cgreen | ||
| 28 | + = link_to project.name_with_namespace, project | ||
| 29 | + .pull-right | ||
| 30 | + = link_to 'Team', project_team_index_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" | ||
| 31 | + = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" | ||
| 32 | + = link_to 'Remove', project, confirm: "REMOVE #{project.name}? Are you sure?", method: :delete, class: "btn btn-small btn-remove" | ||
| 33 | + | ||
| 34 | + .span5 | ||
| 35 | + .ui-box | ||
| 36 | + %h5.title Transfer group | ||
| 37 | + .padded | ||
| 38 | + %p | ||
| 39 | + Transferring group will cause loss of admin control over group and all child projects | ||
| 40 | + = form_for @group do |f| | ||
| 41 | + = f.select :owner_id, User.all.map { |user| [user.name, user.id] }, {}, {class: 'chosen'} | ||
| 42 | + = f.submit 'Transfer group', class: "btn btn-small" | ||
| 43 | + .ui-box | ||
| 44 | + %h5.title Remove group | ||
| 45 | + .padded.bgred | ||
| 46 | + %p | ||
| 47 | + Remove of group will cause removing all child projects and resources | ||
| 48 | + %br | ||
| 49 | + Removed group can not be restored! | ||
| 50 | + = link_to 'Remove Group', @group, confirm: 'Removed group can not be restored! Are you sure?', method: :delete, class: "btn btn-remove btn-small" |
app/views/layouts/group.html.haml
| @@ -22,4 +22,10 @@ | @@ -22,4 +22,10 @@ | ||
| 22 | = nav_link(path: 'groups#people') do | 22 | = nav_link(path: 'groups#people') do |
| 23 | = link_to "People", people_group_path(@group) | 23 | = link_to "People", people_group_path(@group) |
| 24 | 24 | ||
| 25 | + - if can?(current_user, :manage_group, @group) | ||
| 26 | + = nav_link(path: 'groups#edit') do | ||
| 27 | + = link_to edit_group_path(@group), class: "tab " do | ||
| 28 | + %i.icon-edit | ||
| 29 | + Edit Group | ||
| 30 | + | ||
| 25 | .content= yield | 31 | .content= yield |
app/views/projects/_form.html.haml
| @@ -42,7 +42,7 @@ | @@ -42,7 +42,7 @@ | ||
| 42 | = f.check_box :wiki_enabled | 42 | = f.check_box :wiki_enabled |
| 43 | %span.descr Pages for project documentation | 43 | %span.descr Pages for project documentation |
| 44 | 44 | ||
| 45 | - - if can? current_user, :change_public_mode, @project | 45 | + - if can?(current_user, :change_public_mode, @project) |
| 46 | %fieldset.features | 46 | %fieldset.features |
| 47 | %legend | 47 | %legend |
| 48 | %i.icon-share | 48 | %i.icon-share |
app/views/teams/edit.html.haml
| @@ -15,8 +15,6 @@ | @@ -15,8 +15,6 @@ | ||
| 15 | Team path is | 15 | Team path is |
| 16 | .input | 16 | .input |
| 17 | = f.text_field :path, placeholder: "opensource", class: "xxlarge left" | 17 | = f.text_field :path, placeholder: "opensource", class: "xxlarge left" |
| 18 | - .clearfix | ||
| 19 | - .input.span3.center | ||
| 20 | - = f.submit 'Save team changes', class: "btn btn-primary" | ||
| 21 | - .input.span3.center | ||
| 22 | - = link_to 'Delete team', team_path(@team), method: :delete, confirm: "You are shure?", class: "btn btn-remove" | 18 | + .form-actions |
| 19 | + = f.submit 'Save team changes', class: "btn btn-primary" | ||
| 20 | + = link_to 'Delete team', team_path(@team), method: :delete, confirm: "You are shure?", class: "btn btn-remove pull-right" |
config/routes.rb
| @@ -129,7 +129,7 @@ Gitlab::Application.routes.draw do | @@ -129,7 +129,7 @@ Gitlab::Application.routes.draw do | ||
| 129 | # | 129 | # |
| 130 | # Groups Area | 130 | # Groups Area |
| 131 | # | 131 | # |
| 132 | - resources :groups, constraints: { id: /[^\/]+/ }, only: [:show, :new, :create] do | 132 | + resources :groups, constraints: { id: /[^\/]+/ } do |
| 133 | member do | 133 | member do |
| 134 | get :issues | 134 | get :issues |
| 135 | get :merge_requests | 135 | get :merge_requests |
features/group/group.feature
| @@ -24,3 +24,9 @@ Feature: Groups | @@ -24,3 +24,9 @@ Feature: Groups | ||
| 24 | When I visit group people page | 24 | When I visit group people page |
| 25 | And I select user "John" from list with role "Reporter" | 25 | And I select user "John" from list with role "Reporter" |
| 26 | Then I should see user "John" in team list | 26 | Then I should see user "John" in team list |
| 27 | + | ||
| 28 | + Scenario: I should see edit group page | ||
| 29 | + When I visit group settings page | ||
| 30 | + And I change group name | ||
| 31 | + Then I should see new group name | ||
| 32 | + |
features/steps/group/group.rb
| @@ -82,6 +82,17 @@ class Groups < Spinach::FeatureSteps | @@ -82,6 +82,17 @@ class Groups < Spinach::FeatureSteps | ||
| 82 | current_path.should == group_path(Group.last) | 82 | current_path.should == group_path(Group.last) |
| 83 | end | 83 | end |
| 84 | 84 | ||
| 85 | + And 'I change group name' do | ||
| 86 | + fill_in 'group_name', :with => 'new-name' | ||
| 87 | + click_button "Save group" | ||
| 88 | + end | ||
| 89 | + | ||
| 90 | + Then 'I should see new group name' do | ||
| 91 | + within ".navbar-gitlab" do | ||
| 92 | + page.should have_content "group: new-name" | ||
| 93 | + end | ||
| 94 | + end | ||
| 95 | + | ||
| 85 | protected | 96 | protected |
| 86 | 97 | ||
| 87 | def current_group | 98 | def current_group |
features/steps/shared/paths.rb
| @@ -25,6 +25,10 @@ module SharedPaths | @@ -25,6 +25,10 @@ module SharedPaths | ||
| 25 | visit people_group_path(current_group) | 25 | visit people_group_path(current_group) |
| 26 | end | 26 | end |
| 27 | 27 | ||
| 28 | + When 'I visit group settings page' do | ||
| 29 | + visit edit_group_path(current_group) | ||
| 30 | + end | ||
| 31 | + | ||
| 28 | # ---------------------------------------- | 32 | # ---------------------------------------- |
| 29 | # Dashboard | 33 | # Dashboard |
| 30 | # ---------------------------------------- | 34 | # ---------------------------------------- |