Skip to content

Commit

Permalink
Valkyrize batch editing
Browse files Browse the repository at this point in the history
  • Loading branch information
cjcolvar authored and tamsin johnson committed Aug 10, 2023
1 parent 14da6b5 commit b36cae4
Show file tree
Hide file tree
Showing 4 changed files with 550 additions and 172 deletions.
20 changes: 18 additions & 2 deletions app/controllers/hyrax/batch_edits_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,27 @@ def update_document(obj)
obj.save
end

def valkyrie_update_document(obj)
form = Hyrax::Forms::ResourceBatchEditForm.new(obj, current_ability, nil)
return unless form.validate(params[form_class.model_class.model_name.param_key])
result = transactions['change_set.update_work']
.with_step_args('work_resource.save_acl' => { permissions_params: form.input_params["permissions"] })
.call(form)
obj = result.value!

InheritPermissionsJob.perform_now(obj)
VisibilityCopyJob.perform_now(obj)
end

def update
case params["update_type"]
when "update"
batch.each do |doc_id|
update_document(Hyrax.query_service.find_by_alternate_identifier(alternate_identifier: doc_id, use_valkyrie: false))
if Hyrax.config.use_valkyrie?
valkyrie_update_document(Hyrax.query_service.find_by(id: doc_id))
else
update_document(Hyrax.query_service.find_by_alternate_identifier(alternate_identifier: doc_id, use_valkyrie: false))
end
end
flash[:notice] = "Batch update complete"
after_update
Expand Down Expand Up @@ -97,7 +113,7 @@ def destroy_batch
end

def form_class
Forms::BatchEditForm
Hyrax.config.use_valkyrie? ? Forms::ResourceBatchEditForm : Forms::BatchEditForm
end

def terms
Expand Down
83 changes: 83 additions & 0 deletions app/forms/hyrax/forms/resource_batch_edit_form.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# frozen_string_literal: true
module Hyrax
module Forms
class ResourceBatchEditForm < Hyrax::Forms::ResourceForm
include Hyrax::FormFields(:basic_metadata)

self.required_fields = []
self.model_class = Hyrax.primary_work_type

# Contains a list of titles of all the works in the batch
attr_accessor :names

# @param [Hyrax::Work] model the model backing the form
# @param [Ability] current_ability the user authorization model
# @param [Array<String>] batch_document_ids a list of document ids in the batch
def initialize(model, _current_ability, batch_document_ids)
@names = []
@batch_document_ids = batch_document_ids
if @batch_document_ids.present?
super(model.class.new(initialize_combined_fields))
else
super(model)
end
end

def terms
[:creator, :contributor, :description,
:keyword, :resource_type, :license, :publisher, :date_created,
:subject, :language, :identifier, :based_near,
:related_url]
end

attr_reader :batch_document_ids

# Returns a list of parameters we accept from the form
# rubocop:disable Metrics/MethodLength
def self.build_permitted_params
[{ creator: [] },
{ contributor: [] },
{ description: [] },
{ keyword: [] },
{ resource_type: [] },
{ license: [] },
{ publisher: [] },
{ date_created: [] },
{ subject: [] },
{ language: [] },
{ identifier: [] },
{ based_near: [] },
{ related_url: [] },
{ permissions_attributes: [:type, :name, :access, :id, :_destroy] },
:on_behalf_of,
:version,
:add_works_to_collection,
:visibility_during_embargo,
:embargo_release_date,
:visibility_after_embargo,
:visibility_during_lease,
:lease_expiration_date,
:visibility_after_lease,
:visibility,
{ based_near_attributes: [:id, :_destroy] }]
end
# rubocop:enable Metrics/MethodLength

private

# override this method if you need to initialize more complex RDF assertions (b-nodes)
# @return [Hash<String, Array>] the list of unique values per field
def initialize_combined_fields
# For each of the files in the batch, set the attributes to be the concatenation of all the attributes
batch_document_ids.each_with_object({}) do |doc_id, combined_attributes|
work = Hyrax.query_service.find_by(id: doc_id)
terms.each do |field|
combined_attributes[field] ||= []
combined_attributes[field] = (combined_attributes[field] + work[field].to_a).uniq
end
names << work.to_s
end
end
end
end
end
Loading

0 comments on commit b36cae4

Please sign in to comment.