summaryrefslogtreecommitdiff
path: root/app/models/concerns/shared_milestone_properties.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/concerns/shared_milestone_properties.rb')
-rw-r--r--app/models/concerns/shared_milestone_properties.rb61
1 files changed, 61 insertions, 0 deletions
diff --git a/app/models/concerns/shared_milestone_properties.rb b/app/models/concerns/shared_milestone_properties.rb
new file mode 100644
index 00000000000..abb6cb34f05
--- /dev/null
+++ b/app/models/concerns/shared_milestone_properties.rb
@@ -0,0 +1,61 @@
+module SharedMilestoneProperties
+ extend ActiveSupport::Concern
+
+ include StripAttribute
+ include CacheMarkdownField
+
+ included do
+ has_many :issues
+ has_many :merge_requests
+ has_many :labels, -> { distinct.reorder('labels.title') }, through: :issues
+
+ # Use a uniqueness scope here to check name with project milestones
+ validates :title, presence: true#, uniqueness: { scope: :project_id }
+
+ scope :active, -> { with_state(:active) }
+ scope :closed, -> { with_state(:closed) }
+
+ validate :start_date_should_be_less_than_due_date, if: proc { |m| m.start_date.present? && m.due_date.present? }
+ strip_attributes :title
+ alias_attribute :name, :title
+
+ state_machine :state, initial: :active do
+ event :close do
+ transition active: :closed
+ end
+
+ event :activate do
+ transition closed: :active
+ end
+
+ state :closed
+
+ state :active
+ end
+
+ alias_attribute :name, :title
+
+ cache_markdown_field :title, pipeline: :single_line
+ cache_markdown_field :description
+ end
+
+ module ClassMethods
+ def filter_by_state(milestones, state)
+ case state
+ when 'closed' then milestones.closed
+ when 'all' then milestones
+ else milestones.active
+ end
+ end
+ end
+
+ def start_date_should_be_less_than_due_date
+ if due_date <= start_date
+ errors.add(:start_date, "Can't be greater than due date")
+ end
+ end
+
+ def safe_title
+ title.to_slug.normalize.to_s
+ end
+end