]> source.dussan.org Git - redmine.git/commitdiff
Query IssueStatus model to prevent workflows instanciation.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 26 Oct 2014 22:35:04 +0000 (22:35 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 26 Oct 2014 22:35:04 +0000 (22:35 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@13516 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/issue_status.rb

index ba0624a04c57277e94e6e861a32021bf80865edf..b9fccdb9986006ffd1a28a9ccf8086687d0a3227 100644 (file)
@@ -18,6 +18,7 @@
 class IssueStatus < ActiveRecord::Base
   before_destroy :check_integrity
   has_many :workflows, :class_name => 'WorkflowTransition', :foreign_key => "old_status_id"
+  has_many :workflow_transitions_as_new_status, :class_name => 'WorkflowTransition', :foreign_key => "new_status_id"
   acts_as_list
 
   before_destroy :delete_workflow_rules
@@ -72,16 +73,19 @@ class IssueStatus < ActiveRecord::Base
   # More efficient than the previous method if called just once
   def find_new_statuses_allowed_to(roles, tracker, author=false, assignee=false)
     if roles.present? && tracker
-      conditions = "(author = :false AND assignee = :false)"
-      conditions << " OR author = :true" if author
-      conditions << " OR assignee = :true" if assignee
-
-      workflows.
-        includes(:new_status).
-        where(["role_id IN (:role_ids) AND tracker_id = :tracker_id AND (#{conditions})",
-          {:role_ids => roles.collect(&:id), :tracker_id => tracker.id, :true => true, :false => false}
-          ]).to_a.
-        map(&:new_status).compact.sort
+      scope = IssueStatus.
+        joins(:workflow_transitions_as_new_status).
+        where(:workflows => {:old_status_id => id, :role_id => roles.map(&:id), :tracker_id => tracker.id})
+
+      unless author && assignee
+        if author || assignee
+          scope = scope.where("author = ? OR assignee = ?", author, assignee)
+        else
+          scope = scope.where("author = ? AND assignee = ?", false, false)
+        end
+      end
+
+      scope.uniq.to_a.sort
     else
       []
     end