Просмотр исходного кода

Fixes #5483 - Organization is missing when used in expert mode conditions.

Co-authored-by: Florian Liebe <fl@zammad.com>
Rolf Schmidt 1 месяц назад
Родитель
Сommit
f8caa09a45
3 измененных файлов с 65 добавлено и 11 удалено
  1. 18 7
      app/models/application_model/can_assets.rb
  2. 8 4
      lib/selector/base.rb
  3. 39 0
      spec/models/trigger_spec.rb

+ 18 - 7
app/models/application_model/can_assets.rb

@@ -63,10 +63,21 @@ get assets and record_ids of selector
 =end
 
   def assets_of_selector(selector, assets = {})
-    send(selector)
-      .each_with_object(assets) do |(item, content), memo|
-        assets_of_single_selector(item, content, memo)
+    value = send(selector)
+    return assets if value.blank?
+
+    assets_of_selector_deep(Selector::Base.migrate_selector(value), assets)
+    assets
+  end
+
+  def assets_of_selector_deep(value, assets = {})
+    value[:conditions].each do |item|
+      if item[:conditions].nil?
+        assets_of_single_selector(item, assets)
+      else
+        assets_of_selector_deep(item, assets)
       end
+    end
   end
 
   def assets_added_to?(data)
@@ -75,17 +86,17 @@ get assets and record_ids of selector
 
   private
 
-  def assets_of_single_selector(item, content, assets = {})
-    area, key = item.split('.')
+  def assets_of_single_selector(item, assets = {})
+    area, key = item[:name].split('.')
     return if !key
     return if %w[ticket_customer ticket_owner].include?(area)
 
     area = 'user' if %w[customer session].include? area
 
     attribute_ref_class, item_ids = if area == 'notification'
-                                      notifications_assets_data(content)
+                                      notifications_assets_data(item)
                                     else
-                                      non_notifications_assets_data(area, key, content)
+                                      non_notifications_assets_data(area, key, item)
                                     end
 
     return if !attribute_ref_class

+ 8 - 4
lib/selector/base.rb

@@ -22,20 +22,24 @@ class Selector::Base
   end
 
   def migrate
-    return if !selector[:conditions].nil?
+    @selector = self.class.migrate_selector(selector)
+  end
+
+  def self.migrate_selector(value)
+    return value if !value[:conditions].nil?
 
     result = {
       operator:   'AND',
       conditions: [],
     }
 
-    selector.each_key do |key|
+    value.each_key do |key|
       result[:conditions] << {
         name: key.to_s,
-      }.merge(selector[key])
+      }.merge(value[key])
     end
 
-    @selector = result
+    result
   end
 
   def set_static_conditions

+ 39 - 0
spec/models/trigger_spec.rb

@@ -1862,4 +1862,43 @@ RSpec.describe Trigger, type: :model do
       end
     end
   end
+
+  describe 'Organization is missing when used in expert mode conditions #5483' do
+    let(:conditions_orgs) { create_list(:organization, 3) }
+    let(:trigger)         { create(:trigger, condition: condition) }
+
+    context 'when old conditions' do
+      let(:condition) do
+        {
+          'ticket.organization_id' => {
+            'operator'         => 'is',
+            'pre_condition'    => 'specific',
+            'value'            => conditions_orgs.map { |row| row.id.to_s },
+            'value_completion' => ''
+          }
+        }
+      end
+
+      it 'does contain assets for the conditions' do
+        expect(trigger.assets({})[:Organization].keys.sort).to eq(conditions_orgs.map(&:id).sort)
+      end
+    end
+
+    context 'when new conditions' do
+      let(:condition) do
+        Selector::Base.migrate_selector({
+                                          'ticket.organization_id' => {
+                                            'operator'         => 'is',
+                                            'pre_condition'    => 'specific',
+                                            'value'            => conditions_orgs.map { |row| row.id.to_s },
+                                            'value_completion' => ''
+                                          }
+                                        })
+      end
+
+      it 'does contain assets for the conditions' do
+        expect(trigger.assets({})[:Organization].keys.sort).to eq(conditions_orgs.map(&:id).sort)
+      end
+    end
+  end
 end