Commit f86661c9ecd8b52d233a2436cfedbedc0057f59c

Authored by JoenioCosta
1 parent cd4a78e9

ActionItem384: add link Leave to enterprise/community

git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1780 3f533792-8f58-4932-b0fe-aaf55b0a4547
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 %>
app/views/memberships/leave.rhtml 0 → 100644
@@ -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 &lt; Test::Unit::TestCase @@ -113,4 +113,30 @@ class MembershipsControllerTest &lt; 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 &lt; Test::Unit::TestCase @@ -456,6 +456,15 @@ class ProfileTest &lt; 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 &#39;test/unit&#39; @@ -2,6 +2,7 @@ require &#39;test/unit&#39;
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 &lt; Test::Unit::TestCase @@ -9,4 +10,14 @@ class AccessControlTest &lt; 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