##// END OF EJS Templates
Resourcified project memberships....
Jean-Philippe Lang -
r8669:78bd24c6f738
parent child
Show More
@@ -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 => [:new, :autocomplete_for_member]
20 before_filter :find_model_object, :except => [:create, :autocomplete]
21 before_filter :find_project_from_association, :except => [:new, :autocomplete_for_member]
21 before_filter :find_project_from_association, :except => [:create, :autocomplete]
22 before_filter :find_project, :only => [:new, :autocomplete_for_member]
22 before_filter :find_project_by_project_id, :only => [:create, :autocomplete]
23 before_filter :authorize
23 before_filter :authorize
24
24
25 def new
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 edit
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.post? && @member.deletable?
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_for_member
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 => :post,
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 => {:controller => 'members', :action => 'new', :id => @project}, :method => :post,
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 => { :controller => 'members', :action => 'autocomplete_for_member', :id => @project },
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 => [:new, :edit, :destroy, :autocomplete_for_member]}, :require => :member
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 :new, :id => 1, :member => {:role_ids => [1], :user_id => 7}
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 :new, :id => 1, :member => {:role_ids => [1], :user_ids => [7, 8, 9]}
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 :new, :format => "js", :id => 1, :member => {:role_ids => [1], :user_ids => [7, 8, 9]}
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 :new, :format => "js", :id => 1, :member => {:role_ids => [], :user_ids => [7, 8, 9]}
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 post :edit, :id => 2, :member => {:role_ids => [1], :user_id => 3}
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 :post, :edit, :id => 2, :member => {:role_ids => [1], :user_id => 3}
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 post :destroy, :id => 2
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 :post, :destroy, :id => 2
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_for_member
102 def test_autocomplete
103 get :autocomplete_for_member, :id => 1, :q => 'mis'
103 get :autocomplete, :project_id => 1, :q => 'mis'
104 assert_response :success
104 assert_response :success
105 assert_template 'autocomplete_for_member'
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/new" },
23 { :method => 'post', :path => "/projects/5234/memberships" },
24 { :controller => 'members', :action => 'new', :id => '5234' }
24 { :controller => 'members', :action => 'create', :project_id => '5234' }
25 )
25 )
26 assert_routing(
26 assert_routing(
27 { :method => 'post', :path => "/members/edit/5234" },
27 { :method => 'put', :path => "/memberships/5234" },
28 { :controller => 'members', :action => 'edit', :id => '5234' }
28 { :controller => 'members', :action => 'update', :id => '5234' }
29 )
29 )
30 assert_routing(
30 assert_routing(
31 { :method => 'post', :path => "/members/destroy/5234" },
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 => 'post', :path => "/members/autocomplete_for_member/5234" },
35 { :method => 'get', :path => "/projects/5234/memberships/autocomplete" },
36 { :controller => 'members', :action => 'autocomplete_for_member', :id => '5234' }
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