gitlabhq/app/models/project.rb

205 lines
5.9 KiB
Ruby
Raw Normal View History

2012-11-19 19:24:05 +01:00
# == 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
#
2011-10-08 23:36:38 +02:00
require "grit"
class Project < ActiveRecord::Base
include Repository
2012-08-21 20:26:56 +02:00
include PushObserver
include Authority
include Team
attr_accessible :name, :path, :description, :code, :default_branch, :issues_enabled,
:wall_enabled, :merge_requests_enabled, :wiki_enabled
2012-09-27 08:20:36 +02:00
attr_accessor :error_code
# Relations
belongs_to :group, foreign_key: "namespace_id", conditions: 'type = Group'
belongs_to :namespace
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
has_one :last_event, class_name: 'Event', order: 'events.created_at DESC', foreign_key: 'project_id'
2012-11-19 20:34:05 +01:00
has_one :gitlab_ci_service, dependent: :destroy
2011-11-04 08:42:36 +01:00
delegate :name, to: :owner, allow_nil: true, prefix: true
2012-10-09 02:10:04 +02:00
# 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
# Scopes
scope :public_only, where(private_flag: false)
2012-10-03 13:26:37 +02:00
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 ) }
2011-10-08 23:36:38 +02:00
2012-10-09 02:10:04 +02:00
class << self
def active
joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC")
end
2012-10-09 02:10:04 +02:00
def search query
where("name LIKE :query OR code LIKE :query OR path LIKE :query", query: "%#{query}%")
end
2012-10-09 02:10:04 +02:00
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
end
2012-10-09 02:10:04 +02:00
def access_options
UsersProject.access_roles
end
end
def git_error?
error_code == :gitolite
end
def saved?
id && valid?
end
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
2012-08-11 01:47:54 +02:00
errors[:base] << ("Can't check your ability to create project")
2011-10-08 23:36:38 +02:00
end
def repo_name
denied_paths = %w(gitolite-admin groups projects dashboard)
if denied_paths.include?(path)
errors.add(:path, "like #{path} is not allowed")
end
end
2012-07-15 14:29:06 +02:00
def to_param
code
2011-11-06 21:38:08 +01:00
end
def web_url
[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
notes.where(noteable_type: ["", nil]).inc_author_project
2011-10-08 23:36:38 +02:00
end
def build_commit_note(commit)
notes.new(noteable_id: commit.id, noteable_type: "Commit")
2011-10-08 23:36:38 +02:00
end
def commit_notes(commit)
notes.where(noteable_id: commit.id, noteable_type: "Commit", line_code: nil)
2012-01-10 21:08:46 +01:00
end
def commit_line_notes(commit)
2012-10-04 12:40:40 +02: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-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
last_event
2011-10-31 21:57:16 +01:00
end
def last_activity_date
last_event.try(:created_at) || updated_at
2012-03-01 19:40:32 +01:00
end
def wiki_notes
2012-09-27 08:28:10 +02:00
Note.where(noteable_id: wikis.pluck(:id), noteable_type: 'Wiki', project_id: self.id)
end
2012-03-05 23:26:40 +01:00
def project_id
self.id
end
2012-10-09 19:39:06 +02:00
def issues_labels
issues.tag_counts_on(:labels)
end
2012-11-20 13:22:00 +01:00
def services
[gitlab_ci_service].compact
end
2012-11-20 18:34:05 +01:00
def gitlab_ci?
gitlab_ci_service && gitlab_ci_service.active
end
def path_with_namespace
if namespace
namespace.code + '/' + path
else
path
end
end
2011-10-08 23:36:38 +02:00
end