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

class Project < ActiveRecord::Base
4 5 6 7 8 9 10 11
  include Repository
  include GitPush
  include Authority
  include Team

  #
  # Relations
  # 
G
gitlabhq 已提交
12
  belongs_to :owner, :class_name => "User"
13 14
  has_many :users,          :through => :users_projects
  has_many :events,         :dependent => :destroy
D
Dmitriy Zaporozhets 已提交
15
  has_many :merge_requests, :dependent => :destroy
16
  has_many :issues,         :dependent => :destroy, :order => "closed, created_at DESC"
D
Dmitriy Zaporozhets 已提交
17
  has_many :milestones,     :dependent => :destroy
G
gitlabhq 已提交
18
  has_many :users_projects, :dependent => :destroy
19 20 21 22 23
  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 :web_hooks,      :dependent => :destroy
  has_many :wikis,          :dependent => :destroy
24
  has_many :protected_branches, :dependent => :destroy
A
Aleksei Kvitinskii 已提交
25

26 27 28
  # 
  # Protected attributes
  #
V
Valera Sizov 已提交
29
  attr_protected :private_flag, :owner_id
G
gitlabhq 已提交
30

31 32 33
  # 
  # Scopes
  #
G
gitlabhq 已提交
34
  scope :public_only, where(:private_flag => false)
D
Dmitriy Zaporozhets 已提交
35
  scope :without_user, lambda { |user|  where("id not in (:ids)", :ids => user.projects.map(&:id) ) }
G
gitlabhq 已提交
36

37 38 39
  def self.active
    joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC")
  end
40

41 42 43 44
  def self.search query
    where("name like :query or code like :query or path like :query", :query => "%#{query}%")
  end

45 46 47 48 49 50
  def self.create_by_user(params, user)
    project = Project.new params

    Project.transaction do
      project.owner = user

R
randx 已提交
51
      return project unless project.save
52 53 54 55 56 57 58 59 60 61 62 63

      # 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
  end

64 65 66 67 68 69 70 71 72 73 74
  #
  # Validations
  #
  validates :name,
            :uniqueness => true,
            :presence => true,
            :length   => { :within => 0..255 }

  validates :path,
            :uniqueness => true,
            :presence => true,
R
randx 已提交
75 76
            :format => { :with => /^[a-zA-Z][a-zA-Z0-9_\-\.]*$/,
                         :message => "only letters, digits & '_' '-' '.' allowed. Letter should be first" },
77 78 79 80 81 82 83 84
            :length   => { :within => 0..255 }

  validates :description,
            :length   => { :within => 0..2000 }

  validates :code,
            :presence => true,
            :uniqueness => true,
R
randx 已提交
85 86
            :format => { :with => /^[a-zA-Z][a-zA-Z0-9_\-\.]*$/,
                         :message => "only letters, digits & '_' '-' '.' allowed. Letter should be first"  },
87 88 89 90 91 92 93 94 95 96 97 98
            :length   => { :within => 1..255 }

  validates :owner, :presence => true
  validate :check_limit
  validate :repo_name

  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
    errors[:base] << ("Cant check your ability to create project")
G
gitlabhq 已提交
99 100
  end

101 102 103 104 105 106 107 108
  def repo_name
    if path == "gitolite-admin"
      errors.add(:path, " like 'gitolite-admin' is not allowed")
    end
  end
  
  def self.access_options
    UsersProject.access_roles
A
Ariejan de Vroom 已提交
109 110
  end

111 112
  def to_param
    code
113 114
  end

115
  def web_url
116
    [Gitlab.config.url, code].join("/")
117 118
  end

G
gitlabhq 已提交
119
  def common_notes
G
gitlabhq 已提交
120
    notes.where(:noteable_type => ["", nil]).inc_author_project
G
gitlabhq 已提交
121 122
  end

123 124
  def build_commit_note(commit)
    notes.new(:noteable_id => commit.id, :noteable_type => "Commit")
G
gitlabhq 已提交
125
  end
N
Nihad Abbasov 已提交
126

127
  def commit_notes(commit)
D
Dmitriy Zaporozhets 已提交
128 129 130 131
    notes.where(:noteable_id => commit.id, :noteable_type => "Commit", :line_code => nil)
  end

  def commit_line_notes(commit)
V
Valery Sizov 已提交
132
    notes.where(:noteable_id => commit.id, :noteable_type => "Commit").where("line_code is not null")
G
gitlabhq 已提交
133
  end
N
Nihad Abbasov 已提交
134

G
gitlabhq 已提交
135 136 137 138 139 140 141 142
  def public?
    !private_flag
  end

  def private?
    private_flag
  end

N
Nihad Abbasov 已提交
143
  def last_activity
144
    events.last || nil
G
gitlabhq 已提交
145 146 147
  end

  def last_activity_date
D
Dmitriy Zaporozhets 已提交
148 149
    if events.last
      events.last.created_at
150
    else
D
Dmitriy Zaporozhets 已提交
151
      updated_at
152
    end
D
Dmitriy Zaporozhets 已提交
153
  end
154

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

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