From f86661c9ecd8b52d233a2436cfedbedc0057f59c Mon Sep 17 00:00:00 2001 From: JoenioCosta Date: Tue, 6 May 2008 23:10:10 +0000 Subject: [PATCH] ActionItem384: add link Leave to enterprise/community --- app/controllers/my_profile/memberships_controller.rb | 8 ++++++++ app/models/profile.rb | 4 ++++ app/views/memberships/index.rhtml | 3 ++- app/views/memberships/leave.rhtml | 11 +++++++++++ test/functional/memberships_controller_test.rb | 26 ++++++++++++++++++++++++++ test/unit/profile_test.rb | 9 +++++++++ vendor/plugins/access_control/lib/acts_as_accessible.rb | 5 +++++ vendor/plugins/access_control/lib/acts_as_accessor.rb | 2 +- vendor/plugins/access_control/test/acts_as_accessible_test.rb | 11 +++++++++++ 9 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 app/views/memberships/leave.rhtml diff --git a/app/controllers/my_profile/memberships_controller.rb b/app/controllers/my_profile/memberships_controller.rb index 47589e5..7719736 100644 --- a/app/controllers/my_profile/memberships_controller.rb +++ b/app/controllers/my_profile/memberships_controller.rb @@ -14,6 +14,14 @@ class MembershipsController < MyProfileController end end + def leave + @to_leave = Profile.find(params[:id]) + if request.post? && params[:confirmation] + @to_leave.remove_member(profile) + redirect_to :action => 'index' + end + end + def new_community @community = Community.new(params[:community]) if request.post? diff --git a/app/models/profile.rb b/app/models/profile.rb index 5ee56bf..e442b10 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -281,6 +281,10 @@ class Profile < ActiveRecord::Base def add_member(person) self.affiliate(person, Profile::Roles.member) end + + def remove_member(person) + self.disaffiliate(person, Profile::Roles.member) + end # adds a person as administrator os this profile def add_admin(person) diff --git a/app/views/memberships/index.rhtml b/app/views/memberships/index.rhtml index 5fae171..864b23b 100644 --- a/app/views/memberships/index.rhtml +++ b/app/views/memberships/index.rhtml @@ -14,7 +14,8 @@ <%= _('Description: %s') % membership.description + '
' if membership.kind_of?(Community) %> <%= _('Members: %s') % membership.members.size.to_s %>
<%= _('Created at: %s') % show_date(membership.created_at) %>
- <%= _('Actions: %s') % link_to(_('Manage'), membership.admin_url) %>
+ <%= _('Actions: %s') % link_to(_('Manage'), membership.admin_url) + ', ' + link_to(_('Leave'), { :profile => profile.identifier, :controller => 'memberships', :action => 'leave', :id => membership.id }) %>
+ <% end %> diff --git a/app/views/memberships/leave.rhtml b/app/views/memberships/leave.rhtml new file mode 100644 index 0000000..2bff7d8 --- /dev/null +++ b/app/views/memberships/leave.rhtml @@ -0,0 +1,11 @@ +

<%= _('Leaving %s') % @to_leave.name %>

+ +

+<%= _('Are you sure you want to leave %s?') % @to_leave.name %> +

+ +<% form_tag do %> + <%= hidden_field_tag(:confirmation, 1) %> + <%= submit_button(:ok, _("Yes, I want to leave.") % @to_leave.name) %> + <%= button(:cancel, _("No, I don't want."), :action => 'index') %> +<% end %> diff --git a/test/functional/memberships_controller_test.rb b/test/functional/memberships_controller_test.rb index 0084ad6..310b1ca 100644 --- a/test/functional/memberships_controller_test.rb +++ b/test/functional/memberships_controller_test.rb @@ -113,4 +113,30 @@ class MembershipsControllerTest < Test::Unit::TestCase assert_no_tag :tag => 'td', :content => /Description:/ end + should 'show link to leave from community' do + community = Community.create!(:name => 'my test community', :description => 'description test') + community.add_member(profile) + get :index, :profile => profile.identifier + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/#{profile.identifier}/memberships/leave/#{community.id}" }, :content => 'Leave' + end + + should 'present confirmation before leaving a profile' do + community = Community.create!(:name => 'my test community') + get :leave, :profile => profile.identifier, :id => community.id + + assert_response :success + assert_template 'leave' + end + + should 'actually leave profile' do + community = Community.create!(:name => 'my test community') + post :leave, :profile => profile.identifier, :id => community.id, :confirmation => '1' + + assert_response :redirect + assert_redirected_to :action => 'index' + + profile.reload + assert !profile.memberships.include?(community) + end + end diff --git a/test/unit/profile_test.rb b/test/unit/profile_test.rb index daeaa48..9453b27 100644 --- a/test/unit/profile_test.rb +++ b/test/unit/profile_test.rb @@ -456,6 +456,15 @@ class ProfileTest < Test::Unit::TestCase assert_includes Enterprise.find(:all, :within => 2, :origin => [45, 45]), e end + should 'allow to remove members' do + c = Profile.create!(:name => 'my other test profile', :identifier => 'myothertestprofile') + p = create_user('myothertestuser').person + + c.add_member(p) + c.remove_member(p) + assert !c.members.include?(p) + end + private def assert_invalid_identifier(id) diff --git a/vendor/plugins/access_control/lib/acts_as_accessible.rb b/vendor/plugins/access_control/lib/acts_as_accessible.rb index 22b2cc9..ce16497 100644 --- a/vendor/plugins/access_control/lib/acts_as_accessible.rb +++ b/vendor/plugins/access_control/lib/acts_as_accessible.rb @@ -19,6 +19,11 @@ class ActiveRecord::Base roles.map {|role| accessor.add_role(role, self)}.any? end + def disaffiliate(accessor, roles) + roles = [roles] unless roles.kind_of?(Array) + roles.map {|role| accessor.remove_role(role, self)}.any? + end + def members role_assignments.map(&:accessor).uniq end diff --git a/vendor/plugins/access_control/lib/acts_as_accessor.rb b/vendor/plugins/access_control/lib/acts_as_accessor.rb index 0ab513e..81cf859 100644 --- a/vendor/plugins/access_control/lib/acts_as_accessor.rb +++ b/vendor/plugins/access_control/lib/acts_as_accessor.rb @@ -23,7 +23,7 @@ class ActiveRecord::Base false end end - + def remove_role(role, resource) return unless role roles_destroy = RoleAssignment.find(:all, :conditions => role_attributes(role, resource)) diff --git a/vendor/plugins/access_control/test/acts_as_accessible_test.rb b/vendor/plugins/access_control/test/acts_as_accessible_test.rb index 7237c36..df3f3ec 100644 --- a/vendor/plugins/access_control/test/acts_as_accessible_test.rb +++ b/vendor/plugins/access_control/test/acts_as_accessible_test.rb @@ -2,6 +2,7 @@ require 'test/unit' require File.dirname(__FILE__) + '/test_helper' class AccessControlTest < Test::Unit::TestCase + def test_can_have_role_in_respect_to_an_resource r = AccessControlTestResource.create(:name => 'bla') a = AccessControlTestAccessor.create(:name => 'ze') @@ -9,4 +10,14 @@ class AccessControlTest < Test::Unit::TestCase r.affiliate(a, member_role) assert a.has_permission?('bli', r) end + + def test_cant_have_role_in_respect_to_an_resource + r = AccessControlTestResource.create(:name => 'bla') + a = AccessControlTestAccessor.create(:name => 'ze') + member_role = Role.create(:name => 'member', :permissions => ['bli']) + r.affiliate(a, member_role) + r.disaffiliate(a, member_role) + assert !a.has_permission?('bli', r) + end + end -- libgit2 0.21.2