class Dor::EmbargoService

Sets up and removes embargos on an object This assumes the object has embargoMetadata, rightsMetadata, and events datastreams

Attributes

obj[R]

Public Class Methods

new(obj) click to toggle source
# File lib/dor/services/embargo_service.rb, line 7
def initialize(obj)
  @obj = obj
end

Public Instance Methods

release(release_agent) click to toggle source

Lift the embargo from the object Sets embargo status to released in embargoMetadata Modifies rightsMetadata to remove embargoReleaseDate and updates/adds access from embargoMetadata/releaseAccess @param [String] release_agent name of the person, application or thing that released embargo @note The caller should save the object to fedora to commit the changes

# File lib/dor/services/embargo_service.rb, line 16
def release(release_agent)
  # Set status to released
  embargoMetadata.status = 'released'

  # Remove all read acces nodes
  rights_xml = rightsMetadata.ng_xml
  rightsMetadata.ng_xml_will_change!
  rights_xml.xpath("//rightsMetadata/access[@type='read']").each(&:remove)

  # Replace rights <access> nodes with those from embargoMetadta
  release_access = embargoMetadata.release_access_node
  release_access.xpath('//releaseAccess/access').each do |new_access|
    access_sibling = rights_xml.at_xpath('//rightsMetadata/access[last()]')
    if access_sibling
      access_sibling.add_next_sibling(new_access.clone)
    else
      rights_xml.root.add_child(new_access.clone)
    end
  end

  events.add_event('embargo', release_agent, 'Embargo released')
end
release_20_pct_vis(release_agent) click to toggle source
# File lib/dor/services/embargo_service.rb, line 40
def release_20_pct_vis(release_agent)
  # Set status to released
  embargoMetadata.twenty_pct_status = 'released'

  # Remove all read acces nodes
  rights_xml = rightsMetadata.ng_xml
  rightsMetadata.ng_xml_will_change!
  rights_xml.xpath("//rightsMetadata/access[@type='read']").each(&:remove)

  # Replace rights <access> nodes with 1 machine/world node
  access_sibling = rights_xml.at_xpath('//rightsMetadata/access[last()]')
  if access_sibling
    access_sibling.add_next_sibling(world_doc.root.clone)
  else
    rights_xml.root.add_child(world_doc.root.clone)
  end

  events.add_event('embargo', release_agent, '20% Visibility Embargo released')
end
update(new_date) click to toggle source
# File lib/dor/services/embargo_service.rb, line 61
def update(new_date)
  raise ArgumentError, 'You cannot change the embargo date of an item that is not embargoed.' if embargoMetadata.status != 'embargoed'
  raise ArgumentError, 'You cannot set the embargo date to a past date.' if new_date.past?

  time = new_date.beginning_of_day.utc
  rightsMetadata.embargo_release_date = time
  embargoMetadata.release_date = time
  obj.save!
end

Private Instance Methods

world_doc() click to toggle source
# File lib/dor/services/embargo_service.rb, line 77
def world_doc
  Nokogiri::XML::Builder.new do |xml|
    xml.access(type: 'read') do
      xml.machine { xml.world }
    end
  end.doc
end