bulkrax 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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