Read about our upcoming Code of Conduct on this issue

Commit df7c5248 authored by Andrey Kumanyaev's avatar Andrey Kumanyaev
Browse files

simple refactoring

parent 00dc1fa53b42
class Ability class Ability
def self.allowed(object, subject) class << self
def allowed(object, subject)
case subject.class.name case subject.class.name
when "Project" then project_abilities(object, subject) when "Project" then project_abilities(object, subject)
when "Issue" then issue_abilities(object, subject) when "Issue" then issue_abilities(object, subject)
...@@ -10,7 +11,7 @@ def self.allowed(object, subject) ...@@ -10,7 +11,7 @@ def self.allowed(object, subject)
end end
end end
def self.project_abilities(user, project) def project_abilities(user, project)
rules = [] rules = []
rules << [ rules << [
...@@ -55,7 +56,6 @@ def self.project_abilities(user, project) ...@@ -55,7 +56,6 @@ def self.project_abilities(user, project)
rules.flatten rules.flatten
end end
class << self
[:issue, :note, :snippet, :merge_request].each do |name| [:issue, :note, :snippet, :merge_request].each do |name|
define_method "#{name}_abilities" do |user, subject| define_method "#{name}_abilities" do |user, subject|
if subject.author == user if subject.author == user
...@@ -72,8 +72,7 @@ class << self ...@@ -72,8 +72,7 @@ class << self
:"modify_#{name}", :"modify_#{name}",
] ]
else else
subject.respond_to?(:project) ? subject.respond_to?(:project) ? project_abilities(user, subject.project) : []
project_abilities(user, subject.project) : []
end end
end end
end end
......
...@@ -27,10 +27,12 @@ class Event < ActiveRecord::Base ...@@ -27,10 +27,12 @@ class Event < ActiveRecord::Base
# For Hash only # For Hash only
serialize :data serialize :data
# Scopes
scope :recent, order("created_at DESC") scope :recent, order("created_at DESC")
scope :code_push, where(action: Pushed) scope :code_push, where(action: Pushed)
def self.determine_action(record) class << self
def determine_action(record)
if [Issue, MergeRequest].include? record.class if [Issue, MergeRequest].include? record.class
Event::Created Event::Created
elsif record.kind_of? Note elsif record.kind_of? Note
...@@ -38,9 +40,10 @@ def self.determine_action(record) ...@@ -38,9 +40,10 @@ def self.determine_action(record)
end end
end end
def self.recent_for_user user def recent_for_user user
where(project_id: user.projects.map(&:id)).recent where(project_id: user.projects.map(&:id)).recent
end end
end
# Next events currently enabled for system # Next events currently enabled for system
# - push # - push
......
# == Schema Information
#
# Table name: groups
#
# id :integer not null, primary key
# name :string(255) not null
# code :string(255) not null
# owner_id :integer not null
# created_at :datetime not null
# updated_at :datetime not null
#
class Group < ActiveRecord::Base class Group < ActiveRecord::Base
attr_accessible :code, :name, :owner_id attr_accessible :code, :name, :owner_id
...@@ -18,7 +6,7 @@ class Group < ActiveRecord::Base ...@@ -18,7 +6,7 @@ class Group < ActiveRecord::Base
validates :name, presence: true, uniqueness: true validates :name, presence: true, uniqueness: true
validates :code, presence: true, uniqueness: true validates :code, presence: true, uniqueness: true
validates :owner_id, presence: true validates :owner, presence: true
delegate :name, to: :owner, allow_nil: true, prefix: true delegate :name, to: :owner, allow_nil: true, prefix: true
...@@ -31,6 +19,18 @@ def to_param ...@@ -31,6 +19,18 @@ def to_param
end end
def users def users
User.joins(:users_projects).where('users_projects.project_id' => project_ids).uniq User.joins(:users_projects).where(users_projects: {project_id: project_ids}).uniq
end end
end end
# == Schema Information
#
# Table name: groups
#
# id :integer not null, primary key
# name :string(255) not null
# code :string(255) not null
# owner_id :integer not null
# created_at :datetime not null
# updated_at :datetime not null
#
...@@ -6,15 +6,14 @@ class Key < ActiveRecord::Base ...@@ -6,15 +6,14 @@ class Key < ActiveRecord::Base
attr_accessible :key, :title attr_accessible :key, :title
before_validation :strip_white_space
before_save :set_identifier
validates :title, presence: true, length: { within: 0..255 } validates :title, presence: true, length: { within: 0..255 }
validates :key, presence: true, validates :key, presence: true, length: { within: 0..5000 }, format: { :with => /ssh-.{3} / }
length: { within: 0..5000 }, validate :unique_key, :fingerprintable_key
format: { :with => /ssh-.{3} / }
before_save :set_identifier
before_validation :strip_white_space
delegate :name, :email, to: :user, prefix: true delegate :name, :email, to: :user, prefix: true
validate :unique_key, :fingerprintable_key
def strip_white_space def strip_white_space
self.key = self.key.strip unless self.key.blank? self.key = self.key.strip unless self.key.blank?
......
...@@ -7,6 +7,8 @@ class MergeRequest < ActiveRecord::Base ...@@ -7,6 +7,8 @@ class MergeRequest < ActiveRecord::Base
attr_accessible :title, :assignee_id, :closed, :target_branch, :source_branch, attr_accessible :title, :assignee_id, :closed, :target_branch, :source_branch,
:author_id_of_changes :author_id_of_changes
attr_accessor :should_remove_source_branch
BROKEN_DIFF = "--broken-diff" BROKEN_DIFF = "--broken-diff"
UNCHECKED = 1 UNCHECKED = 1
...@@ -16,9 +18,8 @@ class MergeRequest < ActiveRecord::Base ...@@ -16,9 +18,8 @@ class MergeRequest < ActiveRecord::Base
serialize :st_commits serialize :st_commits
serialize :st_diffs serialize :st_diffs
attr_accessor :should_remove_source_branch validates :source_branch, presence: true
validates :target_branch, presence: true
validates_presence_of :source_branch, :target_branch
validate :validate_branches validate :validate_branches
def self.find_all_by_branch(branch_name) def self.find_all_by_branch(branch_name)
......
...@@ -4,7 +4,8 @@ class Milestone < ActiveRecord::Base ...@@ -4,7 +4,8 @@ class Milestone < ActiveRecord::Base
belongs_to :project belongs_to :project
has_many :issues has_many :issues
validates_presence_of :title, :project_id validates :title, presence: true
validates :project, presence: true
def self.active def self.active
where("due_date > ? OR due_date IS NULL", Date.today) where("due_date > ? OR due_date IS NULL", Date.today)
......
...@@ -2,10 +2,13 @@ ...@@ -2,10 +2,13 @@
require 'file_size_validator' require 'file_size_validator'
class Note < ActiveRecord::Base class Note < ActiveRecord::Base
mount_uploader :attachment, AttachmentUploader
attr_accessible :note, :noteable, :noteable_id, :noteable_type, :project_id, attr_accessible :note, :noteable, :noteable_id, :noteable_type, :project_id,
:attachment, :line_code :attachment, :line_code
attr_accessor :notify
attr_accessor :notify_author
belongs_to :project belongs_to :project
belongs_to :noteable, polymorphic: true belongs_to :noteable, polymorphic: true
belongs_to :author, class_name: "User" belongs_to :author, class_name: "User"
...@@ -13,18 +16,17 @@ class Note < ActiveRecord::Base ...@@ -13,18 +16,17 @@ class Note < ActiveRecord::Base
delegate :name, to: :project, prefix: true delegate :name, to: :project, prefix: true
delegate :name, :email, to: :author, prefix: true delegate :name, :email, to: :author, prefix: true
attr_accessor :notify validates :project, presence: true
attr_accessor :notify_author
validates_presence_of :project
validates :note, presence: true, length: { within: 0..5000 } validates :note, presence: true, length: { within: 0..5000 }
validates :attachment, file_size: { maximum: 10.megabytes.to_i } validates :attachment, file_size: { maximum: 10.megabytes.to_i }
mount_uploader :attachment, AttachmentUploader
# Scopes
scope :common, where(noteable_id: nil) scope :common, where(noteable_id: nil)
scope :today, where("created_at >= :date", date: Date.today) scope :today, where("created_at >= :date", date: Date.today)
scope :last_week, where("created_at >= :date", date: (Date.today - 7.days)) scope :last_week, where("created_at >= :date", date: (Date.today - 7.days))
scope :since, lambda { |day| where("created_at >= :date", date: (day)) } scope :since, ->(day) { where("created_at >= :date", date: (day)) }
scope :fresh, order("created_at ASC, id ASC") scope :fresh, order("created_at ASC, id ASC")
scope :inc_author_project, includes(:project, :author) scope :inc_author_project, includes(:project, :author)
scope :inc_author, includes(:author) scope :inc_author, includes(:author)
......
...@@ -28,20 +28,35 @@ class Project < ActiveRecord::Base ...@@ -28,20 +28,35 @@ class Project < ActiveRecord::Base
delegate :name, to: :owner, allow_nil: true, prefix: true delegate :name, to: :owner, allow_nil: true, prefix: true
# 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 # Scopes
scope :public_only, where(private_flag: false) scope :public_only, where(private_flag: false)
scope :without_user, ->(user) { where("id NOT IN (:ids)", ids: user.projects.map(&:id) ) } 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 ) } scope :not_in_group, ->(group) { where("id NOT IN (:ids)", ids: group.project_ids ) }
def self.active class << self
def active
joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC") joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC")
end end
def self.search query def search query
where("name LIKE :query OR code LIKE :query OR path LIKE :query", query: "%#{query}%") where("name LIKE :query OR code LIKE :query OR path LIKE :query", query: "%#{query}%")
end end
def self.create_by_user(params, user) def create_by_user(params, user)
project = Project.new params project = Project.new params
Project.transaction do Project.transaction do
...@@ -66,6 +81,11 @@ def self.create_by_user(params, user) ...@@ -66,6 +81,11 @@ def self.create_by_user(params, user)
project project
end end
def access_options
UsersProject.access_roles
end
end
def git_error? def git_error?
error_code == :gitolite error_code == :gitolite
end end
...@@ -74,20 +94,6 @@ def saved? ...@@ -74,20 +94,6 @@ def saved?
id && valid? id && valid?
end end
# 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
def check_limit def check_limit
unless owner.can_create_project? unless owner.can_create_project?
errors[:base] << ("Your own projects limit is #{owner.projects_limit}! Please contact administrator to increase it") errors[:base] << ("Your own projects limit is #{owner.projects_limit}! Please contact administrator to increase it")
...@@ -102,10 +108,6 @@ def repo_name ...@@ -102,10 +108,6 @@ def repo_name
end end
end end
def self.access_options
UsersProject.access_roles
end
def to_param def to_param
code code
end end
......
...@@ -4,7 +4,8 @@ class ProtectedBranch < ActiveRecord::Base ...@@ -4,7 +4,8 @@ class ProtectedBranch < ActiveRecord::Base
attr_accessible :name attr_accessible :name
belongs_to :project belongs_to :project
validates_presence_of :name, :project_id validates :name, presence: true
validates :project, presence: true
after_save :update_repository after_save :update_repository
after_destroy :update_repository after_destroy :update_repository
......
...@@ -9,11 +9,13 @@ class Snippet < ActiveRecord::Base ...@@ -9,11 +9,13 @@ class Snippet < ActiveRecord::Base
delegate :name, :email, to: :author, prefix: true delegate :name, :email, to: :author, prefix: true
validates_presence_of :author_id, :project_id validates :author, presence: true
validates :project, presence: true
validates :title, presence: true, length: { within: 0..255 } validates :title, presence: true, length: { within: 0..255 }
validates :file_name, presence: true, length: { within: 0..255 } validates :file_name, presence: true, length: { within: 0..255 }
validates :content, presence: true, length: { within: 0..10000 } validates :content, presence: true, length: { within: 0..10000 }
# Scopes
scope :fresh, order("created_at DESC") scope :fresh, order("created_at DESC")
scope :non_expired, where(["expires_at IS NULL OR expires_at > ?", Time.current]) scope :non_expired, where(["expires_at IS NULL OR expires_at > ?", Time.current])
scope :expired, where(["expires_at IS NOT NULL AND expires_at < ?", Time.current]) scope :expired, where(["expires_at IS NOT NULL AND expires_at < ?", Time.current])
......
class SystemHook < WebHook class SystemHook < WebHook
def async_execute(data)
Resque.enqueue(SystemHookWorker, id, data)
end
def self.all_hooks_fire(data) def self.all_hooks_fire(data)
SystemHook.all.each do |sh| SystemHook.all.each do |sh|
sh.async_execute data sh.async_execute data
end end
end end
def async_execute(data)
Resque.enqueue(SystemHookWorker, id, data)
end
end end
# == Schema Information # == Schema Information
......
...@@ -27,22 +27,18 @@ class User < ActiveRecord::Base ...@@ -27,22 +27,18 @@ class User < ActiveRecord::Base
validates :extern_uid, :allow_blank => true, :uniqueness => {:scope => :provider} validates :extern_uid, :allow_blank => true, :uniqueness => {:scope => :provider}
validates :projects_limit, presence: true, numericality: {greater_than_or_equal_to: 0} validates :projects_limit, presence: true, numericality: {greater_than_or_equal_to: 0}
scope :not_in_project, lambda { |project| where("id not in (:ids)", ids: project.users.map(&:id) ) }
scope :admins, where(admin: true)
scope :blocked, where(blocked: true)
scope :active, where(blocked: false)
before_validation :generate_password, on: :create before_validation :generate_password, on: :create
before_save :ensure_authentication_token before_save :ensure_authentication_token
alias_attribute :private_token, :authentication_token alias_attribute :private_token, :authentication_token
def generate_password # Scopes
if self.force_random_password scope :not_in_project, ->(project) { where("id not in (:ids)", ids: project.users.map(&:id) ) }
self.password = self.password_confirmation = Devise.friendly_token.first(8) scope :admins, where(admin: true)
end scope :blocked, where(blocked: true)
end scope :active, where(blocked: false)
def self.filter filter_name class << self
def filter filter_name
case filter_name case filter_name
when "admins"; self.admins when "admins"; self.admins
when "blocked"; self.blocked when "blocked"; self.blocked
...@@ -52,28 +48,35 @@ def self.filter filter_name ...@@ -52,28 +48,35 @@ def self.filter filter_name
end end
end end
def self.without_projects def without_projects
where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)') where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)')
end end
def self.create_from_omniauth(auth, ldap = false) def create_from_omniauth(auth, ldap = false)
gitlab_auth.create_from_omniauth(auth, ldap) gitlab_auth.create_from_omniauth(auth, ldap)
end end
def self.find_or_new_for_omniauth(auth) def find_or_new_for_omniauth(auth)
gitlab_auth.find_or_new_for_omniauth(auth) gitlab_auth.find_or_new_for_omniauth(auth)
end end
def self.find_for_ldap_auth(auth, signed_in_resource = nil) def find_for_ldap_auth(auth, signed_in_resource = nil)
gitlab_auth.find_for_ldap_auth(auth, signed_in_resource) gitlab_auth.find_for_ldap_auth(auth, signed_in_resource)
end end
def self.gitlab_auth def gitlab_auth
Gitlab::Auth.new Gitlab::Auth.new
end end
def self.search query def search query
where("name LIKE :query OR email LIKE :query", query: "%#{query}%") where("name LIKE :query or email LIKE :query", query: "%#{query}%")
end
end
def generate_password
if self.force_random_password
self.password = self.password_confirmation = Devise.friendly_token.first(8)
end
end end
end end
......
...@@ -14,13 +14,14 @@ class UsersProject < ActiveRecord::Base ...@@ -14,13 +14,14 @@ class UsersProject < ActiveRecord::Base
after_save :update_repository after_save :update_repository
after_destroy :update_repository after_destroy :update_repository
validates_uniqueness_of :user_id, scope: [:project_id], message: "already exists in project" validates :user, presence: true
validates_presence_of :user_id validates :user_id, uniqueness: { :scope => [:project_id], message: "already exists in project" }
validates_presence_of :project_id validates :project, presence: true
delegate :name, :email, to: :user, prefix: true delegate :name, :email, to: :user, prefix: true
def self.bulk_delete(project, user_ids) class << self
def bulk_delete(project, user_ids)
UsersProject.transaction do UsersProject.transaction do
UsersProject.where(:user_id => user_ids, :project_id => project.id).each do |users_project| UsersProject.where(:user_id => user_ids, :project_id => project.id).each do |users_project|
users_project.destroy users_project.destroy
...@@ -28,7 +29,7 @@ def self.bulk_delete(project, user_ids) ...@@ -28,7 +29,7 @@ def self.bulk_delete(project, user_ids)
end end
end end
def self.bulk_update(project, user_ids, project_access) def bulk_update(project, user_ids, project_access)
UsersProject.transaction do UsersProject.transaction do
UsersProject.where(:user_id => user_ids, :project_id => project.id).each do |users_project| UsersProject.where(:user_id => user_ids, :project_id => project.id).each do |users_project|
users_project.project_access = project_access users_project.project_access = project_access
...@@ -37,7 +38,7 @@ def self.bulk_update(project, user_ids, project_access) ...@@ -37,7 +38,7 @@ def self.bulk_update(project, user_ids, project_access)
end end
end end
def self.bulk_import(project, user_ids, project_access) def bulk_import(project, user_ids, project_access)
UsersProject.transaction do UsersProject.transaction do
user_ids.each do |user_id| user_ids.each do |user_id|
users_project = UsersProject.new( users_project = UsersProject.new(
...@@ -50,7 +51,7 @@ def self.bulk_import(project, user_ids, project_access) ...@@ -50,7 +51,7 @@ def self.bulk_import(project, user_ids, project_access)
end end
end end
def self.user_bulk_import(user, project_ids, project_access) def user_bulk_import(user, project_ids, project_access)
UsersProject.transaction do UsersProject.transaction do
project_ids.each do |project_id| project_ids.each do |project_id|
users_project = UsersProject.new(