Class: Dor::RightsMetadataDS

Inherits:
ActiveFedora::OmDatastream
  • Object
show all
Defined in:
lib/dor/datastreams/rights_metadata_ds.rb

Constant Summary collapse

RIGHTS_TYPE_CODES =
{
  'world' => 'World',
  'world-nd' => 'World (no-download)',
  'stanford' => 'Stanford',
  'stanford-nd' => 'Stanford (no-download)',
  'cdl-stanford-nd' => 'Controlled Digital Lending (no-download)',
  'loc:spec' => 'Location: Special Collections',
  'loc:music' => 'Location: Music Library',
  'loc:ars' => 'Location: Archive of Recorded Sound',
  'loc:art' => 'Location: Art Library',
  'loc:hoover' => 'Location: Hoover Library',
  'loc:m&m' => 'Location: Media & Microtext',
  'dark' => 'Dark (Preserve Only)',
  'none' => 'Citation Only'
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.upd_rights_xml_for_rights_type(rights_xml, rights_type) ⇒ Object

a helper method for setting up well-structured rights_xml based on a rights type code

Parameters:

  • rights_xml (ng_xml)

    a nokogiri xml (ruby) object that represents the rights xml for a DOR object

  • rights_type (string)

    a recognized rights type code (‘world’, ‘dark’, ‘loc:spec’, etc)



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/dor/datastreams/rights_metadata_ds.rb', line 106

def self.upd_rights_xml_for_rights_type(rights_xml, rights_type)
  # Note: The discover node is either 'none' for a dark object or 'world' for any other rights option
  label = rights_type == 'dark' ? 'none' : 'world'
  rights_xml.search('//rightsMetadata/access[@type=\'discover\']/machine').each do |node|
    node.children.remove
    node.add_child Nokogiri::XML::Node.new(label, rights_xml)
  end

  # The read node varies by rights option
  rights_xml.search('//rightsMetadata/access[@type=\'read\']').each do |node|
    node.children.remove
    machine_node = Nokogiri::XML::Node.new('machine', rights_xml)
    node.add_child(machine_node)
    if rights_type.start_with?('world')
      world_node = Nokogiri::XML::Node.new('world', rights_xml)
      world_node.set_attribute('rule', 'no-download') if rights_type.end_with?('-nd')
      machine_node.add_child(world_node)
    elsif rights_type.start_with?('stanford')
      group_node = Nokogiri::XML::Node.new('group', rights_xml)
      group_node.content = 'stanford'
      group_node.set_attribute('rule', 'no-download') if rights_type.end_with?('-nd')
      machine_node.add_child(group_node)
    elsif rights_type.start_with?('loc:')
      loc_node = Nokogiri::XML::Node.new('location', rights_xml)
      loc_node.content = rights_type.split(':').last
      machine_node.add_child(loc_node)
    elsif rights_type.start_with?('cdl')
      cdl_node = Nokogiri::XML::Node.new('cdl', rights_xml)
      group_node = Nokogiri::XML::Node.new('group', cdl_node)
      group_node.content = 'stanford'
      group_node.set_attribute('rule', 'no-download')
      cdl_node.add_child(group_node)
      machine_node.add_child(cdl_node)
    else # we know it is none or dark by the argument filter (first line)
      machine_node.add_child Nokogiri::XML::Node.new('none', rights_xml)
    end
  end
end

.valid_rights_type?(rights) ⇒ Boolean

Returns:

  • (Boolean)


99
100
101
# File 'lib/dor/datastreams/rights_metadata_ds.rb', line 99

def self.valid_rights_type?(rights)
  RightsMetadataDS.valid_rights_types.include? rights
end

.valid_rights_typesObject

key is the rights type code, used by e.g. RightsMetadataDS#set_read_rights and AdminPolicyObject#default_rights= value is the human-readable string, used for indexing, and for things like building select lists in the argo UI.



95
96
97
# File 'lib/dor/datastreams/rights_metadata_ds.rb', line 95

def self.valid_rights_types
  RIGHTS_TYPE_CODES.keys
end

.xml_templateObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/dor/datastreams/rights_metadata_ds.rb', line 46

def self.xml_template
  Nokogiri::XML::Builder.new do |xml|
    xml. do
      xml.access(type: 'discover') do
        xml.machine { xml.none }
      end
      xml.access(type: 'read') do
        xml.machine { xml.none } # dark default
      end
      xml.use do
        xml.human(type: 'useAndReproduction')
        xml.human(type: 'creativeCommons')
        xml.machine(type: 'creativeCommons', uri: '')
        xml.human(type: 'openDataCommons')
        xml.machine(type: 'openDataCommons', uri: '')
      end
      xml.copyright { xml.human }
    end
  end.doc
end

Instance Method Details

#content=(xml) ⇒ Object

just a wrapper to invalidate @dra_object



84
85
86
87
# File 'lib/dor/datastreams/rights_metadata_ds.rb', line 84

def content=(xml)
  @dra_object = nil
  super
end

#dra_objectObject



89
90
91
# File 'lib/dor/datastreams/rights_metadata_ds.rb', line 89

def dra_object
  @dra_object ||= Dor::RightsAuth.parse(ng_xml, true)
end

#rightsObject



170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/dor/datastreams/rights_metadata_ds.rb', line 170

def rights
  xml = ng_xml
  if xml.search('//rightsMetadata/access[@type=\'read\']/machine/group').length == 1
    'Stanford'
  elsif xml.search('//rightsMetadata/access[@type=\'read\']/machine/world').length == 1
    'World'
  elsif xml.search('//rightsMetadata/access[@type=\'discover\']/machine/none').length == 1
    'Dark'
  else
    'None'
  end
end

#set_read_rights(rights) ⇒ Object

slight misnomer: also sets discover rights! TODO: convert xpath reads to dra_object calls

Parameters:

  • rights (string)

    archetypical rights to assign: ‘world’, ‘stanford’, ‘none’, ‘dark’, etc

Raises:

  • (ArgumentError)


148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/dor/datastreams/rights_metadata_ds.rb', line 148

def set_read_rights(rights)
  raise(ArgumentError, "Argument '#{rights}' is not a recognized value") unless RightsMetadataDS.valid_rights_type? rights

  rights_xml = ng_xml
  if rights_xml.search('//rightsMetadata/access[@type=\'read\']').length == 0
    raise('The rights metadata stream doesnt contain an entry for machine read permissions. Consider populating it from the APO before trying to change it.')
  end

  ng_xml_will_change!
  RightsMetadataDS.upd_rights_xml_for_rights_type(rights_xml, rights)

  @dra_object = nil # until TODO complete, we'll expect to have to reparse after modification
end

#use_licenseObject



162
163
164
165
166
167
168
# File 'lib/dor/datastreams/rights_metadata_ds.rb', line 162

def use_license
  use_license = []
  use_license += Array(creative_commons)
  use_license += Array(open_data_commons)

  use_license.reject(&:blank?)
end