From 39b80911325c8b0d5e4570b2eab2b11048c6362e Mon Sep 17 00:00:00 2001 From: Victor Costa Date: Mon, 6 Jan 2014 13:36:30 -0300 Subject: [PATCH] Add a way to filter by role in members block --- plugins/people_block/controllers/people_block_plugin_profile_controller.rb | 19 +++++++++++++++++++ plugins/people_block/lib/ext/person.rb | 9 +++++++++ plugins/people_block/lib/members_block.rb | 18 +++++++++++++++--- plugins/people_block/test/functional/people_block_plugin_environment_design_controller_test.rb | 7 ------- plugins/people_block/test/functional/people_block_plugin_profile_controller_test.rb | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ plugins/people_block/test/unit/members_block_test.rb | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------- plugins/people_block/views/people_block_plugin.rhtml | 5 +++++ 7 files changed, 231 insertions(+), 24 deletions(-) create mode 100644 plugins/people_block/controllers/people_block_plugin_profile_controller.rb create mode 100644 plugins/people_block/lib/ext/person.rb create mode 100644 plugins/people_block/test/functional/people_block_plugin_profile_controller_test.rb diff --git a/plugins/people_block/controllers/people_block_plugin_profile_controller.rb b/plugins/people_block/controllers/people_block_plugin_profile_controller.rb new file mode 100644 index 0000000..dd3ee0e --- /dev/null +++ b/plugins/people_block/controllers/people_block_plugin_profile_controller.rb @@ -0,0 +1,19 @@ +class PeopleBlockPluginProfileController < ProfileController + + append_view_path File.join(File.dirname(__FILE__) + '/../views') + + def members + if is_cache_expired?(profile.members_cache_key(params)) + if(params[:role_key]) + role = Role.find_by_key_and_environment_id(params[:role_key], profile.environment) + @members = profile.members.with_role(role.id).includes(relations_to_include).paginate(:per_page => members_per_page, :page => params[:npage]) + @members_title = role.name + else + @members = profile.members.includes(relations_to_include).paginate(:per_page => members_per_page, :page => params[:npage]) + @members_title = 'members' + end + end + render "profile/members" + end + +end diff --git a/plugins/people_block/lib/ext/person.rb b/plugins/people_block/lib/ext/person.rb new file mode 100644 index 0000000..daf4f03 --- /dev/null +++ b/plugins/people_block/lib/ext/person.rb @@ -0,0 +1,9 @@ +require_dependency 'person' + +class Person + + named_scope :with_role, lambda { |role_id| + { :select => 'DISTINCT profiles.*', :joins => :role_assignments, :conditions => ["role_assignments.role_id = #{role_id}"] } + } + +end diff --git a/plugins/people_block/lib/members_block.rb b/plugins/people_block/lib/members_block.rb index 7fc33b2..e3a36bf 100644 --- a/plugins/people_block/lib/members_block.rb +++ b/plugins/people_block/lib/members_block.rb @@ -1,5 +1,7 @@ class MembersBlock < PeopleBlockBase + settings_items :visible_role, :type => :string, :default => nil + def self.description _('Members') end @@ -9,19 +11,29 @@ class MembersBlock < PeopleBlockBase end def default_title - _('{#} Members') + title = role ? role.name : 'Members' + _('{#} %s') % title end def profiles - owner.members + role ? owner.members.with_role(role.id) : owner.members end def footer owner = self.owner + role_key = visible_role lambda do - link_to _('View all'), :profile => owner.identifier, :controller => 'profile', :action => 'members' + link_to _('View all'), :profile => owner.identifier, :controller => 'people_block_plugin_profile', :action => 'members', :role_key => role_key end end + def role + visible_role && !visible_role.empty? ? Role.find_by_key_and_environment_id(visible_role, owner.environment) : nil + end + + def roles + Profile::Roles.organization_member_roles(owner.environment) + end + end diff --git a/plugins/people_block/test/functional/people_block_plugin_environment_design_controller_test.rb b/plugins/people_block/test/functional/people_block_plugin_environment_design_controller_test.rb index aa212c1..66629db 100644 --- a/plugins/people_block/test/functional/people_block_plugin_environment_design_controller_test.rb +++ b/plugins/people_block/test/functional/people_block_plugin_environment_design_controller_test.rb @@ -12,13 +12,6 @@ class EnvironmentDesignControllerTest < ActionController::TestCase Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([PeopleBlockPlugin.new]) end - #attr_accessor :environment, :block - - #should 'display *block people-block* class at design blocks page' do - #get :index - #assert_tag :div, :attributes => {:class => 'block people-block'} - #end - should 'be able to edit PeopleBlock' do login_as(create_admin_user(Environment.default)) b = PeopleBlock.create! diff --git a/plugins/people_block/test/functional/people_block_plugin_profile_controller_test.rb b/plugins/people_block/test/functional/people_block_plugin_profile_controller_test.rb new file mode 100644 index 0000000..cd5ae8b --- /dev/null +++ b/plugins/people_block/test/functional/people_block_plugin_profile_controller_test.rb @@ -0,0 +1,76 @@ +require File.dirname(__FILE__) + '/../test_helper' +require File.dirname(__FILE__) + '/../../controllers/people_block_plugin_profile_controller' + + +# Re-raise errors caught by the controller. +class PeopleBlockPluginProfileController; def rescue_action(e) raise e end; end + +class PeopleBlockPluginProfileControllerTest < ActionController::TestCase + + def setup + @controller = PeopleBlockPluginProfileController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new + + @profile = fast_create(Community) + + @environment = @profile.environment + @environment.enabled_plugins = ['PeopleBlockPlugin'] + @environment.save! + + MembersBlock.delete_all + @block = MembersBlock.new + @block.box = @profile.boxes.first + @block.save! + + @admin = create_user('adminprofile').person + @member = create_user('memberprofile').person + @moderator = create_user('moderatorprofile').person + @profile.add_moderator(@moderator) + @profile.add_member(@member) + @profile.add_admin(@admin) + end + + attr_accessor :profile, :block, :admin, :member, :moderator + + should 'list members without role_key' do + get :members, :profile => profile.identifier + assert_response :success + assert_template 'members' + assert_equivalent [@admin, @member, @moderator], assigns(:members) + assert_match /adminprofile/, @response.body + assert_match /memberprofile/, @response.body + assert_match /moderatorprofile/, @response.body + end + + should 'list members with role_key=nil' do + get :members, :profile => profile.identifier, :role_key => nil + assert_response :success + assert_template 'members' + assert_equivalent [@admin, @member, @moderator], assigns(:members) + assert_match /adminprofile/, @response.body + assert_match /memberprofile/, @response.body + assert_match /moderatorprofile/, @response.body + end + + should 'list members only' do + get :members, :profile => profile.identifier, :role_key => Profile::Roles.member(profile.environment.id).key + assert_response :success + assert_template 'members' + assert_equal [@member], assigns(:members) + assert_no_match /adminprofile/, @response.body + assert_match /memberprofile/, @response.body + assert_no_match /moderatorprofile/, @response.body + end + + should 'list moderators only' do + get :members, :profile => profile.identifier, :role_key => Profile::Roles.moderator(profile.environment.id).key + assert_response :success + assert_template 'members' + assert_equal [@moderator], assigns(:members) + assert_no_match /adminprofile/, @response.body + assert_no_match /memberprofile/, @response.body + assert_match /moderatorprofile/, @response.body + end + +end diff --git a/plugins/people_block/test/unit/members_block_test.rb b/plugins/people_block/test/unit/members_block_test.rb index 24689f1..f3c6355 100644 --- a/plugins/people_block/test/unit/members_block_test.rb +++ b/plugins/people_block/test/unit/members_block_test.rb @@ -110,20 +110,6 @@ class MembersBlockTest < ActiveSupport::TestCase assert_match(/#{person2.name}/, content) end - - should 'link to "all members"' do - community = fast_create(Community) - - block = MembersBlock.new - block.expects(:owner).returns(community).at_least_once - - expects(:_).with('View all').returns('View all') - expects(:link_to).with('View all', :profile => community.identifier, :controller => 'profile', :action => 'members').returns('link-to-members') - - assert_equal 'link-to-members', instance_eval(&block.footer) - end - - should 'count number of public and private members' do owner = fast_create(Community) private_p = fast_create(Person, {:public_profile => false}) @@ -153,6 +139,113 @@ class MembersBlockTest < ActiveSupport::TestCase assert_equal 1, block.profile_count end + should 'provide link to members page without a visible_role selected' do + profile = create_user('mytestuser').person + block = MembersBlock.new + block.box = profile.boxes.first + block.save! + + expects(:_).with('View all').returns('View all') + expects(:link_to).with('View all' , :profile => 'mytestuser', :controller => 'people_block_plugin_profile', :action => 'members', :role_key => block.visible_role).returns('link-to-members') + + assert_equal 'link-to-members', instance_eval(&block.footer) + end + + should 'provide link to members page with a selected role' do + profile = create_user('mytestuser').person + block = MembersBlock.new + block.box = profile.boxes.first + block.visible_role = 'profile_member' + block.save! + + expects(:_).with('View all').returns('View all') + expects(:link_to).with('View all' , :profile => 'mytestuser', :controller => 'people_block_plugin_profile', :action => 'members', :role_key => block.visible_role).returns('link-to-members') + + assert_equal 'link-to-members', instance_eval(&block.footer) + end + + should 'provide a role to be displayed (and default to nil)' do + env = fast_create(Environment) + env.boxes << Box.new + block = MembersBlock.new + assert_equal nil, block.visible_role + env.boxes.first.blocks << block + block.visible_role = 'profile_member' + block.save! + assert_equal 'profile_member', block.visible_role + end + + should 'list all members' do + env = fast_create(Environment) + env.boxes << Box.new + profile1 = fast_create(Person, :environment_id => env.id) + profile2 = fast_create(Person, :environment_id => env.id) + + block = MembersBlock.new + owner = fast_create(Community) + block.stubs(:owner).returns(owner) + env.boxes.first.blocks << block + block.save! + + owner.add_member profile1 + owner.add_member profile2 + profiles = block.profiles + + assert_includes profiles, profile1 + assert_includes profiles, profile2 + end + + should 'list only profiles with moderator role' do + env = fast_create(Environment) + env.boxes << Box.new + profile1 = fast_create(Person, :environment_id => env.id) + profile2 = fast_create(Person, :environment_id => env.id) + + block = MembersBlock.new + owner = fast_create(Community) + block.visible_role = Profile::Roles.moderator(owner.environment.id).key + block.stubs(:owner).returns(owner) + env.boxes.first.blocks << block + block.save! + + owner.add_member profile2 + owner.add_moderator profile1 + profiles = block.profiles + + assert_includes profiles, profile1 + assert_not_includes profiles, profile2 + end + + should 'list only profiles with member role' do + env = fast_create(Environment) + env.boxes << Box.new + profile1 = fast_create(Person, :environment_id => env.id) + profile2 = fast_create(Person, :environment_id => env.id) + + block = MembersBlock.new + owner = fast_create(Community) + block.visible_role = Profile::Roles.member(owner.environment.id).key + block.stubs(:owner).returns(owner) + env.boxes.first.blocks << block + block.save! + + owner.add_member profile2 + owner.add_moderator profile1 + profiles = block.profiles + + assert_not_includes profiles, profile1 + assert_includes profiles, profile2 + end + + should 'list available roles' do + block = MembersBlock.new + owner = fast_create(Community) + block.stubs(:owner).returns(owner) + assert_includes block.roles, Profile::Roles.member(owner.environment.id) + assert_includes block.roles, Profile::Roles.admin(owner.environment.id) + assert_includes block.roles, Profile::Roles.moderator(owner.environment.id) + end + protected include NoosferoTestHelper diff --git a/plugins/people_block/views/people_block_plugin.rhtml b/plugins/people_block/views/people_block_plugin.rhtml index 72cea62..c0e3c9f 100644 --- a/plugins/people_block/views/people_block_plugin.rhtml +++ b/plugins/people_block/views/people_block_plugin.rhtml @@ -18,4 +18,9 @@ <%= text_field_tag 'block[address]', @block.address %>

+ <% if @block.kind_of?(MembersBlock) %> + <%= labelled_form_field _('Filter by role:'), '' %> + <%= select_tag 'block[visible_role]', options_for_select(@block.roles.map{|r| [r.name, r.key]}.insert(0,''), @block.visible_role) %> + <% end %> + -- libgit2 0.21.2