2020-01-03 09:07:33 +00:00
# frozen_string_literal: true
# == Milestoneable concern
#
# Contains functionality related to objects that can be assigned Milestones
#
# Used by Issuable
#
module Milestoneable
extend ActiveSupport :: Concern
included do
belongs_to :milestone
validate :milestone_is_valid
2020-07-21 21:09:12 +00:00
scope :any_milestone , - > { where . not ( milestone_id : nil ) }
2020-01-03 09:07:33 +00:00
scope :with_milestone , - > ( title ) { left_joins_milestones . where ( milestones : { title : title } ) }
2020-05-07 03:09:46 +00:00
scope :without_particular_milestone , - > ( title ) { left_outer_joins ( :milestone ) . where ( " milestones.title != ? OR milestone_id IS NULL " , title ) }
2020-01-03 09:07:33 +00:00
scope :any_release , - > { joins_milestone_releases }
scope :with_release , - > ( tag , project_id ) { joins_milestone_releases . where ( milestones : { releases : { tag : tag , project_id : project_id } } ) }
2021-10-20 18:12:31 +00:00
scope :without_particular_release , - > ( tag , project_id ) { joins_milestone_releases . where . not ( milestones : { releases : { tag : tag , project_id : project_id } } ) }
2020-01-03 09:07:33 +00:00
scope :left_joins_milestones , - > { joins ( " LEFT OUTER JOIN milestones ON #{ table_name } .milestone_id = milestones.id " ) }
scope :order_milestone_due_desc , - > { left_joins_milestones . reorder ( Arel . sql ( 'milestones.due_date IS NULL, milestones.id IS NULL, milestones.due_date DESC' ) ) }
scope :order_milestone_due_asc , - > { left_joins_milestones . reorder ( Arel . sql ( 'milestones.due_date IS NULL, milestones.id IS NULL, milestones.due_date ASC' ) ) }
scope :without_release , - > do
joins ( " LEFT OUTER JOIN milestone_releases ON #{ table_name } .milestone_id = milestone_releases.milestone_id " )
2021-04-26 12:09:44 +00:00
. where ( milestone_releases : { release_id : nil } )
2020-01-03 09:07:33 +00:00
end
scope :joins_milestone_releases , - > do
joins ( " JOIN milestone_releases ON #{ table_name } .milestone_id = milestone_releases.milestone_id
JOIN releases ON milestone_releases . release_id = releases . id " ).distinct
end
private
def milestone_is_valid
2021-04-15 15:09:11 +00:00
errors . add ( :milestone_id , 'is invalid' ) if respond_to? ( :milestone_id ) && ! milestone_available?
2020-01-03 09:07:33 +00:00
end
end
def milestone_available?
2021-04-15 15:09:11 +00:00
return true if milestone_id . blank?
2020-01-03 09:07:33 +00:00
project_id == milestone & . project_id || project . ancestors_upto . compact . include? ( milestone & . group )
end
##
# Overridden on EE module
#
def supports_milestone?
2021-01-15 15:10:31 +00:00
respond_to? ( :milestone_id )
2020-01-03 09:07:33 +00:00
end
end
2021-05-11 21:10:21 +00:00
Milestoneable . prepend_mod_with ( 'Milestoneable' )