From 97d6bc77fa8c4939c9df51a2d87b1fa07e1a236e Mon Sep 17 00:00:00 2001 From: Julie Allinson Date: Fri, 22 Sep 2017 11:13:12 +0100 Subject: [PATCH] Add manifest_metadata method into ManifestEnabledWorkShowPresenter to support adding metadata into the IIIF manifest; added solr version until solr 7 issue is fixed --- .../manifest_enabled_work_show_presenter.rb | 68 +++++++++++++------ config/solr_wrapper_test.yml | 2 + ...nifest_enabled_work_show_presenter_spec.rb | 31 ++++++++- 3 files changed, 79 insertions(+), 22 deletions(-) diff --git a/app/presenters/hyku/manifest_enabled_work_show_presenter.rb b/app/presenters/hyku/manifest_enabled_work_show_presenter.rb index ea5e69329e..61f97937c5 100644 --- a/app/presenters/hyku/manifest_enabled_work_show_presenter.rb +++ b/app/presenters/hyku/manifest_enabled_work_show_presenter.rb @@ -8,13 +8,31 @@ def manifest_url manifest_helper.polymorphic_url([:manifest, self]) end - # Hash to populate IIIF manifest with extras. Currently only sequence rendering is implemented. + # IIIF rendering linking property for inclusion in the manifest # - # @return [Hash] hash including sequence_rendering - def manifest_extras - { - sequence_rendering: sequence_rendering - } + # @return [Array] array of rendering hashes + def sequence_rendering + renderings = [] + if solr_document.rendering_ids.present? + solr_document.rendering_ids.each do |file_set_id| + renderings << build_rendering(file_set_id) + end + end + renderings.flatten + end + + # IIIF metadata for inclusion in the manifest + # + # @return [Array] array of metadata hashes + def manifest_metadata + metadata = [] + metadata_fields.each do |field| + metadata << { + 'label' => field.to_s.humanize.capitalize, + 'value' => get_metadata_value(field) + } + end + metadata end private @@ -23,19 +41,6 @@ def manifest_helper @manifest_helper ||= ManifestHelper.new(request.base_url) end - # IIIF rendering linking property for inclusion in the manifest - # - # @return [Array] array of rendering hashes - def sequence_rendering - renderings = [] - if solr_document.rendering_ids.present? - solr_document.rendering_ids.each do |file_set_id| - renderings << build_rendering(file_set_id) - end - end - renderings.flatten - end - # Build a rendering hash # # @return [Hash] rendering @@ -58,5 +63,30 @@ def query_for_rendering(file_set_id) fl: [ActiveFedora.id_field, 'label_ssi', 'mime_type_ssi'], rows: 1) end + + # Retrieve the required fields from the Form class. Derive the Form class name from the Model name. + # The class should exist, but it may not if different amespaces are being used. + # If it does not exist, rescue and return an empty Array. + # + # @return [Array] required fields + def metadata_fields + ns = "Hyrax" + model = solr_document['has_model_ssim'].first + + "#{ns}::#{model}Form".constantize.required_fields + rescue + [] + end + + # Get the metadata value; return a String for single values and an Array of hashes for multiple values. + # + # @return [String or Array] field value(s) + def get_metadata_value(field) + if send(field).count == 1 + send(field).first + else + send(field).collect { |f| f } + end + end end end diff --git a/config/solr_wrapper_test.yml b/config/solr_wrapper_test.yml index 182383df95..9ac1231dbd 100644 --- a/config/solr_wrapper_test.yml +++ b/config/solr_wrapper_test.yml @@ -1,5 +1,7 @@ # Place any default configuration for solr_wrapper here port: 8985 +# TODO: Relax this when we're Solr 7-compliant +version: 6.6.1 collection: dir: solr/config/ name: hydra-test diff --git a/spec/presenters/hyku/manifest_enabled_work_show_presenter_spec.rb b/spec/presenters/hyku/manifest_enabled_work_show_presenter_spec.rb index 0f3f0840cb..82c5c112bc 100644 --- a/spec/presenters/hyku/manifest_enabled_work_show_presenter_spec.rb +++ b/spec/presenters/hyku/manifest_enabled_work_show_presenter_spec.rb @@ -8,7 +8,9 @@ describe "#manifest_url" do subject { presenter.manifest_url } + let(:document) { { "has_model_ssim" => ['GenericWork'], 'id' => '99' } } + it { is_expected.to eq 'http://test.host/concern/generic_works/99/manifest' } end @@ -25,9 +27,9 @@ end end - describe "manifest_extras" do + describe "#sequence rendering" do subject do - presenter.manifest_extras + presenter.sequence_rendering end before do @@ -37,7 +39,30 @@ it "returns a hash containing the rendering information" do work.rendering_ids = [work.file_sets.first.id] - expect(subject).to include(:sequence_rendering) + expect(subject).to be_an Array + end + end + + describe "#manifest metadata" do + subject do + presenter.manifest_metadata + end + + context do + it "returns a hash containing the metadata with a single value" do + expect(subject).to be_a Array + expect(subject[0]['value']).to eq 'Test title' + end + end + + context do + before do + work.title = ['Test title', 'Another test title'] + end + + it "returns an array of metadata values" do + expect(subject[0]['value']).to eq ['Test title', 'Another test title'] + end end end end