Skip to content

Commit

Permalink
Merge pull request #6148 from samvera/valk-batch-edit-old
Browse files Browse the repository at this point in the history
Valkyrize batch editing
  • Loading branch information
tpendragon committed Aug 22, 2023
2 parents 9c4110d + 6b2c3ba commit e285a4a
Show file tree
Hide file tree
Showing 8 changed files with 599 additions and 178 deletions.
35 changes: 32 additions & 3 deletions app/controllers/hyrax/batch_edits_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,30 @@ def update_document(obj)
obj.save
end

def valkyrie_update_document(obj)
form = form_class.new(obj, current_ability, nil)
return unless form.validate(params[form_class.model_class.model_name.param_key])

cleanup_form_fields form

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,15 +116,15 @@ def destroy_batch
end

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

def terms
form_class.terms
end

def work_params(extra_params = {})
work_params = params[form_class.model_name.param_key] || ActionController::Parameters.new
work_params = params[form_class.model_class.model_name.param_key] || ActionController::Parameters.new
form_class.model_attributes(work_params.merge(extra_params))
end

Expand Down Expand Up @@ -135,5 +154,15 @@ def redirect_to_return_controller
redirect_to hyrax.dashboard_path
end
end

# Clean up form fields
# @param form Hyrax::Froms::ResourceBatchEditForm
def cleanup_form_fields(form)
form.lease = nil if form.lease && form.lease.fields['lease_expiration_date'].nil?
form.embargo = nil if form.embargo && form.embargo.fields['embargo_release_date'].nil?
form.fields.keys.each do |k|
form.fields[k] = nil if form.fields[k].is_a?(Array) && form.fields[k].blank?
end
end
end
end
90 changes: 90 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,90 @@
# 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

# @param name [Symbol]
# @return [Symbol]
# @note Added for ActiveModel compatibility.
def column_for_attribute(name)
name
end

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
2 changes: 1 addition & 1 deletion app/services/hyrax/visibility_propagator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class VisibilityPropagator
# @return [#propagate]
def self.for(source:)
case source
when Hyrax::WorkBehavior # ActiveFedora
when ActiveFedora::Base # ActiveFedora
FileSetVisibilityPropagator.new(source: source)
when Hyrax::Resource # Valkyrie
ResourceVisibilityPropagator.new(source: source)
Expand Down
4 changes: 4 additions & 0 deletions lib/wings/active_fedora_converter/default_work.rb
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,10 @@ def enforce_future_date_for_lease?
false
end

def file_sets
members.select(&:file_set?)
end

def indexing_service
Hyrax::ValkyrieIndexer.for(resource: valkyrie_resource)
end
Expand Down
Loading

0 comments on commit e285a4a

Please sign in to comment.