Index: app/models/issue.rb =================================================================== --- app/models/issue.rb +++ app/models/issue.rb @@ -347,7 +347,7 @@ class Issue < ActiveRecord::Base if tracker != tracker_was if status == tracker_was.try(:default_status) self.status = nil - elsif status && tracker && !tracker.issue_status_ids.include?(status.id) + elsif status && tracker && !tracker.issue_status_ids_for_roles(User.current.roles_for_project(project)).include?(status.id) self.status = nil end reassign_custom_field_values @@ -977,7 +977,7 @@ class Issue < ActiveRecord::Base elsif tracker_id_changed? if Tracker.where(:id => tracker_id_was, :default_status_id => status_id_was).any? initial_status = default_status - elsif tracker.issue_status_ids.include?(status_id_was) + elsif tracker.issue_status_ids_for_roles(user.roles_for_project(project)).include?(status_id_was) initial_status = IssueStatus.find_by_id(status_id_was) else initial_status = default_status Index: app/models/tracker.rb =================================================================== --- app/models/tracker.rb +++ app/models/tracker.rb @@ -91,6 +91,18 @@ class Tracker < ActiveRecord::Base end end + def issue_status_ids_for_roles(roles) + if roles.present? + scope = IssueStatus. + joins(:workflow_transitions_as_new_status). + where(:workflows => {:role_id => roles.map(&:id), :tracker_id => self.id}) + + scope.distinct.pluck(:id).sort + else + [] + end + end + def disabled_core_fields i = -1 @disabled_core_fields ||= CORE_FIELDS.select { i += 1; (fields_bits || 0) & (2 ** i) != 0}