]> source.dussan.org Git - redmine.git/commitdiff
Workflow editing shows statuses of irrelevant roles (#24281).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 16 Dec 2016 08:32:35 +0000 (08:32 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 16 Dec 2016 08:32:35 +0000 (08:32 +0000)
Patch by Jens Krämer.

git-svn-id: http://svn.redmine.org/redmine/trunk@16081 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/workflows_controller.rb
test/functional/workflows_controller_test.rb

index e825171bf0b093e4a7f4504b48a9d18a2b7cfdbf..dd75860ff79bd7d85469aa24ca4e86b61616b1c5 100644 (file)
@@ -138,7 +138,11 @@ class WorkflowsController < ApplicationController
   def find_statuses
     @used_statuses_only = (params[:used_statuses_only] == '0' ? false : true)
     if @trackers && @used_statuses_only
-      @statuses = @trackers.map(&:issue_statuses).flatten.uniq.sort.presence
+      role_ids = Role.all.select(&:consider_workflow?).map(&:id)
+      status_ids = WorkflowTransition.where(
+        :tracker_id => @trackers.map(&:id), :role_id => role_ids
+      ).uniq.pluck(:old_status_id, :new_status_id).flatten.uniq
+      @statuses = IssueStatus.where(:id => status_ids).sorted.to_a.presence
     end
     @statuses ||= IssueStatus.sorted.to_a
   end
index d70a79896cc5c700f570eeb8cacdb07293747bbc..c22224e3bee7f3ee3289494648b7b9a8bdbdc549 100644 (file)
@@ -59,6 +59,25 @@ class WorkflowsControllerTest < Redmine::ControllerTest
     assert_select 'input[type=checkbox][name=?]', 'transitions[1][1][always]', 0
   end
 
+  def test_get_edit_with_role_and_tracker_should_not_include_statuses_from_roles_without_workflow_permissions
+    WorkflowTransition.delete_all
+    WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 2, :new_status_id => 3)
+
+    reporter = Role.find(3)
+    reporter.remove_permission! :edit_issues
+    reporter.remove_permission! :add_issues
+    assert !reporter.consider_workflow?
+    WorkflowTransition.create!(:role_id => 3, :tracker_id => 1, :old_status_id => 1, :new_status_id => 5)
+
+    get :edit, :params => {:role_id => 2, :tracker_id => 1}
+    assert_response :success
+
+    # statuses 1 and 5 not displayed
+    statuses = IssueStatus.where(:id => [2, 3]).sorted.pluck(:name)
+    assert_equal ["New issue"] + statuses,
+      css_select('table.workflows.transitions-always tbody tr td:first').map(&:text).map(&:strip)
+  end
+
   def test_get_edit_should_include_allowed_statuses_for_new_issues
     WorkflowTransition.delete_all
     WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 0, :new_status_id => 1)