2009-09-20 18:06:57 +04:00
# Redmine - project management software
2012-05-05 16:56:53 +04:00
# Copyright (C) 2006-2012 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
2012-12-08 14:44:42 +04:00
# Account statuses
STATUS_ANONYMOUS = 0
STATUS_ACTIVE = 1
STATUS_REGISTERED = 2
STATUS_LOCKED = 3
2009-09-20 18:06:57 +04:00
has_many :members , :foreign_key = > 'user_id' , :dependent = > :destroy
2012-06-25 21:49:35 +04:00
has_many :memberships , :class_name = > 'Member' , :foreign_key = > 'user_id' , :include = > [ :project , :roles ] , :conditions = > " #{ Project . table_name } .status<> #{ Project :: STATUS_ARCHIVED } " , :order = > " #{ Project . table_name } .name "
2009-09-20 18:06:57 +04:00
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-12-07 21:59:20 +04:00
scope :active , lambda { where ( " #{ 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-11-14 02:03:42 +04:00
q = q . to_s
2012-02-14 20:29:48 +04:00
if q . blank?
2012-11-14 02:03:42 +04:00
where ( { } )
2012-02-14 20:29:48 +04:00
else
pattern = " % #{ q } % "
2012-11-14 02:13:39 +04:00
sql = %w( login firstname lastname mail ) . map { | column | " LOWER( #{ table_name } . #{ column } ) LIKE LOWER(:p) " } . join ( " OR " )
2012-02-14 20:29:48 +04:00
params = { :p = > pattern }
if q =~ / ^(.+) \ s+(.+)$ /
a , b = " #{ $1 } % " , " #{ $2 } % "
2012-11-14 02:13:39 +04:00
sql << " OR (LOWER( #{ table_name } .firstname) LIKE LOWER(:a) AND LOWER( #{ table_name } .lastname) LIKE LOWER(:b)) "
sql << " OR (LOWER( #{ table_name } .firstname) LIKE LOWER(:b) AND LOWER( #{ table_name } .lastname) LIKE LOWER(:a)) "
2012-02-14 20:29:48 +04:00
params . merge! ( :a = > a , :b = > b )
end
2012-11-14 02:03:42 +04:00
where ( sql , params )
2012-02-14 20:29:48 +04:00
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?
2012-11-14 02:15:47 +04:00
where ( " 1=0 " )
2012-02-02 00:07:01 +04:00
else
ids = projects . map ( & :id )
2012-11-14 02:15:47 +04:00
where ( " #{ Principal . table_name } .status = 1 AND #{ Principal . table_name } .id IN (SELECT DISTINCT user_id FROM #{ Member . table_name } WHERE project_id IN (?)) " , ids )
2012-02-02 00:07:01 +04:00
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?
2012-11-14 02:15:47 +04:00
where ( " 1=0 " )
2012-03-06 22:37:30 +04:00
else
ids = projects . map ( & :id )
2012-11-14 02:15:47 +04:00
where ( " #{ Principal . table_name } .id NOT IN (SELECT DISTINCT user_id FROM #{ Member . table_name } WHERE project_id IN (?)) " , ids )
2012-03-06 22:37:30 +04:00
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