Commit 389f1db051b4de79bb6aa4c8d15d883668881627

Authored by Larissa Reis
1 parent 103b7ebe

Adds filter by role in memberships listing

app/controllers/my_profile/memberships_controller.rb
1 1 class MembershipsController < MyProfileController
2 2  
3 3 protect 'manage_memberships', :profile
4   -
  4 +
5 5 def index
6   - @memberships = profile.memberships
  6 + @roles = environment.roles.select{ |role| profile.role_assignments.find_by_role_id(role.id).present? }
  7 + @filter = params[:filter_type].blank? ? nil : params[:filter_type]
  8 + begin
  9 + @memberships = @filter.nil? ? profile.memberships : profile.memberships_by_role(environment.roles.find(@filter))
  10 + rescue ActiveRecord::RecordNotFound
  11 + @memberships = []
  12 + end
7 13 end
8 14  
9 15 def new_community
... ...
app/models/person.rb
... ... @@ -46,6 +46,10 @@ class Person &lt; Profile
46 46 Profile.memberships_of(self)
47 47 end
48 48  
  49 + def memberships_by_role(role)
  50 + Profile.memberships_of(self).all(:conditions => ['role_assignments.role_id = ?', role.id])
  51 + end
  52 +
49 53 has_many :friendships, :dependent => :destroy
50 54 has_many :friends, :class_name => 'Person', :through => :friendships
51 55  
... ...
app/models/profile.rb
... ... @@ -98,7 +98,6 @@ class Profile &lt; ActiveRecord::Base
98 98 alias_method_chain :count, :distinct
99 99 end
100 100  
101   -
102 101 def members_by_role(role)
103 102 Person.members_of(self).all(:conditions => ['role_assignments.role_id = ?', role.id])
104 103 end
... ...
app/views/memberships/index.rhtml
... ... @@ -8,6 +8,19 @@
8 8 <%= button :back, _('Go back'), :controller => 'profile_editor' %>
9 9 <% end %>
10 10  
11   -<%= render :partial => 'shared/list_groups', :locals => {:groups => @memberships} %>
  11 +<% type_collection = [[nil, _('All')]] %>
  12 +<% type_collection += @roles.sort_by {|role| role.id}.map{|r| ["#{r.id}", r.name]} %>
  13 +
  14 +<p>
  15 + <%= labelled_select(_('Filter')+': ', :filter_type, :first, :last, @filter, type_collection, :onchange => 'document.location.href = "?filter_type="+this.value')%>
  16 +</p>
  17 +
  18 +<% if @memberships.empty? %>
  19 + <p>
  20 + <em><%= _('No groups to list') %></em>
  21 + </p>
  22 +<% else %>
  23 + <%= render :partial => 'shared/list_groups', :locals => {:groups => @memberships} %>
  24 +<% end %>
12 25  
13 26 </div>
... ...
test/functional/memberships_controller_test.rb
... ... @@ -245,4 +245,45 @@ class MembershipsControllerTest &lt; ActionController::TestCase
245 245 assert_tag :tag => 'input', :attributes => {:id => 'community_plugin2', :type => 'hidden', :value => 'Plugin 2'}
246 246 end
247 247  
  248 + should 'filter memberships by role' do
  249 + c1 = fast_create(Community, :name => 'First community')
  250 + c2 = fast_create(Community, :name => 'Second community')
  251 +
  252 + role = Role.create!(:name => 'special_role', :permissions => ['edit_profile'], :environment => c2.environment)
  253 +
  254 + person = Person['testuser']
  255 + c1.add_member(person)
  256 + c2.add_member(person)
  257 +
  258 + person.add_role(role, c2)
  259 +
  260 + login_as('testuser')
  261 + get :index, :profile => 'testuser'
  262 +
  263 + assert_includes assigns(:memberships), c1
  264 + assert_includes assigns(:memberships), c2
  265 +
  266 + post :index, :profile => 'testuser', :filter_type => role.id
  267 +
  268 + assert_not_includes assigns(:memberships), c1
  269 + assert_includes assigns(:memberships), c2
  270 + end
  271 +
  272 + should 'only show roles the user has' do
  273 + c1 = fast_create(Community, :name => 'First community')
  274 +
  275 + role1 = Role.create!(:name => 'normal_role', :permissions => ['edit_profile'], :environment => c1.environment)
  276 + role2 = Role.create!(:name => 'special_role', :permissions => ['edit_profile'], :environment => c1.environment)
  277 +
  278 + person = Person['testuser']
  279 + c1.add_member(person)
  280 + person.add_role(role1, c1)
  281 +
  282 + login_as('testuser')
  283 + get :index, :profile => 'testuser'
  284 +
  285 + assert_includes assigns(:roles), role1
  286 + assert_not_includes assigns(:roles), role2
  287 + end
  288 +
248 289 end
... ...
test/unit/person_test.rb
... ... @@ -1335,4 +1335,15 @@ class PersonTest &lt; ActiveSupport::TestCase
1335 1335 assert_includes non_abusers, not_abuser
1336 1336 end
1337 1337  
  1338 + should 'be able to retrieve memberships by role person has' do
  1339 + user = create_user('john').person
  1340 + c1 = fast_create(Community, :name => 'a-community')
  1341 + c2 = fast_create(Community, :name => 'other-community')
  1342 + member_role = Role.create(:name => 'somerandomrole')
  1343 + user.affiliate(c2, member_role)
  1344 +
  1345 + assert_includes user.memberships_by_role(member_role), c2
  1346 + assert_not_includes user.memberships_by_role(member_role), c1
  1347 + end
  1348 +
1338 1349 end
... ...