Commit ab84311147c5e50565175375dbe75cdf2577e08a
Exists in
master
and in
29 other branches
Merge remote-tracking branch 'larissa/filter-communities' into filter-communities
Conflicts: test/functional/memberships_controller_test.rb test/unit/person_test.rb
Showing
6 changed files
with
79 additions
and
4 deletions
Show diff stats
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 < 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
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,45 @@ class MembershipsControllerTest < 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 | + | |
| 280 | 321 | end | ... | ... |
test/unit/person_test.rb
| ... | ... | @@ -1381,4 +1381,16 @@ class PersonTest < 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 | ... | ... |