Fixes #4057, fixes #2375 - OTRS migration currently do not support custom dropdown multi-select fields.
This commit is contained in:
parent
e552795183
commit
61f42f950f
13 changed files with 101 additions and 23 deletions
|
@ -7,11 +7,11 @@
|
||||||
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_db_unseeded\\r\\e[0K"
|
- echo -e "\\e[0Ksection_end:`date +%s`:zammad_db_unseeded\\r\\e[0K"
|
||||||
- bundle exec rails test test/integration/otrs_import_test.rb
|
- bundle exec rails test test/integration/otrs_import_test.rb
|
||||||
variables:
|
variables:
|
||||||
FF_NETWORK_PER_BUILD: 1 # https://docs.gitlab.com/runner/configuration/feature-flags.html
|
FF_NETWORK_PER_BUILD: 1 # https://docs.gitlab.com/runner/configuration/feature-flags.html
|
||||||
IMPORT_OTRS_ENDPOINT: "http://zammad-ci-otrsimport-app/otrs/public.pl?Action=ZammadMigrator"
|
IMPORT_OTRS_ENDPOINT: 'http://zammad-ci-otrsimport-app/otrs/public.pl?Action=ZammadMigrator'
|
||||||
TZ: "Europe/Berlin" # Required for the zammad-ci-otrsimport-app containers
|
TZ: 'Europe/Berlin' # Required for the zammad-ci-otrsimport-app containers
|
||||||
|
|
||||||
"minitest:integration:otrs:6":
|
'minitest:integration:otrs:6':
|
||||||
<<: *template_integration_otrs
|
<<: *template_integration_otrs
|
||||||
services:
|
services:
|
||||||
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs6
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs6
|
||||||
alias: zammad-ci-otrsimport-app
|
alias: zammad-ci-otrsimport-app
|
||||||
|
|
||||||
"minitest:integration:otrs:5":
|
'minitest:integration:otrs:5':
|
||||||
<<: *template_integration_otrs
|
<<: *template_integration_otrs
|
||||||
services:
|
services:
|
||||||
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs5
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs5
|
||||||
alias: zammad-ci-otrsimport-app
|
alias: zammad-ci-otrsimport-app
|
||||||
|
|
||||||
"minitest:integration:otrs:4":
|
'minitest:integration:otrs:4':
|
||||||
<<: *template_integration_otrs
|
<<: *template_integration_otrs
|
||||||
services:
|
services:
|
||||||
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
|
@ -47,7 +47,7 @@
|
||||||
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs4
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs4
|
||||||
alias: zammad-ci-otrsimport-app
|
alias: zammad-ci-otrsimport-app
|
||||||
|
|
||||||
"minitest:integration:otrs:33":
|
'minitest:integration:otrs:33':
|
||||||
<<: *template_integration_otrs
|
<<: *template_integration_otrs
|
||||||
services:
|
services:
|
||||||
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
|
@ -59,7 +59,7 @@
|
||||||
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs33
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs33
|
||||||
alias: zammad-ci-otrsimport-app
|
alias: zammad-ci-otrsimport-app
|
||||||
|
|
||||||
"minitest:integration:otrs:32":
|
'minitest:integration:otrs:32':
|
||||||
<<: *template_integration_otrs
|
<<: *template_integration_otrs
|
||||||
services:
|
services:
|
||||||
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
|
@ -71,7 +71,7 @@
|
||||||
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs32
|
- name: $CI_REGISTRY/docker/zammad-ci-otrsimport-app:otrs32
|
||||||
alias: zammad-ci-otrsimport-app
|
alias: zammad-ci-otrsimport-app
|
||||||
|
|
||||||
"minitest:integration:otrs:31":
|
'minitest:integration:otrs:31':
|
||||||
<<: *template_integration_otrs
|
<<: *template_integration_otrs
|
||||||
services:
|
services:
|
||||||
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
- name: $CI_REGISTRY/docker/zammad-mysql:stable
|
||||||
|
|
|
@ -306,7 +306,6 @@ possible types
|
||||||
=end
|
=end
|
||||||
|
|
||||||
def self.add(data)
|
def self.add(data)
|
||||||
|
|
||||||
force = data[:force]
|
force = data[:force]
|
||||||
data.delete(:force)
|
data.delete(:force)
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ module Import
|
||||||
@internal_name = self.class.convert_name(dynamic_field['Name'])
|
@internal_name = self.class.convert_name(dynamic_field['Name'])
|
||||||
|
|
||||||
return if already_imported?(dynamic_field)
|
return if already_imported?(dynamic_field)
|
||||||
|
return if skip?(dynamic_field)
|
||||||
|
|
||||||
initialize_attribute_config(dynamic_field)
|
initialize_attribute_config(dynamic_field)
|
||||||
|
|
||||||
|
@ -54,6 +55,10 @@ module Import
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def skip?(_dynamic_field)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
def add
|
def add
|
||||||
ObjectManager::Attribute.add(@attribute_config)
|
ObjectManager::Attribute.add(@attribute_config)
|
||||||
ObjectManager::Attribute.migration_execute(false)
|
ObjectManager::Attribute.migration_execute(false)
|
||||||
|
|
|
@ -17,6 +17,12 @@ module Import
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def skip?(dynamic_field)
|
||||||
|
!dynamic_field['Config']['PossibleValues']
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,7 +6,7 @@ module Import
|
||||||
class Multiselect < Import::OTRS::DynamicField
|
class Multiselect < Import::OTRS::DynamicField
|
||||||
def init_callback(dynamic_field)
|
def init_callback(dynamic_field)
|
||||||
@attribute_config.merge!(
|
@attribute_config.merge!(
|
||||||
data_type: 'select',
|
data_type: 'multiselect',
|
||||||
data_option: {
|
data_option: {
|
||||||
default: '',
|
default: '',
|
||||||
multiple: true,
|
multiple: true,
|
||||||
|
@ -17,6 +17,12 @@ module Import
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def skip?(dynamic_field)
|
||||||
|
!dynamic_field['Config']['PossibleValues']
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,9 +8,10 @@ module Import
|
||||||
@attribute_config.merge!(
|
@attribute_config.merge!(
|
||||||
data_type: 'textarea',
|
data_type: 'textarea',
|
||||||
data_option: {
|
data_option: {
|
||||||
default: dynamic_field['Config']['DefaultValue'],
|
default: dynamic_field['Config']['DefaultValue'],
|
||||||
rows: dynamic_field['Config']['Rows'],
|
rows: dynamic_field['Config']['Rows'],
|
||||||
null: true,
|
null: true,
|
||||||
|
maxlength: 3000,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
20
spec/fixtures/import/otrs/dynamic_field/dropdown/without_possible_values.json
vendored
Normal file
20
spec/fixtures/import/otrs/dynamic_field/dropdown/without_possible_values.json
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"ID": "40",
|
||||||
|
"ChangeTime": "2016-05-25 11:14:06",
|
||||||
|
"InternalField": "0",
|
||||||
|
"ValidID": "1",
|
||||||
|
"CreateTime": "2014-08-21 14:54:15",
|
||||||
|
"Label": "Dropdown Example Without PossibleValues",
|
||||||
|
"FieldOrder": "30",
|
||||||
|
"Config": {
|
||||||
|
"TranslatableValues": "0",
|
||||||
|
"PossibleValues": null,
|
||||||
|
"TreeView": "0",
|
||||||
|
"DefaultValue": "",
|
||||||
|
"Link": "",
|
||||||
|
"PossibleNone": "1"
|
||||||
|
},
|
||||||
|
"FieldType": "Dropdown",
|
||||||
|
"Name": "DropdownExampleWithoutPossibleValues",
|
||||||
|
"ObjectType": "Ticket"
|
||||||
|
}
|
20
spec/fixtures/import/otrs/dynamic_field/multiselect/without_possible_values.json
vendored
Normal file
20
spec/fixtures/import/otrs/dynamic_field/multiselect/without_possible_values.json
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"ID": "40",
|
||||||
|
"ChangeTime": "2016-05-25 11:14:06",
|
||||||
|
"InternalField": "0",
|
||||||
|
"ValidID": "1",
|
||||||
|
"CreateTime": "2014-08-21 14:54:15",
|
||||||
|
"Label": "Multiselect Example Without PossibleValues",
|
||||||
|
"FieldOrder": "30",
|
||||||
|
"Config": {
|
||||||
|
"TranslatableValues": "0",
|
||||||
|
"PossibleValues": null,
|
||||||
|
"TreeView": "0",
|
||||||
|
"DefaultValue": "",
|
||||||
|
"Link": "",
|
||||||
|
"PossibleNone": "1"
|
||||||
|
},
|
||||||
|
"FieldType": "Multiselect",
|
||||||
|
"Name": "MultiselectExampleWithoutPossibleValues",
|
||||||
|
"ObjectType": "Ticket"
|
||||||
|
}
|
|
@ -14,4 +14,4 @@
|
||||||
"FieldType": "TextArea",
|
"FieldType": "TextArea",
|
||||||
"Name": "TextAreaExample",
|
"Name": "TextAreaExample",
|
||||||
"ObjectType": "Ticket"
|
"ObjectType": "Ticket"
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,4 +42,14 @@ RSpec.describe Import::OTRS::DynamicField::Dropdown do
|
||||||
|
|
||||||
dynamic_field_from_json('dropdown/default', zammad_structure)
|
dynamic_field_from_json('dropdown/default', zammad_structure)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'without possible values' do
|
||||||
|
it 'imports no field without possible value' do
|
||||||
|
allow(ObjectManager::Attribute).to receive(:add)
|
||||||
|
|
||||||
|
described_class.new(load_dynamic_field_json('dropdown/without_possible_values'))
|
||||||
|
|
||||||
|
expect(ObjectManager::Attribute).not_to have_received(:add)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -24,7 +24,7 @@ RSpec.describe Import::OTRS::DynamicField::Multiselect do
|
||||||
position: '4',
|
position: '4',
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
data_type: 'select',
|
data_type: 'multiselect',
|
||||||
data_option: {
|
data_option: {
|
||||||
default: '',
|
default: '',
|
||||||
multiple: true,
|
multiple: true,
|
||||||
|
@ -42,4 +42,14 @@ RSpec.describe Import::OTRS::DynamicField::Multiselect do
|
||||||
|
|
||||||
dynamic_field_from_json('multiselect/default', zammad_structure)
|
dynamic_field_from_json('multiselect/default', zammad_structure)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'without possible values' do
|
||||||
|
it 'imports no field without possible value' do
|
||||||
|
allow(ObjectManager::Attribute).to receive(:add)
|
||||||
|
|
||||||
|
described_class.new(load_dynamic_field_json('multiselect/without_possible_values'))
|
||||||
|
|
||||||
|
expect(ObjectManager::Attribute).not_to have_received(:add)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -26,9 +26,10 @@ RSpec.describe Import::OTRS::DynamicField::TextArea do
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
data_type: 'textarea',
|
data_type: 'textarea',
|
||||||
data_option: {
|
data_option: {
|
||||||
default: '',
|
default: '',
|
||||||
rows: '20',
|
rows: '20',
|
||||||
null: true
|
null: true,
|
||||||
|
maxlength: 3000,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ class OtrsImportTest < ActiveSupport::TestCase
|
||||||
end.collect do |local_object|
|
end.collect do |local_object|
|
||||||
local_object['name']
|
local_object['name']
|
||||||
end
|
end
|
||||||
expected_object_attribute_names = %w[vertriebsweg te_test number sugar_crm_remote_no sugar_crm_company_selected_no sugar_crm_company_selection combine title itsm_criticality customer_id itsm_impact itsm_review_required itsm_decision_result organization_id itsm_repair_start_time itsm_recovery_start_time itsm_decision_date 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]
|
expected_object_attribute_names = %w[vertriebsweg te_test number sugar_crm_remote_no sugar_crm_company_selected_no sugar_crm_company_selection combine title itsm_criticality customer_id itsm_impact itsm_review_required itsm_decision_result organization_id itsm_repair_start_time itsm_recovery_start_time itsm_decision_date 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 textfeld state_id pending_time priority_id tags]
|
||||||
|
|
||||||
assert_equal(expected_object_attribute_names, object_attribute_names, 'dynamic field names')
|
assert_equal(expected_object_attribute_names, object_attribute_names, 'dynamic field names')
|
||||||
end
|
end
|
||||||
|
@ -109,7 +109,7 @@ class OtrsImportTest < ActiveSupport::TestCase
|
||||||
assert_equal('invalid-temp', user4.firstname)
|
assert_equal('invalid-temp', user4.firstname)
|
||||||
assert_equal('invalid-temp', user4.lastname)
|
assert_equal('invalid-temp', user4.lastname)
|
||||||
assert_equal('invalid-temp', user4.login)
|
assert_equal('invalid-temp', user4.login)
|
||||||
assert_equal('invalid-temp@example.com', user4.email)
|
|
||||||
assert_equal(false, user4.active)
|
assert_equal(false, user4.active)
|
||||||
|
|
||||||
assert(user4.roles.include?(role_agent))
|
assert(user4.roles.include?(role_agent))
|
||||||
|
@ -217,10 +217,10 @@ class OtrsImportTest < ActiveSupport::TestCase
|
||||||
ticket = Ticket.find(591)
|
ticket = Ticket.find(591)
|
||||||
assert_equal('Some other smart subject!', ticket.title)
|
assert_equal('Some other smart subject!', ticket.title)
|
||||||
assert_equal('488', ticket.vertriebsweg)
|
assert_equal('488', ticket.vertriebsweg)
|
||||||
assert_equal('["193"]', ticket.te_test) # TODO: multiselect
|
assert_equal(%w[193 194], ticket.te_test)
|
||||||
assert_equal('358', ticket.sugar_crm_remote_no)
|
assert_equal('358', ticket.sugar_crm_remote_no)
|
||||||
assert_equal('69', ticket.sugar_crm_company_selected_no)
|
assert_equal('69', ticket.sugar_crm_company_selected_no)
|
||||||
assert_equal('["382"]', ticket.sugar_crm_company_selection) # TODO: multiselect
|
assert_equal(['382'], ticket.sugar_crm_company_selection)
|
||||||
assert_equal('310', ticket.topic_no)
|
assert_equal('310', ticket.topic_no)
|
||||||
assert_equal('495', ticket.open_exchange_ticket_number)
|
assert_equal('495', ticket.open_exchange_ticket_number)
|
||||||
assert_equal('208', ticket.hostname)
|
assert_equal('208', ticket.hostname)
|
||||||
|
|
Loading…
Reference in a new issue