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.
Files changed (133) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +205 -0
  3. data/README.md +202 -0
  4. data/Rakefile +42 -0
  5. data/app/assets/config/bulkrax_manifest.js +2 -0
  6. data/app/assets/javascripts/bulkrax/application.js +14 -0
  7. data/app/assets/javascripts/bulkrax/bulkrax.js +11 -0
  8. data/app/assets/javascripts/bulkrax/entries.js +15 -0
  9. data/app/assets/javascripts/bulkrax/exporters.js +60 -0
  10. data/app/assets/javascripts/bulkrax/importers.js.erb +166 -0
  11. data/app/assets/stylesheets/bulkrax/accordion.scss +40 -0
  12. data/app/assets/stylesheets/bulkrax/application.css +15 -0
  13. data/app/assets/stylesheets/bulkrax/coderay.scss +264 -0
  14. data/app/assets/stylesheets/bulkrax/import_export.scss +37 -0
  15. data/app/controllers/bulkrax/application_controller.rb +8 -0
  16. data/app/controllers/bulkrax/entries_controller.rb +44 -0
  17. data/app/controllers/bulkrax/exporters_controller.rb +125 -0
  18. data/app/controllers/bulkrax/importers_controller.rb +315 -0
  19. data/app/controllers/concerns/bulkrax/api.rb +29 -0
  20. data/app/factories/bulkrax/object_factory.rb +230 -0
  21. data/app/helpers/bulkrax/application_helper.rb +15 -0
  22. data/app/helpers/bulkrax/exporters_helper.rb +6 -0
  23. data/app/helpers/bulkrax/importers_helper.rb +13 -0
  24. data/app/helpers/bulkrax/validation_helper.rb +153 -0
  25. data/app/jobs/bulkrax/application_job.rb +6 -0
  26. data/app/jobs/bulkrax/child_relationships_job.rb +128 -0
  27. data/app/jobs/bulkrax/delete_work_job.rb +16 -0
  28. data/app/jobs/bulkrax/download_cloud_file_job.rb +18 -0
  29. data/app/jobs/bulkrax/export_work_job.rb +37 -0
  30. data/app/jobs/bulkrax/exporter_job.rb +14 -0
  31. data/app/jobs/bulkrax/import_work_collection_job.rb +41 -0
  32. data/app/jobs/bulkrax/import_work_job.rb +32 -0
  33. data/app/jobs/bulkrax/importer_job.rb +26 -0
  34. data/app/mailers/bulkrax/application_mailer.rb +8 -0
  35. data/app/matchers/bulkrax/application_matcher.rb +113 -0
  36. data/app/matchers/bulkrax/bagit_matcher.rb +6 -0
  37. data/app/matchers/bulkrax/csv_matcher.rb +6 -0
  38. data/app/matchers/bulkrax/oai_matcher.rb +6 -0
  39. data/app/models/bulkrax/application_record.rb +7 -0
  40. data/app/models/bulkrax/csv_collection_entry.rb +19 -0
  41. data/app/models/bulkrax/csv_entry.rb +163 -0
  42. data/app/models/bulkrax/entry.rb +104 -0
  43. data/app/models/bulkrax/exporter.rb +122 -0
  44. data/app/models/bulkrax/exporter_run.rb +7 -0
  45. data/app/models/bulkrax/import_failed.rb +13 -0
  46. data/app/models/bulkrax/importer.rb +155 -0
  47. data/app/models/bulkrax/importer_run.rb +8 -0
  48. data/app/models/bulkrax/oai_dc_entry.rb +6 -0
  49. data/app/models/bulkrax/oai_entry.rb +74 -0
  50. data/app/models/bulkrax/oai_qualified_dc_entry.rb +6 -0
  51. data/app/models/bulkrax/oai_set_entry.rb +19 -0
  52. data/app/models/bulkrax/rdf_collection_entry.rb +19 -0
  53. data/app/models/bulkrax/rdf_entry.rb +90 -0
  54. data/app/models/bulkrax/status.rb +25 -0
  55. data/app/models/bulkrax/xml_entry.rb +73 -0
  56. data/app/models/concerns/bulkrax/download_behavior.rb +61 -0
  57. data/app/models/concerns/bulkrax/errored_entries.rb +45 -0
  58. data/app/models/concerns/bulkrax/export_behavior.rb +58 -0
  59. data/app/models/concerns/bulkrax/file_factory.rb +140 -0
  60. data/app/models/concerns/bulkrax/has_local_processing.rb +7 -0
  61. data/app/models/concerns/bulkrax/has_matchers.rb +155 -0
  62. data/app/models/concerns/bulkrax/import_behavior.rb +90 -0
  63. data/app/models/concerns/bulkrax/importer_exporter_behavior.rb +34 -0
  64. data/app/models/concerns/bulkrax/status_info.rb +56 -0
  65. data/app/parsers/bulkrax/application_parser.rb +299 -0
  66. data/app/parsers/bulkrax/bagit_parser.rb +157 -0
  67. data/app/parsers/bulkrax/csv_parser.rb +266 -0
  68. data/app/parsers/bulkrax/oai_dc_parser.rb +130 -0
  69. data/app/parsers/bulkrax/oai_qualified_dc_parser.rb +9 -0
  70. data/app/parsers/bulkrax/xml_parser.rb +103 -0
  71. data/app/views/bulkrax/entries/_parsed_metadata.html.erb +19 -0
  72. data/app/views/bulkrax/entries/_raw_metadata.html.erb +19 -0
  73. data/app/views/bulkrax/entries/show.html.erb +63 -0
  74. data/app/views/bulkrax/exporters/_form.html.erb +120 -0
  75. data/app/views/bulkrax/exporters/edit.html.erb +23 -0
  76. data/app/views/bulkrax/exporters/index.html.erb +67 -0
  77. data/app/views/bulkrax/exporters/new.html.erb +23 -0
  78. data/app/views/bulkrax/exporters/show.html.erb +124 -0
  79. data/app/views/bulkrax/importers/_bagit_fields.html.erb +54 -0
  80. data/app/views/bulkrax/importers/_browse_everything.html.erb +12 -0
  81. data/app/views/bulkrax/importers/_csv_fields.html.erb +39 -0
  82. data/app/views/bulkrax/importers/_edit_form_buttons.html.erb +16 -0
  83. data/app/views/bulkrax/importers/_form.html.erb +35 -0
  84. data/app/views/bulkrax/importers/_oai_fields.html.erb +42 -0
  85. data/app/views/bulkrax/importers/_xml_fields.html.erb +60 -0
  86. data/app/views/bulkrax/importers/edit.html.erb +20 -0
  87. data/app/views/bulkrax/importers/index.html.erb +77 -0
  88. data/app/views/bulkrax/importers/new.html.erb +25 -0
  89. data/app/views/bulkrax/importers/show.html.erb +175 -0
  90. data/app/views/bulkrax/importers/upload_corrected_entries.html.erb +37 -0
  91. data/app/views/bulkrax/shared/_bulkrax_errors.html.erb +52 -0
  92. data/app/views/bulkrax/shared/_bulkrax_field_mapping.html.erb +39 -0
  93. data/app/views/hyrax/dashboard/sidebar/_bulkrax_sidebar_additions.html.erb +6 -0
  94. data/app/views/hyrax/dashboard/sidebar/_repository_content.html.erb +19 -0
  95. data/app/views/layouts/bulkrax/application.html.erb +14 -0
  96. data/config/locales/bulkrax.en.yml +36 -0
  97. data/config/routes.rb +18 -0
  98. data/db/migrate/20181011230201_create_bulkrax_importers.rb +18 -0
  99. data/db/migrate/20181011230228_create_bulkrax_importer_runs.rb +16 -0
  100. data/db/migrate/20190325183136_create_bulkrax_entries.rb +16 -0
  101. data/db/migrate/20190601221109_add_status_to_entry.rb +9 -0
  102. data/db/migrate/20190715161939_add_collections_to_importer_runs.rb +6 -0
  103. data/db/migrate/20190715162044_change_collection_ids_on_entries.rb +5 -0
  104. data/db/migrate/20190729124607_create_bulkrax_exporters.rb +19 -0
  105. data/db/migrate/20190729134158_create_bulkrax_exporter_runs.rb +14 -0
  106. data/db/migrate/20190731114016_change_importer_and_exporter_to_polymorphic.rb +12 -0
  107. data/db/migrate/20191203225129_add_total_collection_records_to_importer_runs.rb +5 -0
  108. data/db/migrate/20191204191623_add_children_to_importer_runs.rb +6 -0
  109. data/db/migrate/20191204223857_change_total_records_to_total_work_entries.rb +6 -0
  110. data/db/migrate/20191212155530_change_entry_last_error.rb +19 -0
  111. data/db/migrate/20200108194557_add_validate_only_to_bulkrax_importers.rb +5 -0
  112. data/db/migrate/20200301232856_add_status_to_importers.rb +9 -0
  113. data/db/migrate/20200312190638_remove_foreign_key_from_bulkrax_entries.rb +5 -0
  114. data/db/migrate/20200326235838_add_status_to_exporters.rb +7 -0
  115. data/db/migrate/20200601204556_add_invalid_record_to_importer_run.rb +5 -0
  116. data/db/migrate/20200818055819_create_bulkrax_statuses.rb +18 -0
  117. data/db/migrate/20200819054016_move_to_statuses.rb +30 -0
  118. data/db/migrate/20201106014204_add_date_filter_and_status_to_bulkrax_exporters.rb +7 -0
  119. data/db/migrate/20201117220007_add_workflow_status_to_bulkrax_exporter.rb +5 -0
  120. data/db/migrate/20210806044408_remove_unused_last_error.rb +7 -0
  121. data/db/migrate/20210806065737_increase_text_sizes.rb +12 -0
  122. data/lib/bulkrax.rb +161 -0
  123. data/lib/bulkrax/engine.rb +37 -0
  124. data/lib/bulkrax/version.rb +5 -0
  125. data/lib/generators/bulkrax/install_generator.rb +80 -0
  126. data/lib/generators/bulkrax/templates/README +3 -0
  127. data/lib/generators/bulkrax/templates/app/assets/images/bulkrax/removed.png +0 -0
  128. data/lib/generators/bulkrax/templates/app/models/concerns/bulkrax/has_local_processing.rb +8 -0
  129. data/lib/generators/bulkrax/templates/bin/importer +140 -0
  130. data/lib/generators/bulkrax/templates/config/bulkrax_api.yml +84 -0
  131. data/lib/generators/bulkrax/templates/config/initializers/bulkrax.rb +72 -0
  132. data/lib/tasks/bulkrax_tasks.rake +6 -0
  133. 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