Module: Dor::Publishable

Extended by:
ActiveSupport::Concern, Deprecation
Included in:
Item, Set
Defined in:
lib/dor/models/concerns/publishable.rb

Instance Method Summary collapse

Instance Method Details

#encoded_thumbString

Return a URI encoded version of the thumb image for use by indexers (leaving the extension of the filename)

Returns:

  • (String)

    URI encoded version of the thumb with the druid prefix, e.g. oo000oo0001%2Ffilenamewith%20space.jp2



22
23
24
25
26
27
28
29
# File 'lib/dor/models/concerns/publishable.rb', line 22

def encoded_thumb
  thumb_image = thumb # store the result locally, so we don't have to compute each time we use it below
  return unless thumb_image

  thumb_druid = thumb_image.split('/').first # the druid (before the first slash)
  thumb_filename = thumb_image.split(/#{pid_regex}[\/]/).last # everything after the druid
  "#{thumb_druid}%2F#{ERB::Util.url_encode(thumb_filename)}"
end

#public_relationshipsNokogiri::XML

strips away the relationships that should not be shown in public desc metadata

Returns:

  • (Nokogiri::XML)


44
45
46
47
48
49
50
51
52
53
54
# File 'lib/dor/models/concerns/publishable.rb', line 44

def public_relationships
  include_elements = ['fedora:isMemberOf', 'fedora:isMemberOfCollection', 'fedora:isConstituentOf']
  rels_doc = Nokogiri::XML(datastreams['RELS-EXT'].content)
  rels_doc.xpath('/rdf:RDF/rdf:Description/*', { 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' }).each do |rel|
    unless include_elements.include?([rel.namespace.prefix, rel.name].join(':'))
      rel.next_sibling.remove if rel.next_sibling.content.strip.empty?
      rel.remove
    end
  end
  rels_doc
end

#public_xmlxml

Generate the public .xml for a PURL page.

Returns:

  • (xml)

    The public xml for the item



58
59
60
# File 'lib/dor/models/concerns/publishable.rb', line 58

def public_xml
  PublicXmlService.new(self).to_xml
end

#publish_delete_on_successObject

When publishing a PURL, we notify purl-fetcher of changes.



116
117
118
119
120
121
122
123
# File 'lib/dor/models/concerns/publishable.rb', line 116

def publish_delete_on_success
  return unless Dor::Config.purl_services.url

  id = pid.gsub(/^druid:/, '')

  purl_services = Dor::Config.purl_services.rest_client
  purl_services["purls/#{id}"].delete
end

#publish_metadataObject

Copies this object’s public_xml to the Purl document cache if it is world discoverable

otherwise, it prunes the object's metadata from the document cache


64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/dor/models/concerns/publishable.rb', line 64

def 
  rights = datastreams['rightsMetadata'].ng_xml.clone.remove_namespaces!
  if rights.at_xpath("//rightsMetadata/access[@type='discover']/machine/world")
    dc_xml = generate_dublin_core.to_xml { |config| config.no_declaration }
    DigitalStacksService.transfer_to_document_store(pid, dc_xml, 'dc')
    %w(identityMetadata contentMetadata rightsMetadata).each do |stream|
      DigitalStacksService.transfer_to_document_store(pid, datastreams[stream].content.to_s, stream) if datastreams[stream]
    end
    DigitalStacksService.transfer_to_document_store(pid, public_xml, 'public')
    DigitalStacksService.transfer_to_document_store(pid, generate_public_desc_md, 'mods')
    publish_notify_on_success
  else
    # Clear out the document cache for this item
    DigitalStacksService.prune_purl_dir pid
    publish_delete_on_success
  end
end

#publish_metadata_remotelyObject

Call dor services app to have it publish the metadata



83
84
85
86
87
88
# File 'lib/dor/models/concerns/publishable.rb', line 83

def 
  dor_services = Dor::Config.dor_services.rest_client
  endpoint = dor_services["v1/objects/#{pid}/publish"]
  endpoint.post ''
  endpoint.url
end

#publish_notify_on_successObject

When publishing a PURL, we notify purl-fetcher of changes. If the purl service isn’t configured, instead we drop a ‘aa11bb2222` file into the `local_recent_changes` folder to notify other applications watching the filesystem (i.e., purl-fetcher). We also remove any .deletes entry that may have left over from a previous removal



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/dor/models/concerns/publishable.rb', line 95

def publish_notify_on_success
  id = pid.gsub(/^druid:/, '')

  if Dor::Config.purl_services.url
    purl_services = Dor::Config.purl_services.rest_client
    purl_services["purls/#{id}"].post ''
  else
    local_recent_changes = Config.stacks.local_recent_changes
    raise ArgumentError, "Missing local_recent_changes directory: #{local_recent_changes}" unless File.directory?(local_recent_changes)

    FileUtils.touch(File.join(local_recent_changes, id))
    begin
      DruidTools::Druid.new(id, Dor::Config.stacks.local_document_cache_root).deletes_delete_record
    rescue Errno::EACCES
      Dor.logger.warn "Access denied while trying to remove .deletes file for druid:#{id}"
    end
  end
end

#thumbString

Compute the thumbnail for this object following the rules at consul.stanford.edu/display/chimera/The+Rules+of+Thumb Used by PublicXmlService

Returns:

  • (String)

    the computed thumb filename, with the druid prefix and a slash in front of it, e.g. oo000oo0001/filenamewith space.jp2



15
16
17
# File 'lib/dor/models/concerns/publishable.rb', line 15

def thumb
  ThumbnailService.new(self).thumb
end

#thumb_urlString

Return a full qualified thumbnail image URL if the thumb is computable

Returns:



34
35
36
37
38
39
# File 'lib/dor/models/concerns/publishable.rb', line 34

def thumb_url
  return unless encoded_thumb

  thumb_basename = File.basename(encoded_thumb, File.extname(encoded_thumb)) # strip the extension for URL generation
  "https://#{Dor::Config.stacks.host}/image/iiif/#{thumb_basename}/full/!400,400/0/default.jpg"
end