project.rb 5.2 KB
Newer Older
G
gitlabhq 已提交
1 2 3
require "grit"

class Project < ActiveRecord::Base
4
  include Repository
R
randx 已提交
5
  include PushObserver
6 7 8
  include Authority
  include Team

9 10
  attr_accessible :name, :path, :description, :code, :default_branch, :issues_enabled,
                  :wall_enabled, :merge_requests_enabled, :wiki_enabled
N
Nihad Abbasov 已提交
11
  attr_accessor :error_code
12

13
  # Relations
14
  belongs_to :group
15 16 17 18 19 20 21 22 23 24 25 26 27
  belongs_to :owner, class_name: "User"
  has_many :users,          through: :users_projects
  has_many :events,         dependent: :destroy
  has_many :merge_requests, dependent: :destroy
  has_many :issues,         dependent: :destroy, order: "closed, created_at DESC"
  has_many :milestones,     dependent: :destroy
  has_many :users_projects, dependent: :destroy
  has_many :notes,          dependent: :destroy
  has_many :snippets,       dependent: :destroy
  has_many :deploy_keys,    dependent: :destroy, foreign_key: "project_id", class_name: "Key"
  has_many :hooks,          dependent: :destroy, class_name: "ProjectHook"
  has_many :wikis,          dependent: :destroy
  has_many :protected_branches, dependent: :destroy
A
Aleksei Kvitinskii 已提交
28

29
  # Scopes
30 31
  scope :public_only, where(private_flag: false)
  scope :without_user, lambda { |user|  where("id not in (:ids)", ids: user.projects.map(&:id) ) }
G
gitlabhq 已提交
32

33 34 35
  def self.active
    joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC")
  end
36

37
  def self.search query
38
    where("name like :query or code like :query or path like :query", query: "%#{query}%")
39 40
  end

41 42 43 44 45
  def self.create_by_user(params, user)
    project = Project.new params

    Project.transaction do
      project.owner = user
46
      project.save!
47 48

      # Add user as project master
49
      project.users_projects.create!(project_access: UsersProject::MASTER, user: user)
50 51 52 53 54 55 56

      # when project saved no team member exist so
      # project repository should be updated after first user add
      project.update_repository
    end

    project
57 58 59 60 61
  rescue Gitlab::Gitolite::AccessDenied => ex
    project.error_code = :gitolite
    project
  rescue => ex
    project.error_code = :db
R
Robert Speicher 已提交
62
    project.errors.add(:base, "Can't save project. Please try again later")
63 64 65 66 67 68 69 70 71
    project
  end

  def git_error?
    error_code == :gitolite
  end

  def saved?
    id && valid?
72 73
  end

74
  # Validations
N
Nihad Abbasov 已提交
75 76 77 78
  validates :owner, presence: true
  validates :description, length: { within: 0..2000 }
  validates :name, uniqueness: true, presence: true, length: { within: 0..255 }
  validates :path, uniqueness: true, presence: true, length: { within: 0..255 },
79
            format: { with: /\A[a-zA-Z][a-zA-Z0-9_\-\.]*\z/,
N
Nihad Abbasov 已提交
80 81
                      message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
  validates :code, presence: true, uniqueness: true, length: { within: 1..255 },
82
            format: { with: /\A[a-zA-Z][a-zA-Z0-9_\-\.]*\z/,
N
Nihad Abbasov 已提交
83
                      message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
84 85
  validates :issues_enabled, :wall_enabled, :merge_requests_enabled,
            :wiki_enabled, inclusion: { in: [true, false] }
N
Nihad Abbasov 已提交
86
  validate :check_limit, :repo_name
87 88 89 90 91 92

  def check_limit
    unless owner.can_create_project?
      errors[:base] << ("Your own projects limit is #{owner.projects_limit}! Please contact administrator to increase it")
    end
  rescue
R
Robert Speicher 已提交
93
    errors[:base] << ("Can't check your ability to create project")
G
gitlabhq 已提交
94 95
  end

96 97 98 99 100
  def repo_name
    if path == "gitolite-admin"
      errors.add(:path, " like 'gitolite-admin' is not allowed")
    end
  end
V
Valeriy Sizov 已提交
101

102 103
  def self.access_options
    UsersProject.access_roles
A
Ariejan de Vroom 已提交
104 105
  end

106 107
  def to_param
    code
108 109
  end

110
  def web_url
111
    [Gitlab.config.url, code].join("/")
112 113
  end

G
gitlabhq 已提交
114
  def common_notes
115
    notes.where(noteable_type: ["", nil]).inc_author_project
G
gitlabhq 已提交
116 117
  end

118
  def build_commit_note(commit)
119
    notes.new(noteable_id: commit.id, noteable_type: "Commit")
G
gitlabhq 已提交
120
  end
N
Nihad Abbasov 已提交
121

122
  def commit_notes(commit)
123
    notes.where(noteable_id: commit.id, noteable_type: "Commit", line_code: nil)
D
Dmitriy Zaporozhets 已提交
124 125 126
  end

  def commit_line_notes(commit)
127
    notes.where(noteable_id: commit.id, noteable_type: "Commit").where("line_code is not null")
G
gitlabhq 已提交
128
  end
N
Nihad Abbasov 已提交
129

G
gitlabhq 已提交
130 131 132 133 134 135 136 137
  def public?
    !private_flag
  end

  def private?
    private_flag
  end

N
Nihad Abbasov 已提交
138
  def last_activity
R
randx 已提交
139
    events.order("created_at ASC").last
G
gitlabhq 已提交
140 141 142
  end

  def last_activity_date
D
Dmitriy Zaporozhets 已提交
143 144
    if events.last
      events.last.created_at
145
    else
D
Dmitriy Zaporozhets 已提交
146
      updated_at
147
    end
D
Dmitriy Zaporozhets 已提交
148
  end
149

150
  def wiki_notes
N
Nihad Abbasov 已提交
151
    Note.where(noteable_id: wikis.pluck(:id), noteable_type: 'Wiki', project_id: self.id)
152 153
  end

D
Dmitriy Zaporozhets 已提交
154 155 156
  def project_id
    self.id
  end
G
gitlabhq 已提交
157
end
D
Dmitriy Zaporozhets 已提交
158

G
gitlabhq 已提交
159 160 161 162
# == Schema Information
#
# Table name: projects
#
N
Nihad Abbasov 已提交
163
#  id                     :integer         not null, primary key
164 165 166
#  name                   :string(255)
#  path                   :string(255)
#  description            :text
R
randx 已提交
167 168
#  created_at             :datetime        not null
#  updated_at             :datetime        not null
N
Nihad Abbasov 已提交
169
#  private_flag           :boolean         default(TRUE), not null
170
#  code                   :string(255)
N
Nihad Abbasov 已提交
171
#  owner_id               :integer
172
#  default_branch         :string(255)
N
Nihad Abbasov 已提交
173 174 175 176
#  issues_enabled         :boolean         default(TRUE), not null
#  wall_enabled           :boolean         default(TRUE), not null
#  merge_requests_enabled :boolean         default(TRUE), not null
#  wiki_enabled           :boolean         default(TRUE), not null
177
#  group_id               :integer
G
gitlabhq 已提交
178
#
179