Commit e9bc0f671e7465a565aaf75586675cc381e28ccb

Authored by Rodrigo Souto
2 parents 49568a03 4ee05c1c

Merge branch 'filter-communities' of /mnt/ebs/repositories/larissa/noosfero

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 do |role|
  7 + ra = profile.role_assignments.find_by_role_id(role.id)
  8 + ra.present? && ra.resource_type == 'Profile'
  9 + end
  10 + @filter = params[:filter_type].blank? ? nil : params[:filter_type]
  11 + begin
  12 + @memberships = @filter.nil? ? profile.memberships : profile.memberships_by_role(environment.roles.find(@filter))
  13 + rescue ActiveRecord::RecordNotFound
  14 + @memberships = []
  15 + end
7 16 end
8 17  
9 18 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 + memberships.where('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
... ... @@ -99,7 +99,6 @@ class Profile &lt; ActiveRecord::Base
99 99 alias_method_chain :count, :distinct
100 100 end
101 101  
102   -
103 102 def members_by_role(role)
104 103 Person.members_of(self).all(:conditions => ['role_assignments.role_id = ?', role.id])
105 104 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
... ... @@ -277,4 +277,61 @@ class MembershipsControllerTest &lt; ActionController::TestCase
277 277 assert_tag :tag => 'a', :attributes => { :href => "/myprofile/#{c1.identifier}" }
278 278 end
279 279  
  280 + should 'filter memberships by role' do
  281 + c1 = fast_create(Community, :name => 'First community')
  282 + c2 = fast_create(Community, :name => 'Second community')
  283 +
  284 + role = Role.create!(:name => 'special_role', :permissions => ['edit_profile'], :environment => c2.environment)
  285 +
  286 + person = Person['testuser']
  287 + c1.add_member(person)
  288 + c2.add_member(person)
  289 +
  290 + person.add_role(role, c2)
  291 +
  292 + login_as('testuser')
  293 + get :index, :profile => 'testuser'
  294 +
  295 + assert_includes assigns(:memberships), c1
  296 + assert_includes assigns(:memberships), c2
  297 +
  298 + get :index, :profile => 'testuser', :filter_type => role.id
  299 +
  300 + assert_not_includes assigns(:memberships), c1
  301 + assert_includes assigns(:memberships), c2
  302 + end
  303 +
  304 + should 'only show roles the user has' do
  305 + c1 = fast_create(Community, :name => 'First community')
  306 +
  307 + role1 = Role.create!(:name => 'normal_role', :permissions => ['edit_profile'], :environment => c1.environment)
  308 + role2 = Role.create!(:name => 'special_role', :permissions => ['edit_profile'], :environment => c1.environment)
  309 +
  310 + person = Person['testuser']
  311 + c1.add_member(person)
  312 + person.add_role(role1, c1)
  313 +
  314 + login_as('testuser')
  315 + get :index, :profile => 'testuser'
  316 +
  317 + assert_includes assigns(:roles), role1
  318 + assert_not_includes assigns(:roles), role2
  319 + end
  320 +
  321 + should 'only show roles related to profiles' do
  322 + c1 = fast_create(Community, :name => 'First community')
  323 + role1 = Role.create!(:name => 'profile_role', :permissions => ['edit_profile'], :environment => c1.environment)
  324 + role2 = Role.create!(:name => 'environment_role', :permissions => ['edit_profile'], :environment => c1.environment)
  325 +
  326 + person = Person['testuser']
  327 + c1.add_member(person)
  328 + person.add_role(role2, c1.environment)
  329 + person.add_role(role1, c1)
  330 +
  331 + login_as('testuser')
  332 + get :index, :profile => 'testuser'
  333 +
  334 + assert_includes assigns(:roles), role1
  335 + assert_not_includes assigns(:roles), role2
  336 + end
280 337 end
... ...
test/unit/person_test.rb
... ... @@ -1381,4 +1381,16 @@ class PersonTest &lt; ActiveSupport::TestCase
1381 1381 }
1382 1382 assert_equal deactivated, Person.deactivated
1383 1383 end
  1384 +
  1385 + should 'be able to retrieve memberships by role person has' do
  1386 + user = create_user('john').person
  1387 + c1 = fast_create(Community, :name => 'a-community')
  1388 + c2 = fast_create(Community, :name => 'other-community')
  1389 + member_role = Role.create(:name => 'somerandomrole')
  1390 + user.affiliate(c2, member_role)
  1391 +
  1392 + assert_includes user.memberships_by_role(member_role), c2
  1393 + assert_not_includes user.memberships_by_role(member_role), c1
  1394 + end
  1395 +
1384 1396 end
... ...