From 54a0ef949fd54689a3d58d59126441c617d0b722 Mon Sep 17 00:00:00 2001 From: Larissa Reis Date: Fri, 18 Jul 2014 00:41:30 -0300 Subject: [PATCH] invite-members: uses a scope to filter out non members of a community --- app/controllers/public/invite_controller.rb | 2 +- app/models/person.rb | 6 ++++++ test/unit/person_test.rb | 23 +++++++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/controllers/public/invite_controller.rb b/app/controllers/public/invite_controller.rb index 0e8bb65..dce32a5 100644 --- a/app/controllers/public/invite_controller.rb +++ b/app/controllers/public/invite_controller.rb @@ -78,7 +78,7 @@ class InviteController < PublicController def search_friend fields = %w[name identifier email] + plugins_options.map {|field| field[:field].to_s } - render :text => find_by_contents(:people, environment.people, params['q'], {:page => 1}, {:fields => fields, :joins => :user})[:results].select {|person| !profile.members.include?(person) }.map {|person| {:id => person.id, :name => person.name} }.to_json + render :text => find_by_contents(:people, environment.people.not_members_of(profile), params['q'], {:page => 1}, {:fields => fields, :joins => :user})[:results].map {|person| {:id => person.id, :name => person.name} }.to_json end protected diff --git a/app/models/person.rb b/app/models/person.rb index 21bc93d..8bfb12b 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -33,6 +33,12 @@ class Person < Profile { :select => 'DISTINCT profiles.*', :joins => :role_assignments, :conditions => [conditions] } } + scope :not_members_of, lambda { |resources| + resources = [resources] if !resources.kind_of?(Array) + conditions = resources.map {|resource| "role_assignments.resource_type = '#{resource.class.base_class.name}' AND role_assignments.resource_id = #{resource.id || -1}"}.join(' OR ') + { :select => 'DISTINCT profiles.*', :conditions => ['"profiles"."id" NOT IN (SELECT DISTINCT profiles.id FROM "profiles" INNER JOIN "role_assignments" ON "role_assignments"."accessor_id" = "profiles"."id" AND "role_assignments"."accessor_type" = (\'Profile\') WHERE "profiles"."type" IN (\'Person\') AND (%s))' % conditions] } + } + def has_permission_with_plugins?(permission, profile) permissions = [has_permission_without_plugins?(permission, profile)] permissions += plugins.map do |plugin| diff --git a/test/unit/person_test.rb b/test/unit/person_test.rb index d8dfa45..085587c 100644 --- a/test/unit/person_test.rb +++ b/test/unit/person_test.rb @@ -1114,6 +1114,15 @@ class PersonTest < ActiveSupport::TestCase assert_equal [person], Person.members_of(community) end + should 'return unique non-members of a community' do + member = fast_create(Person) + person = fast_create(Person) + community = fast_create(Community) + community.add_member(member) + + assert_equal (Person.all - Person.members_of(community)).sort, Person.not_members_of(community).sort + end + should 'be able to pass array to members_of' do person1 = fast_create(Person) community = fast_create(Community) @@ -1126,6 +1135,20 @@ class PersonTest < ActiveSupport::TestCase assert_includes Person.members_of([community, enterprise]), person2 end + should 'be able to pass array to not_members_of' do + person1 = fast_create(Person) + community = fast_create(Community) + community.add_member(person1) + person2 = fast_create(Person) + enterprise = fast_create(Enterprise) + enterprise.add_member(person2) + person3 = fast_create(Person) + + assert_not_includes Person.not_members_of([community, enterprise]), person1 + assert_not_includes Person.not_members_of([community, enterprise]), person2 + assert_includes Person.not_members_of([community, enterprise]), person3 + end + should 'find more active people' do Person.destroy_all p1 = fast_create(Person) -- libgit2 0.21.2