To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / app / models / principal.rb @ 1566:ac2e4a54a6a6
History | View | Annotate | Download (3.88 KB)
| 1 | 0:513646585e45 | Chris | # Redmine - project management software
|
|---|---|---|---|
| 2 | 1494:e248c7af89ec | Chris | # Copyright (C) 2006-2014 Jean-Philippe Lang
|
| 3 | 0:513646585e45 | Chris | #
|
| 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 | 909:cbb26bc654de | Chris | #
|
| 9 | 0:513646585e45 | Chris | # 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 | 909:cbb26bc654de | Chris | #
|
| 14 | 0:513646585e45 | Chris | # 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 | 1115:433d4f72a19b | Chris | self.table_name = "#{table_name_prefix}users#{table_name_suffix}" |
| 20 | 0:513646585e45 | Chris | |
| 21 | 1464:261b3d9a4903 | Chris | # Account statuses
|
| 22 | STATUS_ANONYMOUS = 0 |
||
| 23 | STATUS_ACTIVE = 1 |
||
| 24 | STATUS_REGISTERED = 2 |
||
| 25 | STATUS_LOCKED = 3 |
||
| 26 | |||
| 27 | 0:513646585e45 | Chris | has_many :members, :foreign_key => 'user_id', :dependent => :destroy |
| 28 | 1517:dffacf8a6908 | Chris | 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 | 0:513646585e45 | Chris | has_many :projects, :through => :memberships |
| 34 | 909:cbb26bc654de | Chris | has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify |
| 35 | 0:513646585e45 | Chris | |
| 36 | # Groups and active users
|
||
| 37 | 1464:261b3d9a4903 | Chris | scope :active, lambda { where(:status => STATUS_ACTIVE) } |
| 38 | 909:cbb26bc654de | Chris | |
| 39 | 1115:433d4f72a19b | Chris | 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 | 1464:261b3d9a4903 | Chris | active.uniq.joins(:members).where("#{Member.table_name}.project_id IN (?)", ids) |
| 65 | 1115:433d4f72a19b | Chris | end
|
| 66 | 0:513646585e45 | Chris | } |
| 67 | 929:5f33065ddc4b | Chris | # Principals that are not members of projects
|
| 68 | 1115:433d4f72a19b | Chris | scope :not_member_of, lambda {|projects|
|
| 69 | 929:5f33065ddc4b | Chris | projects = [projects] unless projects.is_a?(Array) |
| 70 | if projects.empty?
|
||
| 71 | 1115:433d4f72a19b | Chris | where("1=0")
|
| 72 | 929:5f33065ddc4b | Chris | else
|
| 73 | ids = projects.map(&:id)
|
||
| 74 | 1115:433d4f72a19b | Chris | where("#{Principal.table_name}.id NOT IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids)
|
| 75 | 929:5f33065ddc4b | Chris | end
|
| 76 | } |
||
| 77 | 1464:261b3d9a4903 | Chris | scope :sorted, lambda { order(*Principal.fields_for_order_statement)} |
| 78 | 909:cbb26bc654de | Chris | |
| 79 | 0:513646585e45 | Chris | before_create :set_default_empty_values
|
| 80 | 22:40f7cfd4df19 | chris | |
| 81 | def name(formatter = nil) |
||
| 82 | to_s |
||
| 83 | end
|
||
| 84 | |||
| 85 | 0:513646585e45 | Chris | def <=>(principal) |
| 86 | 929:5f33065ddc4b | Chris | if principal.nil?
|
| 87 | -1
|
||
| 88 | elsif self.class.name == principal.class.name |
||
| 89 | 0:513646585e45 | Chris | 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 | 909:cbb26bc654de | Chris | |
| 96 | 1464:261b3d9a4903 | Chris | # 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 | 0:513646585e45 | Chris | protected |
| 106 | 909:cbb26bc654de | Chris | |
| 107 | 0:513646585e45 | Chris | # 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 |