Skip to content

Commit aa00dbb

Browse files
authored
Merge pull request #5758 from avalonmediasystem/caption_transcript_facet
Add 'Has Captions' and 'Has Transcripts' facets
2 parents 9680532 + ea133a2 commit aa00dbb

File tree

10 files changed

+99
-1
lines changed

10 files changed

+99
-1
lines changed

app/controllers/catalog_controller.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ class CatalogController < ApplicationController
8888
config.add_facet_field 'collection_ssim', label: 'Collection', limit: 5
8989
config.add_facet_field 'unit_ssim', label: 'Unit', limit: 5
9090
config.add_facet_field 'language_ssim', label: 'Language', limit: 5
91+
config.add_facet_field 'has_captions_bsi', label: 'Has Captions', helper_method: :display_has_caption_or_transcript
92+
config.add_facet_field 'has_transcripts_bsi', label: 'Has Transcripts', helper_method: :display_has_caption_or_transcript
9193
# Hide these facets if not a Collection Manager
9294
config.add_facet_field 'workflow_published_sim', label: 'Published', limit: 5, if: Proc.new {|context, config, opts| Ability.new(context.current_user, context.user_session).can? :create, MediaObject}, group: "workflow"
9395
config.add_facet_field 'avalon_uploader_ssi', label: 'Created by', limit: 5, if: Proc.new {|context, config, opts| Ability.new(context.current_user, context.user_session).can? :create, MediaObject}, group: "workflow"

app/helpers/application_helper.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ def display_metadata(label, value, default=nil)
104104
content_tag(:dt, label) + contents
105105
end
106106

107+
def display_has_caption_or_transcript value
108+
value = value == "true" ? 'Yes' : 'No'
109+
end
110+
107111
def search_result_label item
108112
if item['title_tesi'].present?
109113
label = truncate(item['title_tesi'], length: 100)

app/models/concerns/master_file_behavior.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,10 @@ def supplemental_file_captions
171171
supplemental_files(tag: 'caption')
172172
end
173173

174+
def supplemental_file_transcripts
175+
supplemental_files(tag: 'transcript')
176+
end
177+
174178
# Supplies the route to the master_file as an rdf formatted URI
175179
# @return [String] the route as a uri
176180
# @example uri for a mf on avalon.iu.edu with a id of: avalon:1820

app/models/concerns/media_object_behavior.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ def access_text
5757
"This item is accessible by: #{actors.join(', ')}."
5858
end
5959

60+
def has_captions
61+
master_files.any? { |mf| mf.has_captions? }
62+
end
63+
64+
def has_transcripts
65+
master_files.any? { |mf| mf.has_transcripts? }
66+
end
67+
6068
# CDL methods
6169
def lending_status
6270
Checkout.active_for_media_object(id).any? ? "checked_out" : "available"

app/models/master_file.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,10 @@ def has_captions?
492492
!captions.empty? || !supplemental_file_captions.empty?
493493
end
494494

495+
def has_transcripts?
496+
supplemental_file_transcripts.present?
497+
end
498+
495499
def has_waveform?
496500
!waveform.empty?
497501
end
@@ -508,6 +512,7 @@ def to_solr *args
508512
super.tap do |solr_doc|
509513
solr_doc['file_size_ltsi'] = file_size if file_size.present?
510514
solr_doc['has_captions?_bs'] = has_captions?
515+
solr_doc['has_transcripts?_bs'] = has_transcripts?
511516
solr_doc['has_waveform?_bs'] = has_waveform?
512517
solr_doc['has_poster?_bs'] = has_poster?
513518
solr_doc['has_thumbnail?_bs'] = has_thumbnail?

app/models/media_object.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@ def fill_in_solr_fields_that_need_master_files(solr_doc)
236236
solr_doc['section_id_ssim'] = ordered_master_file_ids
237237
solr_doc["other_identifier_sim"] += master_files.collect {|mf| mf.identifier.to_a }.flatten
238238
solr_doc["date_digitized_ssim"] = master_files.collect {|mf| mf.date_digitized }.compact.map {|t| Time.parse(t).strftime "%F" }
239+
solr_doc["has_captions_bsi"] = has_captions
240+
solr_doc["has_transcripts_bsi"] = has_transcripts
239241
solr_doc["section_label_tesim"] = section_labels
240242
solr_doc['section_physical_description_ssim'] = section_physical_descriptions
241243
solr_doc['all_comments_ssim'] = all_comments

spec/controllers/catalog_controller_spec.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,28 @@
232232
end
233233
end
234234

235+
describe "facet fields" do
236+
let(:media_object) { FactoryBot.create(:fully_searchable_media_object, :with_master_file, :with_completed_workflow, avalon_uploader: 'archivist1', governing_policies: [lease]) }
237+
let(:lease) { FactoryBot.create(:lease, inherited_read_groups: ['ExternalGroup']) }
238+
before(:each) do
239+
MediaObjectIndexingJob.perform_now(media_object.id)
240+
end
241+
["avalon_resource_type_ssim", "creator_ssim", "date_sim", "genre_ssim", "series_ssim", "collection_ssim", "unit_ssim", "language_ssim", "has_captions_bsi", "has_transcripts_bsi",
242+
"workflow_published_sim", "avalon_uploader_ssi", "read_access_group_ssim", "read_access_virtual_group_ssim", "date_digitized_ssim", "date_ingested_ssim"].each do |field|
243+
it "should facet results on #{field}" do
244+
query = Array(media_object.to_solr(include_child_fields:true)[field]).first
245+
# The following line is to check that the test is using a valid solr field name
246+
# since an incorrect one will lead to an empty query resulting in a false positive below
247+
expect(query.to_s).not_to be_empty
248+
get :index, params: { 'f' => { field => [query] } }
249+
expect(response).to be_successful
250+
expect(response).to render_template('catalog/index')
251+
expect(assigns(:response).documents.count).to eq 1
252+
expect(assigns(:response).documents.map(&:id)).to contain_exactly(media_object.id)
253+
end
254+
end
255+
end
256+
235257
describe "gated discovery" do
236258
context "with bad ldap groups" do
237259
let(:ldap_groups) { ['good-group', 'bad group'] }

spec/helpers/application_helper_spec.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,16 @@
163163
end
164164
end
165165

166+
describe "#display_has_caption_or_transcript" do
167+
it "should return 'Yes' for 'true'" do
168+
expect(helper.display_has_caption_or_transcript("true")).to eq("Yes")
169+
end
170+
171+
it "should return 'No' for 'false'" do
172+
expect(helper.display_has_caption_or_transcript("false")).to eq("No")
173+
end
174+
end
175+
166176
describe "#pretty_time" do
167177
it 'returns a formatted time' do
168178
expect(helper.pretty_time(0)).to eq '00:00:00.000'

spec/models/master_file_spec.rb

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,14 +721,26 @@
721721
let(:caption_file) { FactoryBot.create(:supplemental_file, :with_caption_file, :with_caption_tag) }
722722
let(:transcript_file) { FactoryBot.create(:supplemental_file, :with_transcript_tag) }
723723
let(:master_file) { FactoryBot.create(:master_file, supplemental_files: [caption_file, transcript_file]) }
724-
it 'has a caption' do
724+
it 'returns only caption files' do
725725
expect(master_file.supplemental_file_captions).to_not be_empty
726726
expect(master_file.supplemental_file_captions).to all(be_kind_of(SupplementalFile))
727727
expect(master_file.supplemental_file_captions).to_not include(transcript_file)
728728
expect(master_file.supplemental_file_captions).to include(caption_file)
729729
end
730730
end
731731

732+
describe 'supplemental_file_transcripts' do
733+
let(:caption_file) { FactoryBot.create(:supplemental_file, :with_caption_file, :with_caption_tag) }
734+
let(:transcript_file) { FactoryBot.create(:supplemental_file, :with_transcript_tag) }
735+
let(:master_file) { FactoryBot.create(:master_file, supplemental_files: [caption_file, transcript_file]) }
736+
it 'returns only transcript files' do
737+
expect(master_file.supplemental_file_transcripts).to_not be_empty
738+
expect(master_file.supplemental_file_transcripts).to all(be_kind_of(SupplementalFile))
739+
expect(master_file.supplemental_file_transcripts).to include(transcript_file)
740+
expect(master_file.supplemental_file_transcripts).to_not include(caption_file)
741+
end
742+
end
743+
732744
describe 'waveforms' do
733745
let(:master_file) { FactoryBot.create(:master_file) }
734746
it 'sets original_name to default value' do

spec/models/media_object_spec.rb

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,4 +1162,33 @@
11621162
expect(MediaObject.autocomplete('te', mo1.id)).to include({ id: 'Test 2', display: 'Test 2' })
11631163
end
11641164
end
1165+
1166+
describe "#has_captions" do
1167+
let(:captionless_media_object) { FactoryBot.create(:media_object, :with_master_file) }
1168+
let(:captioned_media_object) { FactoryBot.create(:media_object, master_files: [master_file1, master_file2]) }
1169+
let(:master_file1) { FactoryBot.create(:master_file) }
1170+
let(:master_file2) { FactoryBot.create(:master_file, :with_captions) }
1171+
it "returns false when child master files contain no captions" do
1172+
expect(captionless_media_object.has_captions).to be false
1173+
end
1174+
1175+
it "returns true when any child master file contains a caption" do
1176+
expect(captioned_media_object.has_captions).to be true
1177+
end
1178+
end
1179+
1180+
describe "#has_transcripts" do
1181+
let(:transcriptless_media_object) { FactoryBot.create(:media_object, :with_master_file) }
1182+
let(:transcript_media_object) { FactoryBot.create(:media_object, master_files: [master_file1, master_file2]) }
1183+
let(:master_file1) { FactoryBot.create(:master_file) }
1184+
let(:master_file2) { FactoryBot.create(:master_file, supplemental_files: [transcript]) }
1185+
let(:transcript) { FactoryBot.create(:supplemental_file, :with_transcript_tag) }
1186+
it "returns false when child master files contain no transcript" do
1187+
expect(transcriptless_media_object.has_transcripts).to be false
1188+
end
1189+
1190+
it "returns true when any child master file contains a transcript" do
1191+
expect(transcript_media_object.has_transcripts).to be true
1192+
end
1193+
end
11651194
end

0 commit comments

Comments
 (0)