git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@9128 e93f8b46-1217-0410-a6f0-8f06a7374b81tags/1.4.0
@@ -135,7 +135,7 @@ class MembersController < ApplicationController | |||
end | |||
def autocomplete | |||
@principals = Principal.active.like(params[:q]).find(:all, :limit => 100) - @project.principals | |||
@principals = Principal.active.not_member_of(@project).like(params[:q]).all(:limit => 100) | |||
render :layout => false | |||
end | |||
@@ -45,6 +45,7 @@ class Principal < ActiveRecord::Base | |||
# Principals that are members of a collection of projects | |||
named_scope :member_of, lambda {|projects| | |||
projects = [projects] unless projects.is_a?(Array) | |||
if projects.empty? | |||
{:conditions => "1=0"} | |||
else | |||
@@ -52,6 +53,16 @@ class Principal < ActiveRecord::Base | |||
{:conditions => ["#{Principal.table_name}.status = 1 AND #{Principal.table_name}.id IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids]} | |||
end | |||
} | |||
# Principals that are not members of projects | |||
named_scope :not_member_of, lambda {|projects| | |||
projects = [projects] unless projects.is_a?(Array) | |||
if projects.empty? | |||
{:conditions => "1=0"} | |||
else | |||
ids = projects.map(&:id) | |||
{:conditions => ["#{Principal.table_name}.id NOT IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids]} | |||
end | |||
} | |||
before_create :set_default_empty_values | |||
@@ -55,7 +55,7 @@ | |||
<% end %> | |||
</div> | |||
<% principals = Principal.active.find(:all, :limit => 100, :order => 'type, login, lastname ASC') - @project.principals %> | |||
<% principals = Principal.active.not_member_of(@project).all(:limit => 100, :order => 'type, login, lastname ASC') %> | |||
<div class="splitcontentright"> | |||
<% if roles.any? && principals.any? %> |
@@ -18,6 +18,7 @@ | |||
require File.expand_path('../../test_helper', __FILE__) | |||
class PrincipalTest < ActiveSupport::TestCase | |||
fixtures :users, :projects, :members, :member_roles | |||
def test_active_scope_should_return_groups_and_active_users | |||
result = Principal.active.all | |||
@@ -32,6 +33,12 @@ class PrincipalTest < ActiveSupport::TestCase | |||
assert_equal projects.map(&:principals).flatten.sort, Principal.member_of(projects).sort | |||
end | |||
def test_not_member_of_scope_should_return_users_that_have_no_memberships | |||
projects = Project.find_all_by_id(1, 2) | |||
expected = (Principal.all - projects.map(&:memberships).flatten.map(&:principal)).sort | |||
assert_equal expected, Principal.not_member_of(projects).sort | |||
end | |||
context "#like" do | |||
setup do | |||
Principal.generate!(:login => 'login') |