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

This commit is contained in:
Dominik Klein 2025-01-28 22:26:39 +01:00
parent ed298164c7
commit af566999dd
4 changed files with 64 additions and 9 deletions

View file

@ -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',
]

View file

@ -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',
]

View file

@ -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

View file

@ -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