bulkrax 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +205 -0
- data/README.md +202 -0
- data/Rakefile +42 -0
- data/app/assets/config/bulkrax_manifest.js +2 -0
- data/app/assets/javascripts/bulkrax/application.js +14 -0
- data/app/assets/javascripts/bulkrax/bulkrax.js +11 -0
- data/app/assets/javascripts/bulkrax/entries.js +15 -0
- data/app/assets/javascripts/bulkrax/exporters.js +60 -0
- data/app/assets/javascripts/bulkrax/importers.js.erb +166 -0
- data/app/assets/stylesheets/bulkrax/accordion.scss +40 -0
- data/app/assets/stylesheets/bulkrax/application.css +15 -0
- data/app/assets/stylesheets/bulkrax/coderay.scss +264 -0
- data/app/assets/stylesheets/bulkrax/import_export.scss +37 -0
- data/app/controllers/bulkrax/application_controller.rb +8 -0
- data/app/controllers/bulkrax/entries_controller.rb +44 -0
- data/app/controllers/bulkrax/exporters_controller.rb +125 -0
- data/app/controllers/bulkrax/importers_controller.rb +315 -0
- data/app/controllers/concerns/bulkrax/api.rb +29 -0
- data/app/factories/bulkrax/object_factory.rb +230 -0
- data/app/helpers/bulkrax/application_helper.rb +15 -0
- data/app/helpers/bulkrax/exporters_helper.rb +6 -0
- data/app/helpers/bulkrax/importers_helper.rb +13 -0
- data/app/helpers/bulkrax/validation_helper.rb +153 -0
- data/app/jobs/bulkrax/application_job.rb +6 -0
- data/app/jobs/bulkrax/child_relationships_job.rb +128 -0
- data/app/jobs/bulkrax/delete_work_job.rb +16 -0
- data/app/jobs/bulkrax/download_cloud_file_job.rb +18 -0
- data/app/jobs/bulkrax/export_work_job.rb +37 -0
- data/app/jobs/bulkrax/exporter_job.rb +14 -0
- data/app/jobs/bulkrax/import_work_collection_job.rb +41 -0
- data/app/jobs/bulkrax/import_work_job.rb +32 -0
- data/app/jobs/bulkrax/importer_job.rb +26 -0
- data/app/mailers/bulkrax/application_mailer.rb +8 -0
- data/app/matchers/bulkrax/application_matcher.rb +113 -0
- data/app/matchers/bulkrax/bagit_matcher.rb +6 -0
- data/app/matchers/bulkrax/csv_matcher.rb +6 -0
- data/app/matchers/bulkrax/oai_matcher.rb +6 -0
- data/app/models/bulkrax/application_record.rb +7 -0
- data/app/models/bulkrax/csv_collection_entry.rb +19 -0
- data/app/models/bulkrax/csv_entry.rb +163 -0
- data/app/models/bulkrax/entry.rb +104 -0
- data/app/models/bulkrax/exporter.rb +122 -0
- data/app/models/bulkrax/exporter_run.rb +7 -0
- data/app/models/bulkrax/import_failed.rb +13 -0
- data/app/models/bulkrax/importer.rb +155 -0
- data/app/models/bulkrax/importer_run.rb +8 -0
- data/app/models/bulkrax/oai_dc_entry.rb +6 -0
- data/app/models/bulkrax/oai_entry.rb +74 -0
- data/app/models/bulkrax/oai_qualified_dc_entry.rb +6 -0
- data/app/models/bulkrax/oai_set_entry.rb +19 -0
- data/app/models/bulkrax/rdf_collection_entry.rb +19 -0
- data/app/models/bulkrax/rdf_entry.rb +90 -0
- data/app/models/bulkrax/status.rb +25 -0
- data/app/models/bulkrax/xml_entry.rb +73 -0
- data/app/models/concerns/bulkrax/download_behavior.rb +61 -0
- data/app/models/concerns/bulkrax/errored_entries.rb +45 -0
- data/app/models/concerns/bulkrax/export_behavior.rb +58 -0
- data/app/models/concerns/bulkrax/file_factory.rb +140 -0
- data/app/models/concerns/bulkrax/has_local_processing.rb +7 -0
- data/app/models/concerns/bulkrax/has_matchers.rb +155 -0
- data/app/models/concerns/bulkrax/import_behavior.rb +90 -0
- data/app/models/concerns/bulkrax/importer_exporter_behavior.rb +34 -0
- data/app/models/concerns/bulkrax/status_info.rb +56 -0
- data/app/parsers/bulkrax/application_parser.rb +299 -0
- data/app/parsers/bulkrax/bagit_parser.rb +157 -0
- data/app/parsers/bulkrax/csv_parser.rb +266 -0
- data/app/parsers/bulkrax/oai_dc_parser.rb +130 -0
- data/app/parsers/bulkrax/oai_qualified_dc_parser.rb +9 -0
- data/app/parsers/bulkrax/xml_parser.rb +103 -0
- data/app/views/bulkrax/entries/_parsed_metadata.html.erb +19 -0
- data/app/views/bulkrax/entries/_raw_metadata.html.erb +19 -0
- data/app/views/bulkrax/entries/show.html.erb +63 -0
- data/app/views/bulkrax/exporters/_form.html.erb +120 -0
- data/app/views/bulkrax/exporters/edit.html.erb +23 -0
- data/app/views/bulkrax/exporters/index.html.erb +67 -0
- data/app/views/bulkrax/exporters/new.html.erb +23 -0
- data/app/views/bulkrax/exporters/show.html.erb +124 -0
- data/app/views/bulkrax/importers/_bagit_fields.html.erb +54 -0
- data/app/views/bulkrax/importers/_browse_everything.html.erb +12 -0
- data/app/views/bulkrax/importers/_csv_fields.html.erb +39 -0
- data/app/views/bulkrax/importers/_edit_form_buttons.html.erb +16 -0
- data/app/views/bulkrax/importers/_form.html.erb +35 -0
- data/app/views/bulkrax/importers/_oai_fields.html.erb +42 -0
- data/app/views/bulkrax/importers/_xml_fields.html.erb +60 -0
- data/app/views/bulkrax/importers/edit.html.erb +20 -0
- data/app/views/bulkrax/importers/index.html.erb +77 -0
- data/app/views/bulkrax/importers/new.html.erb +25 -0
- data/app/views/bulkrax/importers/show.html.erb +175 -0
- data/app/views/bulkrax/importers/upload_corrected_entries.html.erb +37 -0
- data/app/views/bulkrax/shared/_bulkrax_errors.html.erb +52 -0
- data/app/views/bulkrax/shared/_bulkrax_field_mapping.html.erb +39 -0
- data/app/views/hyrax/dashboard/sidebar/_bulkrax_sidebar_additions.html.erb +6 -0
- data/app/views/hyrax/dashboard/sidebar/_repository_content.html.erb +19 -0
- data/app/views/layouts/bulkrax/application.html.erb +14 -0
- data/config/locales/bulkrax.en.yml +36 -0
- data/config/routes.rb +18 -0
- data/db/migrate/20181011230201_create_bulkrax_importers.rb +18 -0
- data/db/migrate/20181011230228_create_bulkrax_importer_runs.rb +16 -0
- data/db/migrate/20190325183136_create_bulkrax_entries.rb +16 -0
- data/db/migrate/20190601221109_add_status_to_entry.rb +9 -0
- data/db/migrate/20190715161939_add_collections_to_importer_runs.rb +6 -0
- data/db/migrate/20190715162044_change_collection_ids_on_entries.rb +5 -0
- data/db/migrate/20190729124607_create_bulkrax_exporters.rb +19 -0
- data/db/migrate/20190729134158_create_bulkrax_exporter_runs.rb +14 -0
- data/db/migrate/20190731114016_change_importer_and_exporter_to_polymorphic.rb +12 -0
- data/db/migrate/20191203225129_add_total_collection_records_to_importer_runs.rb +5 -0
- data/db/migrate/20191204191623_add_children_to_importer_runs.rb +6 -0
- data/db/migrate/20191204223857_change_total_records_to_total_work_entries.rb +6 -0
- data/db/migrate/20191212155530_change_entry_last_error.rb +19 -0
- data/db/migrate/20200108194557_add_validate_only_to_bulkrax_importers.rb +5 -0
- data/db/migrate/20200301232856_add_status_to_importers.rb +9 -0
- data/db/migrate/20200312190638_remove_foreign_key_from_bulkrax_entries.rb +5 -0
- data/db/migrate/20200326235838_add_status_to_exporters.rb +7 -0
- data/db/migrate/20200601204556_add_invalid_record_to_importer_run.rb +5 -0
- data/db/migrate/20200818055819_create_bulkrax_statuses.rb +18 -0
- data/db/migrate/20200819054016_move_to_statuses.rb +30 -0
- data/db/migrate/20201106014204_add_date_filter_and_status_to_bulkrax_exporters.rb +7 -0
- data/db/migrate/20201117220007_add_workflow_status_to_bulkrax_exporter.rb +5 -0
- data/db/migrate/20210806044408_remove_unused_last_error.rb +7 -0
- data/db/migrate/20210806065737_increase_text_sizes.rb +12 -0
- data/lib/bulkrax.rb +161 -0
- data/lib/bulkrax/engine.rb +37 -0
- data/lib/bulkrax/version.rb +5 -0
- data/lib/generators/bulkrax/install_generator.rb +80 -0
- data/lib/generators/bulkrax/templates/README +3 -0
- data/lib/generators/bulkrax/templates/app/assets/images/bulkrax/removed.png +0 -0
- data/lib/generators/bulkrax/templates/app/models/concerns/bulkrax/has_local_processing.rb +8 -0
- data/lib/generators/bulkrax/templates/bin/importer +140 -0
- data/lib/generators/bulkrax/templates/config/bulkrax_api.yml +84 -0
- data/lib/generators/bulkrax/templates/config/initializers/bulkrax.rb +72 -0
- data/lib/tasks/bulkrax_tasks.rake +6 -0
- metadata +388 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bulkrax
|
4
|
+
class CsvCollectionEntry < CsvEntry
|
5
|
+
def factory_class
|
6
|
+
Collection
|
7
|
+
end
|
8
|
+
|
9
|
+
def build_metadata
|
10
|
+
self.parsed_metadata = self.raw_metadata
|
11
|
+
add_local
|
12
|
+
return self.parsed_metadata
|
13
|
+
end
|
14
|
+
|
15
|
+
def collections_created?
|
16
|
+
true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'csv'
|
4
|
+
|
5
|
+
module Bulkrax
|
6
|
+
class CsvEntry < Entry
|
7
|
+
serialize :raw_metadata, JSON
|
8
|
+
|
9
|
+
def self.fields_from_data(data)
|
10
|
+
data.headers.flatten.compact.uniq
|
11
|
+
end
|
12
|
+
|
13
|
+
# there's a risk that this reads the whole file into memory and could cause a memory leak
|
14
|
+
def self.read_data(path)
|
15
|
+
raise StandardError, 'CSV path empty' if path.blank?
|
16
|
+
CSV.read(path,
|
17
|
+
headers: true,
|
18
|
+
header_converters: :symbol,
|
19
|
+
encoding: 'utf-8')
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.data_for_entry(data, _source_id)
|
23
|
+
# If a multi-line CSV data is passed, grab the first row
|
24
|
+
data = data.first if data.is_a?(CSV::Table)
|
25
|
+
# model has to be separated so that it doesn't get mistranslated by to_h
|
26
|
+
raw_data = data.to_h
|
27
|
+
raw_data[:model] = data[:model]
|
28
|
+
# If the collection field mapping is not 'collection', add 'collection' - the parser needs it
|
29
|
+
raw_data[:collection] = raw_data[collection_field.to_sym] if raw_data.keys.include?(collection_field.to_sym) && collection_field != 'collection'
|
30
|
+
# If the children field mapping is not 'children', add 'children' - the parser needs it
|
31
|
+
raw_data[:children] = raw_data[collection_field.to_sym] if raw_data.keys.include?(children_field.to_sym) && children_field != 'children'
|
32
|
+
return raw_data
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.collection_field
|
36
|
+
Bulkrax.collection_field_mapping[self.class.to_s] || 'collection'
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.children_field
|
40
|
+
Bulkrax.parent_child_field_mapping[self.to_s] || 'children'
|
41
|
+
end
|
42
|
+
|
43
|
+
def keys_without_numbers(keys)
|
44
|
+
keys.map { |key| key_without_numbers(key) }
|
45
|
+
end
|
46
|
+
|
47
|
+
def key_without_numbers(key)
|
48
|
+
key.gsub(/_\d+/, '').sub(/^\d+_/, '')
|
49
|
+
end
|
50
|
+
|
51
|
+
def build_metadata
|
52
|
+
raise StandardError, 'Record not found' if record.nil?
|
53
|
+
raise StandardError, "Missing required elements, missing element(s) are: #{importerexporter.parser.missing_elements(keys_without_numbers(record.keys)).join(', ')}" unless importerexporter.parser.required_elements?(keys_without_numbers(record.keys))
|
54
|
+
|
55
|
+
self.parsed_metadata = {}
|
56
|
+
self.parsed_metadata[work_identifier] = [record[source_identifier]]
|
57
|
+
record.each do |key, value|
|
58
|
+
next if key == 'collection'
|
59
|
+
|
60
|
+
index = key[/\d+/].to_i - 1 if key[/\d+/].to_i != 0
|
61
|
+
add_metadata(key_without_numbers(key), value, index)
|
62
|
+
end
|
63
|
+
add_file
|
64
|
+
add_visibility
|
65
|
+
add_rights_statement
|
66
|
+
add_admin_set_id
|
67
|
+
add_collections
|
68
|
+
add_local
|
69
|
+
self.parsed_metadata
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_file
|
73
|
+
self.parsed_metadata['file'] ||= []
|
74
|
+
if record['file']&.is_a?(String)
|
75
|
+
self.parsed_metadata['file'] = record['file'].split(/\s*[;|]\s*/)
|
76
|
+
elsif record['file'].is_a?(Array)
|
77
|
+
self.parsed_metadata['file'] = record['file']
|
78
|
+
end
|
79
|
+
self.parsed_metadata['file'] = self.parsed_metadata['file'].map { |f| path_to_file(f.tr(' ', '_')) }
|
80
|
+
end
|
81
|
+
|
82
|
+
def build_export_metadata
|
83
|
+
# make_round_trippable
|
84
|
+
self.parsed_metadata = {}
|
85
|
+
self.parsed_metadata['id'] = hyrax_record.id
|
86
|
+
self.parsed_metadata[source_identifier] = hyrax_record.send(work_identifier)
|
87
|
+
self.parsed_metadata['model'] = hyrax_record.has_model.first
|
88
|
+
build_mapping_metadata
|
89
|
+
self.parsed_metadata['collections'] = hyrax_record.member_of_collection_ids.join('; ')
|
90
|
+
unless hyrax_record.is_a?(Collection)
|
91
|
+
self.parsed_metadata['file'] = hyrax_record.file_sets.map { |fs| filename(fs).to_s if filename(fs).present? }.compact.join('; ')
|
92
|
+
end
|
93
|
+
self.parsed_metadata
|
94
|
+
end
|
95
|
+
|
96
|
+
def build_mapping_metadata
|
97
|
+
mapping.each do |key, value|
|
98
|
+
next if Bulkrax.reserved_properties.include?(key) && !field_supported?(key)
|
99
|
+
next if key == "model"
|
100
|
+
next unless hyrax_record.respond_to?(key.to_s)
|
101
|
+
data = hyrax_record.send(key.to_s)
|
102
|
+
if data.is_a?(ActiveTriples::Relation)
|
103
|
+
self.parsed_metadata[key] = data.map { |d| prepare_export_data(d) }.join('; ').to_s unless value[:excluded]
|
104
|
+
else
|
105
|
+
self.parsed_metadata[key] = prepare_export_data(data)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def prepare_export_data(datum)
|
111
|
+
if datum.is_a?(ActiveTriples::Resource)
|
112
|
+
datum.to_uri.to_s
|
113
|
+
else
|
114
|
+
datum
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# In order for the existing exported hyrax_record, to be updated by a re-import
|
119
|
+
# we need a unique value in system_identifier
|
120
|
+
# add the existing hyrax_record id to system_identifier
|
121
|
+
def make_round_trippable
|
122
|
+
values = hyrax_record.send(work_identifier.to_s).to_a
|
123
|
+
values << hyrax_record.id
|
124
|
+
hyrax_record.send("#{work_identifier}=", values)
|
125
|
+
hyrax_record.save
|
126
|
+
end
|
127
|
+
|
128
|
+
def record
|
129
|
+
@record ||= raw_metadata
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.matcher_class
|
133
|
+
Bulkrax::CsvMatcher
|
134
|
+
end
|
135
|
+
|
136
|
+
def collections_created?
|
137
|
+
return true if record[self.class.collection_field].blank?
|
138
|
+
record[self.class.collection_field].split(/\s*[:;|]\s*/).length == self.collection_ids.length
|
139
|
+
end
|
140
|
+
|
141
|
+
def find_or_create_collection_ids
|
142
|
+
return self.collection_ids if collections_created?
|
143
|
+
valid_system_id(Collection)
|
144
|
+
if record[self.class.collection_field].present?
|
145
|
+
record[self.class.collection_field].split(/\s*[:;|]\s*/).each do |collection|
|
146
|
+
c = find_collection(collection)
|
147
|
+
self.collection_ids << c.id unless c.blank? || self.collection_ids.include?(c.id)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
self.collection_ids
|
151
|
+
end
|
152
|
+
|
153
|
+
# If only filename is given, construct the path (/files/my_file)
|
154
|
+
def path_to_file(file)
|
155
|
+
# return if we already have the full file path
|
156
|
+
return file if File.exist?(file)
|
157
|
+
path = importerexporter.parser.path_to_files
|
158
|
+
f = File.join(path, file)
|
159
|
+
return f if File.exist?(f)
|
160
|
+
raise "File #{f} does not exist"
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bulkrax
|
4
|
+
# Custom error class for collections_created?
|
5
|
+
class CollectionsCreatedError < RuntimeError; end
|
6
|
+
class OAIError < RuntimeError; end
|
7
|
+
class Entry < ApplicationRecord
|
8
|
+
include Bulkrax::HasMatchers
|
9
|
+
include Bulkrax::ImportBehavior
|
10
|
+
include Bulkrax::ExportBehavior
|
11
|
+
include Bulkrax::StatusInfo
|
12
|
+
include Bulkrax::HasLocalProcessing
|
13
|
+
|
14
|
+
belongs_to :importerexporter, polymorphic: true
|
15
|
+
alias importer importerexporter
|
16
|
+
alias exporter importerexporter
|
17
|
+
|
18
|
+
serialize :parsed_metadata, JSON
|
19
|
+
# Do not serialize raw_metadata as so we can support xml or other formats
|
20
|
+
serialize :collection_ids, Array
|
21
|
+
|
22
|
+
paginates_per 5
|
23
|
+
|
24
|
+
attr_accessor :all_attrs
|
25
|
+
|
26
|
+
delegate :parser, :mapping, :replace_files, :update_files, to: :importerexporter
|
27
|
+
|
28
|
+
delegate :client,
|
29
|
+
:collection_name,
|
30
|
+
:user,
|
31
|
+
to: :parser
|
32
|
+
|
33
|
+
# Retrieve fields from the file
|
34
|
+
# @param data - the source data
|
35
|
+
# @return Array
|
36
|
+
def self.fields_from_data(_data)
|
37
|
+
raise StandardError, 'Not Implemented'
|
38
|
+
end
|
39
|
+
|
40
|
+
# Read the data from the supplied path
|
41
|
+
# @param path - path to the data file
|
42
|
+
# @return the data from the file
|
43
|
+
def self.read_data(_path)
|
44
|
+
raise StandardError, 'Not Implemented'
|
45
|
+
end
|
46
|
+
|
47
|
+
# Returns formatted data from the given file for a single Entry
|
48
|
+
# @param data - the data from the metadata file
|
49
|
+
# @param path - the path to the metadata file (used by some entries to get the file_paths for import)
|
50
|
+
# @return Hash containing the data (the entry build_metadata method will know what to expect in the hash)
|
51
|
+
def self.data_for_entry(_data, _source_id)
|
52
|
+
raise StandardError, 'Not Implemented'
|
53
|
+
end
|
54
|
+
|
55
|
+
def source_identifier
|
56
|
+
parser&.source_identifier&.to_s || 'source_identifier'
|
57
|
+
end
|
58
|
+
|
59
|
+
def work_identifier
|
60
|
+
parser&.work_identifier&.to_s || 'source'
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.collection_field
|
64
|
+
Bulkrax.collection_field_mapping[self.to_s]
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.children_field
|
68
|
+
Bulkrax.parent_child_field_mapping[self.to_s]
|
69
|
+
end
|
70
|
+
|
71
|
+
def build
|
72
|
+
return if type.nil?
|
73
|
+
self.save if self.new_record? # must be saved for statuses
|
74
|
+
|
75
|
+
return build_for_importer if importer?
|
76
|
+
return build_for_exporter if exporter?
|
77
|
+
end
|
78
|
+
|
79
|
+
def importer?
|
80
|
+
self.importerexporter_type == 'Bulkrax::Importer'
|
81
|
+
end
|
82
|
+
|
83
|
+
def exporter?
|
84
|
+
self.importerexporter_type == 'Bulkrax::Exporter'
|
85
|
+
end
|
86
|
+
|
87
|
+
def valid_system_id(model_class)
|
88
|
+
return true if model_class.properties.keys.include?(work_identifier)
|
89
|
+
raise(
|
90
|
+
"#{model_class} does not implement the system_identifier_field: #{work_identifier}"
|
91
|
+
)
|
92
|
+
end
|
93
|
+
|
94
|
+
def last_run
|
95
|
+
self.importerexporter&.last_run
|
96
|
+
end
|
97
|
+
|
98
|
+
def find_collection(collection_identifier)
|
99
|
+
Collection.where(
|
100
|
+
work_identifier => collection_identifier
|
101
|
+
).detect { |m| m.send(work_identifier).include?(collection_identifier) }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Bulkrax
|
3
|
+
class Exporter < ApplicationRecord
|
4
|
+
include Bulkrax::ImporterExporterBehavior
|
5
|
+
include Bulkrax::StatusInfo
|
6
|
+
|
7
|
+
serialize :parser_fields, JSON
|
8
|
+
serialize :field_mapping, JSON
|
9
|
+
|
10
|
+
belongs_to :user
|
11
|
+
has_many :exporter_runs, dependent: :destroy
|
12
|
+
has_many :entries, as: :importerexporter, dependent: :destroy
|
13
|
+
|
14
|
+
validates :name, presence: true
|
15
|
+
validates :parser_klass, presence: true
|
16
|
+
|
17
|
+
delegate :write, :create_from_collection, :create_from_importer, :create_from_worktype, to: :parser
|
18
|
+
|
19
|
+
def export
|
20
|
+
current_run && setup_export_path
|
21
|
+
case self.export_from
|
22
|
+
when 'collection'
|
23
|
+
create_from_collection
|
24
|
+
when 'importer'
|
25
|
+
create_from_importer
|
26
|
+
when 'worktype'
|
27
|
+
create_from_worktype
|
28
|
+
end
|
29
|
+
rescue StandardError => e
|
30
|
+
status_info(e)
|
31
|
+
end
|
32
|
+
|
33
|
+
# #export_source accessors
|
34
|
+
# Used in form to prevent it from getting confused as to which value to populate #export_source with.
|
35
|
+
# Also, used to display the correct selected value when rendering edit form.
|
36
|
+
def export_source_importer
|
37
|
+
self.export_source if self.export_from == 'importer'
|
38
|
+
end
|
39
|
+
|
40
|
+
def export_source_collection
|
41
|
+
self.export_source if self.export_from == 'collection'
|
42
|
+
end
|
43
|
+
|
44
|
+
def export_source_worktype
|
45
|
+
self.export_source if self.export_from == 'worktype'
|
46
|
+
end
|
47
|
+
|
48
|
+
def date_filter
|
49
|
+
self.start_date.present? || self.finish_date.present?
|
50
|
+
end
|
51
|
+
|
52
|
+
def work_visibility_list
|
53
|
+
[
|
54
|
+
['Any', ''],
|
55
|
+
[I18n.t('hyrax.visibility.open.text'), Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC],
|
56
|
+
[I18n.t('hyrax.visibility.restricted.text'), Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE],
|
57
|
+
[I18n.t('hyrax.visibility.authenticated.text', institution: I18n.t('hyrax.institution_name')), Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED]
|
58
|
+
]
|
59
|
+
end
|
60
|
+
|
61
|
+
def workflow_status_list
|
62
|
+
Sipity::WorkflowState.all.map { |s| [s.name&.titleize, s.name] }.uniq
|
63
|
+
end
|
64
|
+
|
65
|
+
# If field_mapping is empty, setup a default based on the export_properties
|
66
|
+
def mapping
|
67
|
+
@mapping ||= self.field_mapping ||
|
68
|
+
ActiveSupport::HashWithIndifferentAccess.new(
|
69
|
+
export_properties.map do |m|
|
70
|
+
Bulkrax.default_field_mapping.call(m)
|
71
|
+
end.inject(:merge)
|
72
|
+
) ||
|
73
|
+
[{}]
|
74
|
+
end
|
75
|
+
|
76
|
+
def export_from_list
|
77
|
+
[
|
78
|
+
[I18n.t('bulkrax.exporter.labels.importer'), 'importer'],
|
79
|
+
[I18n.t('bulkrax.exporter.labels.collection'), 'collection'],
|
80
|
+
[I18n.t('bulkrax.exporter.labels.worktype'), 'worktype']
|
81
|
+
]
|
82
|
+
end
|
83
|
+
|
84
|
+
def export_type_list
|
85
|
+
[
|
86
|
+
[I18n.t('bulkrax.exporter.labels.metadata'), 'metadata'],
|
87
|
+
[I18n.t('bulkrax.exporter.labels.full'), 'full']
|
88
|
+
]
|
89
|
+
end
|
90
|
+
|
91
|
+
def importers_list
|
92
|
+
Importer.all.map { |i| [i.name, i.id] }
|
93
|
+
end
|
94
|
+
|
95
|
+
def current_run
|
96
|
+
@current_run ||= self.exporter_runs.create!(total_work_entries: self.limit || parser.total)
|
97
|
+
end
|
98
|
+
|
99
|
+
def last_run
|
100
|
+
@last_run ||= self.exporter_runs.last
|
101
|
+
end
|
102
|
+
|
103
|
+
def setup_export_path
|
104
|
+
FileUtils.mkdir_p(exporter_export_path) unless File.exist?(exporter_export_path)
|
105
|
+
end
|
106
|
+
|
107
|
+
def exporter_export_path
|
108
|
+
@exporter_export_path ||= File.join(Bulkrax.export_path, self.id.to_s, self.exporter_runs.last.id.to_s)
|
109
|
+
end
|
110
|
+
|
111
|
+
def exporter_export_zip_path
|
112
|
+
@exporter_export_zip_path ||= File.join(Bulkrax.export_path, "export_#{self.id}_#{self.exporter_runs.last.id}.zip")
|
113
|
+
rescue
|
114
|
+
@exporter_export_zip_path ||= File.join(Bulkrax.export_path, "export_#{self.id}_0.zip")
|
115
|
+
end
|
116
|
+
|
117
|
+
def export_properties
|
118
|
+
properties = Hyrax.config.registered_curation_concern_types.map { |work| work.constantize.properties.keys }.flatten.uniq.sort
|
119
|
+
properties.reject { |prop| Bulkrax.reserved_properties.include?(prop) }
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|