project.assignable_users
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?
+ end
+
# Returns an array of status that user is able to apply
def new_statuses_allowed_to(user)
statuses = status.find_new_statuses_allowed_to(user.roles_for_project(project), tracker)
statuses << status unless statuses.empty?
- statuses.uniq.sort
+ statuses = statuses.uniq.sort
+ blocked? ? statuses.reject {|s| s.is_closed?} : statuses
end
# Returns the mail adresses of users that should be notified for the issue
start_date: \r
due_date: \r
lock_version: 0\r
-
+issues_009: \r
+ created_on: <%= 1.minute.ago.to_date.to_s(:db) %>\r
+ project_id: 5\r
+ updated_on: <%= 1.minute.ago.to_date.to_s(:db) %>\r
+ priority_id: 5\r
+ subject: Blocked Issue\r
+ id: 9\r
+ fixed_version_id: \r
+ category_id: \r
+ description: This is an issue that is blocked by issue #10\r
+ tracker_id: 1\r
+ assigned_to_id: \r
+ author_id: 2\r
+ status_id: 1\r
+ start_date: <%= Date.today.to_s(:db) %>\r
+ due_date: <%= 1.days.from_now.to_date.to_s(:db) %>\r
+issues_010: \r
+ created_on: <%= 1.minute.ago.to_date.to_s(:db) %>\r
+ project_id: 5\r
+ updated_on: <%= 1.minute.ago.to_date.to_s(:db) %>\r
+ priority_id: 5\r
+ subject: Issue Doing the Blocking\r
+ id: 10\r
+ fixed_version_id: \r
+ category_id: \r
+ description: This is an issue that blocks issue #9\r
+ tracker_id: 1\r
+ assigned_to_id: \r
+ author_id: 2\r
+ status_id: 1\r
+ start_date: <%= Date.today.to_s(:db) %>\r
+ due_date: <%= 1.days.from_now.to_date.to_s(:db) %>\r
class IssueTest < Test::Unit::TestCase
fixtures :projects, :users, :members, :member_roles,
:trackers, :projects_trackers,
- :issue_statuses, :issue_categories,
+ :issue_statuses, :issue_categories, :issue_relations, :workflows,
:enumerations,
:issues,
:custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values,
assert_nil TimeEntry.find_by_issue_id(1)
end
+ def test_blocked
+ blocked_issue = Issue.find(9)
+ blocking_issue = Issue.find(10)
+
+ assert blocked_issue.blocked?
+ assert !blocking_issue.blocked?
+ end
+
+ def test_blocked_issues_dont_allow_closed_statuses
+ blocked_issue = Issue.find(9)
+
+ allowed_statuses = blocked_issue.new_statuses_allowed_to(users(:users_002))
+ assert !allowed_statuses.empty?
+ closed_statuses = allowed_statuses.select {|st| st.is_closed?}
+ assert closed_statuses.empty?
+ end
+
+ def test_unblocked_issues_allow_closed_statuses
+ blocking_issue = Issue.find(10)
+
+ allowed_statuses = blocking_issue.new_statuses_allowed_to(users(:users_002))
+ assert !allowed_statuses.empty?
+ closed_statuses = allowed_statuses.select {|st| st.is_closed?}
+ assert !closed_statuses.empty?
+ end
+
def test_overdue
assert Issue.new(:due_date => 1.day.ago.to_date).overdue?
assert !Issue.new(:due_date => Date.today).overdue?