Browse Source

Fixes #4541 - Wrong core workflow execution because of missing relation defaults.

Rolf Schmidt 1 year ago
parent
commit
2b12299353

+ 7 - 0
app/models/core_workflow/attributes.rb

@@ -219,6 +219,13 @@ class CoreWorkflow::Attributes
     @options_relation[key].values
   end
 
+  def options_relation_default(attribute)
+    key = "#{attribute[:relation]}_#{attribute[:name]}"
+    @options_relation ||= {}
+    @options_relation[key] ||= "CoreWorkflow::Attributes::#{attribute[:relation]}".constantize.new(attributes: self, attribute: attribute)
+    @options_relation[key].try(:default_value)
+  end
+
   def attribute_filter?(attribute)
     screen_value(attribute, 'filter').present?
   end

+ 4 - 0
app/models/core_workflow/attributes/ticket_priority.rb

@@ -10,6 +10,10 @@ class CoreWorkflow::Attributes::TicketPriority < CoreWorkflow::Attributes::Base
     end
   end
 
+  def default_value
+    @default_value ||= Ticket::Priority.find_by(default_create: true).try(:id)&.to_s
+  end
+
   def assets(priority)
     return if @attributes.assets == false
     return if @attributes.assets[Ticket::Priority.to_app_model] && @attributes.assets[Ticket::Priority.to_app_model][priority.id]

+ 4 - 0
app/models/core_workflow/attributes/ticket_state.rb

@@ -15,6 +15,10 @@ class CoreWorkflow::Attributes::TicketState < CoreWorkflow::Attributes::Base
     end
   end
 
+  def default_value
+    @default_value ||= Ticket::State.find_by(default_create: true).try(:id)&.to_s
+  end
+
   def state_type
     return if @attributes.saved.id.blank?
 

+ 12 - 1
app/models/core_workflow/result/base_option.rb

@@ -23,8 +23,19 @@ class CoreWorkflow::Result::BaseOption < CoreWorkflow::Result::Backend
     end
   end
 
+  def first_value_default
+    @result_object.result[:restrict_values][field]&.first
+  end
+
+  def relation_value_default
+    return if attribute.blank?
+    return if !@result_object.attributes.attribute_options_relation?(attribute)
+
+    @result_object.attributes.options_relation_default(attribute)
+  end
+
   def remove_string
-    @result_object.payload['params'][field] = @result_object.result[:restrict_values][field]&.first
+    @result_object.payload['params'][field] = relation_value_default || first_value_default
     set_rerun
   end
 

+ 22 - 0
spec/models/core_workflow_spec.rb

@@ -1901,4 +1901,26 @@ RSpec.describe CoreWorkflow, mariadb: true, type: :model do
       end
     end
   end
+
+  describe 'Wrong core workflow execution because of missing relation defaults #4541' do
+    let!(:workflow) do
+      create(:core_workflow,
+             object:             'Ticket',
+             condition_selected: {
+               'ticket.priority_id': {
+                 operator: 'is',
+                 value:    [ Ticket::Priority.find_by(name: '1 low').id.to_s ]
+               },
+             })
+    end
+
+    before do
+      Ticket::Priority.find_by(name: '2 normal').update(note: 'Test')
+      workflow
+    end
+
+    it 'does not execute the core workflow because the default priority is 2 normal and not 1 low' do
+      expect(result[:matched_workflows]).not_to include(workflow.id)
+    end
+  end
 end