Adds version status to limit issue assignments (#1245).
Available version statuses are: * open: no restriction * locked: can not assign new issues to the version * closed: can not assign new issues and can not reopen assigned issues git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3020 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -143,6 +143,14 @@ class Issue < ActiveRecord::Base
|
||||
if start_date && soonest_start && start_date < soonest_start
|
||||
errors.add :start_date, :invalid
|
||||
end
|
||||
|
||||
if fixed_version
|
||||
if !assignable_versions.include?(fixed_version)
|
||||
errors.add :fixed_version_id, :inclusion
|
||||
elsif reopened? && fixed_version.closed?
|
||||
errors.add_to_base I18n.t(:error_can_not_reopen_issue_on_closed_version)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def validate_on_create
|
||||
@@ -193,6 +201,18 @@ class Issue < ActiveRecord::Base
|
||||
self.status.is_closed?
|
||||
end
|
||||
|
||||
# Return true if the issue is being reopened
|
||||
def reopened?
|
||||
if !new_record? && status_id_changed?
|
||||
status_was = IssueStatus.find_by_id(status_id_was)
|
||||
status_new = IssueStatus.find_by_id(status_id)
|
||||
if status_was && status_new && status_was.is_closed? && !status_new.is_closed?
|
||||
return true
|
||||
end
|
||||
end
|
||||
false
|
||||
end
|
||||
|
||||
# Returns true if the issue is overdue
|
||||
def overdue?
|
||||
!due_date.nil? && (due_date < Date.today) && !status.is_closed?
|
||||
@@ -203,6 +223,11 @@ class Issue < ActiveRecord::Base
|
||||
project.assignable_users
|
||||
end
|
||||
|
||||
# Versions that the issue can be assigned to
|
||||
def assignable_versions
|
||||
@assignable_versions ||= (project.versions.open + [Version.find_by_id(fixed_version_id_was)]).compact.uniq.sort
|
||||
end
|
||||
|
||||
# Returns true if this issue is blocked by another issue that is still open
|
||||
def blocked?
|
||||
!relations_to.detect {|ir| ir.relation_type == 'blocks' && !ir.issue_from.closed?}.nil?
|
||||
|
||||
+10
-1
@@ -22,11 +22,16 @@ class Version < ActiveRecord::Base
|
||||
acts_as_attachable :view_permission => :view_files,
|
||||
:delete_permission => :manage_files
|
||||
|
||||
VERSION_STATUSES = %w(open locked closed)
|
||||
|
||||
validates_presence_of :name
|
||||
validates_uniqueness_of :name, :scope => [:project_id]
|
||||
validates_length_of :name, :maximum => 60
|
||||
validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :not_a_date, :allow_nil => true
|
||||
|
||||
validates_inclusion_of :status, :in => VERSION_STATUSES
|
||||
|
||||
named_scope :open, :conditions => {:status => 'open'}
|
||||
|
||||
def start_date
|
||||
effective_date
|
||||
end
|
||||
@@ -45,6 +50,10 @@ class Version < ActiveRecord::Base
|
||||
@spent_hours ||= TimeEntry.sum(:hours, :include => :issue, :conditions => ["#{Issue.table_name}.fixed_version_id = ?", id]).to_f
|
||||
end
|
||||
|
||||
def closed?
|
||||
status == 'closed'
|
||||
end
|
||||
|
||||
# Returns true if the version is completed: due date reached and no open issues
|
||||
def completed?
|
||||
effective_date && (effective_date <= Date.today) && (open_issues_count == 0)
|
||||
|
||||
Reference in New Issue
Block a user