2011-10-08 23:36:38 +02:00
|
|
|
require "grit"
|
|
|
|
|
|
|
|
class Project < ActiveRecord::Base
|
2012-06-07 14:44:57 +02:00
|
|
|
include Repository
|
|
|
|
include GitPush
|
|
|
|
include Authority
|
|
|
|
include Team
|
|
|
|
|
|
|
|
#
|
|
|
|
# Relations
|
|
|
|
#
|
2011-10-09 21:36:57 +02:00
|
|
|
belongs_to :owner, :class_name => "User"
|
2012-03-04 14:35:15 +01:00
|
|
|
has_many :users, :through => :users_projects
|
|
|
|
has_many :events, :dependent => :destroy
|
2011-11-28 08:39:43 +01:00
|
|
|
has_many :merge_requests, :dependent => :destroy
|
2012-07-02 20:51:48 +02:00
|
|
|
has_many :issues, :dependent => :destroy, :order => "closed, created_at DESC"
|
2012-04-08 23:28:58 +02:00
|
|
|
has_many :milestones, :dependent => :destroy
|
2011-10-08 23:36:38 +02:00
|
|
|
has_many :users_projects, :dependent => :destroy
|
2012-03-04 14:35:15 +01:00
|
|
|
has_many :notes, :dependent => :destroy
|
|
|
|
has_many :snippets, :dependent => :destroy
|
|
|
|
has_many :deploy_keys, :dependent => :destroy, :foreign_key => "project_id", :class_name => "Key"
|
2012-07-12 14:36:33 +02:00
|
|
|
has_many :hooks, :dependent => :destroy, :class_name => "ProjectHook"
|
2012-03-04 14:35:15 +01:00
|
|
|
has_many :wikis, :dependent => :destroy
|
2012-02-15 21:02:33 +01:00
|
|
|
has_many :protected_branches, :dependent => :destroy
|
2011-11-04 08:42:36 +01:00
|
|
|
|
2012-07-05 20:59:37 +02:00
|
|
|
attr_accessor :error_code
|
|
|
|
|
2012-06-07 14:44:57 +02:00
|
|
|
#
|
|
|
|
# Protected attributes
|
|
|
|
#
|
2011-10-09 13:05:31 +02:00
|
|
|
attr_protected :private_flag, :owner_id
|
2011-10-08 23:36:38 +02:00
|
|
|
|
2012-06-07 14:44:57 +02:00
|
|
|
#
|
|
|
|
# Scopes
|
|
|
|
#
|
2011-10-08 23:36:38 +02:00
|
|
|
scope :public_only, where(:private_flag => false)
|
2012-02-11 18:56:18 +01:00
|
|
|
scope :without_user, lambda { |user| where("id not in (:ids)", :ids => user.projects.map(&:id) ) }
|
2011-10-08 23:36:38 +02:00
|
|
|
|
2011-12-20 07:24:14 +01:00
|
|
|
def self.active
|
|
|
|
joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC")
|
|
|
|
end
|
2011-12-07 00:27:07 +01:00
|
|
|
|
2012-03-16 00:14:39 +01:00
|
|
|
def self.search query
|
|
|
|
where("name like :query or code like :query or path like :query", :query => "%#{query}%")
|
|
|
|
end
|
|
|
|
|
2012-06-11 07:52:44 +02:00
|
|
|
def self.create_by_user(params, user)
|
|
|
|
project = Project.new params
|
|
|
|
|
|
|
|
Project.transaction do
|
|
|
|
project.owner = user
|
|
|
|
|
2012-07-05 20:59:37 +02:00
|
|
|
project.save!
|
2012-06-11 07:52:44 +02:00
|
|
|
|
|
|
|
# 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
|
2012-07-05 20:59:37 +02:00
|
|
|
rescue Gitlab::Gitolite::AccessDenied => ex
|
|
|
|
project.error_code = :gitolite
|
|
|
|
project
|
|
|
|
rescue => ex
|
|
|
|
project.error_code = :db
|
|
|
|
project.errors.add(:base, "Cant save project. Please try again later")
|
|
|
|
project
|
|
|
|
end
|
|
|
|
|
|
|
|
def git_error?
|
|
|
|
error_code == :gitolite
|
|
|
|
end
|
|
|
|
|
|
|
|
def saved?
|
|
|
|
id && valid?
|
2012-06-11 07:52:44 +02:00
|
|
|
end
|
|
|
|
|
2012-06-07 14:44:57 +02:00
|
|
|
#
|
|
|
|
# Validations
|
|
|
|
#
|
|
|
|
validates :name,
|
|
|
|
:uniqueness => true,
|
|
|
|
:presence => true,
|
|
|
|
:length => { :within => 0..255 }
|
|
|
|
|
|
|
|
validates :path,
|
|
|
|
:uniqueness => true,
|
|
|
|
:presence => true,
|
2012-06-27 23:47:12 +02:00
|
|
|
:format => { :with => /^[a-zA-Z][a-zA-Z0-9_\-\.]*$/,
|
|
|
|
:message => "only letters, digits & '_' '-' '.' allowed. Letter should be first" },
|
2012-06-07 14:44:57 +02:00
|
|
|
:length => { :within => 0..255 }
|
|
|
|
|
|
|
|
validates :description,
|
|
|
|
:length => { :within => 0..2000 }
|
|
|
|
|
|
|
|
validates :code,
|
|
|
|
:presence => true,
|
|
|
|
:uniqueness => true,
|
2012-06-27 23:47:12 +02:00
|
|
|
:format => { :with => /^[a-zA-Z][a-zA-Z0-9_\-\.]*$/,
|
|
|
|
:message => "only letters, digits & '_' '-' '.' allowed. Letter should be first" },
|
2012-06-07 14:44:57 +02:00
|
|
|
: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")
|
2011-10-08 23:36:38 +02:00
|
|
|
end
|
|
|
|
|
2012-06-07 14:44:57 +02:00
|
|
|
def repo_name
|
|
|
|
if path == "gitolite-admin"
|
|
|
|
errors.add(:path, " like 'gitolite-admin' is not allowed")
|
|
|
|
end
|
|
|
|
end
|
2012-07-15 14:29:06 +02:00
|
|
|
|
2012-06-07 14:44:57 +02:00
|
|
|
def self.access_options
|
|
|
|
UsersProject.access_roles
|
2011-12-14 17:38:52 +01:00
|
|
|
end
|
|
|
|
|
2012-06-07 14:44:57 +02:00
|
|
|
def to_param
|
|
|
|
code
|
2011-11-06 21:38:08 +01:00
|
|
|
end
|
|
|
|
|
2012-06-07 14:44:57 +02:00
|
|
|
def web_url
|
2012-07-02 20:51:48 +02:00
|
|
|
[Gitlab.config.url, code].join("/")
|
2011-12-13 22:24:31 +01:00
|
|
|
end
|
|
|
|
|
2011-10-08 23:36:38 +02:00
|
|
|
def common_notes
|
2011-11-15 10:09:07 +01:00
|
|
|
notes.where(:noteable_type => ["", nil]).inc_author_project
|
2011-10-08 23:36:38 +02:00
|
|
|
end
|
|
|
|
|
2011-11-11 00:28:26 +01:00
|
|
|
def build_commit_note(commit)
|
|
|
|
notes.new(:noteable_id => commit.id, :noteable_type => "Commit")
|
2011-10-08 23:36:38 +02:00
|
|
|
end
|
2011-10-26 15:46:25 +02:00
|
|
|
|
2011-11-11 00:28:26 +01:00
|
|
|
def commit_notes(commit)
|
2012-01-10 21:08:46 +01:00
|
|
|
notes.where(:noteable_id => commit.id, :noteable_type => "Commit", :line_code => nil)
|
|
|
|
end
|
|
|
|
|
|
|
|
def commit_line_notes(commit)
|
2012-01-19 20:44:10 +01:00
|
|
|
notes.where(:noteable_id => commit.id, :noteable_type => "Commit").where("line_code is not null")
|
2011-10-08 23:36:38 +02:00
|
|
|
end
|
2011-10-26 15:46:25 +02:00
|
|
|
|
2011-10-08 23:36:38 +02:00
|
|
|
def public?
|
|
|
|
!private_flag
|
|
|
|
end
|
|
|
|
|
|
|
|
def private?
|
|
|
|
private_flag
|
|
|
|
end
|
|
|
|
|
2011-11-15 09:34:30 +01:00
|
|
|
def last_activity
|
2012-03-04 14:35:15 +01:00
|
|
|
events.last || nil
|
2011-10-31 21:57:16 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def last_activity_date
|
2012-03-01 19:40:32 +01:00
|
|
|
if events.last
|
|
|
|
events.last.created_at
|
2011-12-20 07:24:14 +01:00
|
|
|
else
|
2012-03-01 19:40:32 +01:00
|
|
|
updated_at
|
2011-12-20 07:24:14 +01:00
|
|
|
end
|
2012-03-01 19:40:32 +01:00
|
|
|
end
|
2011-12-20 07:24:14 +01:00
|
|
|
|
2012-03-05 23:26:40 +01:00
|
|
|
def project_id
|
|
|
|
self.id
|
|
|
|
end
|
2011-10-08 23:36:38 +02:00
|
|
|
end
|
2012-03-05 23:26:40 +01:00
|
|
|
|
2011-10-08 23:36:38 +02:00
|
|
|
# == Schema Information
|
|
|
|
#
|
|
|
|
# Table name: projects
|
|
|
|
#
|
2012-06-26 20:23:09 +02:00
|
|
|
# id :integer(4) not null, primary key
|
2012-02-15 21:02:33 +01:00
|
|
|
# name :string(255)
|
|
|
|
# path :string(255)
|
|
|
|
# description :text
|
2012-06-26 20:23:09 +02:00
|
|
|
# created_at :datetime not null
|
|
|
|
# updated_at :datetime not null
|
|
|
|
# private_flag :boolean(1) default(TRUE), not null
|
2012-02-15 21:02:33 +01:00
|
|
|
# code :string(255)
|
2012-06-26 20:23:09 +02:00
|
|
|
# owner_id :integer(4)
|
2012-02-15 21:02:33 +01:00
|
|
|
# default_branch :string(255) default("master"), not null
|
2012-06-26 20:23:09 +02:00
|
|
|
# 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
|
2011-10-08 23:36:38 +02:00
|
|
|
#
|
|
|
|
|