b60bc655f2
1f11096c
included new filters but made it hard to determine which dropdown did
what. This patch restores the original placeholders.
108 lines
2.2 KiB
Ruby
108 lines
2.2 KiB
Ruby
# == Schema Information
|
|
#
|
|
# Table name: milestones
|
|
#
|
|
# id :integer not null, primary key
|
|
# title :string(255) not null
|
|
# project_id :integer not null
|
|
# description :text
|
|
# due_date :date
|
|
# created_at :datetime
|
|
# updated_at :datetime
|
|
# state :string(255)
|
|
# iid :integer
|
|
#
|
|
|
|
class Milestone < ActiveRecord::Base
|
|
# Represents a "No Milestone" state used for filtering Issues and Merge
|
|
# Requests that have no milestone assigned.
|
|
MilestoneStruct = Struct.new(:title, :name)
|
|
None = MilestoneStruct.new('No Milestone', 'No Milestone')
|
|
Any = MilestoneStruct.new('Any', '')
|
|
|
|
include InternalId
|
|
include Sortable
|
|
|
|
belongs_to :project
|
|
has_many :issues
|
|
has_many :merge_requests
|
|
has_many :participants, through: :issues, source: :assignee
|
|
|
|
scope :active, -> { with_state(:active) }
|
|
scope :closed, -> { with_state(:closed) }
|
|
scope :of_projects, ->(ids) { where(project_id: ids) }
|
|
|
|
validates :title, presence: true
|
|
validates :project, presence: true
|
|
|
|
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
|
|
|
|
class << self
|
|
def search(query)
|
|
query = "%#{query}%"
|
|
where("title like ? or description like ?", query, query)
|
|
end
|
|
end
|
|
|
|
def expired?
|
|
if due_date
|
|
due_date.past?
|
|
else
|
|
false
|
|
end
|
|
end
|
|
|
|
def open_items_count
|
|
self.issues.opened.count + self.merge_requests.opened.count
|
|
end
|
|
|
|
def closed_items_count
|
|
self.issues.closed.count + self.merge_requests.closed_and_merged.count
|
|
end
|
|
|
|
def total_items_count
|
|
self.issues.count + self.merge_requests.count
|
|
end
|
|
|
|
def percent_complete
|
|
((closed_items_count * 100) / total_items_count).abs
|
|
rescue ZeroDivisionError
|
|
0
|
|
end
|
|
|
|
def expires_at
|
|
if due_date
|
|
if due_date.past?
|
|
"expired at #{due_date.stamp("Aug 21, 2011")}"
|
|
else
|
|
"expires at #{due_date.stamp("Aug 21, 2011")}"
|
|
end
|
|
end
|
|
end
|
|
|
|
def can_be_closed?
|
|
active? && issues.opened.count.zero?
|
|
end
|
|
|
|
def is_empty?
|
|
total_items_count.zero?
|
|
end
|
|
|
|
def author_id
|
|
nil
|
|
end
|
|
end
|