Added import of OTRS DynamicFields into Zammads ObjectManager attributes.
This commit is contained in:
parent
b198454b87
commit
b797fd6d30
2 changed files with 165 additions and 1 deletions
|
@ -317,7 +317,7 @@ module Import::OTRS
|
|||
|
||||
# dynamic fields
|
||||
dynamic_fields = load('DynamicField')
|
||||
#settings(dynamic_fields, settings)
|
||||
object_manager(dynamic_fields)
|
||||
|
||||
# email accounts
|
||||
#accounts = load('PostMasterAccount')
|
||||
|
@ -608,6 +608,19 @@ module Import::OTRS
|
|||
ticket_new[value] = record[key.to_s]
|
||||
}
|
||||
|
||||
record.keys.each { |key|
|
||||
|
||||
key_string = key.to_s
|
||||
|
||||
next if !key_string.start_with?('DynamicField_')
|
||||
dynamic_field_name = key_string[13, key_string.length]
|
||||
|
||||
next if skip_fields.include?( dynamic_field_name )
|
||||
dynamic_field_name = convert_df_name(dynamic_field_name)
|
||||
|
||||
ticket_new[dynamic_field_name.to_sym] = record[key_string]
|
||||
}
|
||||
|
||||
# find owner
|
||||
if ticket_new[:owner]
|
||||
user = User.find_by(login: ticket_new[:owner].downcase)
|
||||
|
@ -1345,6 +1358,127 @@ module Import::OTRS
|
|||
}
|
||||
end
|
||||
|
||||
# dynamic fields
|
||||
def self.object_manager(dynamic_fields)
|
||||
|
||||
dynamic_fields.each { |dynamic_field|
|
||||
|
||||
if dynamic_field['ObjectType'] != 'Ticket'
|
||||
log "ERROR: Unsupported dynamic field object type '#{dynamic_field['ObjectType']}' for dynamic field '#{dynamic_field['Name']}'"
|
||||
next
|
||||
end
|
||||
|
||||
next if skip_fields.include?( dynamic_field['Name'] )
|
||||
|
||||
internal_name = convert_df_name(dynamic_field['Name'])
|
||||
|
||||
attribute = ObjectManager::Attribute.get(
|
||||
object: dynamic_field['ObjectType'],
|
||||
name: internal_name,
|
||||
)
|
||||
next if !attribute.nil?
|
||||
|
||||
object_manager_config = {
|
||||
object: dynamic_field['ObjectType'],
|
||||
name: internal_name,
|
||||
display: dynamic_field['Label'],
|
||||
screens: {
|
||||
view: {
|
||||
'-all-' => {
|
||||
shown: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
active: true,
|
||||
editable: dynamic_field['InternalField'] == '0',
|
||||
position: dynamic_field['FieldOrder'],
|
||||
created_by_id: 1,
|
||||
updated_by_id: 1,
|
||||
}
|
||||
|
||||
if dynamic_field['FieldType'] == 'Text'
|
||||
|
||||
object_manager_config[:data_type] = 'input'
|
||||
object_manager_config[:data_option] = {
|
||||
default: dynamic_field['Config']['DefaultValue'],
|
||||
type: 'text',
|
||||
maxlength: 255,
|
||||
null: false,
|
||||
}
|
||||
elsif dynamic_field['FieldType'] == 'TextArea'
|
||||
|
||||
object_manager_config[:data_type] = 'textarea'
|
||||
object_manager_config[:data_option] = {
|
||||
default: dynamic_field['Config']['DefaultValue'],
|
||||
rows: dynamic_field['Config']['Rows'],
|
||||
null: false,
|
||||
}
|
||||
elsif dynamic_field['FieldType'] == 'Checkbox'
|
||||
|
||||
object_manager_config[:data_type] = 'boolean'
|
||||
object_manager_config[:data_option] = {
|
||||
default: dynamic_field['Config']['DefaultValue'] == '1',
|
||||
options: {
|
||||
true => 'Yes',
|
||||
false => 'No',
|
||||
},
|
||||
null: false,
|
||||
translate: true,
|
||||
}
|
||||
elsif dynamic_field['FieldType'] == 'DateTime'
|
||||
|
||||
object_manager_config[:data_type] = 'datetime'
|
||||
object_manager_config[:data_option] = {
|
||||
future: dynamic_field['Config']['YearsInFuture'] != '0',
|
||||
past: dynamic_field['Config']['YearsInPast'] != '0',
|
||||
diff: dynamic_field['Config']['DefaultValue'].to_i / 60 / 60,
|
||||
null: false,
|
||||
}
|
||||
elsif dynamic_field['FieldType'] == 'Date'
|
||||
|
||||
object_manager_config[:data_type] = 'date'
|
||||
object_manager_config[:data_option] = {
|
||||
future: dynamic_field['Config']['YearsInFuture'] != '0',
|
||||
past: dynamic_field['Config']['YearsInPast'] != '0',
|
||||
diff: dynamic_field['Config']['DefaultValue'].to_i / 60 / 60 / 24,
|
||||
null: false,
|
||||
}
|
||||
elsif dynamic_field['FieldType'] == 'Dropdown'
|
||||
|
||||
object_manager_config[:data_type] = 'select'
|
||||
object_manager_config[:data_option] = {
|
||||
default: '',
|
||||
multiple: false,
|
||||
options: dynamic_field['Config']['PossibleValues'],
|
||||
null: dynamic_field['Config']['PossibleNone'] == '1',
|
||||
translate: dynamic_field['Config']['TranslatableValues'] == '1',
|
||||
}
|
||||
elsif dynamic_field['FieldType'] == 'Multiselect'
|
||||
|
||||
object_manager_config[:data_type] = 'select'
|
||||
object_manager_config[:data_option] = {
|
||||
default: '',
|
||||
multiple: true,
|
||||
options: dynamic_field['Config']['PossibleValues'],
|
||||
null: dynamic_field['Config']['PossibleNone'] == '1',
|
||||
translate: dynamic_field['Config']['TranslatableValues'] == '1',
|
||||
}
|
||||
else
|
||||
log "ERROR: Unsupported dynamic field field type '#{dynamic_field['FieldType']}' for dynamic field '#{dynamic_field['Name']}'"
|
||||
next
|
||||
end
|
||||
|
||||
ObjectManager::Attribute.add( object_manager_config )
|
||||
ObjectManager::Attribute.migration_execute(false)
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
def self.convert_df_name(dynamic_field_name)
|
||||
new_name = dynamic_field_name.underscore
|
||||
new_name.sub(/\_id(s)?\z/, "_no#{$1}")
|
||||
end
|
||||
|
||||
# log
|
||||
def self.log(message)
|
||||
thread_no = Thread.current[:thread_no] || '-'
|
||||
|
@ -1460,4 +1594,8 @@ module Import::OTRS
|
|||
true
|
||||
end
|
||||
|
||||
def self.skip_fields
|
||||
%w(ProcessManagementProcessID ProcessManagementActivityID ZammadMigratorChanged ZammadMigratorChangedOld)
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -30,7 +30,21 @@ class OtrsImportTest < ActiveSupport::TestCase
|
|||
assert_equal( fqdn, Setting.get('fqdn'), 'fqdn' )
|
||||
assert_equal( http, Setting.get('http_type'), 'http_type' )
|
||||
assert_equal( 'Example Company', Setting.get('organization'), 'organization' )
|
||||
end
|
||||
|
||||
test 'check dynamic fields' do
|
||||
local_objects = ObjectManager::Attribute.list_full
|
||||
|
||||
assert_equal(75, local_objects.size, 'dynamic field count')
|
||||
|
||||
object_attribute_names = local_objects.reject { |local_object|
|
||||
local_object[:object] != 'Ticket'
|
||||
}.collect { |local_object|
|
||||
local_object['name']
|
||||
}
|
||||
expected_object_attribute_names = %w(vertriebsweg te_test sugar_crm_remote_no sugar_crm_company_selected_no sugar_crm_company_selection combine itsm_criticality customer_id itsm_impact itsm_review_required itsm_decision_result itsm_repair_start_time itsm_recovery_start_time itsm_decision_date title itsm_due_date topic_no open_exchange_ticket_number hostname ticket_free_key11 type ticket_free_text11 open_exchange_tn topic zarafa_tn group_id scom_hostname checkbox_example scom_uuid scom_state scom_service location owner_id department customer_location state_id pending_time priority_id tags)
|
||||
|
||||
assert_equal(expected_object_attribute_names, object_attribute_names, 'dynamic field names')
|
||||
end
|
||||
|
||||
# check count of imported items
|
||||
|
@ -205,6 +219,18 @@ class OtrsImportTest < ActiveSupport::TestCase
|
|||
assert_equal( Time.zone.parse('2014-11-21 00:17:40 +0000').gmtime.to_s, ticket.created_at.to_s )
|
||||
assert_equal( Time.zone.parse('2014-11-21 00:21:08 +0000').gmtime.to_s, ticket.close_time.to_s )
|
||||
|
||||
# ticket dynamic fields
|
||||
ticket = Ticket.find(591)
|
||||
assert_equal( 'Some other smart subject!', ticket.title )
|
||||
assert_equal( '488', ticket.vertriebsweg )
|
||||
assert_equal( '["193"]', ticket.te_test ) # TODO: multiselect
|
||||
assert_equal( '358', ticket.sugar_crm_remote_no )
|
||||
assert_equal( '69', ticket.sugar_crm_company_selected_no )
|
||||
assert_equal( '["382"]', ticket.sugar_crm_company_selection ) # TODO: multiselect
|
||||
assert_equal( '310', ticket.topic_no )
|
||||
assert_equal( '495', ticket.open_exchange_ticket_number )
|
||||
assert_equal( '208', ticket.hostname )
|
||||
|
||||
# check history
|
||||
# - create entry
|
||||
# - state change entry
|
||||
|
|
Loading…
Reference in a new issue