bulkrax 1.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 +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,25 @@
|
|
1
|
+
<% provide :page_header do %>
|
2
|
+
<h1><span class="fa fa-edit" aria-hidden="true"></span> New Importer</h1>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<div class="row">
|
6
|
+
<div class="col-md-12">
|
7
|
+
<div class="panel panel-default tabs">
|
8
|
+
<%= simple_form_for @importer, html: { multipart: true } do |form| %>
|
9
|
+
<%= render 'form', importer: @importer, form: form %>
|
10
|
+
<div class="panel-footer">
|
11
|
+
<div class='pull-right'>
|
12
|
+
<%= form.button :submit, value: 'Create and Validate', class: 'btn btn-primary' %>
|
13
|
+
|
|
14
|
+
<%= form.button :submit, value: 'Create and Import', class: 'btn btn-primary' %>
|
15
|
+
|
|
16
|
+
<%= form.button :submit, value: 'Create', class: 'btn btn-primary' %>
|
17
|
+
|
|
18
|
+
<% cancel_path = form.object.persisted? ? importer_path(form.object) : importers_path %>
|
19
|
+
<%= link_to t('.cancel'), cancel_path, class: 'btn btn-default ' %>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
<% end %>
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
</div>
|
@@ -0,0 +1,175 @@
|
|
1
|
+
<div class="col-xs-12 main-header">
|
2
|
+
<h1><span class="fa fa-cloud-upload" aria-hidden="true"></span> Importer: <%= @importer.name %></h1>
|
3
|
+
<% if @importer.parser_klass == 'Bulkrax::CsvParser' && @work_entries.map { |e| e.status == 'failed' }.any? %>
|
4
|
+
<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' %>
|
7
|
+
</div>
|
8
|
+
<% end %>
|
9
|
+
</div>
|
10
|
+
<div class="panel panel-default bulkrax-align-text">
|
11
|
+
<div class="panel-body">
|
12
|
+
<p class="bulkrax-p-align">
|
13
|
+
<strong>Name:</strong>
|
14
|
+
<%= @importer.name %>
|
15
|
+
</p>
|
16
|
+
<p class="bulkrax-p-align">
|
17
|
+
<strong>Admin set:</strong>
|
18
|
+
<%= @importer.admin_set_id %>
|
19
|
+
</p>
|
20
|
+
<p class="bulkrax-p-align">
|
21
|
+
<strong>User:</strong>
|
22
|
+
<%= @importer.user %>
|
23
|
+
</p>
|
24
|
+
<p class="bulkrax-p-align">
|
25
|
+
<strong>Frequency:</strong>
|
26
|
+
<%= @importer.frequency %>
|
27
|
+
</p>
|
28
|
+
<p class="bulkrax-p-align">
|
29
|
+
<strong>Parser klass:</strong>
|
30
|
+
<%= @importer.parser_klass %>
|
31
|
+
</p>
|
32
|
+
<p class="bulkrax-p-align">
|
33
|
+
<strong>Limit:</strong>
|
34
|
+
<%= @importer.limit %>
|
35
|
+
</p>
|
36
|
+
|
37
|
+
<%= render partial: 'bulkrax/shared/bulkrax_errors', locals: {item: @importer} %>
|
38
|
+
|
39
|
+
<div class="accordion-container">
|
40
|
+
<div class="accordion-heading" role="tab" id="parser-fields-heading">
|
41
|
+
<a class="accordion-title" role="button" data-toggle="collapse" data-target="#parser-fields-importer-show" aria-expanded="true" aria-controls="parser-fields-importer-show">
|
42
|
+
Parser fields:
|
43
|
+
</a>
|
44
|
+
<a role="button" data-toggle="collapse" data-target="#parser-fields-importer-show" aria-expanded="true" aria-controls="parser-fields-importer-show">
|
45
|
+
<div class="accordion-icon glyphicon glyphicon-remove-circle" aria-hidden="true"></div>
|
46
|
+
</a>
|
47
|
+
</div>
|
48
|
+
<div id="parser-fields-importer-show" class="accordion-collapse collapse" role="tabpanel" aria-labelledby="parser-fields-heading">
|
49
|
+
<div class="accordion-body">
|
50
|
+
<% @importer.parser_fields.each do |key,value| %>
|
51
|
+
<strong><%= key %>:</strong> <%= value %> <br />
|
52
|
+
<% end %>
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
</div>
|
56
|
+
|
57
|
+
<%= render partial: 'bulkrax/shared/bulkrax_field_mapping', locals: {item: @importer} %>
|
58
|
+
|
59
|
+
<p class="bulkrax-p-align">
|
60
|
+
<strong>Total Works:</strong>
|
61
|
+
<%= @importer.importer_runs.last&.total_work_entries %>
|
62
|
+
</p>
|
63
|
+
|
64
|
+
<p class="bulkrax-p-align">
|
65
|
+
<strong>Total Collections:</strong>
|
66
|
+
<%= @importer.importer_runs.last&.total_collection_entries %>
|
67
|
+
</p>
|
68
|
+
|
69
|
+
<div class="bulkrax-nav-tab-bottom-margin">
|
70
|
+
<!-- Nav tabs -->
|
71
|
+
<ul class="bulkrax-nav-tab-top-margin tab-nav nav nav-tabs" role="tablist">
|
72
|
+
<li role="presentation" class='active'><a href="#work-entries" aria-controls="work-entries" role="tab" data-toggle="tab">Work Entries</a></li>
|
73
|
+
<li role="presentation"><a href="#collection-entries" aria-controls="collection-entries" role="tab" data-toggle="tab">Collection Entries</a></li>
|
74
|
+
</ul>
|
75
|
+
<!-- Tab panes -->
|
76
|
+
<div class="tab-content outline">
|
77
|
+
<div role="tabpanel" class="tab-pane active bulkrax-nav-tab-table-left-align" id="work-entries">
|
78
|
+
<table class='table table-striped'>
|
79
|
+
<thead>
|
80
|
+
<tr>
|
81
|
+
<th>Identifier</th>
|
82
|
+
<th>Collection</th>
|
83
|
+
<th>Entry ID</th>
|
84
|
+
<th>Status</th>
|
85
|
+
<th>Errors</th>
|
86
|
+
<th>Status Set At</th>
|
87
|
+
<th>Actions</th>
|
88
|
+
</tr>
|
89
|
+
</thead>
|
90
|
+
<tbody>
|
91
|
+
<% @work_entries.each do |e| %>
|
92
|
+
<tr>
|
93
|
+
<td><%= link_to e.identifier, bulkrax.importer_entry_path(@importer.id, e.id) %></td>
|
94
|
+
<% if e.parsed_metadata.present? && e.parsed_metadata.dig("collections").present? %>
|
95
|
+
<td><%= e.parsed_metadata.dig("collections").map {|c| c['id'] }.join('; ') %></td>
|
96
|
+
<% elsif e.raw_metadata.present? %>
|
97
|
+
<td><%= Array.wrap(e.raw_metadata.dig("collection")).join(';') %></td>
|
98
|
+
<% else %>
|
99
|
+
<td></td>
|
100
|
+
<% end %>
|
101
|
+
<td><%= e.id %></td>
|
102
|
+
<% if e.status == "Complete" %>
|
103
|
+
<td><span class="glyphicon glyphicon-ok" style="color: green;"></span> <%= e.status %></td>
|
104
|
+
<% else %>
|
105
|
+
<td><span class="glyphicon glyphicon-remove" style="color: red;"></span> <%= e.status %></td>
|
106
|
+
<% end %>
|
107
|
+
<% if e.last_error.present? %>
|
108
|
+
<td><%= link_to e.last_error.dig("error_class"), bulkrax.importer_entry_path(@importer.id, e.id) %></td>
|
109
|
+
<% else %>
|
110
|
+
<td></td>
|
111
|
+
<% end %>
|
112
|
+
<td><%= e.status_at %></td>
|
113
|
+
<td><%= link_to raw('<span class="glyphicon glyphicon-info-sign"></span>'), bulkrax.importer_entry_path(@importer.id, e.id) %></td>
|
114
|
+
</tr>
|
115
|
+
<% end %>
|
116
|
+
</tbody>
|
117
|
+
</table>
|
118
|
+
<%= page_entries_info(@work_entries) %><br />
|
119
|
+
<%= paginate(@work_entries, theme: 'blacklight', param_name: :work_entries_page, params: { anchor: 'work-entries'}) %>
|
120
|
+
</div>
|
121
|
+
<div role="tabpanel" class="tab-pane bulkrax-nav-tab-table-left-align" id="collection-entries">
|
122
|
+
<table class='table table-striped'>
|
123
|
+
<thead>
|
124
|
+
<tr>
|
125
|
+
<th>Identifier</th>
|
126
|
+
<th>Entry ID</th>
|
127
|
+
<th>Status</th>
|
128
|
+
<th>Errors</th>
|
129
|
+
<th>Status Set At</th>
|
130
|
+
<th>Actions</th>
|
131
|
+
</tr>
|
132
|
+
</thead>
|
133
|
+
<tbody>
|
134
|
+
<% @collection_entries.each do |e| %>
|
135
|
+
<tr>
|
136
|
+
<td><%= link_to e.identifier, bulkrax.importer_entry_path(@importer.id, e.id) %></td>
|
137
|
+
<td><%= e.id %></td>
|
138
|
+
<% if e.status == "Complete" %>
|
139
|
+
<td><span class="glyphicon glyphicon-ok" style="color: green;"></span> <%= e.status %></td>
|
140
|
+
<% else %>
|
141
|
+
<td><span class="glyphicon glyphicon-remove" style="color: red;"></span> <%= e.status %></td>
|
142
|
+
<% end %>
|
143
|
+
<% if e.last_error.present? %>
|
144
|
+
<td><%= link_to e.last_error.dig("error_class"), bulkrax.importer_entry_path(@importer.id, e.id) %></td>
|
145
|
+
<% else %>
|
146
|
+
<td></td>
|
147
|
+
<% end %>
|
148
|
+
<td><%= e.status_at %></td>
|
149
|
+
<td><%= link_to raw('<span class="glyphicon glyphicon-info-sign"></span>'), bulkrax.importer_entry_path(@importer.id, e.id) %></td>
|
150
|
+
</tr>
|
151
|
+
<% end %>
|
152
|
+
</tbody>
|
153
|
+
</table>
|
154
|
+
<%= page_entries_info(@collection_entries) %><br />
|
155
|
+
<%= paginate(@collection_entries, theme: 'blacklight', param_name: :collections_entries_page, params: {anchor: 'collection-entries'}) %>
|
156
|
+
</div>
|
157
|
+
</div>
|
158
|
+
</div>
|
159
|
+
|
160
|
+
<p class="bulkrax-p-align">
|
161
|
+
<%= link_to 'Edit', edit_importer_path(@importer) %>
|
162
|
+
|
|
163
|
+
<%= link_to 'Back', importers_path %><br /><br />
|
164
|
+
</p>
|
165
|
+
|
166
|
+
<% if @importer.validate_only == true %>
|
167
|
+
<div class='pull-left'>
|
168
|
+
<%= button_to 'Continue', importer_continue_path(@importer), method: :put, class: 'btn btn-primary' %>
|
169
|
+
</div>
|
170
|
+
<div class='pull-right'>
|
171
|
+
<%= button_to 'Discard', @importer, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-primary' %>
|
172
|
+
</div>
|
173
|
+
<% end %>
|
174
|
+
</div>
|
175
|
+
</div>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<div class='col-xs-12 main-header'>
|
2
|
+
<h1><span class='fa fa-cloud-upload' aria-hidden='true'></span> Upload Corrected Entries: <%= @importer.name %></h1>
|
3
|
+
</div>
|
4
|
+
|
5
|
+
<div class='panel panel-default'>
|
6
|
+
<div class='panel-body'>
|
7
|
+
<p>
|
8
|
+
Upload <b>only</b> the corrected entries for the <b><%= @importer.name %></b> importer. To export failed entries for correction,
|
9
|
+
<%= link_to importer_export_errors_path(@importer.id) do %>
|
10
|
+
click here <span class='glyphicon glyphicon-download-alt'></span>
|
11
|
+
<% end %>
|
12
|
+
</p>
|
13
|
+
<p>Only CSV files are allowed.</p>
|
14
|
+
|
15
|
+
<%= simple_form_for @importer, url: importer_upload_corrected_entries_file_path, method: :post, html: { multipart: true } do |f| %>
|
16
|
+
<%= f.fields_for :parser_fields do |fi| %>
|
17
|
+
<div class='parser_fields'>
|
18
|
+
<div class='fileupload-buttonbar hide-required-tag'>
|
19
|
+
<%= fi.input 'file',
|
20
|
+
as: :file,
|
21
|
+
label: "<span class='glyphicon glyphicon-plus'></span><span> Add file...</span>".html_safe,
|
22
|
+
label_html: {
|
23
|
+
class: 'btn btn-success'
|
24
|
+
},
|
25
|
+
input_html: {
|
26
|
+
style: 'display:none;',
|
27
|
+
accept: 'text/csv'
|
28
|
+
} %>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<% end %>
|
32
|
+
<div class='pull-right'>
|
33
|
+
<%= f.button :submit, 'Import Corrected Works', class: 'btn btn-primary' %>
|
34
|
+
</div>
|
35
|
+
<% end %>
|
36
|
+
</div>
|
37
|
+
</div>
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<% if item.failed? %>
|
2
|
+
<div class="accordion-container">
|
3
|
+
<div class="accordion-heading" role="tab" id="error-trace-heading">
|
4
|
+
<a class="accordion-title" role="button" data-toggle="collapse" data-target="#error-trace-show" aria-expanded="true" aria-controls="error-trace-show">
|
5
|
+
Errors:
|
6
|
+
</a>
|
7
|
+
<a role="button" data-toggle="collapse" data-target="#error-trace-show" aria-expanded="true" aria-controls="error-trace-show">
|
8
|
+
<div class="accordion-icon glyphicon glyphicon-remove-circle" aria-hidden="true"></div>
|
9
|
+
</a>
|
10
|
+
</div>
|
11
|
+
<div id="error-trace-show" class="accordion-collapse collapse" role="tabpanel" aria-labelledby="error-trace-show">
|
12
|
+
<div class="accordion-body">
|
13
|
+
<div class="bulkrax-nav-tab-bottom-margin">
|
14
|
+
<!-- Toggle buttons -->
|
15
|
+
<div class="btn-group pull-right" role="group" aria-label="...">
|
16
|
+
<button type="button" class="btn btn-default active"><a href="#bulkrax-full-toggle-1" aria-controls="bulkrax-full-toggle-1" role="tab" data-toggle="tab">Full</a></button>
|
17
|
+
<button type="button" class="btn btn-default"><a href="#bulkrax-raw-toggle-1" aria-controls="bulkrax-raw-toggle-1" role="tab" data-toggle="tab">Raw</a></button>
|
18
|
+
</div>
|
19
|
+
<!-- Tab panes -->
|
20
|
+
<div class="tab-content">
|
21
|
+
<div role="tabpanel" class="tab-pane active" id="bulkrax-full-toggle-1">
|
22
|
+
<strong>Errored at:</strong> <%= item.status_at %><br /><br />
|
23
|
+
<strong>Error:</strong> <%= item.current_status.error_class %> - <%= item.current_status.error_message %><br /><br />
|
24
|
+
<strong>Error Trace:</strong><br/><br />
|
25
|
+
<% item.current_status.error_backtrace.each do |v| %>
|
26
|
+
<%= coderay(v, { wrap: :page, css: :class, tab_width: 200, break_lines: true }) %>
|
27
|
+
<br>
|
28
|
+
<% end %>
|
29
|
+
</div>
|
30
|
+
<div role="tabpanel" class="tab-pane" id="bulkrax-raw-toggle-1">
|
31
|
+
<strong>Errored at:</strong> <%= item.status_at %><br /><br />
|
32
|
+
<strong>Error:</strong> <%= item.current_status.error_class %> - <%= item.current_status.error_message %><br /><br />
|
33
|
+
<strong>Error Trace:</strong><br/><br />
|
34
|
+
<% item.current_status.error_backtrace.each do |v| %>
|
35
|
+
<%= coderay(v, { css: :class, tab_width: 0, break_lines: false }) %>
|
36
|
+
<br>
|
37
|
+
<% end %>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
<% elsif item.succeeded? %>
|
45
|
+
<p class='bulkrax-p-align'>
|
46
|
+
<strong>Succeeded At:</strong> <%= item.status_at %>
|
47
|
+
</p>
|
48
|
+
<% else %>
|
49
|
+
<p class='bulkrax-p-align'>
|
50
|
+
<strong>Succeeded At:</strong> Item has not yet been <%= @importer.present? ? 'imported' : 'exported' %> successfully
|
51
|
+
</p>
|
52
|
+
<% end %>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<% if item.field_mapping.present? %>
|
2
|
+
<div class="accordion-container">
|
3
|
+
<div class="accordion-heading" role="tab" id="field-mapping-show-heading">
|
4
|
+
<a class="accordion-title" role="button" data-toggle="collapse" data-target="#field-mapping-show" aria-expanded="true" aria-controls="field-mapping-show">
|
5
|
+
<strong>Field mapping:</strong>
|
6
|
+
</a>
|
7
|
+
<a role="button" data-toggle="collapse" data-target="#field-mapping-show" aria-expanded="true" aria-controls="field-mapping-show">
|
8
|
+
<div class="accordion-icon glyphicon glyphicon-remove-circle" aria-hidden="true"></div>
|
9
|
+
</a>
|
10
|
+
</div>
|
11
|
+
<div id="field-mapping-show" class="accordion-collapse collapse" role="tabpanel" aria-labelledby="field-mapping-show">
|
12
|
+
<div class="accordion-body">
|
13
|
+
<div class="bulkrax-nav-tab-bottom-margin">
|
14
|
+
<!-- Toggle buttons -->
|
15
|
+
<div class="btn-group pull-right" role="group" aria-label="...">
|
16
|
+
<button type="button" class="btn btn-default"><a href="#bulkrax-full-toggle-2" aria-controls="bulkrax-full-toggle-2" role="tab" data-toggle="tab">Full</a></button>
|
17
|
+
<button type="button" class="btn btn-default"><a href="#bulkrax-raw-toggle-2" aria-controls="bulkrax-raw-toggle-2" role="tab" data-toggle="tab">Raw</a></button>
|
18
|
+
</div>
|
19
|
+
<!-- Tab panes -->
|
20
|
+
<div class="tab-content">
|
21
|
+
<div id='bulkrax-full-toggle-2' role="tabpanel" class="tab-pane active bulkrax-clear-toggles">
|
22
|
+
<% item.field_mapping.each do |k, v| %>
|
23
|
+
<strong><%= k %>:</strong>
|
24
|
+
<%= coderay(v, { wrap: :page, css: :class, tab_width: 200, break_lines: true }) %>
|
25
|
+
<br>
|
26
|
+
<% end %>
|
27
|
+
</div>
|
28
|
+
<div id="bulkrax-raw-toggle-2" role="tabpanel" class="tab-pane">
|
29
|
+
<% item.field_mapping.each do |k, v| %>
|
30
|
+
<%= coderay(v, { css: :class, tab_width: 0, break_lines: false }) %>
|
31
|
+
<br>
|
32
|
+
<% end %>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
<% end %>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<%= menu.nav_link(bulkrax.importers_path) do %>
|
2
|
+
<span class="fa fa-cloud-upload" aria-hidden="true"></span> <span class="sidebar-action-text"><%= t('bulkrax.admin.sidebar.importers') %></span>
|
3
|
+
<% end %>
|
4
|
+
<%= menu.nav_link(bulkrax.exporters_path) do %>
|
5
|
+
<span class="fa fa-cloud-download" aria-hidden="true"></span> <span class="sidebar-action-text"><%= t('bulkrax.admin.sidebar.exporters') %></span>
|
6
|
+
<% end %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<li class="h5"><%= t('hyrax.admin.sidebar.repository_objects') %></li>
|
2
|
+
|
3
|
+
<%= menu.nav_link(hyrax.my_collections_path,
|
4
|
+
also_active_for: hyrax.dashboard_collections_path) do %>
|
5
|
+
<span class="fa fa-folder-open" aria-hidden="true"></span> <span class="sidebar-action-text"><%= t('hyrax.admin.sidebar.collections') %></span>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
<%= menu.nav_link(hyrax.my_works_path,
|
9
|
+
also_active_for: hyrax.dashboard_works_path) do %>
|
10
|
+
<span class="fa fa-file" aria-hidden="true"></span> <span class="sidebar-action-text"><%= t('hyrax.admin.sidebar.works') %></span>
|
11
|
+
<% end %>
|
12
|
+
|
13
|
+
<%= menu.nav_link(bulkrax.importers_path) do %>
|
14
|
+
<span class="fa fa-cloud-upload" aria-hidden="true"></span> <span class="sidebar-action-text"><%= t('bulkrax.admin.sidebar.importers') %></span>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<%= menu.nav_link(bulkrax.exporters_path) do %>
|
18
|
+
<span class="fa fa-cloud-download" aria-hidden="true"></span> <span class="sidebar-action-text"><%= t('bulkrax.admin.sidebar.exporters') %></span>
|
19
|
+
<% end %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Bulkrax</title>
|
5
|
+
<%= stylesheet_link_tag "bulkrax/application", media: "all" %>
|
6
|
+
<%= javascript_include_tag "bulkrax/application" %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
en:
|
2
|
+
bulkrax:
|
3
|
+
admin:
|
4
|
+
sidebar:
|
5
|
+
exporters: Exporters
|
6
|
+
importers: Importers
|
7
|
+
exporter:
|
8
|
+
labels:
|
9
|
+
collection: Collection
|
10
|
+
export_format: Export Format
|
11
|
+
export_from: Export From
|
12
|
+
export_source: Export Source
|
13
|
+
export_type: Type of Export
|
14
|
+
field_mapping: Field Mapping
|
15
|
+
filter_by_date: Filter By Date
|
16
|
+
finish_date: End Date
|
17
|
+
full: Metadata and Files
|
18
|
+
importer: Importer
|
19
|
+
limit: Limit
|
20
|
+
metadata: Metadata Only
|
21
|
+
name: Name
|
22
|
+
parser_fields: Parser Fields
|
23
|
+
parser_klass: Parser
|
24
|
+
start_date: Start Date
|
25
|
+
status: Status
|
26
|
+
total_work_entries: Total Works
|
27
|
+
user: User
|
28
|
+
worktype: Work Type
|
29
|
+
workflow_status:
|
30
|
+
approved: "Approved"
|
31
|
+
deleted: "Deleted"
|
32
|
+
in_process: "In Process"
|
33
|
+
broken_url: "Broken Url"
|
34
|
+
ingested: "Ingested"
|
35
|
+
unapproved: "Unapproved"
|
36
|
+
needs_repair: "Needs Repair"
|
data/config/routes.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Bulkrax::Engine.routes.draw do
|
4
|
+
resources :exporters do
|
5
|
+
get :download
|
6
|
+
resources :entries, only: %i[show]
|
7
|
+
end
|
8
|
+
resources :importers do
|
9
|
+
put :continue
|
10
|
+
get :export_errors
|
11
|
+
collection do
|
12
|
+
post :external_sets
|
13
|
+
end
|
14
|
+
resources :entries, only: %i[show]
|
15
|
+
get :upload_corrected_entries
|
16
|
+
post :upload_corrected_entries_file
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class CreateBulkraxImporters < ActiveRecord::Migration[5.1]
|
2
|
+
def change
|
3
|
+
unless table_exists?(:bulkrax_importers)
|
4
|
+
create_table :bulkrax_importers do |t|
|
5
|
+
t.string :name
|
6
|
+
t.string :admin_set_id
|
7
|
+
t.references :user, foreign_key: false
|
8
|
+
t.string :frequency
|
9
|
+
t.string :parser_klass
|
10
|
+
t.integer :limit
|
11
|
+
t.text :parser_fields
|
12
|
+
t.text :field_mapping
|
13
|
+
|
14
|
+
t.timestamps
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|