user.rb 4.24 KB
Newer Older
gitlabhq's avatar
gitlabhq committed
1
class User < ActiveRecord::Base
2

3 4
  include Account

5
  devise :database_authenticatable, :token_authenticatable, :lockable,
Valery Sizov's avatar
Valery Sizov committed
6
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable
gitlabhq's avatar
gitlabhq committed
7

8
  attr_accessible :email, :password, :password_confirmation, :remember_me, :bio,
9
                  :name, :projects_limit, :skype, :linkedin, :twitter, :dark_scheme,
10 11 12
                  :theme_id, :force_random_password

  attr_accessor :force_random_password
gitlabhq's avatar
gitlabhq committed
13 14 15

  has_many :users_projects, :dependent => :destroy
  has_many :projects, :through => :users_projects
16
  has_many :my_own_projects, :class_name => "Project", :foreign_key => :owner_id
gitlabhq's avatar
gitlabhq committed
17
  has_many :keys, :dependent => :destroy
18

19
  has_many :recent_events,
20 21 22 23
    :class_name => "Event",
    :foreign_key => :author_id,
    :order => "id DESC"

gitlabhq's avatar
gitlabhq committed
24 25 26 27
  has_many :issues,
    :foreign_key => :author_id,
    :dependent => :destroy

28 29 30 31
  has_many :notes,
    :foreign_key => :author_id,
    :dependent => :destroy

gitlabhq's avatar
gitlabhq committed
32 33 34 35 36
  has_many :assigned_issues,
    :class_name => "Issue",
    :foreign_key => :assignee_id,
    :dependent => :destroy

37 38 39 40 41 42 43 44 45
  has_many :merge_requests,
    :foreign_key => :author_id,
    :dependent => :destroy

  has_many :assigned_merge_requests,
    :class_name => "MergeRequest",
    :foreign_key => :assignee_id,
    :dependent => :destroy

Valery Sizov's avatar
Valery Sizov committed
46 47 48
  validates :projects_limit,
            :presence => true,
            :numericality => {:greater_than_or_equal_to => 0}
49

50
  validates :bio, :length => { :within => 0..255 }
Valery Sizov's avatar
Valery Sizov committed
51

Nihad Abbasov's avatar
Nihad Abbasov committed
52
  before_save :ensure_authentication_token
53
  alias_attribute :private_token, :authentication_token
54

gitlabhq's avatar
gitlabhq committed
55
  scope :not_in_project, lambda { |project|  where("id not in (:ids)", :ids => project.users.map(&:id) ) }
56 57 58 59
  scope :admins, where(:admin =>  true)
  scope :blocked, where(:blocked =>  true)
  scope :active, where(:blocked =>  false)

60
  before_validation :generate_password, :on => :create
61 62

  def generate_password
Jakub Troszok's avatar
Jakub Troszok committed
63
    if self.force_random_password
64 65 66 67
      self.password = self.password_confirmation = Devise.friendly_token.first(8)
    end
  end

68 69 70 71 72 73 74 75 76 77 78 79 80
  def self.filter filter_name
    case filter_name
    when "admins"; self.admins
    when "blocked"; self.blocked
    when "wop"; self.without_projects
    else
      self.active
    end
  end

  def self.without_projects
    where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)')
  end
gitlabhq's avatar
gitlabhq committed
81

82
  def self.find_for_ldap_auth(omniauth_info)
83
    name = omniauth_info.name.force_encoding("utf-8")
84 85
    email = omniauth_info.email.downcase unless omniauth_info.email.nil?
    raise OmniAuth::Error, "LDAP accounts must provide an email address" if email.nil?
86

vsizov's avatar
vsizov committed
87 88 89
    if @user = User.find_by_email(email)
      @user
    else
Nihad Abbasov's avatar
Nihad Abbasov committed
90 91 92
      password = Devise.friendly_token[0, 8].downcase
      @user = User.create(
        :name => name,
vsizov's avatar
vsizov committed
93 94
        :email => email,
        :password => password,
95
        :password_confirmation => password,
96
        :projects_limit => Gitlab.config.default_projects_limit
vsizov's avatar
vsizov committed
97 98 99
      )
    end
  end
randx's avatar
randx committed
100 101 102 103

  def self.search query
    where("name like :query or email like :query", :query => "%#{query}%")
  end
gitlabhq's avatar
gitlabhq committed
104 105 106 107 108
end
# == Schema Information
#
# Table name: users
#
randx's avatar
randx committed
109
#  id                     :integer(4)      not null, primary key
gitlabhq's avatar
gitlabhq committed
110 111 112 113 114
#  email                  :string(255)     default(""), not null
#  encrypted_password     :string(128)     default(""), not null
#  reset_password_token   :string(255)
#  reset_password_sent_at :datetime
#  remember_created_at    :datetime
randx's avatar
randx committed
115
#  sign_in_count          :integer(4)      default(0)
gitlabhq's avatar
gitlabhq committed
116 117 118 119
#  current_sign_in_at     :datetime
#  last_sign_in_at        :datetime
#  current_sign_in_ip     :string(255)
#  last_sign_in_ip        :string(255)
randx's avatar
randx committed
120 121
#  created_at             :datetime        not null
#  updated_at             :datetime        not null
gitlabhq's avatar
gitlabhq committed
122
#  name                   :string(255)
randx's avatar
randx committed
123 124
#  admin                  :boolean(1)      default(FALSE), not null
#  projects_limit         :integer(4)      default(10)
Saito's avatar
Saito committed
125 126 127 128
#  skype                  :string(255)     default(""), not null
#  linkedin               :string(255)     default(""), not null
#  twitter                :string(255)     default(""), not null
#  authentication_token   :string(255)
randx's avatar
randx committed
129 130 131 132
#  dark_scheme            :boolean(1)      default(FALSE), not null
#  theme_id               :integer(4)      default(1), not null
#  bio                    :string(255)
#  blocked                :boolean(1)      default(FALSE), not null
gitlabhq's avatar
gitlabhq committed
133
#
randx's avatar
randx committed
134