diff options
Diffstat (limited to 'app/models/iteration.rb')
-rw-r--r-- | app/models/iteration.rb | 136 |
1 files changed, 6 insertions, 130 deletions
diff --git a/app/models/iteration.rb b/app/models/iteration.rb index 7a35bb1cd1f..7483d04aab8 100644 --- a/app/models/iteration.rb +++ b/app/models/iteration.rb @@ -1,140 +1,16 @@ # frozen_string_literal: true +# Placeholder class for model that is implemented in EE class Iteration < ApplicationRecord self.table_name = 'sprints' - attr_accessor :skip_future_date_validation - attr_accessor :skip_project_validation - - STATE_ENUM_MAP = { - upcoming: 1, - started: 2, - closed: 3 - }.with_indifferent_access.freeze - - include AtomicInternalId - - belongs_to :project - belongs_to :group - - has_internal_id :iid, scope: :project - has_internal_id :iid, scope: :group - - validates :start_date, presence: true - validates :due_date, presence: true - - validate :dates_do_not_overlap, if: :start_or_due_dates_changed? - validate :future_date, if: :start_or_due_dates_changed?, unless: :skip_future_date_validation - validate :no_project, unless: :skip_project_validation - - scope :upcoming, -> { with_state(:upcoming) } - scope :started, -> { with_state(:started) } - scope :closed, -> { with_state(:closed) } - - scope :within_timeframe, -> (start_date, end_date) do - where('start_date IS NOT NULL OR due_date IS NOT NULL') - .where('start_date IS NULL OR start_date <= ?', end_date) - .where('due_date IS NULL OR due_date >= ?', start_date) + def self.reference_prefix + '*iteration:' end - scope :start_date_passed, -> { where('start_date <= ?', Date.current).where('due_date >= ?', Date.current) } - scope :due_date_passed, -> { where('due_date < ?', Date.current) } - - state_machine :state_enum, initial: :upcoming do - event :start do - transition upcoming: :started - end - - event :close do - transition [:upcoming, :started] => :closed - end - - state :upcoming, value: Iteration::STATE_ENUM_MAP[:upcoming] - state :started, value: Iteration::STATE_ENUM_MAP[:started] - state :closed, value: Iteration::STATE_ENUM_MAP[:closed] - end - - # Alias to state machine .with_state_enum method - # This needs to be defined after the state machine block to avoid errors - class << self - alias_method :with_state, :with_state_enum - alias_method :with_states, :with_state_enums - - def filter_by_state(iterations, state) - case state - when 'closed' then iterations.closed - when 'started' then iterations.started - when 'upcoming' then iterations.upcoming - when 'opened' then iterations.started.or(iterations.upcoming) - when 'all' then iterations - else raise ArgumentError, "Unknown state filter: #{state}" - end - end - - def reference_prefix - '*iteration:' - end - - def reference_pattern - nil - end - end - - def state - STATE_ENUM_MAP.key(state_enum) - end - - def state=(value) - self.state_enum = STATE_ENUM_MAP[value] - end - - def resource_parent - group || project - end - - private - - def parent_group - group || project.group - end - - def start_or_due_dates_changed? - start_date_changed? || due_date_changed? - end - - # ensure dates do not overlap with other Iterations in the same group/project tree - def dates_do_not_overlap - iterations = if parent_group.present? && resource_parent.is_a?(Project) - Iteration.where(group: parent_group.self_and_ancestors).or(project.iterations) - elsif parent_group.present? - Iteration.where(group: parent_group.self_and_ancestors) - else - project.iterations - end - - return unless iterations.where.not(id: self.id).within_timeframe(start_date, due_date).exists? - - errors.add(:base, s_("Iteration|Dates cannot overlap with other existing Iterations")) - end - - # ensure dates are in the future - def future_date - if start_date_changed? - errors.add(:start_date, s_("Iteration|cannot be in the past")) if start_date < Date.current - errors.add(:start_date, s_("Iteration|cannot be more than 500 years in the future")) if start_date > 500.years.from_now - end - - if due_date_changed? - errors.add(:due_date, s_("Iteration|cannot be in the past")) if due_date < Date.current - errors.add(:due_date, s_("Iteration|cannot be more than 500 years in the future")) if due_date > 500.years.from_now - end - end - - def no_project - return unless project_id.present? - - errors.add(:project_id, s_("is not allowed. We do not currently support project-level iterations")) + def self.reference_pattern + nil end end -Iteration.prepend_if_ee('EE::Iteration') +Iteration.prepend_if_ee('::EE::Iteration') |