12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- # Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
- class InputFieldsOperatorRenaming < ActiveRecord::Migration[6.1]
- def change
- # return if it's a new setup
- return if !Setting.exists?(name: 'system_init_done')
- update_postmaster_filter
- update_core_workflows
- end
- private
- OPERATOR_MAPPING = {
- 'is' => 'is any of',
- 'is not' => 'is none of',
- 'starts with' => 'starts with one of',
- 'ends with' => 'ends with one of',
- }.freeze
- def update_postmaster_filter
- PostmasterFilter.in_batches.each_record do |filter|
- next if filter.match.blank?
- filter.match.each_value do |condition|
- next if condition[:operator].blank?
- next if OPERATOR_MAPPING.keys.exclude?(condition[:operator])
- condition[:operator] = OPERATOR_MAPPING[condition[:operator]]
- end
- filter.save!
- end
- end
- def update_core_workflows
- CoreWorkflow.in_batches.each_record do |workflow|
- next if workflow.condition_saved.blank? && workflow.condition_selected.blank?
- update_core_workflow_condition(workflow, :condition_saved)
- update_core_workflow_condition(workflow, :condition_selected)
- workflow.save!
- end
- end
- def update_core_workflow_condition(workflow, condition_type)
- return if !input_operators_used?(workflow, condition_type)
- workflow[condition_type.to_sym].each do |attribute, condition|
- next if !operator_relevant?(condition[:operator])
- next if !input_attribute?(attribute)
- condition[:operator] = OPERATOR_MAPPING[condition[:operator]]
- end
- end
- def operator_relevant?(operator)
- return false if operator.blank?
- return false if OPERATOR_MAPPING.keys.exclude?(operator)
- true
- end
- def input_attribute?(attribute)
- meta_information = object_manager_attributes_type_lookup[attribute]
- return false if meta_information.nil?
- return false if !meta_information.eql?('input')
- true
- end
- def input_operators_used?(workflow, condition_type)
- workflow[condition_type.to_sym].values.any? do |condition|
- condition.key?(:operator) && condition[:operator].present? && OPERATOR_MAPPING.key?(condition[:operator])
- end
- end
- def object_manager_attributes_type_lookup
- @object_manager_attributes_type_lookup ||= begin
- ObjectManager::Attribute.all.each_with_object({}) do |attribute, hash|
- object_name = ObjectLookup.by_id(attribute.object_lookup_id)
- if object_name.casecmp('ticketarticle').zero?
- object_name = 'article'
- end
- hash["#{object_name.downcase}.#{attribute.name}"] = attribute.data_type
- end
- end
- end
- end
|