From 389f1db051b4de79bb6aa4c8d15d883668881627 Mon Sep 17 00:00:00 2001 From: Larissa Reis Date: Wed, 23 Oct 2013 13:23:10 -0300 Subject: [PATCH] Adds filter by role in memberships listing --- app/controllers/my_profile/memberships_controller.rb | 10 ++++++++-- app/models/person.rb | 4 ++++ app/models/profile.rb | 1 - app/views/memberships/index.rhtml | 15 ++++++++++++++- test/functional/memberships_controller_test.rb | 41 +++++++++++++++++++++++++++++++++++++++++ test/unit/person_test.rb | 11 +++++++++++ 6 files changed, 78 insertions(+), 4 deletions(-) diff --git a/app/controllers/my_profile/memberships_controller.rb b/app/controllers/my_profile/memberships_controller.rb index a93480f..2c93fea 100644 --- a/app/controllers/my_profile/memberships_controller.rb +++ b/app/controllers/my_profile/memberships_controller.rb @@ -1,9 +1,15 @@ class MembershipsController < MyProfileController protect 'manage_memberships', :profile - + def index - @memberships = profile.memberships + @roles = environment.roles.select{ |role| profile.role_assignments.find_by_role_id(role.id).present? } + @filter = params[:filter_type].blank? ? nil : params[:filter_type] + begin + @memberships = @filter.nil? ? profile.memberships : profile.memberships_by_role(environment.roles.find(@filter)) + rescue ActiveRecord::RecordNotFound + @memberships = [] + end end def new_community diff --git a/app/models/person.rb b/app/models/person.rb index 8729394..91fcebf 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -46,6 +46,10 @@ class Person < Profile Profile.memberships_of(self) end + def memberships_by_role(role) + Profile.memberships_of(self).all(:conditions => ['role_assignments.role_id = ?', role.id]) + end + has_many :friendships, :dependent => :destroy has_many :friends, :class_name => 'Person', :through => :friendships diff --git a/app/models/profile.rb b/app/models/profile.rb index 6ceabcd..ab3e84c 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -98,7 +98,6 @@ class Profile < ActiveRecord::Base alias_method_chain :count, :distinct end - def members_by_role(role) Person.members_of(self).all(:conditions => ['role_assignments.role_id = ?', role.id]) end diff --git a/app/views/memberships/index.rhtml b/app/views/memberships/index.rhtml index 66aeeb6..a0ce746 100644 --- a/app/views/memberships/index.rhtml +++ b/app/views/memberships/index.rhtml @@ -8,6 +8,19 @@ <%= button :back, _('Go back'), :controller => 'profile_editor' %> <% end %> -<%= render :partial => 'shared/list_groups', :locals => {:groups => @memberships} %> +<% type_collection = [[nil, _('All')]] %> +<% type_collection += @roles.sort_by {|role| role.id}.map{|r| ["#{r.id}", r.name]} %> + +

+ <%= labelled_select(_('Filter')+': ', :filter_type, :first, :last, @filter, type_collection, :onchange => 'document.location.href = "?filter_type="+this.value')%> +

+ +<% if @memberships.empty? %> +

+ <%= _('No groups to list') %> +

+<% else %> + <%= render :partial => 'shared/list_groups', :locals => {:groups => @memberships} %> +<% end %> diff --git a/test/functional/memberships_controller_test.rb b/test/functional/memberships_controller_test.rb index 766312c..7bc3003 100644 --- a/test/functional/memberships_controller_test.rb +++ b/test/functional/memberships_controller_test.rb @@ -245,4 +245,45 @@ class MembershipsControllerTest < ActionController::TestCase assert_tag :tag => 'input', :attributes => {:id => 'community_plugin2', :type => 'hidden', :value => 'Plugin 2'} end + should 'filter memberships by role' do + c1 = fast_create(Community, :name => 'First community') + c2 = fast_create(Community, :name => 'Second community') + + role = Role.create!(:name => 'special_role', :permissions => ['edit_profile'], :environment => c2.environment) + + person = Person['testuser'] + c1.add_member(person) + c2.add_member(person) + + person.add_role(role, c2) + + login_as('testuser') + get :index, :profile => 'testuser' + + assert_includes assigns(:memberships), c1 + assert_includes assigns(:memberships), c2 + + post :index, :profile => 'testuser', :filter_type => role.id + + assert_not_includes assigns(:memberships), c1 + assert_includes assigns(:memberships), c2 + end + + should 'only show roles the user has' do + c1 = fast_create(Community, :name => 'First community') + + role1 = Role.create!(:name => 'normal_role', :permissions => ['edit_profile'], :environment => c1.environment) + role2 = Role.create!(:name => 'special_role', :permissions => ['edit_profile'], :environment => c1.environment) + + person = Person['testuser'] + c1.add_member(person) + person.add_role(role1, c1) + + login_as('testuser') + get :index, :profile => 'testuser' + + assert_includes assigns(:roles), role1 + assert_not_includes assigns(:roles), role2 + end + end diff --git a/test/unit/person_test.rb b/test/unit/person_test.rb index d8e2ee5..de8aa48 100644 --- a/test/unit/person_test.rb +++ b/test/unit/person_test.rb @@ -1335,4 +1335,15 @@ class PersonTest < ActiveSupport::TestCase assert_includes non_abusers, not_abuser end + should 'be able to retrieve memberships by role person has' do + user = create_user('john').person + c1 = fast_create(Community, :name => 'a-community') + c2 = fast_create(Community, :name => 'other-community') + member_role = Role.create(:name => 'somerandomrole') + user.affiliate(c2, member_role) + + assert_includes user.memberships_by_role(member_role), c2 + assert_not_includes user.memberships_by_role(member_role), c1 + end + end -- libgit2 0.21.2