summaryrefslogtreecommitdiff
path: root/app/models/user.rb
blob: ff27660a6ee68bc540e4afb1aa96716be95e22a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
class User < ActiveRecord::Base

  include Account

  devise :database_authenticatable, :token_authenticatable, :lockable,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable

  attr_accessible :email, :password, :password_confirmation, :remember_me, :bio,
                  :name, :projects_limit, :skype, :linkedin, :twitter, :dark_scheme,
                  :theme_id, :force_random_password

  attr_accessor :force_random_password

  has_many :users_projects, :dependent => :destroy
  has_many :projects, :through => :users_projects
  has_many :my_own_projects, :class_name => "Project", :foreign_key => :owner_id
  has_many :keys, :dependent => :destroy

  has_many :events,
    :class_name => "Event",
    :foreign_key => :author_id,
    :dependent => :destroy

  has_many :recent_events,
    :class_name => "Event",
    :foreign_key => :author_id,
    :order => "id DESC"

  has_many :issues,
    :foreign_key => :author_id,
    :dependent => :destroy

  has_many :notes,
    :foreign_key => :author_id,
    :dependent => :destroy

  has_many :assigned_issues,
    :class_name => "Issue",
    :foreign_key => :assignee_id,
    :dependent => :destroy

  has_many :merge_requests,
    :foreign_key => :author_id,
    :dependent => :destroy

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

  validates :projects_limit,
            :presence => true,
            :numericality => {:greater_than_or_equal_to => 0}

  validates :bio, :length => { :within => 0..255 }

  before_save :ensure_authentication_token
  alias_attribute :private_token, :authentication_token

  scope :not_in_project, lambda { |project|  where("id not in (:ids)", :ids => project.users.map(&:id) ) }
  scope :admins, where(:admin =>  true)
  scope :blocked, where(:blocked =>  true)
  scope :active, where(:blocked =>  false)

  before_validation :generate_password, :on => :create

  def generate_password
    if self.force_random_password
      self.password = self.password_confirmation = Devise.friendly_token.first(8)
    end
  end

  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

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

    if @user = User.find_by_email(email)
      @user
    else
      password = Devise.friendly_token[0, 8].downcase
      @user = User.create(
        :name => name,
        :email => email,
        :password => password,
        :password_confirmation => password,
        :projects_limit => Gitlab.config.default_projects_limit
      )
    end
  end

  def self.search query
    where("name like :query or email like :query", :query => "%#{query}%")
  end
end
# == Schema Information
#
# Table name: users
#
#  id                     :integer(4)      not null, primary key
#  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
#  sign_in_count          :integer(4)      default(0)
#  current_sign_in_at     :datetime
#  last_sign_in_at        :datetime
#  current_sign_in_ip     :string(255)
#  last_sign_in_ip        :string(255)
#  created_at             :datetime        not null
#  updated_at             :datetime        not null
#  name                   :string(255)
#  admin                  :boolean(1)      default(FALSE), not null
#  projects_limit         :integer(4)      default(10)
#  skype                  :string(255)     default(""), not null
#  linkedin               :string(255)     default(""), not null
#  twitter                :string(255)     default(""), not null
#  authentication_token   :string(255)
#  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
#