project.rb 5.7 KB
Newer Older
D
Dmitriy Zaporozhets 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
# == Schema Information
#
# Table name: projects
#
#  id                     :integer          not null, primary key
#  name                   :string(255)
#  path                   :string(255)
#  description            :text
#  created_at             :datetime         not null
#  updated_at             :datetime         not null
#  private_flag           :boolean          default(TRUE), not null
#  code                   :string(255)
#  owner_id               :integer
#  default_branch         :string(255)
#  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
#  group_id               :integer
#

G
gitlabhq 已提交
22 23 24
require "grit"

class Project < ActiveRecord::Base
25
  include Repository
R
randx 已提交
26
  include PushObserver
27 28 29
  include Authority
  include Team

30 31
  attr_accessible :name, :path, :description, :code, :default_branch, :issues_enabled,
                  :wall_enabled, :merge_requests_enabled, :wiki_enabled
N
Nihad Abbasov 已提交
32
  attr_accessor :error_code
33

34
  # Relations
35
  belongs_to :group
36 37 38 39 40 41 42 43 44 45 46 47 48
  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
49
  has_one :last_event, class_name: 'Event', order: 'events.created_at DESC', foreign_key: 'project_id'
D
Dmitriy Zaporozhets 已提交
50
  has_many :services, dependent: :destroy
D
Dmitriy Zaporozhets 已提交
51
  has_one :gitlab_ci_service, dependent: :destroy
A
Aleksei Kvitinskii 已提交
52

53 54
  delegate :name, to: :owner, allow_nil: true, prefix: true

A
Andrey Kumanyaev 已提交
55 56 57 58 59 60 61 62 63 64 65 66 67 68
  # Validations
  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 },
            format: { with: /\A[a-zA-Z][a-zA-Z0-9_\-\.]*\z/,
                      message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
  validates :code, presence: true, uniqueness: true, length: { within: 1..255 },
            format: { with: /\A[a-zA-Z][a-zA-Z0-9_\-\.]*\z/,
                      message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
  validates :issues_enabled, :wall_enabled, :merge_requests_enabled,
            :wiki_enabled, inclusion: { in: [true, false] }
  validate :check_limit, :repo_name

69
  # Scopes
70
  scope :public_only, where(private_flag: false)
D
Dmitriy Zaporozhets 已提交
71 72
  scope :without_user, ->(user)  { where("id NOT IN (:ids)", ids: user.projects.map(&:id) ) }
  scope :not_in_group, ->(group) { where("id NOT IN (:ids)", ids: group.project_ids ) }
G
gitlabhq 已提交
73

A
Andrey Kumanyaev 已提交
74 75 76 77
  class << self
    def active
      joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC")
    end
78

A
Andrey Kumanyaev 已提交
79 80 81
    def search query
      where("name LIKE :query OR code LIKE :query OR path LIKE :query", query: "%#{query}%")
    end
82

A
Andrey Kumanyaev 已提交
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
    def create_by_user(params, user)
      project = Project.new params

      Project.transaction do
        project.owner = user
        project.save!

        # Add user as project master
        project.users_projects.create!(project_access: UsersProject::MASTER, user: user)

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

      project
    rescue Gitlab::Gitolite::AccessDenied => ex
      project.error_code = :gitolite
      project
    rescue => ex
      project.error_code = :db
      project.errors.add(:base, "Can't save project. Please try again later")
      project
106 107
    end

A
Andrey Kumanyaev 已提交
108 109 110
    def access_options
      UsersProject.access_roles
    end
111 112 113 114 115 116 117 118
  end

  def git_error?
    error_code == :gitolite
  end

  def saved?
    id && valid?
119 120
  end

121 122 123 124 125
  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 已提交
126
    errors[:base] << ("Can't check your ability to create project")
G
gitlabhq 已提交
127 128
  end

129
  def repo_name
130 131 132 133
    denied_paths = %w(gitolite-admin groups projects dashboard)

    if denied_paths.include?(path)
      errors.add(:path, "like #{path} is not allowed")
134 135
    end
  end
V
Valeriy Sizov 已提交
136

137 138
  def to_param
    code
139 140
  end

141
  def web_url
142
    [Gitlab.config.url, code].join("/")
143 144
  end

G
gitlabhq 已提交
145
  def common_notes
146
    notes.where(noteable_type: ["", nil]).inc_author_project
G
gitlabhq 已提交
147 148
  end

149
  def build_commit_note(commit)
150
    notes.new(noteable_id: commit.id, noteable_type: "Commit")
G
gitlabhq 已提交
151
  end
N
Nihad Abbasov 已提交
152

153
  def commit_notes(commit)
154
    notes.where(noteable_id: commit.id, noteable_type: "Commit", line_code: nil)
D
Dmitriy Zaporozhets 已提交
155 156 157
  end

  def commit_line_notes(commit)
V
Valeriy Sizov 已提交
158
    notes.where(noteable_id: commit.id, noteable_type: "Commit").where("line_code IS NOT NULL")
G
gitlabhq 已提交
159
  end
N
Nihad Abbasov 已提交
160

G
gitlabhq 已提交
161 162 163 164 165 166 167 168
  def public?
    !private_flag
  end

  def private?
    private_flag
  end

N
Nihad Abbasov 已提交
169
  def last_activity
170
    last_event
G
gitlabhq 已提交
171 172 173
  end

  def last_activity_date
174
    last_event.try(:created_at) || updated_at
D
Dmitriy Zaporozhets 已提交
175
  end
176

177
  def wiki_notes
N
Nihad Abbasov 已提交
178
    Note.where(noteable_id: wikis.pluck(:id), noteable_type: 'Wiki', project_id: self.id)
179 180
  end

D
Dmitriy Zaporozhets 已提交
181 182 183
  def project_id
    self.id
  end
R
randx 已提交
184 185 186 187

  def issues_labels
    issues.tag_counts_on(:labels)
  end
G
gitlabhq 已提交
188
end