git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@8875 e93f8b46-1217-0410-a6f0-8f06a7374b81tags/1.4.0
@@ -27,10 +27,20 @@ class Principal < ActiveRecord::Base | |||
named_scope :active, :conditions => "#{Principal.table_name}.status = 1" | |||
named_scope :like, lambda {|q| | |||
s = "%#{q.to_s.strip.downcase}%" | |||
{:conditions => ["LOWER(login) LIKE :s OR LOWER(firstname) LIKE :s OR LOWER(lastname) LIKE :s OR LOWER(mail) LIKE :s", {:s => s}], | |||
:order => 'type, login, lastname, firstname, mail' | |||
} | |||
if q.blank? | |||
{} | |||
else | |||
q = q.to_s.downcase | |||
pattern = "%#{q}%" | |||
sql = "LOWER(login) LIKE :p OR LOWER(firstname) LIKE :p OR LOWER(lastname) LIKE :p OR LOWER(mail) LIKE :p" | |||
params = {:p => pattern} | |||
if q =~ /^(.+)\s+(.+)$/ | |||
a, b = "#{$1}%", "#{$2}%" | |||
sql << " OR (LOWER(firstname) LIKE :a AND LOWER(lastname) LIKE :b) OR (LOWER(firstname) LIKE :b AND LOWER(lastname) LIKE :a)" | |||
params.merge!(:a => a, :b => b) | |||
end | |||
{:conditions => [sql, params]} | |||
end | |||
} | |||
# Principals that are members of a collection of projects |
@@ -56,14 +56,6 @@ class User < Principal | |||
named_scope :active, :conditions => "#{User.table_name}.status = #{STATUS_ACTIVE}" | |||
named_scope :logged, :conditions => "#{User.table_name}.status <> #{STATUS_ANONYMOUS}" | |||
named_scope :status, lambda {|arg| arg.blank? ? {} : {:conditions => {:status => arg.to_i}} } | |||
named_scope :like, lambda {|arg| | |||
if arg.blank? | |||
{} | |||
else | |||
pattern = "%#{arg.to_s.strip.downcase}%" | |||
{:conditions => ["LOWER(login) LIKE :p OR LOWER(firstname) LIKE :p OR LOWER(lastname) LIKE :p OR LOWER(mail) LIKE :p", {:p => pattern}]} | |||
end | |||
} | |||
acts_as_customizable | |||
@@ -45,6 +45,8 @@ class PrincipalTest < ActiveSupport::TestCase | |||
Principal.generate!(:mail => 'mail@example.com') | |||
Principal.generate!(:mail => 'mail2@example.com') | |||
@palmer = Principal.generate!(:firstname => 'David', :lastname => 'Palmer') | |||
end | |||
should "search login" do | |||
@@ -74,6 +76,19 @@ class PrincipalTest < ActiveSupport::TestCase | |||
assert_equal 2, results.count | |||
assert results.all? {|u| u.mail.match(/mail/) } | |||
end | |||
end | |||
should "search firstname and lastname" do | |||
results = Principal.like('david palm') | |||
assert_equal 1, results.count | |||
assert_equal @palmer, results.first | |||
end | |||
should "search lastname and firstname" do | |||
results = Principal.like('palmer davi') | |||
assert_equal 1, results.count | |||
assert_equal @palmer, results.first | |||
end | |||
end | |||
end |