Commit e9bc0f671e7465a565aaf75586675cc381e28ccb
Exists in
master
and in
29 other branches
Merge branch 'filter-communities' of /mnt/ebs/repositories/larissa/noosfero
Showing
6 changed files
with
98 additions
and
4 deletions
Show diff stats
app/controllers/my_profile/memberships_controller.rb
1 | class MembershipsController < MyProfileController | 1 | class MembershipsController < MyProfileController |
2 | 2 | ||
3 | protect 'manage_memberships', :profile | 3 | protect 'manage_memberships', :profile |
4 | - | 4 | + |
5 | def index | 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 | end | 16 | end |
8 | 17 | ||
9 | def new_community | 18 | def new_community |
app/models/person.rb
@@ -46,6 +46,10 @@ class Person < Profile | @@ -46,6 +46,10 @@ class Person < Profile | ||
46 | Profile.memberships_of(self) | 46 | Profile.memberships_of(self) |
47 | end | 47 | end |
48 | 48 | ||
49 | + def memberships_by_role(role) | ||
50 | + memberships.where('role_assignments.role_id = ?', role.id) | ||
51 | + end | ||
52 | + | ||
49 | has_many :friendships, :dependent => :destroy | 53 | has_many :friendships, :dependent => :destroy |
50 | has_many :friends, :class_name => 'Person', :through => :friendships | 54 | has_many :friends, :class_name => 'Person', :through => :friendships |
51 | 55 |
app/models/profile.rb
@@ -99,7 +99,6 @@ class Profile < ActiveRecord::Base | @@ -99,7 +99,6 @@ class Profile < ActiveRecord::Base | ||
99 | alias_method_chain :count, :distinct | 99 | alias_method_chain :count, :distinct |
100 | end | 100 | end |
101 | 101 | ||
102 | - | ||
103 | def members_by_role(role) | 102 | def members_by_role(role) |
104 | Person.members_of(self).all(:conditions => ['role_assignments.role_id = ?', role.id]) | 103 | Person.members_of(self).all(:conditions => ['role_assignments.role_id = ?', role.id]) |
105 | end | 104 | end |
app/views/memberships/index.rhtml
@@ -8,6 +8,19 @@ | @@ -8,6 +8,19 @@ | ||
8 | <%= button :back, _('Go back'), :controller => 'profile_editor' %> | 8 | <%= button :back, _('Go back'), :controller => 'profile_editor' %> |
9 | <% end %> | 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 | </div> | 26 | </div> |
test/functional/memberships_controller_test.rb
@@ -277,4 +277,61 @@ class MembershipsControllerTest < ActionController::TestCase | @@ -277,4 +277,61 @@ class MembershipsControllerTest < ActionController::TestCase | ||
277 | assert_tag :tag => 'a', :attributes => { :href => "/myprofile/#{c1.identifier}" } | 277 | assert_tag :tag => 'a', :attributes => { :href => "/myprofile/#{c1.identifier}" } |
278 | end | 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 | end | 337 | end |
test/unit/person_test.rb
@@ -1381,4 +1381,16 @@ class PersonTest < ActiveSupport::TestCase | @@ -1381,4 +1381,16 @@ class PersonTest < ActiveSupport::TestCase | ||
1381 | } | 1381 | } |
1382 | assert_equal deactivated, Person.deactivated | 1382 | assert_equal deactivated, Person.deactivated |
1383 | end | 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 | end | 1396 | end |