2009-09-20 16:06:57 +02:00
# Redmine - project management software
2011-07-23 20:18:13 +02:00
# Copyright (C) 2006-2011 Jean-Philippe Lang
2009-09-20 16:06:57 +02: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 10:46:55 +02:00
#
2009-09-20 16:06:57 +02: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 10:46:55 +02:00
#
2009-09-20 16:06:57 +02: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
2010-04-17 14:14:52 +02:00
set_table_name " #{ table_name_prefix } users #{ table_name_suffix } "
2009-09-20 16:06:57 +02: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 20:18:13 +02:00
has_many :issue_categories , :foreign_key = > 'assigned_to_id' , :dependent = > :nullify
2009-09-20 16:06:57 +02:00
# Groups and active users
2012-02-01 20:35:49 +01:00
named_scope :active , :conditions = > " #{ Principal . table_name } .status = 1 "
2011-08-31 10:46:55 +02:00
named_scope :like , lambda { | q |
2009-09-20 16:06:57 +02:00
s = " % #{ q . to_s . strip . downcase } % "
2009-12-12 07:18:45 +01:00
{ :conditions = > [ " LOWER(login) LIKE :s OR LOWER(firstname) LIKE :s OR LOWER(lastname) LIKE :s OR LOWER(mail) LIKE :s " , { :s = > s } ] ,
2009-12-12 07:18:40 +01:00
:order = > 'type, login, lastname, firstname, mail'
2009-09-20 16:06:57 +02:00
}
}
2011-08-31 10:46:55 +02:00
2012-02-01 21:07:01 +01:00
# Principals that are members of a collection of projects
named_scope :member_of , lambda { | projects |
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
}
2010-01-30 11:24:23 +01:00
before_create :set_default_empty_values
2010-09-10 20:46:23 +02:00
def name ( formatter = nil )
to_s
end
2009-09-20 16:06:57 +02:00
def <=> ( principal )
2009-12-12 12:20:26 +01:00
if self . class . name == principal . class . name
self . to_s . downcase < = > principal . to_s . downcase
else
# groups after users
principal . class . name < = > self . class . name
end
2009-09-20 16:06:57 +02:00
end
2011-08-31 10:46:55 +02:00
2010-01-30 11:24:23 +01:00
protected
2011-08-31 10:46:55 +02:00
2010-01-30 11:24:23 +01: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 16:06:57 +02:00
end