Commit 39b80911325c8b0d5e4570b2eab2b11048c6362e

Authored by Victor Costa
1 parent d4f19d98

Add a way to filter by role in members block

plugins/people_block/controllers/people_block_plugin_profile_controller.rb 0 → 100644
@@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
  1 +class PeopleBlockPluginProfileController < ProfileController
  2 +
  3 + append_view_path File.join(File.dirname(__FILE__) + '/../views')
  4 +
  5 + def members
  6 + if is_cache_expired?(profile.members_cache_key(params))
  7 + if(params[:role_key])
  8 + role = Role.find_by_key_and_environment_id(params[:role_key], profile.environment)
  9 + @members = profile.members.with_role(role.id).includes(relations_to_include).paginate(:per_page => members_per_page, :page => params[:npage])
  10 + @members_title = role.name
  11 + else
  12 + @members = profile.members.includes(relations_to_include).paginate(:per_page => members_per_page, :page => params[:npage])
  13 + @members_title = 'members'
  14 + end
  15 + end
  16 + render "profile/members"
  17 + end
  18 +
  19 +end
plugins/people_block/lib/ext/person.rb 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +require_dependency 'person'
  2 +
  3 +class Person
  4 +
  5 + named_scope :with_role, lambda { |role_id|
  6 + { :select => 'DISTINCT profiles.*', :joins => :role_assignments, :conditions => ["role_assignments.role_id = #{role_id}"] }
  7 + }
  8 +
  9 +end
plugins/people_block/lib/members_block.rb
1 class MembersBlock < PeopleBlockBase 1 class MembersBlock < PeopleBlockBase
2 2
  3 + settings_items :visible_role, :type => :string, :default => nil
  4 +
3 def self.description 5 def self.description
4 _('Members') 6 _('Members')
5 end 7 end
@@ -9,19 +11,29 @@ class MembersBlock &lt; PeopleBlockBase @@ -9,19 +11,29 @@ class MembersBlock &lt; PeopleBlockBase
9 end 11 end
10 12
11 def default_title 13 def default_title
12 - _('{#} Members') 14 + title = role ? role.name : 'Members'
  15 + _('{#} %s') % title
13 end 16 end
14 17
15 def profiles 18 def profiles
16 - owner.members 19 + role ? owner.members.with_role(role.id) : owner.members
17 end 20 end
18 21
19 def footer 22 def footer
20 owner = self.owner 23 owner = self.owner
  24 + role_key = visible_role
21 lambda do 25 lambda do
22 - link_to _('View all'), :profile => owner.identifier, :controller => 'profile', :action => 'members' 26 + link_to _('View all'), :profile => owner.identifier, :controller => 'people_block_plugin_profile', :action => 'members', :role_key => role_key
23 end 27 end
24 end 28 end
25 29
  30 + def role
  31 + visible_role && !visible_role.empty? ? Role.find_by_key_and_environment_id(visible_role, owner.environment) : nil
  32 + end
  33 +
  34 + def roles
  35 + Profile::Roles.organization_member_roles(owner.environment)
  36 + end
  37 +
26 end 38 end
27 39
plugins/people_block/test/functional/people_block_plugin_environment_design_controller_test.rb
@@ -12,13 +12,6 @@ class EnvironmentDesignControllerTest &lt; ActionController::TestCase @@ -12,13 +12,6 @@ class EnvironmentDesignControllerTest &lt; ActionController::TestCase
12 Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([PeopleBlockPlugin.new]) 12 Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([PeopleBlockPlugin.new])
13 end 13 end
14 14
15 - #attr_accessor :environment, :block  
16 -  
17 - #should 'display *block people-block* class at design blocks page' do  
18 - #get :index  
19 - #assert_tag :div, :attributes => {:class => 'block people-block'}  
20 - #end  
21 -  
22 should 'be able to edit PeopleBlock' do 15 should 'be able to edit PeopleBlock' do
23 login_as(create_admin_user(Environment.default)) 16 login_as(create_admin_user(Environment.default))
24 b = PeopleBlock.create! 17 b = PeopleBlock.create!
plugins/people_block/test/functional/people_block_plugin_profile_controller_test.rb 0 → 100644
@@ -0,0 +1,76 @@ @@ -0,0 +1,76 @@
  1 +require File.dirname(__FILE__) + '/../test_helper'
  2 +require File.dirname(__FILE__) + '/../../controllers/people_block_plugin_profile_controller'
  3 +
  4 +
  5 +# Re-raise errors caught by the controller.
  6 +class PeopleBlockPluginProfileController; def rescue_action(e) raise e end; end
  7 +
  8 +class PeopleBlockPluginProfileControllerTest < ActionController::TestCase
  9 +
  10 + def setup
  11 + @controller = PeopleBlockPluginProfileController.new
  12 + @request = ActionController::TestRequest.new
  13 + @response = ActionController::TestResponse.new
  14 +
  15 + @profile = fast_create(Community)
  16 +
  17 + @environment = @profile.environment
  18 + @environment.enabled_plugins = ['PeopleBlockPlugin']
  19 + @environment.save!
  20 +
  21 + MembersBlock.delete_all
  22 + @block = MembersBlock.new
  23 + @block.box = @profile.boxes.first
  24 + @block.save!
  25 +
  26 + @admin = create_user('adminprofile').person
  27 + @member = create_user('memberprofile').person
  28 + @moderator = create_user('moderatorprofile').person
  29 + @profile.add_moderator(@moderator)
  30 + @profile.add_member(@member)
  31 + @profile.add_admin(@admin)
  32 + end
  33 +
  34 + attr_accessor :profile, :block, :admin, :member, :moderator
  35 +
  36 + should 'list members without role_key' do
  37 + get :members, :profile => profile.identifier
  38 + assert_response :success
  39 + assert_template 'members'
  40 + assert_equivalent [@admin, @member, @moderator], assigns(:members)
  41 + assert_match /adminprofile/, @response.body
  42 + assert_match /memberprofile/, @response.body
  43 + assert_match /moderatorprofile/, @response.body
  44 + end
  45 +
  46 + should 'list members with role_key=nil' do
  47 + get :members, :profile => profile.identifier, :role_key => nil
  48 + assert_response :success
  49 + assert_template 'members'
  50 + assert_equivalent [@admin, @member, @moderator], assigns(:members)
  51 + assert_match /adminprofile/, @response.body
  52 + assert_match /memberprofile/, @response.body
  53 + assert_match /moderatorprofile/, @response.body
  54 + end
  55 +
  56 + should 'list members only' do
  57 + get :members, :profile => profile.identifier, :role_key => Profile::Roles.member(profile.environment.id).key
  58 + assert_response :success
  59 + assert_template 'members'
  60 + assert_equal [@member], assigns(:members)
  61 + assert_no_match /adminprofile/, @response.body
  62 + assert_match /memberprofile/, @response.body
  63 + assert_no_match /moderatorprofile/, @response.body
  64 + end
  65 +
  66 + should 'list moderators only' do
  67 + get :members, :profile => profile.identifier, :role_key => Profile::Roles.moderator(profile.environment.id).key
  68 + assert_response :success
  69 + assert_template 'members'
  70 + assert_equal [@moderator], assigns(:members)
  71 + assert_no_match /adminprofile/, @response.body
  72 + assert_no_match /memberprofile/, @response.body
  73 + assert_match /moderatorprofile/, @response.body
  74 + end
  75 +
  76 +end
plugins/people_block/test/unit/members_block_test.rb
@@ -110,20 +110,6 @@ class MembersBlockTest &lt; ActiveSupport::TestCase @@ -110,20 +110,6 @@ class MembersBlockTest &lt; ActiveSupport::TestCase
110 assert_match(/#{person2.name}/, content) 110 assert_match(/#{person2.name}/, content)
111 end 111 end
112 112
113 -  
114 - should 'link to "all members"' do  
115 - community = fast_create(Community)  
116 -  
117 - block = MembersBlock.new  
118 - block.expects(:owner).returns(community).at_least_once  
119 -  
120 - expects(:_).with('View all').returns('View all')  
121 - expects(:link_to).with('View all', :profile => community.identifier, :controller => 'profile', :action => 'members').returns('link-to-members')  
122 -  
123 - assert_equal 'link-to-members', instance_eval(&block.footer)  
124 - end  
125 -  
126 -  
127 should 'count number of public and private members' do 113 should 'count number of public and private members' do
128 owner = fast_create(Community) 114 owner = fast_create(Community)
129 private_p = fast_create(Person, {:public_profile => false}) 115 private_p = fast_create(Person, {:public_profile => false})
@@ -153,6 +139,113 @@ class MembersBlockTest &lt; ActiveSupport::TestCase @@ -153,6 +139,113 @@ class MembersBlockTest &lt; ActiveSupport::TestCase
153 assert_equal 1, block.profile_count 139 assert_equal 1, block.profile_count
154 end 140 end
155 141
  142 + should 'provide link to members page without a visible_role selected' do
  143 + profile = create_user('mytestuser').person
  144 + block = MembersBlock.new
  145 + block.box = profile.boxes.first
  146 + block.save!
  147 +
  148 + expects(:_).with('View all').returns('View all')
  149 + expects(:link_to).with('View all' , :profile => 'mytestuser', :controller => 'people_block_plugin_profile', :action => 'members', :role_key => block.visible_role).returns('link-to-members')
  150 +
  151 + assert_equal 'link-to-members', instance_eval(&block.footer)
  152 + end
  153 +
  154 + should 'provide link to members page with a selected role' do
  155 + profile = create_user('mytestuser').person
  156 + block = MembersBlock.new
  157 + block.box = profile.boxes.first
  158 + block.visible_role = 'profile_member'
  159 + block.save!
  160 +
  161 + expects(:_).with('View all').returns('View all')
  162 + expects(:link_to).with('View all' , :profile => 'mytestuser', :controller => 'people_block_plugin_profile', :action => 'members', :role_key => block.visible_role).returns('link-to-members')
  163 +
  164 + assert_equal 'link-to-members', instance_eval(&block.footer)
  165 + end
  166 +
  167 + should 'provide a role to be displayed (and default to nil)' do
  168 + env = fast_create(Environment)
  169 + env.boxes << Box.new
  170 + block = MembersBlock.new
  171 + assert_equal nil, block.visible_role
  172 + env.boxes.first.blocks << block
  173 + block.visible_role = 'profile_member'
  174 + block.save!
  175 + assert_equal 'profile_member', block.visible_role
  176 + end
  177 +
  178 + should 'list all members' do
  179 + env = fast_create(Environment)
  180 + env.boxes << Box.new
  181 + profile1 = fast_create(Person, :environment_id => env.id)
  182 + profile2 = fast_create(Person, :environment_id => env.id)
  183 +
  184 + block = MembersBlock.new
  185 + owner = fast_create(Community)
  186 + block.stubs(:owner).returns(owner)
  187 + env.boxes.first.blocks << block
  188 + block.save!
  189 +
  190 + owner.add_member profile1
  191 + owner.add_member profile2
  192 + profiles = block.profiles
  193 +
  194 + assert_includes profiles, profile1
  195 + assert_includes profiles, profile2
  196 + end
  197 +
  198 + should 'list only profiles with moderator role' do
  199 + env = fast_create(Environment)
  200 + env.boxes << Box.new
  201 + profile1 = fast_create(Person, :environment_id => env.id)
  202 + profile2 = fast_create(Person, :environment_id => env.id)
  203 +
  204 + block = MembersBlock.new
  205 + owner = fast_create(Community)
  206 + block.visible_role = Profile::Roles.moderator(owner.environment.id).key
  207 + block.stubs(:owner).returns(owner)
  208 + env.boxes.first.blocks << block
  209 + block.save!
  210 +
  211 + owner.add_member profile2
  212 + owner.add_moderator profile1
  213 + profiles = block.profiles
  214 +
  215 + assert_includes profiles, profile1
  216 + assert_not_includes profiles, profile2
  217 + end
  218 +
  219 + should 'list only profiles with member role' do
  220 + env = fast_create(Environment)
  221 + env.boxes << Box.new
  222 + profile1 = fast_create(Person, :environment_id => env.id)
  223 + profile2 = fast_create(Person, :environment_id => env.id)
  224 +
  225 + block = MembersBlock.new
  226 + owner = fast_create(Community)
  227 + block.visible_role = Profile::Roles.member(owner.environment.id).key
  228 + block.stubs(:owner).returns(owner)
  229 + env.boxes.first.blocks << block
  230 + block.save!
  231 +
  232 + owner.add_member profile2
  233 + owner.add_moderator profile1
  234 + profiles = block.profiles
  235 +
  236 + assert_not_includes profiles, profile1
  237 + assert_includes profiles, profile2
  238 + end
  239 +
  240 + should 'list available roles' do
  241 + block = MembersBlock.new
  242 + owner = fast_create(Community)
  243 + block.stubs(:owner).returns(owner)
  244 + assert_includes block.roles, Profile::Roles.member(owner.environment.id)
  245 + assert_includes block.roles, Profile::Roles.admin(owner.environment.id)
  246 + assert_includes block.roles, Profile::Roles.moderator(owner.environment.id)
  247 + end
  248 +
156 protected 249 protected
157 include NoosferoTestHelper 250 include NoosferoTestHelper
158 251
plugins/people_block/views/people_block_plugin.rhtml
@@ -18,4 +18,9 @@ @@ -18,4 +18,9 @@
18 <%= text_field_tag 'block[address]', @block.address %> 18 <%= text_field_tag 'block[address]', @block.address %>
19 </p> 19 </p>
20 20
  21 + <% if @block.kind_of?(MembersBlock) %>
  22 + <%= labelled_form_field _('Filter by role:'), '' %>
  23 + <%= select_tag 'block[visible_role]', options_for_select(@block.roles.map{|r| [r.name, r.key]}.insert(0,''), @block.visible_role) %>
  24 + <% end %>
  25 +
21 </div> 26 </div>