]> source.dussan.org Git - redmine.git/commitdiff
Makes user autocompleters work with firstname and lastname.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 14 Feb 2012 16:29:48 +0000 (16:29 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 14 Feb 2012 16:29:48 +0000 (16:29 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@8875 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/principal.rb
app/models/user.rb
test/unit/principal_test.rb

index 5c4e17a8bcb991f4ae757bf2b274f635345834f3..9955501e3f20fae20c044325cfadb636cea6d92e 100644 (file)
@@ -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
index 02aecd34193c01eb69279e638b82908c87f47ef5..9b0ab81104a05583b7da4708f460ee7216f7ee83 100644 (file)
@@ -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
 
index 694f7e02758eade7a72e63dd8fcfc8a20b08298b..c33286208158c32514a46b42d301331a712f939a 100644 (file)
@@ -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