Browse Source

Fixes #5474 - Failing import when an existing zendesk custom attribute name is...

Dominik Klein 1 month ago
parent
commit
b1b791a7d5

+ 1 - 0
lib/sequencer/sequence/import/zendesk/organization_field.rb

@@ -7,6 +7,7 @@ class Sequencer::Sequence::Import::Zendesk::OrganizationField < Sequencer::Seque
       'Common::ModelClass::Organization',
       'Import::Zendesk::ObjectAttribute::SanitizedType',
       'Import::Zendesk::ObjectAttribute::SanitizedName',
+      'Import::Zendesk::ObjectAttribute::Skip',
       'Import::Zendesk::ObjectAttribute::Add',
       'Import::Zendesk::ObjectAttribute::FieldMap',
     ]

+ 1 - 0
lib/sequencer/sequence/import/zendesk/user_field.rb

@@ -7,6 +7,7 @@ class Sequencer::Sequence::Import::Zendesk::UserField < Sequencer::Sequence::Bas
       'Common::ModelClass::User',
       'Import::Zendesk::ObjectAttribute::SanitizedType',
       'Import::Zendesk::ObjectAttribute::SanitizedName',
+      'Import::Zendesk::ObjectAttribute::Skip',
       'Import::Zendesk::ObjectAttribute::Add',
       'Import::Zendesk::ObjectAttribute::FieldMap',
     ]

+ 26 - 0
lib/sequencer/unit/import/zendesk/object_attribute/skip.rb

@@ -0,0 +1,26 @@
+# Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
+
+class Sequencer::Unit::Import::Zendesk::ObjectAttribute::Skip < Sequencer::Unit::Base
+
+  uses :model_class, :sanitized_name
+  provides :action
+
+  # Skip fields which already exists and not editable.
+  def process
+    attribute = object_attribute_for_name
+
+    return if !attribute || attribute.editable
+
+    logger.info { "Skipping. Default field '#{attribute}' found for field '#{sanitized_name}'." }
+    state.provide(:action, :skipped)
+  end
+
+  private
+
+  def object_attribute_for_name
+    ObjectManager::Attribute.get(
+      object: model_class.to_s,
+      name:   sanitized_name
+    )
+  end
+end

+ 36 - 9
spec/lib/sequencer/sequence/import/zendesk/user_field_spec.rb

@@ -4,18 +4,17 @@ require 'rails_helper'
 require 'zendesk_api'
 
 RSpec.describe Sequencer::Sequence::Import::Zendesk::UserField, sequencer: :sequence do
+  let(:process_payload) do
+    {
+      import_job: build_stubbed(:import_job, name: 'Import::Zendesk', payload: {}),
+      dry_run:    false,
+      resource:   resource,
+      field_map:  {},
+    }
+  end
 
   context 'when trying to import user fields from Zendesk', db_strategy: :reset do
 
-    let(:process_payload) do
-      {
-        import_job: build_stubbed(:import_job, name: 'Import::Zendesk', payload: {}),
-        dry_run:    false,
-        resource:   resource,
-        field_map:  {},
-      }
-    end
-
     let(:resource) do
       ZendeskAPI::UserField.new(
         nil,
@@ -43,4 +42,32 @@ RSpec.describe Sequencer::Sequence::Import::Zendesk::UserField, sequencer: :sequ
       expect { process(process_payload) }.to change(User, :column_names).by(['lieblingstier'])
     end
   end
+
+  context 'when trying to import an existing internal field on zammad side' do
+    let(:resource) do
+      ZendeskAPI::UserField.new(
+        nil,
+        {
+          'id'                    => 206_415,
+          'type'                  => 'text',
+          'key'                   => 'phone',
+          'title'                 => 'Phone',
+          'description'           => '',
+          'raw_title'             => 'Phone',
+          'raw_description'       => ",
+           Katze oder Maus?",
+          'position'              => 0,
+          'active'                => false,
+          'system'                => false,
+          'regexp_for_validation' => nil,
+          'created_at'            => '2015-12-04 11:05:45 UTC',
+          'updated_at'            => '2015-12-04 11:05:45 UTC'
+        }
+      )
+    end
+
+    it 'does not try to add a existing field' do
+      expect { process(process_payload) }.not_to raise_error
+    end
+  end
 end