user.rb 4.3 KB
Newer Older
G
gitlabhq 已提交
1
class User < ActiveRecord::Base
N
Nihad Abbasov 已提交
2
  devise :database_authenticatable, :token_authenticatable,
V
Valery Sizov 已提交
3
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable
G
gitlabhq 已提交
4

5
  attr_accessible :email, :password, :password_confirmation, :remember_me, :bio,
6
                  :name, :projects_limit, :skype, :linkedin, :twitter, :dark_scheme, :theme_id
G
gitlabhq 已提交
7 8 9

  has_many :users_projects, :dependent => :destroy
  has_many :projects, :through => :users_projects
V
Valera Sizov 已提交
10
  has_many :my_own_projects, :class_name => "Project", :foreign_key => :owner_id
G
gitlabhq 已提交
11
  has_many :keys, :dependent => :destroy
12

13
  has_many :recent_events,
14 15 16 17
    :class_name => "Event",
    :foreign_key => :author_id,
    :order => "id DESC"

G
gitlabhq 已提交
18 19 20 21
  has_many :issues,
    :foreign_key => :author_id,
    :dependent => :destroy

22 23 24 25
  has_many :notes,
    :foreign_key => :author_id,
    :dependent => :destroy

G
gitlabhq 已提交
26 27 28 29 30
  has_many :assigned_issues,
    :class_name => "Issue",
    :foreign_key => :assignee_id,
    :dependent => :destroy

31 32 33 34 35 36 37 38 39
  has_many :merge_requests,
    :foreign_key => :author_id,
    :dependent => :destroy

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

V
Valery Sizov 已提交
40 41 42
  validates :projects_limit,
            :presence => true,
            :numericality => {:greater_than_or_equal_to => 0}
43

44
  validates :bio, :length => { :within => 0..255 }
V
Valery Sizov 已提交
45

N
Nihad Abbasov 已提交
46
  before_save :ensure_authentication_token
47
  alias_attribute :private_token, :authentication_token
48

G
gitlabhq 已提交
49
  scope :not_in_project, lambda { |project|  where("id not in (:ids)", :ids => project.users.map(&:id) ) }
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
  scope :admins, where(:admin =>  true)
  scope :blocked, where(:blocked =>  true)
  scope :active, where(:blocked =>  false)

  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
G
gitlabhq 已提交
67 68

  def identifier
D
Drew 已提交
69
    email.gsub /[@.]/, "_"
G
gitlabhq 已提交
70 71 72 73 74
  end

  def is_admin?
    admin
  end
V
Valera Sizov 已提交
75

76 77 78 79
  def require_ssh_key?
    keys.count == 0
  end

V
Valera Sizov 已提交
80
  def can_create_project?
V
Valery Sizov 已提交
81
    projects_limit > my_own_projects.count
V
Valera Sizov 已提交
82
  end
G
gitlabhq 已提交
83 84 85 86

  def last_activity_project
    projects.first
  end
V
Valery Sizov 已提交
87

88
  def first_name
N
Nihad Abbasov 已提交
89
    name.split.first unless name.blank?
90
  end
V
vsizov 已提交
91

92
  def self.find_for_ldap_auth(omniauth_info)
93
    name = omniauth_info.name.force_encoding("utf-8")
94
    email = omniauth_info.email.downcase
95

V
vsizov 已提交
96 97 98
    if @user = User.find_by_email(email)
      @user
    else
N
Nihad Abbasov 已提交
99 100 101
      password = Devise.friendly_token[0, 8].downcase
      @user = User.create(
        :name => name,
V
vsizov 已提交
102 103 104 105 106 107
        :email => email,
        :password => password,
        :password_confirmation => password
      )
    end
  end
108 109 110 111

  def cared_merge_requests
    MergeRequest.where("author_id = :id or assignee_id = :id", :id => self.id).opened
  end
D
Dmitriy Zaporozhets 已提交
112 113 114 115

  def project_ids
    projects.map(&:id)
  end
116 117 118

  # Remove user from all projects and
  # set blocked attribute to true
119 120
  def block
    users_projects.all.each do |membership|
121 122 123 124 125 126
      return false unless membership.destroy
    end

    self.blocked = true
    save
  end
127 128

  def projects_limit_percent
N
Nihad Abbasov 已提交
129
    return 100 if projects_limit.zero?
130 131
    (my_own_projects.count.to_f / projects_limit) * 100
  end
G
gitlabhq 已提交
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
end
# == Schema Information
#
# Table name: users
#
#  id                     :integer         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         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
#  updated_at             :datetime
#  name                   :string(255)
#  admin                  :boolean         default(FALSE), not null
S
Saito 已提交
152 153 154 155 156
#  projects_limit         :integer         default(10)
#  skype                  :string(255)     default(""), not null
#  linkedin               :string(255)     default(""), not null
#  twitter                :string(255)     default(""), not null
#  authentication_token   :string(255)
V
Valery Sizov 已提交
157
#  dark_scheme            :boolean         default(FALSE), not null
G
gitlabhq 已提交
158
#