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