Commit f86661c9ecd8b52d233a2436cfedbedc0057f59c
1 parent
cd4a78e9
Exists in
master
and in
29 other branches
ActionItem384: add link Leave to enterprise/community
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1780 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
9 changed files
with
77 additions
and
2 deletions
Show diff stats
app/controllers/my_profile/memberships_controller.rb
@@ -14,6 +14,14 @@ class MembershipsController < MyProfileController | @@ -14,6 +14,14 @@ class MembershipsController < MyProfileController | ||
14 | end | 14 | end |
15 | end | 15 | end |
16 | 16 | ||
17 | + def leave | ||
18 | + @to_leave = Profile.find(params[:id]) | ||
19 | + if request.post? && params[:confirmation] | ||
20 | + @to_leave.remove_member(profile) | ||
21 | + redirect_to :action => 'index' | ||
22 | + end | ||
23 | + end | ||
24 | + | ||
17 | def new_community | 25 | def new_community |
18 | @community = Community.new(params[:community]) | 26 | @community = Community.new(params[:community]) |
19 | if request.post? | 27 | if request.post? |
app/models/profile.rb
@@ -281,6 +281,10 @@ class Profile < ActiveRecord::Base | @@ -281,6 +281,10 @@ class Profile < ActiveRecord::Base | ||
281 | def add_member(person) | 281 | def add_member(person) |
282 | self.affiliate(person, Profile::Roles.member) | 282 | self.affiliate(person, Profile::Roles.member) |
283 | end | 283 | end |
284 | + | ||
285 | + def remove_member(person) | ||
286 | + self.disaffiliate(person, Profile::Roles.member) | ||
287 | + end | ||
284 | 288 | ||
285 | # adds a person as administrator os this profile | 289 | # adds a person as administrator os this profile |
286 | def add_admin(person) | 290 | def add_admin(person) |
app/views/memberships/index.rhtml
@@ -14,7 +14,8 @@ | @@ -14,7 +14,8 @@ | ||
14 | <%= _('Description: %s') % membership.description + '<br/>' if membership.kind_of?(Community) %> | 14 | <%= _('Description: %s') % membership.description + '<br/>' if membership.kind_of?(Community) %> |
15 | <%= _('Members: %s') % membership.members.size.to_s %> <br/> | 15 | <%= _('Members: %s') % membership.members.size.to_s %> <br/> |
16 | <%= _('Created at: %s') % show_date(membership.created_at) %> <br/> | 16 | <%= _('Created at: %s') % show_date(membership.created_at) %> <br/> |
17 | - <%= _('Actions: %s') % link_to(_('Manage'), membership.admin_url) %> <br/> | 17 | + <%= _('Actions: %s') % link_to(_('Manage'), membership.admin_url) + ', ' + link_to(_('Leave'), { :profile => profile.identifier, :controller => 'memberships', :action => 'leave', :id => membership.id }) %> <br/> |
18 | + | ||
18 | </td> | 19 | </td> |
19 | </tr> | 20 | </tr> |
20 | <% end %> | 21 | <% end %> |
@@ -0,0 +1,11 @@ | @@ -0,0 +1,11 @@ | ||
1 | +<h1><%= _('Leaving %s') % @to_leave.name %></h1> | ||
2 | + | ||
3 | +<p> | ||
4 | +<%= _('Are you sure you want to leave %s?') % @to_leave.name %> | ||
5 | +</p> | ||
6 | + | ||
7 | +<% form_tag do %> | ||
8 | + <%= hidden_field_tag(:confirmation, 1) %> | ||
9 | + <%= submit_button(:ok, _("Yes, I want to leave.") % @to_leave.name) %> | ||
10 | + <%= button(:cancel, _("No, I don't want."), :action => 'index') %> | ||
11 | +<% end %> |
test/functional/memberships_controller_test.rb
@@ -113,4 +113,30 @@ class MembershipsControllerTest < Test::Unit::TestCase | @@ -113,4 +113,30 @@ class MembershipsControllerTest < Test::Unit::TestCase | ||
113 | assert_no_tag :tag => 'td', :content => /Description:/ | 113 | assert_no_tag :tag => 'td', :content => /Description:/ |
114 | end | 114 | end |
115 | 115 | ||
116 | + should 'show link to leave from community' do | ||
117 | + community = Community.create!(:name => 'my test community', :description => 'description test') | ||
118 | + community.add_member(profile) | ||
119 | + get :index, :profile => profile.identifier | ||
120 | + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/#{profile.identifier}/memberships/leave/#{community.id}" }, :content => 'Leave' | ||
121 | + end | ||
122 | + | ||
123 | + should 'present confirmation before leaving a profile' do | ||
124 | + community = Community.create!(:name => 'my test community') | ||
125 | + get :leave, :profile => profile.identifier, :id => community.id | ||
126 | + | ||
127 | + assert_response :success | ||
128 | + assert_template 'leave' | ||
129 | + end | ||
130 | + | ||
131 | + should 'actually leave profile' do | ||
132 | + community = Community.create!(:name => 'my test community') | ||
133 | + post :leave, :profile => profile.identifier, :id => community.id, :confirmation => '1' | ||
134 | + | ||
135 | + assert_response :redirect | ||
136 | + assert_redirected_to :action => 'index' | ||
137 | + | ||
138 | + profile.reload | ||
139 | + assert !profile.memberships.include?(community) | ||
140 | + end | ||
141 | + | ||
116 | end | 142 | end |
test/unit/profile_test.rb
@@ -456,6 +456,15 @@ class ProfileTest < Test::Unit::TestCase | @@ -456,6 +456,15 @@ class ProfileTest < Test::Unit::TestCase | ||
456 | assert_includes Enterprise.find(:all, :within => 2, :origin => [45, 45]), e | 456 | assert_includes Enterprise.find(:all, :within => 2, :origin => [45, 45]), e |
457 | end | 457 | end |
458 | 458 | ||
459 | + should 'allow to remove members' do | ||
460 | + c = Profile.create!(:name => 'my other test profile', :identifier => 'myothertestprofile') | ||
461 | + p = create_user('myothertestuser').person | ||
462 | + | ||
463 | + c.add_member(p) | ||
464 | + c.remove_member(p) | ||
465 | + assert !c.members.include?(p) | ||
466 | + end | ||
467 | + | ||
459 | private | 468 | private |
460 | 469 | ||
461 | def assert_invalid_identifier(id) | 470 | def assert_invalid_identifier(id) |
vendor/plugins/access_control/lib/acts_as_accessible.rb
@@ -19,6 +19,11 @@ class ActiveRecord::Base | @@ -19,6 +19,11 @@ class ActiveRecord::Base | ||
19 | roles.map {|role| accessor.add_role(role, self)}.any? | 19 | roles.map {|role| accessor.add_role(role, self)}.any? |
20 | end | 20 | end |
21 | 21 | ||
22 | + def disaffiliate(accessor, roles) | ||
23 | + roles = [roles] unless roles.kind_of?(Array) | ||
24 | + roles.map {|role| accessor.remove_role(role, self)}.any? | ||
25 | + end | ||
26 | + | ||
22 | def members | 27 | def members |
23 | role_assignments.map(&:accessor).uniq | 28 | role_assignments.map(&:accessor).uniq |
24 | end | 29 | end |
vendor/plugins/access_control/lib/acts_as_accessor.rb
@@ -23,7 +23,7 @@ class ActiveRecord::Base | @@ -23,7 +23,7 @@ class ActiveRecord::Base | ||
23 | false | 23 | false |
24 | end | 24 | end |
25 | end | 25 | end |
26 | - | 26 | + |
27 | def remove_role(role, resource) | 27 | def remove_role(role, resource) |
28 | return unless role | 28 | return unless role |
29 | roles_destroy = RoleAssignment.find(:all, :conditions => role_attributes(role, resource)) | 29 | roles_destroy = RoleAssignment.find(:all, :conditions => role_attributes(role, resource)) |
vendor/plugins/access_control/test/acts_as_accessible_test.rb
@@ -2,6 +2,7 @@ require 'test/unit' | @@ -2,6 +2,7 @@ require 'test/unit' | ||
2 | require File.dirname(__FILE__) + '/test_helper' | 2 | require File.dirname(__FILE__) + '/test_helper' |
3 | 3 | ||
4 | class AccessControlTest < Test::Unit::TestCase | 4 | class AccessControlTest < Test::Unit::TestCase |
5 | + | ||
5 | def test_can_have_role_in_respect_to_an_resource | 6 | def test_can_have_role_in_respect_to_an_resource |
6 | r = AccessControlTestResource.create(:name => 'bla') | 7 | r = AccessControlTestResource.create(:name => 'bla') |
7 | a = AccessControlTestAccessor.create(:name => 'ze') | 8 | a = AccessControlTestAccessor.create(:name => 'ze') |
@@ -9,4 +10,14 @@ class AccessControlTest < Test::Unit::TestCase | @@ -9,4 +10,14 @@ class AccessControlTest < Test::Unit::TestCase | ||
9 | r.affiliate(a, member_role) | 10 | r.affiliate(a, member_role) |
10 | assert a.has_permission?('bli', r) | 11 | assert a.has_permission?('bli', r) |
11 | end | 12 | end |
13 | + | ||
14 | + def test_cant_have_role_in_respect_to_an_resource | ||
15 | + r = AccessControlTestResource.create(:name => 'bla') | ||
16 | + a = AccessControlTestAccessor.create(:name => 'ze') | ||
17 | + member_role = Role.create(:name => 'member', :permissions => ['bli']) | ||
18 | + r.affiliate(a, member_role) | ||
19 | + r.disaffiliate(a, member_role) | ||
20 | + assert !a.has_permission?('bli', r) | ||
21 | + end | ||
22 | + | ||
12 | end | 23 | end |