From b24ad1f0bca4ea8af727ce2e3e82a516390daa41 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Wed, 7 Mar 2012 19:40:50 +0000 Subject: [PATCH] Merged r9128 from trunk. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.3-stable@9158 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/members_controller.rb | 2 +- app/models/principal.rb | 10 ++++++++++ app/views/projects/settings/_members.html.erb | 2 +- test/unit/principal_test.rb | 7 +++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index 866ddca3a..540489b22 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -96,7 +96,7 @@ class MembersController < ApplicationController end def autocomplete_for_member - @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 diff --git a/app/models/principal.rb b/app/models/principal.rb index f79b9df7a..2bf97d05c 100644 --- a/app/models/principal.rb +++ b/app/models/principal.rb @@ -32,6 +32,16 @@ class Principal < ActiveRecord::Base :order => 'type, login, lastname, firstname, mail' } } + # 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 diff --git a/app/views/projects/settings/_members.html.erb b/app/views/projects/settings/_members.html.erb index e604566d0..531a7ccbc 100644 --- a/app/views/projects/settings/_members.html.erb +++ b/app/views/projects/settings/_members.html.erb @@ -50,7 +50,7 @@ <% end %> -<% 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') %>
<% if roles.any? && principals.any? %> diff --git a/test/unit/principal_test.rb b/test/unit/principal_test.rb index 5fd10d8ed..63f00bcd9 100644 --- a/test/unit/principal_test.rb +++ b/test/unit/principal_test.rb @@ -18,6 +18,13 @@ require File.expand_path('../../test_helper', __FILE__) class PrincipalTest < ActiveSupport::TestCase + fixtures :users, :projects, :members, :member_roles + + 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