diff --git a/app/assets/javascripts/app/controllers/_integration/exchange.coffee b/app/assets/javascripts/app/controllers/_integration/exchange.coffee
index 13ea97709..e69976c98 100644
--- a/app/assets/javascripts/app/controllers/_integration/exchange.coffee
+++ b/app/assets/javascripts/app/controllers/_integration/exchange.coffee
@@ -454,9 +454,9 @@ class ConnectionWizard extends App.WizardModal
for key in ['source', 'dest']
if !_.isArray(attributes[key])
attributes[key] = [attributes[key]]
- attributes_local =
- item_id: 'login'
- length = attributes.source.length-1
+
+ attributes_local = {}
+ length = attributes.source.length-1
for count in [0..length]
if attributes.source[count] && attributes.dest[count]
attributes_local[attributes.source[count]] = attributes.dest[count]
@@ -465,18 +465,8 @@ class ConnectionWizard extends App.WizardModal
@tryShow()
buildRowsUserMap: (user_attribute_map) =>
-
- # show static login row
- userUidDisplayValue = @wizardConfig.wizardData.backend_attributes['item_id']
- el = [
- $(App.view('integration/ldap_user_attribute_row_read_only')(
- key: userUidDisplayValue,
- value: 'Login'
- ))
- ]
-
+ el = []
for source, dest of user_attribute_map
- continue if source == 'item_id'
continue if !(source of @wizardConfig.wizardData.backend_attributes)
el.push @buildRowUserAttribute(source, dest)
el
diff --git a/app/assets/javascripts/app/views/integration/ldap_user_attribute_row_read_only.jst.eco b/app/assets/javascripts/app/views/integration/ldap_user_attribute_row_read_only.jst.eco
deleted file mode 100644
index 96c5bb33e..000000000
--- a/app/assets/javascripts/app/views/integration/ldap_user_attribute_row_read_only.jst.eco
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
- <%= @key %>
- |
- <%= @value %>
- |
diff --git a/db/migrate/20180327170847_issue_1905_exchange_login_from_remote_id.rb b/db/migrate/20180327170847_issue_1905_exchange_login_from_remote_id.rb
new file mode 100644
index 000000000..2d78fb5cf
--- /dev/null
+++ b/db/migrate/20180327170847_issue_1905_exchange_login_from_remote_id.rb
@@ -0,0 +1,17 @@
+class Issue1905ExchangeLoginFromRemoteId < ActiveRecord::Migration[5.1]
+ def change
+
+ # return if it's a new setup
+ return if !Setting.find_by(name: 'system_init_done')
+
+ config = Import::Exchange.config
+ return if config.blank?
+ return if config[:attributes].blank?
+ return if config[:attributes][:item_id].blank?
+ return if config[:attributes][:item_id] != 'login'
+
+ config[:attributes].delete(:item_id)
+
+ Import::Exchange.config = config
+ end
+end
diff --git a/lib/sequencer/sequence/import/exchange/folder_contact.rb b/lib/sequencer/sequence/import/exchange/folder_contact.rb
index d14f53ec6..4342c7a76 100644
--- a/lib/sequencer/sequence/import/exchange/folder_contact.rb
+++ b/lib/sequencer/sequence/import/exchange/folder_contact.rb
@@ -8,7 +8,8 @@ class Sequencer
[
'Import::Exchange::FolderContact::RemoteId',
'Import::Common::RemoteId::CaseSensitive',
- 'Import::Exchange::FolderContact::Mapping',
+ 'Import::Exchange::FolderContact::Mapping::FromConfig',
+ 'Import::Exchange::FolderContact::Mapping::Login',
'Import::Common::Model::Skip::Blank::Mapped',
'Common::ModelClass::User',
'Import::Exchange::FolderContact::ExternalSyncSource',
diff --git a/lib/sequencer/unit/import/exchange/folder_contact/mapping.rb b/lib/sequencer/unit/import/exchange/folder_contact/mapping.rb
deleted file mode 100644
index 076492699..000000000
--- a/lib/sequencer/unit/import/exchange/folder_contact/mapping.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-class Sequencer
- class Unit
- module Import
- module Exchange
- module FolderContact
- class Mapping < Sequencer::Unit::Import::Common::Mapping::FlatKeys
-
- uses :import_job
-
- private
-
- def mapping
- from_import_job || ::Import::Exchange.config[:attributes]
- end
-
- def from_import_job
- return if !state.provided?(:import_job)
- payload = import_job.payload
- return if payload.blank?
- payload[:ews_attributes]
- end
- end
- end
- end
- end
- end
-end
diff --git a/lib/sequencer/unit/import/exchange/folder_contact/mapping/from_config.rb b/lib/sequencer/unit/import/exchange/folder_contact/mapping/from_config.rb
new file mode 100644
index 000000000..7cdc37de9
--- /dev/null
+++ b/lib/sequencer/unit/import/exchange/folder_contact/mapping/from_config.rb
@@ -0,0 +1,29 @@
+class Sequencer
+ class Unit
+ module Import
+ module Exchange
+ module FolderContact
+ module Mapping
+ class FromConfig < Sequencer::Unit::Import::Common::Mapping::FlatKeys
+
+ uses :import_job
+
+ private
+
+ def mapping
+ from_import_job || ::Import::Exchange.config[:attributes]
+ end
+
+ def from_import_job
+ return if !state.provided?(:import_job)
+ payload = import_job.payload
+ return if payload.blank?
+ payload[:ews_attributes]
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/exchange/folder_contact/mapping/login.rb b/lib/sequencer/unit/import/exchange/folder_contact/mapping/login.rb
new file mode 100644
index 000000000..47cd531f0
--- /dev/null
+++ b/lib/sequencer/unit/import/exchange/folder_contact/mapping/login.rb
@@ -0,0 +1,25 @@
+class Sequencer
+ class Unit
+ module Import
+ module Exchange
+ module FolderContact
+ module Mapping
+ class Login < Sequencer::Unit::Import::Common::Mapping::FlatKeys
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :remote_id
+
+ def process
+ provide_mapped do
+ {
+ login: remote_id
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/db/migrate/issue_1905_exchange_login_from_remote_id_spec.rb b/spec/db/migrate/issue_1905_exchange_login_from_remote_id_spec.rb
new file mode 100644
index 000000000..b687e2bea
--- /dev/null
+++ b/spec/db/migrate/issue_1905_exchange_login_from_remote_id_spec.rb
@@ -0,0 +1,82 @@
+require 'rails_helper'
+
+RSpec.describe Issue1905ExchangeLoginFromRemoteId, type: :db_migration do
+
+ let(:backend) { ::Import::Exchange }
+
+ it 'removes :item_id from attributes' do
+
+ invalid_config = {
+ attributes: {
+ item_id: 'login',
+ some: 'other',
+ }
+ }
+
+ valid_config = ActiveSupport::HashWithIndifferentAccess.new(
+ attributes: {
+ some: 'other',
+ }
+ )
+
+ expect(backend).to receive(:config).and_return(invalid_config)
+ allow(backend).to receive(:config).and_call_original
+
+ migrate
+
+ expect(backend.config).to eq(valid_config)
+ end
+
+ context 'no changes' do
+
+ it 'performs no action for new systems', system_init_done: false do
+ expect(backend).not_to receive(:config)
+ migrate
+ end
+
+ shared_examples 'irrelevant config' do
+ it 'does not change the config' do
+ expect(backend).to receive(:config).and_return(config)
+ expect(backend).not_to receive(:config=)
+ migrate
+ end
+ end
+
+ context 'blank config' do
+ let(:config) { nil }
+ it_behaves_like 'irrelevant config'
+ end
+
+ context 'blank attributes' do
+ let(:config) do
+ {
+ some: 'config'
+ }
+ end
+ it_behaves_like 'irrelevant config'
+ end
+
+ context 'blank attribute :item_id' do
+ let(:config) do
+ {
+ attributes: {
+ some: 'mapping'
+ }
+ }
+ end
+ it_behaves_like 'irrelevant config'
+ end
+
+ context 'attribute :item_id not mapping to login' do
+
+ let(:config) do
+ {
+ attributes: {
+ item_id: 'other_local_attribute'
+ }
+ }
+ end
+ it_behaves_like 'irrelevant config'
+ end
+ end
+end
|