@@ -0,0 +1,1 | |||
|
1 | <%= principals_check_box_tags 'membership[user_ids][]', @principals %> |
@@ -17,15 +17,15 | |||
|
17 | 17 | |
|
18 | 18 | class MembersController < ApplicationController |
|
19 | 19 | model_object Member |
|
20 |
before_filter :find_model_object, :except => [: |
|
|
21 |
before_filter :find_project_from_association, :except => [: |
|
|
22 |
before_filter :find_project, :only => [: |
|
|
20 | before_filter :find_model_object, :except => [:create, :autocomplete] | |
|
21 | before_filter :find_project_from_association, :except => [:create, :autocomplete] | |
|
22 | before_filter :find_project_by_project_id, :only => [:create, :autocomplete] | |
|
23 | 23 | before_filter :authorize |
|
24 | 24 | |
|
25 |
def |
|
|
25 | def create | |
|
26 | 26 | members = [] |
|
27 | if params[:member] && request.post? | |
|
28 | attrs = params[:member].dup | |
|
27 | if params[:membership] && request.post? | |
|
28 | attrs = params[:membership].dup | |
|
29 | 29 | if (user_ids = attrs.delete(:user_ids)) |
|
30 | 30 | user_ids.each do |user_id| |
|
31 | 31 | members << Member.new(attrs.merge(:user_id => user_id)) |
@@ -63,8 +63,11 class MembersController < ApplicationController | |||
|
63 | 63 | end |
|
64 | 64 | end |
|
65 | 65 | |
|
66 |
def |
|
|
67 | if request.post? and @member.update_attributes(params[:member]) | |
|
66 | def update | |
|
67 | if params[:membership] | |
|
68 | @member.role_ids = params[:membership][:role_ids] | |
|
69 | end | |
|
70 | if request.put? && @member.save | |
|
68 | 71 | respond_to do |format| |
|
69 | 72 | format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project } |
|
70 | 73 | format.js { |
@@ -79,7 +82,7 class MembersController < ApplicationController | |||
|
79 | 82 | end |
|
80 | 83 | |
|
81 | 84 | def destroy |
|
82 |
if request. |
|
|
85 | if request.delete? && @member.deletable? | |
|
83 | 86 | @member.destroy |
|
84 | 87 | end |
|
85 | 88 | respond_to do |format| |
@@ -92,7 +95,7 class MembersController < ApplicationController | |||
|
92 | 95 | end |
|
93 | 96 | end |
|
94 | 97 | |
|
95 |
def autocomplete |
|
|
98 | def autocomplete | |
|
96 | 99 | @principals = Principal.active.like(params[:q]).find(:all, :limit => 100) - @project.principals |
|
97 | 100 | render :layout => false |
|
98 | 101 | end |
@@ -18,21 +18,19 | |||
|
18 | 18 | <td class="<%= member.principal.class.name.downcase %>"><%= link_to_user member.principal %></td> |
|
19 | 19 | <td class="roles"> |
|
20 | 20 | <span id="member-<%= member.id %>-roles"><%=h member.roles.sort.collect(&:to_s).join(', ') %></span> |
|
21 | <% if authorize_for('members', 'edit') %> | |
|
22 | <% remote_form_for(:member, member, :url => {:controller => 'members', :action => 'edit', :id => member}, | |
|
23 | :method => :post, | |
|
21 | <% remote_form_for(:membership, member, :url => membership_path(member), | |
|
22 | :method => :put, | |
|
24 | 23 | :html => { :id => "member-#{member.id}-roles-form", :class => 'hol' }) do |f| %> |
|
25 | 24 | <p><% roles.each do |role| %> |
|
26 | <label><%= check_box_tag 'member[role_ids][]', role.id, member.roles.include?(role), | |
|
25 | <label><%= check_box_tag 'membership[role_ids][]', role.id, member.roles.include?(role), | |
|
27 | 26 | :disabled => member.member_roles.detect {|mr| mr.role_id == role.id && !mr.inherited_from.nil?} %> <%=h role %></label><br /> |
|
28 | 27 | <% end %></p> |
|
29 | <%= hidden_field_tag 'member[role_ids][]', '' %> | |
|
28 | <%= hidden_field_tag 'membership[role_ids][]', '' %> | |
|
30 | 29 | <p><%= submit_tag l(:button_change), :class => "small" %> |
|
31 | 30 | <%= link_to_function l(:button_cancel), |
|
32 | 31 | "$('member-#{member.id}-roles').show(); $('member-#{member.id}-roles-form').hide(); return false;" |
|
33 | 32 | %></p> |
|
34 | 33 | <% end %> |
|
35 | <% end %> | |
|
36 | 34 | </td> |
|
37 | 35 | <td class="buttons"> |
|
38 | 36 | <%= link_to_function l(:button_edit), |
@@ -40,8 +38,8 | |||
|
40 | 38 | :class => 'icon icon-edit' %> |
|
41 | 39 | <%= link_to_remote( |
|
42 | 40 | l(:button_delete), |
|
43 | { :url => {:controller => 'members', :action => 'destroy', :id => member}, | |
|
44 |
:method => : |
|
|
41 | { :url => membership_path(member), | |
|
42 | :method => :delete, | |
|
45 | 43 | :confirm => (!User.current.admin? && member.include?(User.current) ? l(:text_own_membership_delete_confirmation) : nil) }, |
|
46 | 44 | :title => l(:button_delete), |
|
47 | 45 | :class => 'icon icon-del' |
@@ -61,7 +59,7 | |||
|
61 | 59 | |
|
62 | 60 | <div class="splitcontentright"> |
|
63 | 61 | <% if roles.any? && principals.any? %> |
|
64 |
<% remote_form_for(:member, @member, :url => |
|
|
62 | <% remote_form_for(:membership, @member, :url => project_memberships_path(@project), :method => :post, | |
|
65 | 63 | :loading => '$(\'member-add-submit\').disable();', |
|
66 | 64 | :complete => 'if($(\'member-add-submit\')) $(\'member-add-submit\').enable();') do |f| %> |
|
67 | 65 | <fieldset><legend><%=l(:label_member_new)%></legend> |
@@ -70,17 +68,18 | |||
|
70 | 68 | <%= observe_field(:principal_search, |
|
71 | 69 | :frequency => 0.5, |
|
72 | 70 | :update => :principals, |
|
73 |
:url => |
|
|
71 | :url => autocomplete_project_memberships_path(@project), | |
|
72 | :method => :get, | |
|
74 | 73 | :with => 'q') |
|
75 | 74 | %> |
|
76 | 75 | |
|
77 | 76 | <div id="principals"> |
|
78 | <%= principals_check_box_tags 'member[user_ids][]', principals %> | |
|
77 | <%= principals_check_box_tags 'membership[user_ids][]', principals %> | |
|
79 | 78 | </div> |
|
80 | 79 | |
|
81 | 80 | <p><%= l(:label_role_plural) %>: |
|
82 | 81 | <% roles.each do |role| %> |
|
83 | <label><%= check_box_tag 'member[role_ids][]', role.id %> <%=h role %></label> | |
|
82 | <label><%= check_box_tag 'membership[role_ids][]', role.id %> <%=h role %></label> | |
|
84 | 83 | <% end %></p> |
|
85 | 84 | |
|
86 | 85 | <p><%= submit_tag l(:button_add), :id => 'member-add-submit' %></p> |
@@ -96,15 +96,6 ActionController::Routing::Routes.draw do |map| | |||
|
96 | 96 | map.connect 'my/order_blocks', :controller => 'my', :action => 'order_blocks', |
|
97 | 97 | :conditions => {:method => :post} |
|
98 | 98 | |
|
99 | map.connect 'projects/:id/members/new', :controller => 'members', | |
|
100 | :action => 'new', :conditions => { :method => :post } | |
|
101 | map.connect 'members/edit/:id', :controller => 'members', | |
|
102 | :action => 'edit', :id => /\d+/, :conditions => { :method => :post } | |
|
103 | map.connect 'members/destroy/:id', :controller => 'members', | |
|
104 | :action => 'destroy', :id => /\d+/, :conditions => { :method => :post } | |
|
105 | map.connect 'members/autocomplete_for_member/:id', :controller => 'members', | |
|
106 | :action => 'autocomplete_for_member', :conditions => { :method => :post } | |
|
107 | ||
|
108 | 99 | map.with_options :controller => 'users' do |users| |
|
109 | 100 | users.user_membership 'users/:id/memberships/:membership_id', |
|
110 | 101 | :action => 'edit_membership', |
@@ -178,6 +169,9 ActionController::Routing::Routes.draw do |map| | |||
|
178 | 169 | project.resources :boards |
|
179 | 170 | project.resources :repositories, :shallow => true, :except => [:index, :show], |
|
180 | 171 | :member => {:committers => [:get, :post]} |
|
172 | project.resources :memberships, :shallow => true, :controller => 'members', | |
|
173 | :only => [:create, :update, :destroy], | |
|
174 | :collection => {:autocomplete => :get} | |
|
181 | 175 | |
|
182 | 176 | project.wiki_start_page 'wiki', :controller => 'wiki', :action => 'show', :conditions => {:method => :get} |
|
183 | 177 | project.wiki_index 'wiki/index', :controller => 'wiki', :action => 'index', :conditions => {:method => :get} |
@@ -52,7 +52,7 Redmine::AccessControl.map do |map| | |||
|
52 | 52 | map.permission :add_project, {:projects => [:new, :create]}, :require => :loggedin |
|
53 | 53 | map.permission :edit_project, {:projects => [:settings, :edit, :update]}, :require => :member |
|
54 | 54 | map.permission :select_project_modules, {:projects => :modules}, :require => :member |
|
55 |
map.permission :manage_members, {:projects => :settings, :members => [: |
|
|
55 | map.permission :manage_members, {:projects => :settings, :members => [:create, :update, :destroy, :autocomplete]}, :require => :member | |
|
56 | 56 | map.permission :manage_versions, {:projects => :settings, :versions => [:new, :create, :edit, :update, :close_completed, :destroy]}, :require => :member |
|
57 | 57 | map.permission :add_subprojects, {:projects => [:new, :create]}, :require => :member |
|
58 | 58 |
@@ -35,7 +35,7 class MembersControllerTest < ActionController::TestCase | |||
|
35 | 35 | |
|
36 | 36 | def test_create |
|
37 | 37 | assert_difference 'Member.count' do |
|
38 |
post : |
|
|
38 | post :create, :project_id => 1, :membership => {:role_ids => [1], :user_id => 7} | |
|
39 | 39 | end |
|
40 | 40 | assert_redirected_to '/projects/ecookbook/settings/members' |
|
41 | 41 | assert User.find(7).member_of?(Project.find(1)) |
@@ -43,7 +43,7 class MembersControllerTest < ActionController::TestCase | |||
|
43 | 43 | |
|
44 | 44 | def test_create_multiple |
|
45 | 45 | assert_difference 'Member.count', 3 do |
|
46 |
post : |
|
|
46 | post :create, :project_id => 1, :membership => {:role_ids => [1], :user_ids => [7, 8, 9]} | |
|
47 | 47 | end |
|
48 | 48 | assert_redirected_to '/projects/ecookbook/settings/members' |
|
49 | 49 | assert User.find(7).member_of?(Project.find(1)) |
@@ -51,7 +51,7 class MembersControllerTest < ActionController::TestCase | |||
|
51 | 51 | |
|
52 | 52 | def test_xhr_create |
|
53 | 53 | assert_difference 'Member.count', 3 do |
|
54 |
post : |
|
|
54 | post :create, :project_id => 1, :membership => {:role_ids => [1], :user_ids => [7, 8, 9]}, :format => "js" | |
|
55 | 55 | end |
|
56 | 56 | assert_select_rjs :replace_html, 'tab-content-members' |
|
57 | 57 | assert User.find(7).member_of?(Project.find(1)) |
@@ -61,7 +61,7 class MembersControllerTest < ActionController::TestCase | |||
|
61 | 61 | |
|
62 | 62 | def test_xhr_create_with_failure |
|
63 | 63 | assert_no_difference 'Member.count' do |
|
64 |
post : |
|
|
64 | post :create, :project_id => 1, :membership => {:role_ids => [], :user_ids => [7, 8, 9]}, :format => "js" | |
|
65 | 65 | end |
|
66 | 66 | assert_select '#tab-content-members', 0 |
|
67 | 67 | assert @response.body.match(/alert/i), "Alert message not sent" |
@@ -69,14 +69,14 class MembersControllerTest < ActionController::TestCase | |||
|
69 | 69 | |
|
70 | 70 | def test_edit |
|
71 | 71 | assert_no_difference 'Member.count' do |
|
72 |
p |
|
|
72 | put :update, :id => 2, :membership => {:role_ids => [1], :user_id => 3} | |
|
73 | 73 | end |
|
74 | 74 | assert_redirected_to '/projects/ecookbook/settings/members' |
|
75 | 75 | end |
|
76 | 76 | |
|
77 | 77 | def test_xhr_edit |
|
78 | 78 | assert_no_difference 'Member.count' do |
|
79 |
xhr :p |
|
|
79 | xhr :put, :update, :id => 2, :membership => {:role_ids => [1], :user_id => 3} | |
|
80 | 80 | end |
|
81 | 81 | assert_select_rjs :replace_html, 'tab-content-members' |
|
82 | 82 | member = Member.find(2) |
@@ -86,7 +86,7 class MembersControllerTest < ActionController::TestCase | |||
|
86 | 86 | |
|
87 | 87 | def test_destroy |
|
88 | 88 | assert_difference 'Member.count', -1 do |
|
89 |
|
|
|
89 | delete :destroy, :id => 2 | |
|
90 | 90 | end |
|
91 | 91 | assert_redirected_to '/projects/ecookbook/settings/members' |
|
92 | 92 | assert !User.find(3).member_of?(Project.find(1)) |
@@ -94,17 +94,17 class MembersControllerTest < ActionController::TestCase | |||
|
94 | 94 | |
|
95 | 95 | def test_xhr_destroy |
|
96 | 96 | assert_difference 'Member.count', -1 do |
|
97 |
xhr : |
|
|
97 | xhr :delete, :destroy, :id => 2 | |
|
98 | 98 | end |
|
99 | 99 | assert_select_rjs :replace_html, 'tab-content-members' |
|
100 | 100 | end |
|
101 | 101 | |
|
102 |
def test_autocomplete |
|
|
103 |
get :autocomplete |
|
|
102 | def test_autocomplete | |
|
103 | get :autocomplete, :project_id => 1, :q => 'mis' | |
|
104 | 104 | assert_response :success |
|
105 |
assert_template 'autocomplete |
|
|
105 | assert_template 'autocomplete' | |
|
106 | 106 | |
|
107 | 107 | assert_tag :label, :content => /User Misc/, |
|
108 | :child => { :tag => 'input', :attributes => { :name => 'member[user_ids][]', :value => '8' } } | |
|
108 | :child => { :tag => 'input', :attributes => { :name => 'membership[user_ids][]', :value => '8' } } | |
|
109 | 109 | end |
|
110 | 110 | end |
@@ -20,20 +20,20 require File.expand_path('../../../test_helper', __FILE__) | |||
|
20 | 20 | class RoutingMembersTest < ActionController::IntegrationTest |
|
21 | 21 | def test_members |
|
22 | 22 | assert_routing( |
|
23 |
{ :method => 'post', :path => "/projects/5234/members |
|
|
24 |
{ :controller => 'members', :action => ' |
|
|
23 | { :method => 'post', :path => "/projects/5234/memberships" }, | |
|
24 | { :controller => 'members', :action => 'create', :project_id => '5234' } | |
|
25 | 25 | ) |
|
26 | 26 | assert_routing( |
|
27 |
{ :method => 'p |
|
|
28 |
{ :controller => 'members', :action => ' |
|
|
27 | { :method => 'put', :path => "/memberships/5234" }, | |
|
28 | { :controller => 'members', :action => 'update', :id => '5234' } | |
|
29 | 29 | ) |
|
30 | 30 | assert_routing( |
|
31 |
{ :method => ' |
|
|
31 | { :method => 'delete', :path => "/memberships/5234" }, | |
|
32 | 32 | { :controller => 'members', :action => 'destroy', :id => '5234' } |
|
33 | 33 | ) |
|
34 | 34 | assert_routing( |
|
35 |
{ :method => ' |
|
|
36 |
{ :controller => 'members', :action => 'autocomplete |
|
|
35 | { :method => 'get', :path => "/projects/5234/memberships/autocomplete" }, | |
|
36 | { :controller => 'members', :action => 'autocomplete', :project_id => '5234' } | |
|
37 | 37 | ) |
|
38 | 38 | end |
|
39 | 39 | end |
|
1 | NO CONTENT: file was removed |
General Comments 0
You need to be logged in to leave comments.
Login now