bulkrax 6.0.1 → 7.0.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.
- checksums.yaml +4 -4
- data/Rakefile +7 -7
- data/app/assets/javascripts/bulkrax/bulkrax.js +11 -0
- data/app/assets/javascripts/bulkrax/datatables.js +139 -0
- data/app/assets/javascripts/bulkrax/exporters.js +4 -4
- data/app/assets/javascripts/bulkrax/importers.js.erb +15 -1
- data/app/assets/stylesheets/bulkrax/import_export.scss +6 -1
- data/app/controllers/bulkrax/entries_controller.rb +52 -3
- data/app/controllers/bulkrax/exporters_controller.rb +19 -7
- data/app/controllers/bulkrax/importers_controller.rb +29 -11
- data/app/controllers/concerns/bulkrax/datatables_behavior.rb +201 -0
- data/app/helpers/bulkrax/application_helper.rb +7 -3
- data/app/jobs/bulkrax/create_relationships_job.rb +1 -1
- data/app/jobs/bulkrax/delete_and_import_collection_job.rb +8 -0
- data/app/jobs/bulkrax/delete_and_import_file_set_job.rb +8 -0
- data/app/jobs/bulkrax/delete_and_import_job.rb +20 -0
- data/app/jobs/bulkrax/delete_and_import_work_job.rb +8 -0
- data/app/jobs/bulkrax/delete_job.rb +5 -1
- data/app/jobs/bulkrax/download_cloud_file_job.rb +1 -1
- data/app/jobs/bulkrax/import_collection_job.rb +1 -1
- data/app/jobs/bulkrax/import_file_set_job.rb +1 -1
- data/app/jobs/bulkrax/import_job.rb +7 -0
- data/app/jobs/bulkrax/import_work_job.rb +1 -1
- data/app/jobs/bulkrax/importer_job.rb +1 -1
- data/app/models/bulkrax/csv_collection_entry.rb +1 -3
- data/app/models/bulkrax/csv_entry.rb +2 -1
- data/app/models/bulkrax/entry.rb +2 -0
- data/app/models/bulkrax/exporter.rb +9 -2
- data/app/models/bulkrax/importer.rb +48 -7
- data/app/models/bulkrax/oai_set_entry.rb +1 -3
- data/app/models/bulkrax/rdf_collection_entry.rb +1 -4
- data/app/models/bulkrax/status.rb +10 -1
- data/app/models/concerns/bulkrax/file_set_entry_behavior.rb +4 -2
- data/app/models/concerns/bulkrax/import_behavior.rb +4 -16
- data/app/models/concerns/bulkrax/status_info.rb +8 -0
- data/app/parsers/bulkrax/application_parser.rb +90 -19
- data/app/parsers/bulkrax/bagit_parser.rb +0 -23
- data/app/parsers/bulkrax/csv_parser.rb +0 -52
- data/app/parsers/bulkrax/oai_dc_parser.rb +26 -16
- data/app/parsers/bulkrax/parser_export_record_set.rb +2 -2
- data/app/parsers/bulkrax/xml_parser.rb +18 -21
- data/app/services/bulkrax/factory_class_finder.rb +90 -0
- data/app/views/bulkrax/exporters/_form.html.erb +10 -10
- data/app/views/bulkrax/exporters/index.html.erb +13 -57
- data/app/views/bulkrax/exporters/show.html.erb +2 -10
- data/app/views/bulkrax/importers/_csv_fields.html.erb +7 -1
- data/app/views/bulkrax/importers/_edit_form_buttons.html.erb +8 -1
- data/app/views/bulkrax/importers/_edit_item_buttons.html.erb +18 -0
- data/app/views/bulkrax/importers/index.html.erb +20 -64
- data/app/views/bulkrax/importers/show.html.erb +7 -13
- data/app/views/bulkrax/shared/_entries_tab.html.erb +16 -0
- data/config/routes.rb +8 -2
- data/db/migrate/20240208005801_denormalize_status_message.rb +7 -0
- data/db/migrate/20240209070952_update_identifier_index.rb +6 -0
- data/lib/bulkrax/engine.rb +6 -0
- data/lib/bulkrax/persistence_layer/active_fedora_adapter.rb +27 -0
- data/lib/bulkrax/persistence_layer/valkyrie_adapter.rb +8 -0
- data/lib/bulkrax/persistence_layer.rb +38 -0
- data/lib/bulkrax/version.rb +1 -1
- data/lib/bulkrax.rb +88 -2
- data/lib/tasks/bulkrax_tasks.rake +12 -0
- metadata +46 -6
- data/app/views/bulkrax/shared/_collection_entries_tab.html.erb +0 -39
- data/app/views/bulkrax/shared/_file_set_entries_tab.html.erb +0 -39
- data/app/views/bulkrax/shared/_work_entries_tab.html.erb +0 -39
@@ -0,0 +1,18 @@
|
|
1
|
+
<div class="modal fade" id="bulkraxItemModal" tabindex="-1" role="dialog" aria-labelledby="bulkraxItemModalLabel">
|
2
|
+
<div class="modal-dialog" role="document">
|
3
|
+
<div class="modal-content">
|
4
|
+
<div class="modal-body">
|
5
|
+
<h5>Options for Updating an Entry</h5>
|
6
|
+
<hr />
|
7
|
+
<p>Rebuild metadata and files.</p>
|
8
|
+
<%= link_to 'Build', item_entry_path(item, e), method: :patch, class: 'btn btn-primary' %>
|
9
|
+
<hr />
|
10
|
+
<p>Remove existing work and then recreate the works metadata and files.</p>
|
11
|
+
<%= link_to 'Remove and then Build', item_entry_path(item, e, destroy_first: true), method: :patch, class: 'btn btn-primary' %>
|
12
|
+
</div>
|
13
|
+
<div class="modal-footer">
|
14
|
+
<button type="button" class="btn btn-default" data-dismiss="modal"><%= t('helpers.action.cancel') %></button>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
</div>
|
@@ -13,69 +13,25 @@
|
|
13
13
|
|
14
14
|
<div class="panel panel-default">
|
15
15
|
<div class="panel-body">
|
16
|
-
|
17
|
-
<
|
18
|
-
<
|
19
|
-
<
|
20
|
-
<
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
</thead>
|
37
|
-
<tbody>
|
38
|
-
<% @importers.each do |importer| %>
|
39
|
-
<tr>
|
40
|
-
<th scope="row"><%= link_to importer.name, importer_path(importer) %></th>
|
41
|
-
<td><%= importer.status %></td>
|
42
|
-
<td><%= importer.last_imported_at.strftime("%b %d, %Y") if importer.last_imported_at %></td>
|
43
|
-
<td><%= importer.next_import_at.strftime("%b %d, %Y") if importer.next_import_at %></td>
|
44
|
-
<td><%= importer.last_run&.enqueued_records %></td>
|
45
|
-
<td><%= (importer.last_run&.processed_records || 0) %></td>
|
46
|
-
<td><%= (importer.last_run&.failed_records || 0) %></td>
|
47
|
-
<td><%= importer.last_run&.deleted_records %></td>
|
48
|
-
<td><%= importer.last_run&.total_collection_entries %></td>
|
49
|
-
<td><%= importer.last_run&.total_work_entries %></td>
|
50
|
-
<td><%= importer.last_run&.total_file_set_entries %></td>
|
51
|
-
<td><%= link_to raw('<span class="glyphicon glyphicon-info-sign"></span>'), importer_path(importer) %></td>
|
52
|
-
<td><%= link_to raw('<span class="glyphicon glyphicon-pencil"></span>'), edit_importer_path(importer) %></td>
|
53
|
-
<td><%= link_to raw('<span class="glyphicon glyphicon-remove"></span>'), importer, method: :delete, data: { confirm: 'Are you sure?' } %></td>
|
54
|
-
</tr>
|
55
|
-
<% end %>
|
56
|
-
</tbody>
|
57
|
-
</table>
|
58
|
-
</div>
|
59
|
-
<% else %>
|
60
|
-
<p>No importers have been created.</p>
|
61
|
-
<% end %>
|
16
|
+
<div class="table-responsive">
|
17
|
+
<table id='importers-table' class="table table-striped">
|
18
|
+
<thead>
|
19
|
+
<tr>
|
20
|
+
<th scope="col">Name</th>
|
21
|
+
<th scope="col">Status</th>
|
22
|
+
<th scope="col">Last Run</th>
|
23
|
+
<th scope="col">Next Run</th>
|
24
|
+
<th scope="col">Entries Enqueued</th>
|
25
|
+
<th scope="col">Entries Processed</th>
|
26
|
+
<th scope="col">Entries Failed</th>
|
27
|
+
<th scope="col">Entries Deleted Upstream</th>
|
28
|
+
<th scope="col">Total Collection Entries</th>
|
29
|
+
<th scope="col">Total Work Entries</th>
|
30
|
+
<th scope="col">Total File Set Entries</th>
|
31
|
+
<th scope="col">Actions</th>
|
32
|
+
</tr>
|
33
|
+
</thead>
|
34
|
+
</table>
|
35
|
+
</div>
|
62
36
|
</div>
|
63
37
|
</div>
|
64
|
-
|
65
|
-
<script>
|
66
|
-
$(function() {
|
67
|
-
$('#DataTables_Table_0').DataTable({
|
68
|
-
destroy: true, /* Reinitialize DataTable with config below */
|
69
|
-
'columnDefs': [
|
70
|
-
{ 'orderable': true, 'targets': [...Array(10).keys()] },
|
71
|
-
{ 'orderable': false, 'targets': [10, 11, 12] }
|
72
|
-
],
|
73
|
-
'language': {
|
74
|
-
'info': 'Showing _START_ to _END_ of _TOTAL_ importers',
|
75
|
-
'infoEmpty': 'No importers to show',
|
76
|
-
'infoFiltered': '(filtered from _MAX_ total importers)',
|
77
|
-
'lengthMenu': 'Show _MENU_ importers'
|
78
|
-
}
|
79
|
-
})
|
80
|
-
})
|
81
|
-
</script>
|
@@ -1,9 +1,10 @@
|
|
1
1
|
<div class="col-xs-12 main-header">
|
2
2
|
<h1><span class="fa fa-cloud-upload" aria-hidden="true"></span> Importer: <%= @importer.name %></h1>
|
3
|
-
|
3
|
+
|
4
|
+
<% if @importer.failed_entries? %>
|
4
5
|
<div class="pull-right">
|
5
|
-
<%= link_to 'Export Errored Entries', importer_export_errors_path(@importer.id), class: 'btn btn-primary' %>
|
6
|
-
<%= link_to 'Upload Corrected Entries', importer_upload_corrected_entries_path(@importer.id), class: 'btn btn-primary' %>
|
6
|
+
<%= link_to 'Export Errored Entries', importer_export_errors_path(@importer.id), class: 'btn btn-primary', data: { turbolinks: false }%>
|
7
|
+
<%= link_to 'Upload Corrected Entries', importer_upload_corrected_entries_path(@importer.id), class: 'btn btn-primary' if @importer.parser.is_a?(Bulkrax::CsvParser) %>
|
7
8
|
</div>
|
8
9
|
<% end %>
|
9
10
|
</div>
|
@@ -75,17 +76,10 @@
|
|
75
76
|
|
76
77
|
<div class="bulkrax-nav-tab-bottom-margin">
|
77
78
|
<!-- Nav tabs -->
|
78
|
-
<
|
79
|
-
|
80
|
-
<li role="presentation" class="nav-link"><a href="#collection-entries" aria-controls="collection-entries" role="tab" data-toggle="tab"><%= t('bulkrax.importer.labels.collection_entries') %></a></li>
|
81
|
-
<li role="presentation" class="nav-link"><a href="#file-set-entries" aria-controls="file-set-entries" role="tab" data-toggle="tab"><%= t('bulkrax.importer.labels.file_set_entries') %></a></li>
|
82
|
-
</ul>
|
83
|
-
<!-- Tab panes -->
|
84
|
-
<div class="tab-content outline">
|
85
|
-
<%= render partial: 'bulkrax/shared/work_entries_tab', locals: { item: @importer, entries: @work_entries } %>
|
86
|
-
<%= render partial: 'bulkrax/shared/collection_entries_tab', locals: { item: @importer, entries: @collection_entries } %>
|
87
|
-
<%= render partial: 'bulkrax/shared/file_set_entries_tab', locals: { item: @importer, entries: @file_set_entries } %>
|
79
|
+
<div class="outline">
|
80
|
+
<%= render partial: 'bulkrax/shared/entries_tab', locals: { item: @importer} %>
|
88
81
|
</div>
|
82
|
+
<%= render partial: 'bulkrax/importers/edit_item_buttons', locals: { item: @importer, e: @first_entry } if @first_entry.present? %>
|
89
83
|
</div>
|
90
84
|
|
91
85
|
<p class="bulkrax-p-align">
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div class="tab-pane bulkrax-nav-tab-table-left-align" >
|
2
|
+
<table id='importer-show-table' class='table table-striped'>
|
3
|
+
<thead>
|
4
|
+
<tr>
|
5
|
+
<th><%= t('bulkrax.table_header.labels.identifier') %></th>
|
6
|
+
<th><%= t('bulkrax.table_header.labels.entry_id') %></th>
|
7
|
+
<th><%= t('bulkrax.table_header.labels.status') %></th>
|
8
|
+
<th><%= t('bulkrax.table_header.labels.type') %></th>
|
9
|
+
<th><%= t('bulkrax.table_header.labels.updated_at') %></th>
|
10
|
+
<th><%= t('bulkrax.table_header.labels.errors') %></th>
|
11
|
+
<th><%= t('bulkrax.table_header.labels.actions') %></th>
|
12
|
+
</tr>
|
13
|
+
</thead>
|
14
|
+
</table>
|
15
|
+
<div id='importer-entry-classes' class='hidden'><%= [item.parser.entry_class.to_s, item.parser.collection_entry_class.to_s, item.parser.file_set_entry_class.to_s].compact.join('|') %></div>
|
16
|
+
</div>
|
data/config/routes.rb
CHANGED
@@ -3,15 +3,21 @@
|
|
3
3
|
Bulkrax::Engine.routes.draw do
|
4
4
|
resources :exporters do
|
5
5
|
get :download
|
6
|
-
|
6
|
+
get :entry_table
|
7
|
+
collection do
|
8
|
+
get :exporter_table
|
9
|
+
end
|
10
|
+
resources :entries, only: %i[show update destroy]
|
7
11
|
end
|
8
12
|
resources :importers do
|
9
13
|
put :continue
|
14
|
+
get :entry_table
|
10
15
|
get :export_errors
|
11
16
|
collection do
|
17
|
+
get :importer_table
|
12
18
|
post :external_sets
|
13
19
|
end
|
14
|
-
resources :entries, only: %i[show]
|
20
|
+
resources :entries, only: %i[show update destroy]
|
15
21
|
get :upload_corrected_entries
|
16
22
|
post :upload_corrected_entries_file
|
17
23
|
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
class DenormalizeStatusMessage < ActiveRecord::Migration[5.2]
|
2
|
+
def change
|
3
|
+
add_column :bulkrax_entries, :status_message, :string, default: 'Pending' unless column_exists?(:bulkrax_entries, :status_message)
|
4
|
+
add_column :bulkrax_importers, :status_message, :string, default: 'Pending' unless column_exists?(:bulkrax_importers, :status_message)
|
5
|
+
add_column :bulkrax_exporters, :status_message, :string, default: 'Pending' unless column_exists?(:bulkrax_exporters, :status_message)
|
6
|
+
end
|
7
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
class UpdateIdentifierIndex < ActiveRecord::Migration[5.2]
|
2
|
+
def change
|
3
|
+
remove_index :bulkrax_entries, :identifier if index_exists?(:bulkrax_entries, :identifier )
|
4
|
+
add_index :bulkrax_entries, [:identifier, :importerexporter_id, :importerexporter_type], name: 'bulkrax_identifier_idx' unless index_exists?(:bulkrax_entries, [:identifier, :importerexporter_id, :importerexporter_type], name: 'bulkrax_identifier_idx')
|
5
|
+
end
|
6
|
+
end
|
data/lib/bulkrax/engine.rb
CHANGED
@@ -13,6 +13,12 @@ module Bulkrax
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
initializer 'requires' do
|
17
|
+
require 'bulkrax/persistence_layer'
|
18
|
+
require 'bulkrax/persistence_layer/active_fedora_adapter' if defined?(ActiveFedora)
|
19
|
+
require 'bulkrax/persistence_layer/valkyrie_adapter' if defined?(Valkyrie)
|
20
|
+
end
|
21
|
+
|
16
22
|
config.generators do |g|
|
17
23
|
g.test_framework :rspec
|
18
24
|
begin
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bulkrax
|
4
|
+
module PersistenceLayer
|
5
|
+
class ActiveFedoraAdapter < AbstractAdapter
|
6
|
+
def self.find(id)
|
7
|
+
ActiveFedora::Base.find(id)
|
8
|
+
rescue ActiveFedora::ObjectNotFoundError => e
|
9
|
+
raise PersistenceLayer::RecordNotFound, e.message
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.query(q, **kwargs)
|
13
|
+
ActiveFedora::SolrService.query(q, **kwargs)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.clean!
|
17
|
+
super do
|
18
|
+
ActiveFedora::Cleaner.clean!
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.solr_name(field_name)
|
23
|
+
ActiveFedora.index_field_mapper.solr_name(field_name)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bulkrax
|
4
|
+
##
|
5
|
+
# The target data layer where we write and read our imported {Bulkrax::Entry} objects.
|
6
|
+
module PersistenceLayer
|
7
|
+
# We're inheriting from an ActiveRecord exception as that is something we know will be here; and
|
8
|
+
# something that the main_app will be expect to be able to handle.
|
9
|
+
class ObjectNotFoundError < ActiveRecord::RecordNotFound
|
10
|
+
end
|
11
|
+
|
12
|
+
# We're inheriting from an ActiveRecord exception as that is something we know will be here; and
|
13
|
+
# something that the main_app will be expect to be able to handle.
|
14
|
+
class RecordInvalid < ActiveRecord::RecordInvalid
|
15
|
+
end
|
16
|
+
|
17
|
+
class AbstractAdapter
|
18
|
+
# @see ActiveFedora::Base.find
|
19
|
+
def self.find(id)
|
20
|
+
raise NotImplementedError, "#{self}.#{__method__}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.solr_name(field_name)
|
24
|
+
raise NotImplementedError, "#{self}.#{__method__}"
|
25
|
+
end
|
26
|
+
|
27
|
+
# @yield when Rails application is running in test environment.
|
28
|
+
def self.clean!
|
29
|
+
return true unless Rails.env.test?
|
30
|
+
yield
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.query(q, **kwargs)
|
34
|
+
raise NotImplementedError, "#{self}.#{__method__}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/bulkrax/version.rb
CHANGED
data/lib/bulkrax.rb
CHANGED
@@ -3,7 +3,8 @@
|
|
3
3
|
require "bulkrax/version"
|
4
4
|
require "bulkrax/engine"
|
5
5
|
require 'active_support/all'
|
6
|
-
|
6
|
+
require 'coderay'
|
7
|
+
require 'denormalize_fields'
|
7
8
|
# rubocop:disable Metrics/ModuleLength
|
8
9
|
module Bulkrax
|
9
10
|
extend self # rubocop:disable Style/ModuleFunction
|
@@ -19,7 +20,6 @@ module Bulkrax
|
|
19
20
|
:export_path,
|
20
21
|
:field_mappings,
|
21
22
|
:file_model_class,
|
22
|
-
:fill_in_blank_source_identifiers,
|
23
23
|
:generated_metadata_mapping,
|
24
24
|
:import_path,
|
25
25
|
:multi_value_element_join_on,
|
@@ -35,6 +35,86 @@ module Bulkrax
|
|
35
35
|
:reserved_properties,
|
36
36
|
:server_name
|
37
37
|
|
38
|
+
##
|
39
|
+
# @return [#call] with arity 2. The first parameter is a {Bulkrax::ApplicationParser} and the
|
40
|
+
# second parameter is an Integer for the index of the record encountered in the import.
|
41
|
+
attr_accessor :fill_in_blank_source_identifiers
|
42
|
+
|
43
|
+
##
|
44
|
+
# @param adapter [Class<Bulkrax::PersistenceLayer::AbstractAdapter>]
|
45
|
+
attr_writer :persistence_adapter
|
46
|
+
|
47
|
+
##
|
48
|
+
# @param [String]
|
49
|
+
attr_writer :solr_key_for_member_file_ids
|
50
|
+
|
51
|
+
##
|
52
|
+
# @return [String]
|
53
|
+
# @see https://github.com/samvera/hyrax/pull/6513
|
54
|
+
def solr_key_for_member_file_ids
|
55
|
+
return @solr_key_for_member_file_ids if @solr_key_for_member_file_ids.present?
|
56
|
+
|
57
|
+
return "member_ids_ssim" if defined?(Hyrax)
|
58
|
+
|
59
|
+
"#{file_model_class.name.to_s.underscore}_ids_ssim"
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# @param coercer [#call]
|
64
|
+
# @see Bulkrax::FactoryClassFinder
|
65
|
+
attr_writer :factory_class_name_coercer
|
66
|
+
|
67
|
+
##
|
68
|
+
# A function responsible for converting the name of a factory class to the corresponding
|
69
|
+
# constant.
|
70
|
+
#
|
71
|
+
# @return [#call, Bulkrax::FactoryClassFinder::DefaultCoercer] an object responding to call,
|
72
|
+
# with one positional parameter (e.g. arity == 1)
|
73
|
+
#
|
74
|
+
# @example
|
75
|
+
# Bulkrax.factory_class_name_coercer.call("Work")
|
76
|
+
# => Work
|
77
|
+
def factory_class_name_coercer
|
78
|
+
@factory_class_name_coercer || Bulkrax::FactoryClassFinder::DefaultCoercer
|
79
|
+
end
|
80
|
+
|
81
|
+
attr_writer :ingest_queue_name
|
82
|
+
##
|
83
|
+
# @return [String, Proc]
|
84
|
+
def ingest_queue_name
|
85
|
+
return @ingest_queue_name if @ingest_queue_name.present?
|
86
|
+
return Hyrax.config.ingest_queue_name if defined?(Hyrax)
|
87
|
+
:import
|
88
|
+
end
|
89
|
+
|
90
|
+
##
|
91
|
+
# Configure the persistence adapter used for persisting imported data.
|
92
|
+
#
|
93
|
+
# @return [Class<Bulkrax::PersistenceLayer::AbstractAdapter>]
|
94
|
+
# @see Bulkrax::PersistenceLayer
|
95
|
+
def persistence_adapter
|
96
|
+
@persistence_adapter || derived_persistence_adapter
|
97
|
+
end
|
98
|
+
|
99
|
+
def derived_persistence_adapter
|
100
|
+
if defined?(Hyrax)
|
101
|
+
# There's probably some configuration of Hyrax we could use to better refine this; but it's
|
102
|
+
# likely a reasonable guess. The main goal is to not break existing implementations and
|
103
|
+
# maintain an upgrade path.
|
104
|
+
if Gem::Version.new(Hyrax::VERSION) >= Gem::Version.new('6.0.0')
|
105
|
+
Bulkrax::PersistenceLayer::ValkyrieAdapter
|
106
|
+
else
|
107
|
+
Bulkrax::PersistenceLayer::ActiveFedoraAdapter
|
108
|
+
end
|
109
|
+
elsif defined?(ActiveFedora)
|
110
|
+
Bulkrax::PersistenceLayer::ActiveFedoraAdapter
|
111
|
+
elsif defined?(Valkyrie)
|
112
|
+
Bulkrax::PersistenceLayer::ValkyrieAdapter
|
113
|
+
else
|
114
|
+
raise "Unable to derive a persistence adapter"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
38
118
|
attr_writer :use_locking
|
39
119
|
|
40
120
|
def use_locking
|
@@ -63,6 +143,8 @@ module Bulkrax
|
|
63
143
|
:default_work_type=,
|
64
144
|
:export_path,
|
65
145
|
:export_path=,
|
146
|
+
:factory_class_name_coercer,
|
147
|
+
:factory_class_name_coercer=,
|
66
148
|
:field_mappings,
|
67
149
|
:field_mappings=,
|
68
150
|
:file_model_class,
|
@@ -81,6 +163,8 @@ module Bulkrax
|
|
81
163
|
:object_factory=,
|
82
164
|
:parsers,
|
83
165
|
:parsers=,
|
166
|
+
:persistence_adapter,
|
167
|
+
:persistence_adapter=,
|
84
168
|
:qa_controlled_properties,
|
85
169
|
:qa_controlled_properties=,
|
86
170
|
:related_children_field_mapping,
|
@@ -97,6 +181,8 @@ module Bulkrax
|
|
97
181
|
:reserved_properties=,
|
98
182
|
:server_name,
|
99
183
|
:server_name=,
|
184
|
+
:solr_key_for_member_file_ids,
|
185
|
+
:solr_key_for_member_file_ids=,
|
100
186
|
:use_locking,
|
101
187
|
:use_locking=,
|
102
188
|
:use_locking?
|
@@ -1,6 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
namespace :bulkrax do
|
4
|
+
desc 'Update all status messages from the latest status. This is to refresh the denormalized field'
|
5
|
+
task update_status_messages: :environment do
|
6
|
+
@progress = ProgressBar.create(total: Bulkrax::Status.latest_by_statusable.count,
|
7
|
+
format: "%a %b\u{15E7}%i %c/%C %p%% %t",
|
8
|
+
progress_mark: ' ',
|
9
|
+
remainder_mark: "\u{FF65}")
|
10
|
+
Bulkrax::Status.latest_by_statusable.includes(:statusable).find_each do |status|
|
11
|
+
status.statusable.update(status_message: status.status_message)
|
12
|
+
@progress.increment
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
4
16
|
# Usage example: rails bulkrax:generate_test_csvs['5','100','GenericWork']
|
5
17
|
desc 'Generate CSVs with fake data for testing purposes'
|
6
18
|
task :generate_test_csvs, [:num_of_csvs, :csv_rows, :record_type] => :environment do |_t, args|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bulkrax
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 7.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Kaufman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: denormalize_fields
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: iso8601
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -210,6 +224,20 @@ dependencies:
|
|
210
224
|
- - ">="
|
211
225
|
- !ruby/object:Gem::Version
|
212
226
|
version: '0'
|
227
|
+
- !ruby/object:Gem::Dependency
|
228
|
+
name: dry-monads
|
229
|
+
requirement: !ruby/object:Gem::Requirement
|
230
|
+
requirements:
|
231
|
+
- - ">="
|
232
|
+
- !ruby/object:Gem::Version
|
233
|
+
version: '0'
|
234
|
+
type: :development
|
235
|
+
prerelease: false
|
236
|
+
version_requirements: !ruby/object:Gem::Requirement
|
237
|
+
requirements:
|
238
|
+
- - ">="
|
239
|
+
- !ruby/object:Gem::Version
|
240
|
+
version: '0'
|
213
241
|
- !ruby/object:Gem::Dependency
|
214
242
|
name: sqlite3
|
215
243
|
requirement: !ruby/object:Gem::Requirement
|
@@ -283,6 +311,7 @@ files:
|
|
283
311
|
- app/assets/config/bulkrax_manifest.js
|
284
312
|
- app/assets/javascripts/bulkrax/application.js
|
285
313
|
- app/assets/javascripts/bulkrax/bulkrax.js
|
314
|
+
- app/assets/javascripts/bulkrax/datatables.js
|
286
315
|
- app/assets/javascripts/bulkrax/entries.js
|
287
316
|
- app/assets/javascripts/bulkrax/exporters.js
|
288
317
|
- app/assets/javascripts/bulkrax/importers.js.erb
|
@@ -296,6 +325,7 @@ files:
|
|
296
325
|
- app/controllers/bulkrax/exporters_controller.rb
|
297
326
|
- app/controllers/bulkrax/importers_controller.rb
|
298
327
|
- app/controllers/concerns/bulkrax/api.rb
|
328
|
+
- app/controllers/concerns/bulkrax/datatables_behavior.rb
|
299
329
|
- app/controllers/concerns/bulkrax/download_behavior.rb
|
300
330
|
- app/factories/bulkrax/object_factory.rb
|
301
331
|
- app/helpers/bulkrax/application_helper.rb
|
@@ -304,6 +334,10 @@ files:
|
|
304
334
|
- app/helpers/bulkrax/validation_helper.rb
|
305
335
|
- app/jobs/bulkrax/application_job.rb
|
306
336
|
- app/jobs/bulkrax/create_relationships_job.rb
|
337
|
+
- app/jobs/bulkrax/delete_and_import_collection_job.rb
|
338
|
+
- app/jobs/bulkrax/delete_and_import_file_set_job.rb
|
339
|
+
- app/jobs/bulkrax/delete_and_import_job.rb
|
340
|
+
- app/jobs/bulkrax/delete_and_import_work_job.rb
|
307
341
|
- app/jobs/bulkrax/delete_collection_job.rb
|
308
342
|
- app/jobs/bulkrax/delete_file_set_job.rb
|
309
343
|
- app/jobs/bulkrax/delete_job.rb
|
@@ -313,6 +347,7 @@ files:
|
|
313
347
|
- app/jobs/bulkrax/exporter_job.rb
|
314
348
|
- app/jobs/bulkrax/import_collection_job.rb
|
315
349
|
- app/jobs/bulkrax/import_file_set_job.rb
|
350
|
+
- app/jobs/bulkrax/import_job.rb
|
316
351
|
- app/jobs/bulkrax/import_work_job.rb
|
317
352
|
- app/jobs/bulkrax/importer_job.rb
|
318
353
|
- app/jobs/bulkrax/schedule_relationships_job.rb
|
@@ -358,6 +393,7 @@ files:
|
|
358
393
|
- app/parsers/bulkrax/oai_qualified_dc_parser.rb
|
359
394
|
- app/parsers/bulkrax/parser_export_record_set.rb
|
360
395
|
- app/parsers/bulkrax/xml_parser.rb
|
396
|
+
- app/services/bulkrax/factory_class_finder.rb
|
361
397
|
- app/services/bulkrax/remove_relationships_for_importer.rb
|
362
398
|
- app/views/bulkrax/entries/_parsed_metadata.html.erb
|
363
399
|
- app/views/bulkrax/entries/_raw_metadata.html.erb
|
@@ -372,6 +408,7 @@ files:
|
|
372
408
|
- app/views/bulkrax/importers/_browse_everything.html.erb
|
373
409
|
- app/views/bulkrax/importers/_csv_fields.html.erb
|
374
410
|
- app/views/bulkrax/importers/_edit_form_buttons.html.erb
|
411
|
+
- app/views/bulkrax/importers/_edit_item_buttons.html.erb
|
375
412
|
- app/views/bulkrax/importers/_form.html.erb
|
376
413
|
- app/views/bulkrax/importers/_oai_fields.html.erb
|
377
414
|
- app/views/bulkrax/importers/_xml_fields.html.erb
|
@@ -382,9 +419,7 @@ files:
|
|
382
419
|
- app/views/bulkrax/importers/upload_corrected_entries.html.erb
|
383
420
|
- app/views/bulkrax/shared/_bulkrax_errors.html.erb
|
384
421
|
- app/views/bulkrax/shared/_bulkrax_field_mapping.html.erb
|
385
|
-
- app/views/bulkrax/shared/
|
386
|
-
- app/views/bulkrax/shared/_file_set_entries_tab.html.erb
|
387
|
-
- app/views/bulkrax/shared/_work_entries_tab.html.erb
|
422
|
+
- app/views/bulkrax/shared/_entries_tab.html.erb
|
388
423
|
- app/views/hyrax/dashboard/sidebar/_bulkrax_sidebar_additions.html.erb
|
389
424
|
- app/views/hyrax/dashboard/sidebar/_repository_content.html.erb
|
390
425
|
- app/views/layouts/bulkrax/application.html.erb
|
@@ -425,9 +460,14 @@ files:
|
|
425
460
|
- db/migrate/20220413180915_add_generated_metadata_to_bulkrax_exporters.rb
|
426
461
|
- db/migrate/20220609001128_rename_bulkrax_importer_run_to_importer_run.rb
|
427
462
|
- db/migrate/20230608153601_add_indices_to_bulkrax.rb
|
463
|
+
- db/migrate/20240208005801_denormalize_status_message.rb
|
464
|
+
- db/migrate/20240209070952_update_identifier_index.rb
|
428
465
|
- lib/bulkrax.rb
|
429
466
|
- lib/bulkrax/engine.rb
|
430
467
|
- lib/bulkrax/entry_spec_helper.rb
|
468
|
+
- lib/bulkrax/persistence_layer.rb
|
469
|
+
- lib/bulkrax/persistence_layer/active_fedora_adapter.rb
|
470
|
+
- lib/bulkrax/persistence_layer/valkyrie_adapter.rb
|
431
471
|
- lib/bulkrax/version.rb
|
432
472
|
- lib/generators/bulkrax/install_generator.rb
|
433
473
|
- lib/generators/bulkrax/templates/README
|
@@ -457,7 +497,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
457
497
|
- !ruby/object:Gem::Version
|
458
498
|
version: '0'
|
459
499
|
requirements: []
|
460
|
-
rubygems_version: 3.
|
500
|
+
rubygems_version: 3.4.10
|
461
501
|
signing_key:
|
462
502
|
specification_version: 4
|
463
503
|
summary: Import and export tool for Hyrax and Hyku
|
@@ -1,39 +0,0 @@
|
|
1
|
-
<div role="tabpanel" class="tab-pane bulkrax-nav-tab-table-left-align" id="collection-entries">
|
2
|
-
<table class='table table-striped'>
|
3
|
-
<thead>
|
4
|
-
<tr>
|
5
|
-
<th><%= t('bulkrax.table_header.labels.identifier') %></th>
|
6
|
-
<th><%= t('bulkrax.table_header.labels.entry_id') %></th>
|
7
|
-
<th><%= t('bulkrax.table_header.labels.status') %></th>
|
8
|
-
<th><%= t('bulkrax.table_header.labels.errors') %></th>
|
9
|
-
<th><%= t('bulkrax.table_header.labels.status_set_at') %></th>
|
10
|
-
<th><%= t('bulkrax.table_header.labels.actions') %></th>
|
11
|
-
</tr>
|
12
|
-
</thead>
|
13
|
-
<tbody>
|
14
|
-
<% entries.each do |e| %>
|
15
|
-
<% entry_path = item.class.to_s.include?('Importer') ? bulkrax.importer_entry_path(item.id, e.id) : bulkrax.exporter_entry_path(item.id, e.id) %>
|
16
|
-
<tr>
|
17
|
-
<td><%= link_to e.identifier, entry_path %></td>
|
18
|
-
<td><%= e.id %></td>
|
19
|
-
<% if e.status == "Complete" %>
|
20
|
-
<td><span class="glyphicon glyphicon-ok" style="color: green;"></span> <%= e.status %></td>
|
21
|
-
<% elsif e.status == "Pending" %>
|
22
|
-
<td><span class="glyphicon glyphicon-option-horizontal" style="color: blue;"></span> <%= e.status %></td>
|
23
|
-
<% else %>
|
24
|
-
<td><span class="glyphicon glyphicon-remove" style="color: <%= e.status == 'Deleted' ? 'green' : 'red' %>;"></span> <%= e.status %></td>
|
25
|
-
<% end %>
|
26
|
-
<% if e.last_error.present? %>
|
27
|
-
<td><%= link_to e.last_error.dig("error_class"), entry_path %></td>
|
28
|
-
<% else %>
|
29
|
-
<td></td>
|
30
|
-
<% end %>
|
31
|
-
<td><%= e.status_at %></td>
|
32
|
-
<td><%= link_to raw('<span class="glyphicon glyphicon-info-sign"></span>'), entry_path %></td>
|
33
|
-
</tr>
|
34
|
-
<% end %>
|
35
|
-
</tbody>
|
36
|
-
</table>
|
37
|
-
<%= page_entries_info(entries) %><br />
|
38
|
-
<%= paginate(entries, theme: 'blacklight', param_name: :collections_entries_page, params: { anchor: 'collection-entries' }) %>
|
39
|
-
</div>
|