2009-09-20 18:06:57 +04:00
# Redmine - project management software
2011-07-23 22:18:13 +04:00
# Copyright (C) 2006-2011 Jean-Philippe Lang
2009-09-20 18:06:57 +04:00
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
2011-08-31 12:46:55 +04:00
#
2009-09-20 18:06:57 +04:00
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
2011-08-31 12:46:55 +04:00
#
2009-09-20 18:06:57 +04:00
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Principal < ActiveRecord :: Base
2012-04-27 20:28:35 +04:00
self . table_name = " #{ table_name_prefix } users #{ table_name_suffix } "
2009-09-20 18:06:57 +04:00
has_many :members , :foreign_key = > 'user_id' , :dependent = > :destroy
has_many :memberships , :class_name = > 'Member' , :foreign_key = > 'user_id' , :include = > [ :project , :roles ] , :conditions = > " #{ Project . table_name } .status= #{ Project :: STATUS_ACTIVE } " , :order = > " #{ Project . table_name } .name "
has_many :projects , :through = > :memberships
2011-07-23 22:18:13 +04:00
has_many :issue_categories , :foreign_key = > 'assigned_to_id' , :dependent = > :nullify
2009-09-20 18:06:57 +04:00
# Groups and active users
2012-04-27 03:51:10 +04:00
scope :active , :conditions = > " #{ Principal . table_name } .status = 1 "
2011-08-31 12:46:55 +04:00
2012-04-27 03:51:10 +04:00
scope :like , lambda { | q |
2012-02-14 20:29:48 +04:00
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
2009-09-20 18:06:57 +04:00
}
2011-08-31 12:46:55 +04:00
2012-02-02 00:07:01 +04:00
# Principals that are members of a collection of projects
2012-04-27 03:51:10 +04:00
scope :member_of , lambda { | projects |
2012-03-06 22:37:30 +04:00
projects = [ projects ] unless projects . is_a? ( Array )
2012-02-02 00:07:01 +04:00
if projects . empty?
{ :conditions = > " 1=0 " }
else
ids = projects . map ( & :id )
{ :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
}
2012-03-06 22:37:30 +04:00
# Principals that are not members of projects
2012-04-27 03:51:10 +04:00
scope :not_member_of , lambda { | projects |
2012-03-06 22:37:30 +04:00
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
}
2012-02-02 00:07:01 +04:00
2010-01-30 13:24:23 +03:00
before_create :set_default_empty_values
2010-09-10 22:46:23 +04:00
def name ( formatter = nil )
to_s
end
2009-09-20 18:06:57 +04:00
def <=> ( principal )
2012-02-12 18:54:30 +04:00
if principal . nil?
- 1
elsif self . class . name == principal . class . name
2009-12-12 14:20:26 +03:00
self . to_s . downcase < = > principal . to_s . downcase
else
# groups after users
principal . class . name < = > self . class . name
end
2009-09-20 18:06:57 +04:00
end
2011-08-31 12:46:55 +04:00
2010-01-30 13:24:23 +03:00
protected
2011-08-31 12:46:55 +04:00
2010-01-30 13:24:23 +03:00
# Make sure we don't try to insert NULL values (see #4632)
def set_default_empty_values
self . login || = ''
self . hashed_password || = ''
self . firstname || = ''
self . lastname || = ''
self . mail || = ''
true
end
2009-09-20 18:06:57 +04:00
end