Mercurial > hg > soundsoftware-site
comparison .svn/pristine/80/80976803aa4ae03da071ef1a25ad25828bf8c96b.svn-base @ 1517:dffacf8a6908 redmine-2.5
Update to Redmine SVN revision 13367 on 2.5-stable branch
author | Chris Cannam |
---|---|
date | Tue, 09 Sep 2014 09:29:00 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1516:b450a9d58aed | 1517:dffacf8a6908 |
---|---|
1 # Redmine - project management software | |
2 # Copyright (C) 2006-2014 Jean-Philippe Lang | |
3 # | |
4 # This program is free software; you can redistribute it and/or | |
5 # modify it under the terms of the GNU General Public License | |
6 # as published by the Free Software Foundation; either version 2 | |
7 # of the License, or (at your option) any later version. | |
8 # | |
9 # This program is distributed in the hope that it will be useful, | |
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 # GNU General Public License for more details. | |
13 # | |
14 # You should have received a copy of the GNU General Public License | |
15 # along with this program; if not, write to the Free Software | |
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
17 | |
18 class Principal < ActiveRecord::Base | |
19 self.table_name = "#{table_name_prefix}users#{table_name_suffix}" | |
20 | |
21 # Account statuses | |
22 STATUS_ANONYMOUS = 0 | |
23 STATUS_ACTIVE = 1 | |
24 STATUS_REGISTERED = 2 | |
25 STATUS_LOCKED = 3 | |
26 | |
27 has_many :members, :foreign_key => 'user_id', :dependent => :destroy | |
28 has_many :memberships, :class_name => 'Member', | |
29 :foreign_key => 'user_id', | |
30 :include => [:project, :roles], | |
31 :conditions => "#{Project.table_name}.status<>#{Project::STATUS_ARCHIVED}", | |
32 :order => "#{Project.table_name}.name" | |
33 has_many :projects, :through => :memberships | |
34 has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify | |
35 | |
36 # Groups and active users | |
37 scope :active, lambda { where(:status => STATUS_ACTIVE) } | |
38 | |
39 scope :like, lambda {|q| | |
40 q = q.to_s | |
41 if q.blank? | |
42 where({}) | |
43 else | |
44 pattern = "%#{q}%" | |
45 sql = %w(login firstname lastname mail).map {|column| "LOWER(#{table_name}.#{column}) LIKE LOWER(:p)"}.join(" OR ") | |
46 params = {:p => pattern} | |
47 if q =~ /^(.+)\s+(.+)$/ | |
48 a, b = "#{$1}%", "#{$2}%" | |
49 sql << " OR (LOWER(#{table_name}.firstname) LIKE LOWER(:a) AND LOWER(#{table_name}.lastname) LIKE LOWER(:b))" | |
50 sql << " OR (LOWER(#{table_name}.firstname) LIKE LOWER(:b) AND LOWER(#{table_name}.lastname) LIKE LOWER(:a))" | |
51 params.merge!(:a => a, :b => b) | |
52 end | |
53 where(sql, params) | |
54 end | |
55 } | |
56 | |
57 # Principals that are members of a collection of projects | |
58 scope :member_of, lambda {|projects| | |
59 projects = [projects] unless projects.is_a?(Array) | |
60 if projects.empty? | |
61 where("1=0") | |
62 else | |
63 ids = projects.map(&:id) | |
64 active.uniq.joins(:members).where("#{Member.table_name}.project_id IN (?)", ids) | |
65 end | |
66 } | |
67 # Principals that are not members of projects | |
68 scope :not_member_of, lambda {|projects| | |
69 projects = [projects] unless projects.is_a?(Array) | |
70 if projects.empty? | |
71 where("1=0") | |
72 else | |
73 ids = projects.map(&:id) | |
74 where("#{Principal.table_name}.id NOT IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids) | |
75 end | |
76 } | |
77 scope :sorted, lambda { order(*Principal.fields_for_order_statement)} | |
78 | |
79 before_create :set_default_empty_values | |
80 | |
81 def name(formatter = nil) | |
82 to_s | |
83 end | |
84 | |
85 def <=>(principal) | |
86 if principal.nil? | |
87 -1 | |
88 elsif self.class.name == principal.class.name | |
89 self.to_s.downcase <=> principal.to_s.downcase | |
90 else | |
91 # groups after users | |
92 principal.class.name <=> self.class.name | |
93 end | |
94 end | |
95 | |
96 # Returns an array of fields names than can be used to make an order statement for principals. | |
97 # Users are sorted before Groups. | |
98 # Examples: | |
99 def self.fields_for_order_statement(table=nil) | |
100 table ||= table_name | |
101 columns = ['type DESC'] + (User.name_formatter[:order] - ['id']) + ['lastname', 'id'] | |
102 columns.uniq.map {|field| "#{table}.#{field}"} | |
103 end | |
104 | |
105 protected | |
106 | |
107 # Make sure we don't try to insert NULL values (see #4632) | |
108 def set_default_empty_values | |
109 self.login ||= '' | |
110 self.hashed_password ||= '' | |
111 self.firstname ||= '' | |
112 self.lastname ||= '' | |
113 self.mail ||= '' | |
114 true | |
115 end | |
116 end |