From 3ae6402798c866c879ef57e1c4126b3165ba2bdb Mon Sep 17 00:00:00 2001 From: Rob Kaufman Date: Fri, 19 Jan 2024 10:21:00 -0800 Subject: [PATCH] Retry and delete take 2 (#894) * working single item retry, delete and retry, and just delete * remove all entries and works and then rebuild them * call the cops --- app/assets/javascripts/bulkrax/bulkrax.js | 11 ++++++ app/controllers/bulkrax/entries_controller.rb | 39 +++++++++++++++++-- .../bulkrax/exporters_controller.rb | 2 - .../bulkrax/importers_controller.rb | 11 ++++-- app/helpers/bulkrax/application_helper.rb | 10 +++-- app/models/bulkrax/importer.rb | 20 +++++++--- app/views/bulkrax/exporters/show.html.erb | 7 ++-- .../importers/_edit_form_buttons.html.erb | 9 ++++- .../importers/_edit_item_buttons.html.erb | 18 +++++++++ app/views/bulkrax/importers/show.html.erb | 8 ++-- ...ies_tab.html.erb => _entries_tab.html.erb} | 17 +++++--- .../shared/_file_set_entries_tab.html.erb | 39 ------------------- .../bulkrax/shared/_work_entries_tab.html.erb | 39 ------------------- config/routes.rb | 4 +- .../app/helpers/application_helper.rb | 2 + 15 files changed, 126 insertions(+), 110 deletions(-) create mode 100644 app/views/bulkrax/importers/_edit_item_buttons.html.erb rename app/views/bulkrax/shared/{_collection_entries_tab.html.erb => _entries_tab.html.erb} (59%) delete mode 100644 app/views/bulkrax/shared/_file_set_entries_tab.html.erb delete mode 100644 app/views/bulkrax/shared/_work_entries_tab.html.erb diff --git a/app/assets/javascripts/bulkrax/bulkrax.js b/app/assets/javascripts/bulkrax/bulkrax.js index c918def53..006ce8205 100644 --- a/app/assets/javascripts/bulkrax/bulkrax.js +++ b/app/assets/javascripts/bulkrax/bulkrax.js @@ -8,4 +8,15 @@ $(document).on('turbolinks:load ready', function() { $('button#fm_toggle').click(function() { $('#field_mapping').toggle(); }); + $('#bulkraxItemModal').on('show.bs.modal', function (event) { + var button = $(event.relatedTarget) // Button that triggered the modal + var recipient = button.data('entry-id') // Extract info from data-* attributes + // If necessary, you could initiate an AJAX request here (and then do the updating in a callback). + // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead. + var modal = $(this) + modal.find('a').each(function() { + this.href = this.href.replace(/\d+\?/, recipient + '?') + }) + return true + }) }); diff --git a/app/controllers/bulkrax/entries_controller.rb b/app/controllers/bulkrax/entries_controller.rb index 57c0fd6a3..4328ed0bf 100644 --- a/app/controllers/bulkrax/entries_controller.rb +++ b/app/controllers/bulkrax/entries_controller.rb @@ -1,8 +1,5 @@ # frozen_string_literal: true -require_dependency "bulkrax/application_controller" -require_dependency "oai" - module Bulkrax class EntriesController < ApplicationController include Hyrax::ThemedLayoutController if defined?(::Hyrax) @@ -18,6 +15,42 @@ def show end end + def update + @entry = Entry.find(params[:id]) + @entry.factory&.find&.destroy if params[:destroy_first] + @entry.build + @entry.save + item = @entry.importerexporter + entry_path = item.class.to_s.include?('Importer') ? bulkrax.importer_entry_path(item.id, @entry.id) : bulkrax.exporter_entry_path(item.id, @entry.id) + + redirect_back fallback_location: entry_path, notice: "Entry update ran, new status is #{@entry.status}" + end + + def destroy + @entry = Entry.find(params[:id]) + @status = "" + begin + work = @entry.factory&.find + if work.present? + work.destroy + @entry.destroy + @status = "Entry and work deleted" + else + @entry.destroy + @status = "Entry deleted" + end + rescue StandardError => e + @status = "Error: #{e.message}" + end + + item = @entry.importerexporter + entry_path = item.class.to_s.include?('Importer') ? bulkrax.importer_entry_path(item.id, @entry.id) : bulkrax.exporter_entry_path(item.id, @entry.id) + + redirect_back fallback_location: entry_path, notice: @status + end + + protected + # GET /importers/1/entries/1 def show_importer @importer = Importer.find(params[:importer_id]) diff --git a/app/controllers/bulkrax/exporters_controller.rb b/app/controllers/bulkrax/exporters_controller.rb index 22efe039a..02ab2b95f 100644 --- a/app/controllers/bulkrax/exporters_controller.rb +++ b/app/controllers/bulkrax/exporters_controller.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require_dependency "bulkrax/application_controller" - module Bulkrax class ExportersController < ApplicationController include Hyrax::ThemedLayoutController if defined?(::Hyrax) diff --git a/app/controllers/bulkrax/importers_controller.rb b/app/controllers/bulkrax/importers_controller.rb index c44fa60de..8248975cd 100644 --- a/app/controllers/bulkrax/importers_controller.rb +++ b/app/controllers/bulkrax/importers_controller.rb @@ -1,11 +1,8 @@ # frozen_string_literal: true -require_dependency 'bulkrax/application_controller' -require_dependency 'oai' - module Bulkrax # rubocop:disable Metrics/ClassLength - class ImportersController < ApplicationController + class ImportersController < ::Bulkrax::ApplicationController include Hyrax::ThemedLayoutController if defined?(::Hyrax) include Bulkrax::DownloadBehavior include Bulkrax::API @@ -310,10 +307,16 @@ def update_harvest end def set_files_parser_fields + @importer.parser_fields['update_files'] = + @importer.parser_fields['replace_files'] = + @importer.parser_fields['remove_and_rerun'] = + @importer.parser_fields['metadata_only'] = false if params[:commit] == 'Update Metadata and Files' @importer.parser_fields['update_files'] = true elsif params[:commit] == ('Update and Replace Files' || 'Update and Re-Harvest All Items') @importer.parser_fields['replace_files'] = true + elsif params[:commit] == 'Remove and Rerun' + @importer.parser_fields['remove_and_rerun'] = true elsif params[:commit] == 'Update and Harvest Updated Items' return else diff --git a/app/helpers/bulkrax/application_helper.rb b/app/helpers/bulkrax/application_helper.rb index 0242aa5d8..9418043c1 100644 --- a/app/helpers/bulkrax/application_helper.rb +++ b/app/helpers/bulkrax/application_helper.rb @@ -1,9 +1,13 @@ # frozen_string_literal: true -require 'coderay' - module Bulkrax module ApplicationHelper - include ::Hyrax::HyraxHelperBehavior if defined?(::Hyrax) + def item_entry_path(item, e, opts = {}) + an_importer?(item) ? bulkrax.importer_entry_path(item.id, e.id, opts) : bulkrax.exporter_entry_path(item.id, e.id, opts) + end + + def an_importer?(item) + item.class.to_s.include?('Importer') + end def coderay(value, opts) CodeRay diff --git a/app/models/bulkrax/importer.rb b/app/models/bulkrax/importer.rb index 27e73a4be..89c2210e5 100644 --- a/app/models/bulkrax/importer.rb +++ b/app/models/bulkrax/importer.rb @@ -3,7 +3,7 @@ require 'iso8601' module Bulkrax - class Importer < ApplicationRecord + class Importer < ApplicationRecord # rubocop:disable Metrics/ClassLength include Bulkrax::ImporterExporterBehavior include Bulkrax::StatusInfo @@ -135,6 +135,14 @@ def update_files self.parser_fields['update_files'] end + def remove_and_rerun + self.parser_fields['remove_and_rerun'] + end + + def metadata_only? + parser.parser_fields['metadata_only'] == true + end + def import_works import_objects(['work']) end @@ -157,6 +165,12 @@ def import_objects(types_array = nil) self.only_updates ||= false self.save if self.new_record? # Object needs to be saved for statuses types = types_array || DEFAULT_OBJECT_TYPES + if remove_and_rerun + self.entries.find_each do |e| + e.factory.find&.destroy! + e.destroy! + end + end parser.create_objects(types) rescue StandardError => e set_status_info(e) @@ -192,9 +206,5 @@ def path_string rescue "#{self.id}_#{self.created_at.strftime('%Y%m%d%H%M%S')}" end - - def metadata_only? - parser.parser_fields['metadata_only'] == true - end end end diff --git a/app/views/bulkrax/exporters/show.html.erb b/app/views/bulkrax/exporters/show.html.erb index 37071999e..b0b42b5fe 100644 --- a/app/views/bulkrax/exporters/show.html.erb +++ b/app/views/bulkrax/exporters/show.html.erb @@ -102,10 +102,11 @@
- <%= render partial: 'bulkrax/shared/work_entries_tab', locals: { item: @exporter, entries: @work_entries } %> - <%= render partial: 'bulkrax/shared/collection_entries_tab', locals: { item: @exporter, entries: @collection_entries } %> - <%= render partial: 'bulkrax/shared/file_set_entries_tab', locals: { item: @exporter, entries: @file_set_entries } %> + <%= render partial: 'bulkrax/shared/entries_tab', locals: { item: @exporter, entries: @work_entries, pagination_param_name: :work_entries_page, pagination_anchor: 'work-entries' } %> + <%= render partial: 'bulkrax/shared/entries_tab', locals: { item: @exporter, entries: @collection_entries, pagination_param_name: :collection_entries_path, pagination_anchor: 'collection-entries' } %> + <%= render partial: 'bulkrax/shared/entries_tab', locals: { item: @exporter, entries: @file_set_entries, pagination_param_name: :file_set_entries_path, pagination_anchor: 'file-set-entries' } %>
+
<%= link_to 'Edit', edit_exporter_path(@exporter) %> | diff --git a/app/views/bulkrax/importers/_edit_form_buttons.html.erb b/app/views/bulkrax/importers/_edit_form_buttons.html.erb index 844622587..ddeca37b7 100644 --- a/app/views/bulkrax/importers/_edit_form_buttons.html.erb +++ b/app/views/bulkrax/importers/_edit_form_buttons.html.erb @@ -34,7 +34,14 @@ <%= form.button :submit, value: 'Update and Replace Files', class: 'btn btn-primary', - data: {confirm: "Are you sure? This will remove all files before adding them from the import."} %> + data: {confirm: "Are you sure? This will remove all files before adding them from the import."} %> +
+

Remove all works and then run the import again from a clean slate. This will remove all files and associations and any edits made since the last import will be lost.

+ <%= form.button :submit, + value: 'Remove and Rerun', + class: 'btn btn-primary', + data: {confirm: "Are you sure? This will delete all the works and any associated files and relationships before re running."} %> + <% end %>
diff --git a/app/views/bulkrax/importers/_edit_item_buttons.html.erb b/app/views/bulkrax/importers/_edit_item_buttons.html.erb new file mode 100644 index 000000000..4a7987abc --- /dev/null +++ b/app/views/bulkrax/importers/_edit_item_buttons.html.erb @@ -0,0 +1,18 @@ + diff --git a/app/views/bulkrax/importers/show.html.erb b/app/views/bulkrax/importers/show.html.erb index 35491d00a..b95a79807 100644 --- a/app/views/bulkrax/importers/show.html.erb +++ b/app/views/bulkrax/importers/show.html.erb @@ -82,10 +82,12 @@
- <%= render partial: 'bulkrax/shared/work_entries_tab', locals: { item: @importer, entries: @work_entries } %> - <%= render partial: 'bulkrax/shared/collection_entries_tab', locals: { item: @importer, entries: @collection_entries } %> - <%= render partial: 'bulkrax/shared/file_set_entries_tab', locals: { item: @importer, entries: @file_set_entries } %> + <%= render partial: 'bulkrax/shared/entries_tab', locals: { item: @importer, entries: @work_entries, pagination_param_name: :work_entries_page, pagination_anchor: 'work-entries' } %> + <%= render partial: 'bulkrax/shared/entries_tab', locals: { item: @importer, entries: @collection_entries, pagination_param_name: :collection_entries_path, pagination_anchor: 'collection-entries' } %> + <%= render partial: 'bulkrax/shared/entries_tab', locals: { item: @importer, entries: @file_set_entries, pagination_param_name: :file_set_entries_path, pagination_anchor: 'file-set-entries' } %>
+ <% all_entries = @work_entries + @collection_entries + @file_set_entries %> + <%= render partial: 'bulkrax/importers/edit_item_buttons', locals: { item: @importer, e: all_entries.first } if all_entries.present? %>

diff --git a/app/views/bulkrax/shared/_collection_entries_tab.html.erb b/app/views/bulkrax/shared/_entries_tab.html.erb similarity index 59% rename from app/views/bulkrax/shared/_collection_entries_tab.html.erb rename to app/views/bulkrax/shared/_entries_tab.html.erb index 9c0406e48..d2f1da520 100644 --- a/app/views/bulkrax/shared/_collection_entries_tab.html.erb +++ b/app/views/bulkrax/shared/_entries_tab.html.erb @@ -1,4 +1,4 @@ -

+
@@ -12,9 +12,8 @@ <% entries.each do |e| %> - <% entry_path = item.class.to_s.include?('Importer') ? bulkrax.importer_entry_path(item.id, e.id) : bulkrax.exporter_entry_path(item.id, e.id) %> - + <% if e.status == "Complete" %> @@ -24,16 +23,22 @@ <% end %> <% if e.last_error.present? %> - + <% else %> <% end %> - + <% end %>
<%= link_to e.identifier, entry_path %><%= link_to e.identifier, item_entry_path(item, e) %> <%= e.id %> <%= e.status %> <%= e.status %><%= link_to e.last_error.dig("error_class"), entry_path %><%= link_to e.last_error.dig("error_class"), item_entry_path(item, e) %><%= e.status_at %><%= link_to raw(''), entry_path %> + <%= link_to raw(''), item_entry_path(item, e) %> + <% if an_importer?(item) %> + + <% end %> + <%= link_to raw(''), item_entry_path(item, e), method: :delete, data: { confirm: 'This will delete the entry and any work associated with it. Are you sure?' } %> +
<%= page_entries_info(entries) %>
- <%= paginate(entries, theme: 'blacklight', param_name: :collections_entries_page, params: { anchor: 'collection-entries' }) %> + <%= paginate(entries, theme: 'blacklight', param_name: pagination_param_name, params: { anchor: pagination_anchor }) %>
diff --git a/app/views/bulkrax/shared/_file_set_entries_tab.html.erb b/app/views/bulkrax/shared/_file_set_entries_tab.html.erb deleted file mode 100644 index b1f8a0d60..000000000 --- a/app/views/bulkrax/shared/_file_set_entries_tab.html.erb +++ /dev/null @@ -1,39 +0,0 @@ -
- - - - - - - - - - - - - <% entries.each do |e| %> - <% entry_path = item.class.to_s.include?('Importer') ? bulkrax.importer_entry_path(item.id, e.id) : bulkrax.exporter_entry_path(item.id, e.id) %> - - - - <% if e.status == "Complete" %> - - <% elsif e.status == "Pending" %> - - <% else %> - - <% end %> - <% if e.last_error.present? %> - - <% else %> - - <% end %> - - - - <% end %> - -
<%= t('bulkrax.table_header.labels.identifier') %><%= t('bulkrax.table_header.labels.entry_id') %><%= t('bulkrax.table_header.labels.status') %><%= t('bulkrax.table_header.labels.errors') %><%= t('bulkrax.table_header.labels.status_set_at') %><%= t('bulkrax.table_header.labels.actions') %>
<%= link_to e.identifier, entry_path %><%= e.id %> <%= e.status %> <%= e.status %> <%= e.status %><%= link_to e.last_error.dig("error_class"), entry_path %><%= e.status_at %><%= link_to raw(''), entry_path %>
- <%= page_entries_info(entries) %>
- <%= paginate(entries, theme: 'blacklight', param_name: :file_set_entries_page, params: { anchor: 'file-set-entries' }) %> -
diff --git a/app/views/bulkrax/shared/_work_entries_tab.html.erb b/app/views/bulkrax/shared/_work_entries_tab.html.erb deleted file mode 100644 index ef1792ca4..000000000 --- a/app/views/bulkrax/shared/_work_entries_tab.html.erb +++ /dev/null @@ -1,39 +0,0 @@ -
- - - - - - - - - - - - - <% entries.each do |e| %> - <% entry_path = item.class.to_s.include?('Importer') ? bulkrax.importer_entry_path(item.id, e.id) : bulkrax.exporter_entry_path(item.id, e.id) %> - - - - <% if e.status == "Complete" %> - - <% elsif e.status == "Pending" %> - - <% else %> - - <% end %> - <% if e.last_error.present? %> - - <% else %> - - <% end %> - - - - <% end %> - -
<%= t('bulkrax.table_header.labels.identifier') %><%= t('bulkrax.table_header.labels.entry_id') %><%= t('bulkrax.table_header.labels.status') %><%= t('bulkrax.table_header.labels.errors') %><%= t('bulkrax.table_header.labels.status_set_at') %><%= t('bulkrax.table_header.labels.actions') %>
<%= link_to e.identifier, entry_path %><%= e.id %> <%= e.status %> <%= e.status %> <%= e.status %><%= link_to e.last_error.dig("error_class"), entry_path %><%= e.status_at %><%= link_to raw(''), entry_path %>
- <%= page_entries_info(entries) %>
- <%= paginate(entries, theme: 'blacklight', param_name: :work_entries_page, params: { anchor: 'work-entries' }) %> -
diff --git a/config/routes.rb b/config/routes.rb index 31f416b3f..e4a709e27 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,7 +3,7 @@ Bulkrax::Engine.routes.draw do resources :exporters do get :download - resources :entries, only: %i[show] + resources :entries, only: %i[show update destroy] end resources :importers do put :continue @@ -11,7 +11,7 @@ collection do post :external_sets end - resources :entries, only: %i[show] + resources :entries, only: %i[show update destroy] get :upload_corrected_entries post :upload_corrected_entries_file end diff --git a/spec/test_app/app/helpers/application_helper.rb b/spec/test_app/app/helpers/application_helper.rb index 15b06f0f6..e6fbe7222 100644 --- a/spec/test_app/app/helpers/application_helper.rb +++ b/spec/test_app/app/helpers/application_helper.rb @@ -1,4 +1,6 @@ # frozen_string_literal: true module ApplicationHelper + include ::Hyrax::HyraxHelperBehavior if defined?(::Hyrax) + end