Commit f36f0dac authored by Robert Speicher's avatar Robert Speicher

Consolidate functionality shared between Issue and MergeRequest

Any associations, validations, delegates, scopes and methods that
were exactly the same in both Issue and MergeRequest models have been
moved to a new IssueCommonality module (role) that gets included by each
class.

There was actually quite a bit of duplication, because MergeRequests are
basically just specialized Issues.
parent 7a4c9588
...@@ -4,58 +4,17 @@ class Issue < ActiveRecord::Base ...@@ -4,58 +4,17 @@ class Issue < ActiveRecord::Base
acts_as_taggable_on :labels acts_as_taggable_on :labels
belongs_to :project
belongs_to :milestone belongs_to :milestone
belongs_to :author, :class_name => "User"
belongs_to :assignee, :class_name => "User"
has_many :notes, :as => :noteable, :dependent => :destroy
attr_protected :author, :author_id, :project, :project_id
attr_accessor :author_id_of_changes
validates_presence_of :project_id
validates_presence_of :author_id
delegate :name,
:email,
:to => :author,
:prefix => true
delegate :name,
:email,
:to => :assignee,
:allow_nil => true,
:prefix => true
validates :title,
:presence => true,
:length => { :within => 0..255 }
validates :description, validates :description,
:length => { :within => 0..2000 } :length => { :within => 0..2000 }
scope :opened, where(:closed => false)
scope :closed, where(:closed => true)
scope :assigned, lambda { |u| where(:assignee_id => u.id)}
acts_as_list acts_as_list
def self.open_for(user) def self.open_for(user)
opened.assigned(user) opened.assigned(user)
end end
def self.search query
where("title like :query", :query => "%#{query}%")
end
def today?
Date.today == created_at.to_date
end
def new?
today? && created_at == updated_at
end
def is_assigned? def is_assigned?
!!assignee_id !!assignee_id
end end
......
...@@ -10,47 +10,15 @@ class MergeRequest < ActiveRecord::Base ...@@ -10,47 +10,15 @@ class MergeRequest < ActiveRecord::Base
CAN_BE_MERGED = 2 CAN_BE_MERGED = 2
CANNOT_BE_MERGED = 3 CANNOT_BE_MERGED = 3
belongs_to :project
belongs_to :author, :class_name => "User"
belongs_to :assignee, :class_name => "User"
has_many :notes, :as => :noteable, :dependent => :destroy
serialize :st_commits serialize :st_commits
serialize :st_diffs serialize :st_diffs
attr_protected :author, :author_id, :project, :project_id attr_accessor :should_remove_source_branch
attr_accessor :author_id_of_changes,
:should_remove_source_branch
validates_presence_of :project_id
validates_presence_of :author_id
validates_presence_of :source_branch validates_presence_of :source_branch
validates_presence_of :target_branch validates_presence_of :target_branch
validate :validate_branches validate :validate_branches
delegate :name,
:email,
:to => :author,
:prefix => true
delegate :name,
:email,
:to => :assignee,
:allow_nil => true,
:prefix => true
validates :title,
:presence => true,
:length => { :within => 0..255 }
scope :opened, where(:closed => false)
scope :closed, where(:closed => true)
scope :assigned, lambda { |u| where(:assignee_id => u.id)}
def self.search query
where("title like :query", :query => "%#{query}%")
end
def self.find_all_by_branch(branch_name) def self.find_all_by_branch(branch_name)
where("source_branch like :branch or target_branch like :branch", :branch => branch_name) where("source_branch like :branch or target_branch like :branch", :branch => branch_name)
end end
...@@ -96,14 +64,6 @@ class MergeRequest < ActiveRecord::Base ...@@ -96,14 +64,6 @@ class MergeRequest < ActiveRecord::Base
self.save self.save
end end
def today?
Date.today == created_at.to_date
end
def new?
today? && created_at == updated_at
end
def diffs def diffs
st_diffs || [] st_diffs || []
end end
...@@ -136,7 +96,7 @@ class MergeRequest < ActiveRecord::Base ...@@ -136,7 +96,7 @@ class MergeRequest < ActiveRecord::Base
commits.first commits.first
end end
def merged? def merged?
merged && merge_event merged && merge_event
end end
...@@ -153,7 +113,7 @@ class MergeRequest < ActiveRecord::Base ...@@ -153,7 +113,7 @@ class MergeRequest < ActiveRecord::Base
end end
def probably_merged? def probably_merged?
unmerged_commits.empty? && unmerged_commits.empty? &&
commits.any? && open? commits.any? && open?
end end
...@@ -171,8 +131,8 @@ class MergeRequest < ActiveRecord::Base ...@@ -171,8 +131,8 @@ class MergeRequest < ActiveRecord::Base
self.update_attributes :state => CANNOT_BE_MERGED self.update_attributes :state => CANNOT_BE_MERGED
end end
def reloaded_commits def reloaded_commits
if open? && unmerged_commits.any? if open? && unmerged_commits.any?
self.st_commits = unmerged_commits self.st_commits = unmerged_commits
save save
end end
......
# Contains common functionality shared between Issues and MergeRequests # Contains common functionality shared between Issues and MergeRequests
module IssueCommonality module IssueCommonality
extend ActiveSupport::Concern
included do
attr_protected :author, :author_id, :project, :project_id
belongs_to :project
belongs_to :author, :class_name => "User"
belongs_to :assignee, :class_name => "User"
has_many :notes, :as => :noteable, :dependent => :destroy
validates_presence_of :project_id
validates_presence_of :author_id
validates :title,
:presence => true,
:length => { :within => 0..255 }
scope :opened, where(:closed => false)
scope :closed, where(:closed => true)
scope :assigned, lambda { |u| where(:assignee_id => u.id)}
delegate :name,
:email,
:to => :author,
:prefix => true
delegate :name,
:email,
:to => :assignee,
:allow_nil => true,
:prefix => true
attr_accessor :author_id_of_changes
end
def self.search query
where("title like :query", :query => "%#{query}%")
end
def today?
Date.today == created_at.to_date
end
def new?
today? && created_at == updated_at
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment