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 | |
7 | 7 | # Authorize |
8 | 8 | before_filter :authorize_read_group!, except: [:new, :create] |
9 | + before_filter :authorize_admin_group!, only: [:edit, :update, :destroy] | |
9 | 10 | before_filter :authorize_create_group!, only: [:new, :create] |
10 | 11 | |
11 | 12 | # Load group projects |
... | ... | @@ -84,6 +85,31 @@ class GroupsController < ApplicationController |
84 | 85 | redirect_to people_group_path(@group), notice: 'Users was successfully added.' |
85 | 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 | 113 | protected |
88 | 114 | |
89 | 115 | def group |
... | ... | @@ -106,6 +132,14 @@ class GroupsController < ApplicationController |
106 | 132 | end |
107 | 133 | |
108 | 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 | 144 | end |
111 | 145 | end | ... | ... |
... | ... | @@ -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 | 22 | = nav_link(path: 'groups#people') do |
23 | 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 | 31 | .content= yield | ... | ... |
app/views/projects/_form.html.haml
... | ... | @@ -42,7 +42,7 @@ |
42 | 42 | = f.check_box :wiki_enabled |
43 | 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 | 46 | %fieldset.features |
47 | 47 | %legend |
48 | 48 | %i.icon-share | ... | ... |
app/views/teams/edit.html.haml
... | ... | @@ -15,8 +15,6 @@ |
15 | 15 | Team path is |
16 | 16 | .input |
17 | 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 | 129 | # |
130 | 130 | # Groups Area |
131 | 131 | # |
132 | - resources :groups, constraints: { id: /[^\/]+/ }, only: [:show, :new, :create] do | |
132 | + resources :groups, constraints: { id: /[^\/]+/ } do | |
133 | 133 | member do |
134 | 134 | get :issues |
135 | 135 | get :merge_requests | ... | ... |
features/group/group.feature
... | ... | @@ -24,3 +24,9 @@ Feature: Groups |
24 | 24 | When I visit group people page |
25 | 25 | And I select user "John" from list with role "Reporter" |
26 | 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 | 82 | current_path.should == group_path(Group.last) |
83 | 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 | 96 | protected |
86 | 97 | |
87 | 98 | def current_group | ... | ... |
features/steps/shared/paths.rb
... | ... | @@ -25,6 +25,10 @@ module SharedPaths |
25 | 25 | visit people_group_path(current_group) |
26 | 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 | 33 | # Dashboard |
30 | 34 | # ---------------------------------------- | ... | ... |