@@ -27,10 +27,20 class Principal < ActiveRecord::Base | |||||
27 | named_scope :active, :conditions => "#{Principal.table_name}.status = 1" |
|
27 | named_scope :active, :conditions => "#{Principal.table_name}.status = 1" | |
28 |
|
28 | |||
29 | named_scope :like, lambda {|q| |
|
29 | named_scope :like, lambda {|q| | |
30 | s = "%#{q.to_s.strip.downcase}%" |
|
30 | if q.blank? | |
31 | {:conditions => ["LOWER(login) LIKE :s OR LOWER(firstname) LIKE :s OR LOWER(lastname) LIKE :s OR LOWER(mail) LIKE :s", {:s => s}], |
|
31 | {} | |
32 | :order => 'type, login, lastname, firstname, mail' |
|
32 | else | |
33 | } |
|
33 | q = q.to_s.downcase | |
|
34 | pattern = "%#{q}%" | |||
|
35 | sql = "LOWER(login) LIKE :p OR LOWER(firstname) LIKE :p OR LOWER(lastname) LIKE :p OR LOWER(mail) LIKE :p" | |||
|
36 | params = {:p => pattern} | |||
|
37 | if q =~ /^(.+)\s+(.+)$/ | |||
|
38 | a, b = "#{$1}%", "#{$2}%" | |||
|
39 | sql << " OR (LOWER(firstname) LIKE :a AND LOWER(lastname) LIKE :b) OR (LOWER(firstname) LIKE :b AND LOWER(lastname) LIKE :a)" | |||
|
40 | params.merge!(:a => a, :b => b) | |||
|
41 | end | |||
|
42 | {:conditions => [sql, params]} | |||
|
43 | end | |||
34 | } |
|
44 | } | |
35 |
|
45 | |||
36 | # Principals that are members of a collection of projects |
|
46 | # Principals that are members of a collection of projects |
@@ -56,14 +56,6 class User < Principal | |||||
56 | named_scope :active, :conditions => "#{User.table_name}.status = #{STATUS_ACTIVE}" |
|
56 | named_scope :active, :conditions => "#{User.table_name}.status = #{STATUS_ACTIVE}" | |
57 | named_scope :logged, :conditions => "#{User.table_name}.status <> #{STATUS_ANONYMOUS}" |
|
57 | named_scope :logged, :conditions => "#{User.table_name}.status <> #{STATUS_ANONYMOUS}" | |
58 | named_scope :status, lambda {|arg| arg.blank? ? {} : {:conditions => {:status => arg.to_i}} } |
|
58 | named_scope :status, lambda {|arg| arg.blank? ? {} : {:conditions => {:status => arg.to_i}} } | |
59 | named_scope :like, lambda {|arg| |
|
|||
60 | if arg.blank? |
|
|||
61 | {} |
|
|||
62 | else |
|
|||
63 | pattern = "%#{arg.to_s.strip.downcase}%" |
|
|||
64 | {:conditions => ["LOWER(login) LIKE :p OR LOWER(firstname) LIKE :p OR LOWER(lastname) LIKE :p OR LOWER(mail) LIKE :p", {:p => pattern}]} |
|
|||
65 | end |
|
|||
66 | } |
|
|||
67 |
|
59 | |||
68 | acts_as_customizable |
|
60 | acts_as_customizable | |
69 |
|
61 |
@@ -45,6 +45,8 class PrincipalTest < ActiveSupport::TestCase | |||||
45 |
|
45 | |||
46 | Principal.generate!(:mail => 'mail@example.com') |
|
46 | Principal.generate!(:mail => 'mail@example.com') | |
47 | Principal.generate!(:mail => 'mail2@example.com') |
|
47 | Principal.generate!(:mail => 'mail2@example.com') | |
|
48 | ||||
|
49 | @palmer = Principal.generate!(:firstname => 'David', :lastname => 'Palmer') | |||
48 | end |
|
50 | end | |
49 |
|
51 | |||
50 | should "search login" do |
|
52 | should "search login" do | |
@@ -74,6 +76,19 class PrincipalTest < ActiveSupport::TestCase | |||||
74 | assert_equal 2, results.count |
|
76 | assert_equal 2, results.count | |
75 | assert results.all? {|u| u.mail.match(/mail/) } |
|
77 | assert results.all? {|u| u.mail.match(/mail/) } | |
76 | end |
|
78 | end | |
77 | end |
|
|||
78 |
|
79 | |||
|
80 | should "search firstname and lastname" do | |||
|
81 | results = Principal.like('david palm') | |||
|
82 | ||||
|
83 | assert_equal 1, results.count | |||
|
84 | assert_equal @palmer, results.first | |||
|
85 | end | |||
|
86 | ||||
|
87 | should "search lastname and firstname" do | |||
|
88 | results = Principal.like('palmer davi') | |||
|
89 | ||||
|
90 | assert_equal 1, results.count | |||
|
91 | assert_equal @palmer, results.first | |||
|
92 | end | |||
|
93 | end | |||
79 | end |
|
94 | end |
General Comments 0
You need to be logged in to leave comments.
Login now