bulkrax 4.2.1 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/bulkrax/exporters.js +12 -0
  3. data/app/assets/javascripts/bulkrax/importers.js.erb +27 -1
  4. data/app/controllers/bulkrax/exporters_controller.rb +3 -1
  5. data/app/controllers/bulkrax/importers_controller.rb +1 -1
  6. data/app/factories/bulkrax/object_factory.rb +35 -8
  7. data/app/jobs/bulkrax/create_relationships_job.rb +1 -1
  8. data/app/jobs/bulkrax/import_work_job.rb +12 -10
  9. data/app/matchers/bulkrax/application_matcher.rb +1 -1
  10. data/app/models/bulkrax/csv_entry.rb +14 -10
  11. data/app/models/bulkrax/importer.rb +20 -15
  12. data/app/models/bulkrax/oai_entry.rb +1 -2
  13. data/app/models/concerns/bulkrax/file_set_entry_behavior.rb +8 -1
  14. data/app/models/concerns/bulkrax/import_behavior.rb +10 -9
  15. data/app/parsers/bulkrax/application_parser.rb +87 -14
  16. data/app/parsers/bulkrax/bagit_parser.rb +2 -1
  17. data/app/parsers/bulkrax/csv_parser.rb +11 -10
  18. data/app/parsers/bulkrax/oai_dc_parser.rb +2 -2
  19. data/app/services/bulkrax/remove_relationships_for_importer.rb +107 -0
  20. data/app/views/bulkrax/exporters/_form.html.erb +3 -3
  21. data/app/views/bulkrax/exporters/show.html.erb +17 -41
  22. data/app/views/bulkrax/importers/edit.html.erb +1 -1
  23. data/app/views/bulkrax/importers/new.html.erb +1 -1
  24. data/app/views/bulkrax/importers/show.html.erb +3 -114
  25. data/app/views/bulkrax/shared/_collection_entries_tab.html.erb +39 -0
  26. data/app/views/bulkrax/shared/_file_set_entries_tab.html.erb +39 -0
  27. data/app/views/bulkrax/shared/_work_entries_tab.html.erb +39 -0
  28. data/app/views/hyrax/dashboard/sidebar/_bulkrax_sidebar_additions.html.erb +7 -5
  29. data/app/views/hyrax/dashboard/sidebar/_repository_content.html.erb +23 -15
  30. data/db/migrate/20211203195233_rename_children_counters_to_relationships.rb +1 -1
  31. data/db/migrate/20211220195027_add_file_set_counters_to_importer_runs.rb +1 -1
  32. data/db/migrate/20220118001339_add_import_attempts_to_entries.rb +1 -1
  33. data/db/migrate/20220119213325_add_work_counters_to_importer_runs.rb +1 -1
  34. data/db/migrate/20220301001839_create_bulkrax_pending_relationships.rb +1 -1
  35. data/db/migrate/20220303212810_add_order_to_bulkrax_pending_relationships.rb +1 -1
  36. data/db/migrate/20220412233954_add_include_thumbnails_to_bulkrax_exporters.rb +1 -1
  37. data/db/migrate/20220413180915_add_generated_metadata_to_bulkrax_exporters.rb +1 -1
  38. data/db/migrate/20220609001128_rename_bulkrax_importer_run_to_importer_run.rb +1 -1
  39. data/lib/bulkrax/version.rb +1 -1
  40. data/lib/bulkrax.rb +38 -11
  41. data/lib/generators/bulkrax/templates/config/initializers/bulkrax.rb +10 -0
  42. data/lib/tasks/bulkrax_tasks.rake +10 -11
  43. data/lib/tasks/reset.rake +65 -0
  44. metadata +7 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11a3549082d5c6493135ed66fe5729474b4303bb8dec30ee20a8e00fe66f563d
4
- data.tar.gz: '08a021e73dc020a2791d1cf6e7f086a2cebdc5b511ffa2c83db004f31592a6af'
3
+ metadata.gz: d53012e0252f8033f5da334d5336c134deb3a6221040cfe4c1c6c01bb473d617
4
+ data.tar.gz: e986a3506c073aa533c4ea303a123e8866d2bf7ac6d8ab6df3949682f61b6c05
5
5
  SHA512:
6
- metadata.gz: '049aaefb66b149b6e57857f75ded3408a910578cdbbd3c8094a85fedeffc2416124e0369e22cab136e2620cd56c9516f7fcf9bf906897682f09f8b32b2ef9dcc'
7
- data.tar.gz: bf1a0ff60588f3b66295f6eb7941c80b4c2cb06cbbc68755145e5ec1688906103a8efd6e7ebb6fab5137460de9f1d3d6b5fe8191beac47cd8241ce0c35b250b2
6
+ metadata.gz: 8ea20593d1164f62fdfda2dbe84bd8cc4e199a65d7e85eea0b68b27e71aeff7579f1b0059042f55eec1c7ab36f8dec9db406ad58cc3a315b29b8e4900f7cb450
7
+ data.tar.gz: 89a03cd842d855d48f8c4952b6e9a6daea757e80cb8c0f9ee370b59f90e434b39dfb548deb1757f36463914bd5cccbcf1df6c5ffd9102bb5f0d54b5b7ea6476f
@@ -1,10 +1,12 @@
1
1
  function hideUnhide(field) {
2
2
  var allSources = $('body').find('.export-source-option')
3
+ removeRequired(allSources)
3
4
  hide(allSources)
4
5
 
5
6
  if (field.length > 0) {
6
7
  var selectedSource = $('.' + field)
7
8
  unhideSelected(selectedSource)
9
+ addRequired(selectedSource)
8
10
  }
9
11
 
10
12
  if (field === 'collection') {
@@ -12,6 +14,16 @@ function hideUnhide(field) {
12
14
  }
13
15
  };
14
16
 
17
+ function addRequired(selectedSource) {
18
+ selectedSource.addClass('required').attr('required', 'required');
19
+ selectedSource.parent().addClass('required');
20
+ }
21
+
22
+ function removeRequired(allSources) {
23
+ allSources.removeClass('required').removeAttr('required');
24
+ allSources.parent().removeClass('required').removeAttr('required')
25
+ };
26
+
15
27
  // hide all export_source
16
28
  function hide(allSources) {
17
29
  allSources.addClass('hidden');
@@ -47,6 +47,7 @@ function prepBulkrax(event) {
47
47
  var config = { childList: true, attributes: true };
48
48
  var callback = function(mutationsList) {
49
49
  for(var mutation of mutationsList) {
50
+
50
51
  if (mutation.type == 'childList') {
51
52
  browseButton = document.getElementById('browse');
52
53
  var exp = /selected_files\[[0-9]*\]\[url\]/
@@ -119,10 +120,35 @@ function handleParserKlass() {
119
120
  $('.parser_fields').append(window[parser_klass.data('partial')])
120
121
  }
121
122
 
123
+ handleBrowseEverything()
122
124
  var file_path_value = $('#importer_parser_fields_import_file_path').val()
123
125
  handleFileToggle(file_path_value)
124
126
  }
125
127
 
128
+ function handleBrowseEverything(){
129
+ var button = $("button[data-toggle='browse-everything']")
130
+ if(button.length == 0) { return; }
131
+ button.browseEverything({
132
+ route: button.data('route'),
133
+ target: button.data('target')
134
+ }).done(function(data) {
135
+ var evt = { isDefaultPrevented: function() { return false; } };
136
+ $('.ev-browser.show').removeClass('show')
137
+ if($('#fileupload').length > 0) {
138
+ var files = $.map(data, function(d) { return { name: d.file_name, size: d.file_size, id: d.url } });
139
+ $.blueimp.fileupload.prototype.options.done.call($('#fileupload').fileupload(), evt, { result: { files: files }});
140
+ }
141
+ return true
142
+ // User has submitted files; data contains an array of URLs and their options
143
+ }).cancel(function() {
144
+ $('.ev-browser.show').removeClass('show')
145
+ // User cancelled the browse operation
146
+ }).fail(function(status, error, text) {
147
+ $('.ev-browser.show').removeClass('show')
148
+ // URL retrieval experienced a technical failure
149
+ });
150
+ }
151
+
126
152
  function handleSourceLoad(refresh_button, base_url, external_set_select) {
127
153
  if (base_url.val() == "") { // ignore empty base_url value
128
154
  return
@@ -163,4 +189,4 @@ function setError(selector, error) {
163
189
  selector.attr('disabled', true)
164
190
  }
165
191
 
166
- $(document).on({'ready': prepBulkrax, 'turbolinks:load': prepBulkrax})
192
+ $(document).on({'ready': prepBulkrax, 'turbolinks:load': prepBulkrax})
@@ -22,7 +22,9 @@ module Bulkrax
22
22
  add_exporter_breadcrumbs
23
23
  add_breadcrumb @exporter.name
24
24
 
25
- @work_entries = @exporter.entries.where(type: @exporter.parser.entry_class.to_s).page(params[:work_entries_page])
25
+ @work_entries = @exporter.entries.where(type: @exporter.parser.entry_class.to_s).page(params[:work_entries_page]).per(30)
26
+ @collection_entries = @exporter.entries.where(type: @exporter.parser.collection_entry_class.to_s).page(params[:collections_entries_page]).per(30)
27
+ @file_set_entries = @exporter.entries.where(type: @exporter.parser.file_set_entry_class.to_s).page(params[:file_set_entries_page]).per(30)
26
28
  end
27
29
 
28
30
  # GET /exporters/new
@@ -276,7 +276,7 @@ module Bulkrax
276
276
  def setup_client(url)
277
277
  return false if url.nil?
278
278
  headers = { from: Bulkrax.server_name }
279
- @client ||= OAI::Client.new(url, headers: headers, parser: 'libxml', metadata_prefix: 'oai_dc')
279
+ @client ||= OAI::Client.new(url, headers: headers, parser: 'libxml')
280
280
  end
281
281
 
282
282
  # Download methods
@@ -159,28 +159,55 @@ module Bulkrax
159
159
  file_set_attrs = attrs.slice(*object.attributes.keys)
160
160
  object.assign_attributes(file_set_attrs)
161
161
 
162
- attrs['uploaded_files'].each do |uploaded_file_id|
162
+ attrs['uploaded_files']&.each do |uploaded_file_id|
163
163
  uploaded_file = ::Hyrax::UploadedFile.find(uploaded_file_id)
164
164
  next if uploaded_file.file_set_uri.present?
165
165
 
166
- actor = ::Hyrax::Actors::FileSetActor.new(object, @user)
167
- uploaded_file.update(file_set_uri: actor.file_set.uri)
168
- actor.file_set.permissions_attributes = work_permissions
169
- actor.create_metadata
170
- actor.create_content(uploaded_file)
171
- actor.attach_to_work(work)
166
+ create_file_set_actor(attrs, work, work_permissions, uploaded_file)
167
+ end
168
+ attrs['remote_files']&.each do |remote_file|
169
+ create_file_set_actor(attrs, work, work_permissions, nil, remote_file)
172
170
  end
173
171
 
174
172
  object.save!
175
173
  end
176
174
 
175
+ def create_file_set_actor(attrs, work, work_permissions, uploaded_file, remote_file = nil)
176
+ actor = ::Hyrax::Actors::FileSetActor.new(object, @user)
177
+ uploaded_file&.update(file_set_uri: actor.file_set.uri)
178
+ actor.file_set.permissions_attributes = work_permissions
179
+ actor.create_metadata(attrs)
180
+ actor.create_content(uploaded_file) if uploaded_file
181
+ actor.attach_to_work(work, attrs)
182
+ handle_remote_file(remote_file: remote_file, actor: actor, update: false) if remote_file
183
+ end
184
+
177
185
  def update_file_set(attrs)
178
186
  file_set_attrs = attrs.slice(*object.attributes.keys)
179
187
  actor = ::Hyrax::Actors::FileSetActor.new(object, @user)
180
-
188
+ attrs['remote_files']&.each do |remote_file|
189
+ handle_remote_file(remote_file: remote_file, actor: actor, update: true)
190
+ end
181
191
  actor.update_metadata(file_set_attrs)
182
192
  end
183
193
 
194
+ def handle_remote_file(remote_file:, actor:, update: false)
195
+ actor.file_set.label = remote_file['file_name']
196
+ actor.file_set.import_url = remote_file['url']
197
+
198
+ url = remote_file['url']
199
+ tmp_file = Tempfile.new(remote_file['file_name'].split('.').first)
200
+ tmp_file.binmode
201
+
202
+ URI.open(url) do |url_file|
203
+ tmp_file.write(url_file.read)
204
+ end
205
+
206
+ tmp_file.rewind
207
+ update == true ? actor.update_content(tmp_file) : actor.create_content(tmp_file, from_url: true)
208
+ tmp_file.close
209
+ end
210
+
184
211
  def clean_attrs(attrs)
185
212
  # avoid the "ArgumentError: Identifier must be a string of size > 0 in order to be treeified" error
186
213
  # when setting object.attributes
@@ -81,7 +81,7 @@ module Bulkrax
81
81
  # This is adding the reverse relationship, from the child to the parent
82
82
  def collection_parent_work_child
83
83
  child_work_ids = child_records[:works].map(&:id)
84
- parent_record.reindex_extent = Hyrax::Adapters::NestingIndexAdapter::LIMITED_REINDEX
84
+ parent_record.try(:reindex_extent=, Hyrax::Adapters::NestingIndexAdapter::LIMITED_REINDEX)
85
85
 
86
86
  parent_record.add_member_objects(child_work_ids)
87
87
  ImporterRun.find(importer_run_id).increment!(:processed_relationships, child_work_ids.count) # rubocop:disable Rails/SkipsModelValidations
@@ -5,25 +5,27 @@ module Bulkrax
5
5
  queue_as :import
6
6
 
7
7
  # rubocop:disable Rails/SkipsModelValidations
8
- def perform(*args)
9
- entry = Entry.find(args[0])
8
+ def perform(entry_id, run_id, *)
9
+ entry = Entry.find(entry_id)
10
+ importer_run = ImporterRun.find(run_id)
10
11
  entry.build
11
12
  if entry.status == "Complete"
12
- ImporterRun.find(args[1]).increment!(:processed_records)
13
- ImporterRun.find(args[1]).increment!(:processed_works)
14
- ImporterRun.find(args[1]).decrement!(:enqueued_records) unless ImporterRun.find(args[1]).enqueued_records <= 0 # rubocop:disable Style/IdenticalConditionalBranches
13
+ importer_run.increment!(:processed_records)
14
+ importer_run.increment!(:processed_works)
15
15
  else
16
16
  # do not retry here because whatever parse error kept you from creating a work will likely
17
17
  # keep preventing you from doing so.
18
- ImporterRun.find(args[1]).increment!(:failed_records)
19
- ImporterRun.find(args[1]).increment!(:failed_works)
20
- ImporterRun.find(args[1]).decrement!(:enqueued_records) unless ImporterRun.find(args[1]).enqueued_records <= 0 # rubocop:disable Style/IdenticalConditionalBranches
18
+ importer_run.increment!(:failed_records)
19
+ importer_run.increment!(:failed_works)
21
20
  end
21
+ # Regardless of completion or not, we want to decrement the enqueued records.
22
+ importer_run.decrement!(:enqueued_records) unless importer_run.enqueued_records <= 0
23
+
22
24
  entry.save!
23
- entry.importer.current_run = ImporterRun.find(args[1])
25
+ entry.importer.current_run = importer_run
24
26
  entry.importer.record_status
25
27
  rescue Bulkrax::CollectionsCreatedError
26
- reschedule(args[0], args[1])
28
+ reschedule(entry_id, run_id)
27
29
  end
28
30
  # rubocop:enable Rails/SkipsModelValidations
29
31
 
@@ -30,7 +30,7 @@ module Bulkrax
30
30
 
31
31
  def process_split
32
32
  if self.split.is_a?(TrueClass)
33
- @result = @result.split(/\s*[:;|]\s*/) # default split by : ; |
33
+ @result = @result.split(Bulkrax.multi_value_element_split_on)
34
34
  elsif self.split
35
35
  result = @result.split(Regexp.new(self.split))
36
36
  @result = result.map(&:strip)
@@ -18,7 +18,7 @@ module Bulkrax
18
18
  raise StandardError, 'CSV path empty' if path.blank?
19
19
  CSV.read(path,
20
20
  headers: true,
21
- header_converters: :symbol,
21
+ header_converters: ->(h) { h.to_sym },
22
22
  encoding: 'utf-8')
23
23
  end
24
24
 
@@ -81,7 +81,7 @@ module Bulkrax
81
81
  def add_file
82
82
  self.parsed_metadata['file'] ||= []
83
83
  if record['file']&.is_a?(String)
84
- self.parsed_metadata['file'] = record['file'].split(/\s*[;|]\s*/)
84
+ self.parsed_metadata['file'] = record['file'].split(Bulkrax.multi_value_element_split_on)
85
85
  elsif record['file'].is_a?(Array)
86
86
  self.parsed_metadata['file'] = record['file']
87
87
  end
@@ -112,12 +112,16 @@ module Bulkrax
112
112
  end
113
113
 
114
114
  def build_files_metadata
115
- file_mapping = key_for_export('file')
116
- file_sets = hyrax_record.file_set? ? Array.wrap(hyrax_record) : hyrax_record.file_sets
117
- filenames = map_file_sets(file_sets)
115
+ # attaching files to the FileSet row only so we don't have duplicates when importing to a new tenant
116
+ if hyrax_record.work?
117
+ build_thumbnail_files
118
+ else
119
+ file_mapping = key_for_export('file')
120
+ file_sets = hyrax_record.file_set? ? Array.wrap(hyrax_record) : hyrax_record.file_sets
121
+ filenames = map_file_sets(file_sets)
118
122
 
119
- handle_join_on_export(file_mapping, filenames, mapping['file']&.[]('join')&.present?)
120
- build_thumbnail_files if hyrax_record.work?
123
+ handle_join_on_export(file_mapping, filenames, mapping['file']&.[]('join')&.present?)
124
+ end
121
125
  end
122
126
 
123
127
  def build_relationship_metadata
@@ -172,7 +176,7 @@ module Bulkrax
172
176
  data = hyrax_record.send(key.to_s)
173
177
  if data.is_a?(ActiveTriples::Relation)
174
178
  if value['join']
175
- self.parsed_metadata[key_for_export(key)] = data.map { |d| prepare_export_data(d) }.join(' | ').to_s # TODO: make split char dynamic
179
+ self.parsed_metadata[key_for_export(key)] = data.map { |d| prepare_export_data(d) }.join(Bulkrax.multi_value_element_join_on).to_s
176
180
  else
177
181
  data.each_with_index do |d, i|
178
182
  self.parsed_metadata["#{key_for_export(key)}_#{i + 1}"] = prepare_export_data(d)
@@ -232,7 +236,7 @@ module Bulkrax
232
236
 
233
237
  def handle_join_on_export(key, values, join)
234
238
  if join
235
- parsed_metadata[key] = values.join(' | ') # TODO: make split char dynamic
239
+ parsed_metadata[key] = values.join(Bulkrax.multi_value_element_join_on)
236
240
  else
237
241
  values.each_with_index do |value, i|
238
242
  parsed_metadata["#{key}_#{i + 1}"] = value
@@ -256,7 +260,7 @@ module Bulkrax
256
260
  return [] unless parent_field_mapping.present? && record[parent_field_mapping].present?
257
261
 
258
262
  identifiers = []
259
- split_references = record[parent_field_mapping].split(/\s*[;|]\s*/)
263
+ split_references = record[parent_field_mapping].split(Bulkrax.multi_value_element_split_on)
260
264
  split_references.each do |c_reference|
261
265
  matching_collection_entries = importerexporter.entries.select do |e|
262
266
  (e.raw_metadata&.[](source_identifier) == c_reference) &&
@@ -58,17 +58,26 @@ module Bulkrax
58
58
 
59
59
  # If field_mapping is empty, setup a default based on the export_properties
60
60
  def mapping
61
+ # rubocop:disable Style/IfUnlessModifier
61
62
  @mapping ||= if self.field_mapping.blank? || self.field_mapping == [{}]
62
63
  if parser.import_fields.present? || self.field_mapping == [{}]
63
- ActiveSupport::HashWithIndifferentAccess.new(
64
- parser.import_fields.reject(&:nil?).map do |m|
65
- Bulkrax.default_field_mapping.call(m)
66
- end.inject(:merge)
67
- )
64
+ default_field_mapping
68
65
  end
69
66
  else
70
- self.field_mapping
67
+ default_field_mapping.merge(self.field_mapping)
71
68
  end
69
+
70
+ # rubocop:enable Style/IfUnlessModifier
71
+ end
72
+
73
+ def default_field_mapping
74
+ return self.field_mapping if parser.import_fields.nil?
75
+
76
+ ActiveSupport::HashWithIndifferentAccess.new(
77
+ parser.import_fields.reject(&:nil?).map do |m|
78
+ Bulkrax.default_field_mapping.call(m)
79
+ end.inject(:merge)
80
+ )
72
81
  end
73
82
 
74
83
  def parser_fields
@@ -143,17 +152,13 @@ module Bulkrax
143
152
  import_objects(['relationship'])
144
153
  end
145
154
 
155
+ DEFAULT_OBJECT_TYPES = %w[collection work file_set relationship].freeze
156
+
146
157
  def import_objects(types_array = nil)
147
158
  self.only_updates ||= false
148
- types = types_array || %w[collection work file_set relationship]
149
- if parser.class == Bulkrax::CsvParser
150
- parser.create_objects(types)
151
- else
152
- types.each do |object_type|
153
- self.save if self.new_record? # Object needs to be saved for statuses
154
- parser.send("create_#{object_type.pluralize}")
155
- end
156
- end
159
+ self.save if self.new_record? # Object needs to be saved for statuses
160
+ types = types_array || DEFAULT_OBJECT_TYPES
161
+ parser.create_objects(types)
157
162
  rescue StandardError => e
158
163
  status_info(e)
159
164
  end
@@ -59,12 +59,11 @@ module Bulkrax
59
59
  def find_collection_ids
60
60
  return self.collection_ids if collections_created?
61
61
  if sets.blank? || parser.collection_name != 'all'
62
- # c = Collection.where(Bulkrax.system_identifier_field => importerexporter.unique_collection_identifier(parser.collection_name)).first
63
62
  collection = find_collection(importerexporter.unique_collection_identifier(parser.collection_name))
64
63
  self.collection_ids << collection.id if collection.present? && !self.collection_ids.include?(collection.id)
65
64
  else # All - collections should exist for all sets
66
65
  sets.each do |set|
67
- c = Collection.find_by(work_identifier => importerexporter.unique_collection_identifier(set.content))
66
+ c = find_collection(importerexporter.unique_collection_identifier(set.content))
68
67
  self.collection_ids << c.id if c.present? && !self.collection_ids.include?(c.id)
69
68
  end
70
69
  end
@@ -6,7 +6,14 @@ module Bulkrax
6
6
  ::FileSet
7
7
  end
8
8
 
9
+ def file_reference
10
+ return 'file' if parsed_metadata&.[]('file')&.map(&:present?)&.any?
11
+ return 'remote_files' if parsed_metadata&.[]('remote_files')&.map(&:present?)&.any?
12
+ end
13
+
9
14
  def add_path_to_file
15
+ return unless file_reference == 'file'
16
+
10
17
  parsed_metadata['file'].each_with_index do |filename, i|
11
18
  next if filename.blank?
12
19
 
@@ -22,7 +29,7 @@ module Bulkrax
22
29
  end
23
30
 
24
31
  def validate_presence_of_filename!
25
- return if parsed_metadata&.[]('file')&.map(&:present?)&.any?
32
+ return if parsed_metadata&.[](file_reference)&.map(&:present?)&.any?
26
33
 
27
34
  raise StandardError, 'File set must have a filename'
28
35
  end
@@ -165,15 +165,16 @@ module Bulkrax
165
165
  end
166
166
 
167
167
  def factory
168
- @factory ||= Bulkrax::ObjectFactory.new(attributes: self.parsed_metadata,
169
- source_identifier_value: identifier,
170
- work_identifier: parser.work_identifier,
171
- related_parents_parsed_mapping: parser.related_parents_parsed_mapping,
172
- replace_files: replace_files,
173
- user: user,
174
- klass: factory_class,
175
- importer_run_id: importerexporter.last_run.id,
176
- update_files: update_files)
168
+ of = Bulkrax.object_factory || Bulkrax::ObjectFactory
169
+ @factory ||= of.new(attributes: self.parsed_metadata,
170
+ source_identifier_value: identifier,
171
+ work_identifier: parser.work_identifier,
172
+ related_parents_parsed_mapping: parser.related_parents_parsed_mapping,
173
+ replace_files: replace_files,
174
+ user: user,
175
+ klass: factory_class,
176
+ importer_run_id: importerexporter.last_run.id,
177
+ update_files: update_files)
177
178
  end
178
179
 
179
180
  def factory_class