dor-services 4.5.0 → 4.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/dor/models/describable.rb +79 -32
- data/lib/dor/models/publishable.rb +1 -1
- data/lib/dor/version.rb +1 -1
- metadata +2 -2
| @@ -7,7 +7,7 @@ module Dor | |
| 7 7 | 
             
            			"http://www.loc.gov/mods/v3" =>	 'mods'
         | 
| 8 8 | 
             
            		}
         | 
| 9 9 | 
             
            		class CrosswalkError < Exception; end
         | 
| 10 | 
            -
             | 
| 10 | 
            +
             | 
| 11 11 | 
             
            		included do
         | 
| 12 12 | 
             
            			has_metadata :name => "descMetadata", :type => Dor::DescMetadataDS, :label => 'Descriptive Metadata', :control_group => 'M'
         | 
| 13 13 | 
             
            		end
         | 
| @@ -31,7 +31,7 @@ module Dor | |
| 31 31 | 
             
            				ds.content = ds.ng_xml.to_xml
         | 
| 32 32 | 
             
            			end
         | 
| 33 33 | 
             
            		end
         | 
| 34 | 
            -
             | 
| 34 | 
            +
             | 
| 35 35 | 
             
            		# Generates Dublin Core from the MODS in the descMetadata datastream using the LoC mods2dc stylesheet
         | 
| 36 36 | 
             
            		#		Should not be used for the Fedora DC datastream
         | 
| 37 37 | 
             
            		# @raise [Exception] Raises an Exception if the generated DC is empty or has no children
         | 
| @@ -41,7 +41,9 @@ module Dor | |
| 41 41 | 
             
            				raise CrosswalkError, "Unknown descMetadata namespace: #{metadata_namespace.inspect}"
         | 
| 42 42 | 
             
            			end
         | 
| 43 43 | 
             
            			xslt = Nokogiri::XSLT(File.new(File.expand_path(File.dirname(__FILE__) + "/#{format}2dc.xslt")) )
         | 
| 44 | 
            -
            			 | 
| 44 | 
            +
            			desc_md = self.descMetadata.ng_xml.dup(1)
         | 
| 45 | 
            +
            			self.add_collection_reference(desc_md)
         | 
| 46 | 
            +
            			dc_doc = xslt.transform(desc_md)
         | 
| 45 47 | 
             
            			# Remove empty nodes
         | 
| 46 48 | 
             
            			dc_doc.xpath('/oai_dc:dc/*[count(text()) = 0]').remove
         | 
| 47 49 | 
             
            			if(dc_doc.root.nil? || dc_doc.root.children.size == 0)
         | 
| @@ -49,54 +51,90 @@ module Dor | |
| 49 51 | 
             
            			end
         | 
| 50 52 | 
             
            			dc_doc
         | 
| 51 53 | 
             
            		end
         | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            +
             | 
| 55 | 
            +
                def generate_public_desc_md
         | 
| 56 | 
            +
                  doc = self.descMetadata.ng_xml.dup(1)
         | 
| 57 | 
            +
                  add_collection_reference(doc)
         | 
| 58 | 
            +
                  add_access_conditions(doc)
         | 
| 59 | 
            +
                  Nokogiri::XML(doc.to_xml) { |x| x.noblanks }.to_xml { |config| config.no_declaration }
         | 
| 60 | 
            +
            	  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                # Create MODS accessCondition statements from rightsMetadata
         | 
| 63 | 
            +
                # @param [Nokogiri::XML::Document] doc Document representing the descriptiveMetadata of the object
         | 
| 64 | 
            +
                # @note this method modifies the passed in doc
         | 
| 65 | 
            +
                def add_access_conditions(doc)
         | 
| 66 | 
            +
                  # clear out any existing accessConditions
         | 
| 67 | 
            +
                  doc.xpath('//mods:accessCondition').each {|n| n.remove}
         | 
| 68 | 
            +
                  rights = self.datastreams['rightsMetadata'].ng_xml
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  rights.xpath('//use/human[@type="useAndReproduction"]').each do |use|
         | 
| 71 | 
            +
                    new_use =  doc.create_element("accessCondition", use.text.strip, :type => 'useAndReproduction')
         | 
| 72 | 
            +
                    doc.root.element_children.last.add_next_sibling new_use
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
                  rights.xpath('//copyright/human[@type="copyright"]').each do |cr|
         | 
| 75 | 
            +
                    new_use =  doc.create_element("accessCondition", cr.text.strip, :type => 'copyright')
         | 
| 76 | 
            +
                    doc.root.element_children.last.add_next_sibling new_use
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
                  rights.xpath("//use/machine[#{ci_compare('type', 'creativecommons')}]").each do |lic|
         | 
| 79 | 
            +
                    next if(lic.text =~ /none/i)
         | 
| 80 | 
            +
                    new_text = "CC #{lic.text} : " << rights.at_xpath("//use/human[#{ci_compare('type', 'creativecommons')}]").text.strip
         | 
| 81 | 
            +
                    new_lic =  doc.create_element("accessCondition", new_text, :type => 'license')
         | 
| 82 | 
            +
                    doc.root.element_children.last.add_next_sibling new_lic
         | 
| 83 | 
            +
                  end
         | 
| 84 | 
            +
                  rights.xpath("//use/machine[#{ci_compare('type', 'opendata')}]").each do |lic|
         | 
| 85 | 
            +
                    next if(lic.text =~ /none/i)
         | 
| 86 | 
            +
                    new_text = "ODC #{lic.text} : " << rights.at_xpath("//use/human[#{ci_compare('type', 'opendata')}]").text.strip
         | 
| 87 | 
            +
                    new_lic =  doc.create_element("accessCondition", new_text, :type => 'license')
         | 
| 88 | 
            +
                    doc.root.element_children.last.add_next_sibling new_lic
         | 
| 89 | 
            +
                  end
         | 
| 90 | 
            +
            	  end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                # returns the desc metadata a relatedItem with information about the collection this object belongs to for use in published mods and mods to DC conversion
         | 
| 93 | 
            +
                # @param [Nokogiri::XML::Document] doc Document representing the descriptiveMetadata of the object
         | 
| 94 | 
            +
                # @note this method modifies the passed in doc
         | 
| 95 | 
            +
                def add_collection_reference(doc)
         | 
| 54 96 | 
             
            	    if not self.methods.include? :public_relationships
         | 
| 55 | 
            -
                    return | 
| 97 | 
            +
                    return
         | 
| 56 98 | 
             
                  end
         | 
| 57 99 | 
             
            	    relationships=self.public_relationships
         | 
| 58 | 
            -
             | 
| 59 | 
            -
            	    
         | 
| 100 | 
            +
             | 
| 60 101 | 
             
            	    collections=relationships.search('//rdf:RDF/rdf:Description/fedora:isMemberOfCollection','fedora' => 'info:fedora/fedora-system:def/relations-external#', 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' 	)
         | 
| 61 102 | 
             
            	    #if there is an existing relatedItem node with type=host and a child typeOfResource @collection=yes dont add anything
         | 
| 62 | 
            -
            	    existing_node= | 
| 63 | 
            -
                  if(existing_node.length>0)
         | 
| 64 | 
            -
                    return | 
| 103 | 
            +
            	    existing_node=doc.search('//mods:relatedItem/mods:typeOfResource[@collection=\'yes\']', 'mods' => 'http://www.loc.gov/mods/v3')
         | 
| 104 | 
            +
                  if(existing_node.length > 0)
         | 
| 105 | 
            +
                    return
         | 
| 65 106 | 
             
                  end
         | 
| 66 107 | 
             
                  collections.each do |collection_node|
         | 
| 67 108 | 
             
                    druid=collection_node['rdf:resource']
         | 
| 68 109 | 
             
                    druid=druid.gsub('info:fedora/','')
         | 
| 69 110 | 
             
                    collection_obj=Dor::Item.find(druid)
         | 
| 70 111 | 
             
                    collection_title = Dor::Describable.get_collection_title(collection_obj)
         | 
| 71 | 
            -
                     | 
| 72 | 
            -
                    node=node.first
         | 
| 73 | 
            -
                    related_item_node=Nokogiri::XML::Node.new('relatedItem',xml)
         | 
| 112 | 
            +
                    related_item_node=Nokogiri::XML::Node.new('relatedItem',doc)
         | 
| 74 113 | 
             
                    related_item_node['type']='host'
         | 
| 75 | 
            -
                    title_info_node=Nokogiri::XML::Node.new('titleInfo', | 
| 76 | 
            -
                    title_node=Nokogiri::XML::Node.new('title', | 
| 114 | 
            +
                    title_info_node=Nokogiri::XML::Node.new('titleInfo',doc)
         | 
| 115 | 
            +
                    title_node=Nokogiri::XML::Node.new('title',doc)
         | 
| 77 116 | 
             
                    title_node.content=collection_title
         | 
| 78 | 
            -
                    type_node=Nokogiri::XML::Node.new('typeOfResource', | 
| 117 | 
            +
                    type_node=Nokogiri::XML::Node.new('typeOfResource',doc)
         | 
| 79 118 | 
             
                    type_node['collection'] = 'yes'
         | 
| 80 | 
            -
                     | 
| 119 | 
            +
                    doc.root.add_child(related_item_node)
         | 
| 81 120 | 
             
                    related_item_node.add_child(title_info_node)
         | 
| 82 121 | 
             
                    title_info_node.add_child(title_node)
         | 
| 83 122 | 
             
                    related_item_node.add_child(type_node)
         | 
| 84 123 | 
             
                  end
         | 
| 85 | 
            -
                  Nokogiri::XML(xml.to_s) {|x| x.noblanks }.to_s
         | 
| 86 124 | 
             
                end
         | 
| 87 125 | 
             
            		def metadata_namespace
         | 
| 88 126 | 
             
            			desc_md = self.datastreams['descMetadata'].ng_xml
         | 
| 89 127 | 
             
            			if desc_md.nil? or desc_md.root.nil? or desc_md.root.namespace.nil?
         | 
| 90 | 
            -
            				return nil | 
| 128 | 
            +
            				return nil
         | 
| 91 129 | 
             
            			else
         | 
| 92 130 | 
             
            				return desc_md.root.namespace.href
         | 
| 93 131 | 
             
            			end
         | 
| 94 132 | 
             
            		end
         | 
| 95 | 
            -
             | 
| 133 | 
            +
             | 
| 96 134 | 
             
            		def metadata_format
         | 
| 97 135 | 
             
            			DESC_MD_FORMATS[metadata_namespace]
         | 
| 98 136 | 
             
            		end
         | 
| 99 | 
            -
             | 
| 137 | 
            +
             | 
| 100 138 | 
             
            		def to_solr(solr_doc=Hash.new, *args)
         | 
| 101 139 | 
             
            			super solr_doc, *args
         | 
| 102 140 | 
             
            			add_solr_value(solr_doc, "metadata_format", self.metadata_format, :string, [:searchable, :facetable])
         | 
| @@ -135,18 +173,18 @@ module Dor | |
| 135 173 | 
             
            				end
         | 
| 136 174 | 
             
            			end
         | 
| 137 175 | 
             
            			def delete_identifier(type,value=nil)
         | 
| 138 | 
            -
             | 
| 176 | 
            +
             | 
| 139 177 | 
             
            				ds_xml=self.descMetadata.ng_xml
         | 
| 140 | 
            -
            				ds_xml.search('//mods:identifier','mods' => 'http://www.loc.gov/mods/v3').each do |node| | 
| 178 | 
            +
            				ds_xml.search('//mods:identifier','mods' => 'http://www.loc.gov/mods/v3').each do |node|
         | 
| 141 179 | 
             
            					if node.content == value or value==nil
         | 
| 142 180 | 
             
            						node.remove
         | 
| 143 | 
            -
            						return true | 
| 181 | 
            +
            						return true
         | 
| 144 182 | 
             
            					end
         | 
| 145 183 | 
             
            				end
         | 
| 146 184 | 
             
            				return false
         | 
| 147 185 | 
             
            			end
         | 
| 148 | 
            -
             | 
| 149 | 
            -
            			def set_desc_metadata_using_label(force=false) | 
| 186 | 
            +
             | 
| 187 | 
            +
            			def set_desc_metadata_using_label(force=false)
         | 
| 150 188 | 
             
            				ds=self.descMetadata
         | 
| 151 189 | 
             
            				unless force or ds.new?#22 is the length of <?xml version="1.0"?>
         | 
| 152 190 | 
             
            					raise 'Cannot proceed, there is already content in the descriptive metadata datastream.'+ds.content.to_s
         | 
| @@ -158,10 +196,10 @@ module Dor | |
| 158 196 | 
             
            						xml.title label
         | 
| 159 197 | 
             
            						}
         | 
| 160 198 | 
             
            					}
         | 
| 161 | 
            -
            				} | 
| 199 | 
            +
            				}
         | 
| 162 200 | 
             
            				self.descMetadata.content=builder.to_xml
         | 
| 163 201 | 
             
            			end
         | 
| 164 | 
            -
             | 
| 202 | 
            +
             | 
| 165 203 | 
             
            			def self.get_collection_title(obj)
         | 
| 166 204 | 
             
            			  xml=obj.descMetadata.ng_xml
         | 
| 167 205 | 
             
            			  preferred_citation=xml.search('//mods:mods/mods:note[@type=\'preferredCitation\']','mods' => 'http://www.loc.gov/mods/v3')
         | 
| @@ -177,7 +215,7 @@ module Dor | |
| 177 215 | 
             
            	      end
         | 
| 178 216 | 
             
            	      title
         | 
| 179 217 | 
             
            		  end
         | 
| 180 | 
            -
             | 
| 218 | 
            +
             | 
| 181 219 | 
             
            			private
         | 
| 182 220 | 
             
            			#generic updater useful for updating things like title or subtitle which can only have a single occurance and must be present
         | 
| 183 221 | 
             
            			def update_simple_field(field,new_val)
         | 
| @@ -188,7 +226,16 @@ module Dor | |
| 188 226 | 
             
            				end
         | 
| 189 227 | 
             
            				return false
         | 
| 190 228 | 
             
            			end
         | 
| 191 | 
            -
             | 
| 192 | 
            -
             | 
| 229 | 
            +
             | 
| 230 | 
            +
            			# Builds case-insensitive xpath translate function call that will match the attribute to a value
         | 
| 231 | 
            +
            			def ci_compare(attribute, value)
         | 
| 232 | 
            +
                      "translate(
         | 
| 233 | 
            +
                          @#{attribute},
         | 
| 234 | 
            +
                          'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
         | 
| 235 | 
            +
                          'abcdefghijklmnopqrstuvwxyz'
         | 
| 236 | 
            +
                        ) = '#{value}' "
         | 
| 237 | 
            +
            			end
         | 
| 238 | 
            +
             | 
| 239 | 
            +
             | 
| 193 240 | 
             
            	end
         | 
| 194 241 | 
             
            end
         | 
| @@ -56,7 +56,7 @@ module Dor | |
| 56 56 | 
             
                    DigitalStacksService.transfer_to_document_store(pid, self.datastreams['rightsMetadata'].to_xml, 'rightsMetadata')
         | 
| 57 57 | 
             
                    DigitalStacksService.transfer_to_document_store(pid, public_xml, 'public')
         | 
| 58 58 | 
             
                    if self.metadata_format == 'mods'
         | 
| 59 | 
            -
                      DigitalStacksService.transfer_to_document_store(pid, self. | 
| 59 | 
            +
                      DigitalStacksService.transfer_to_document_store(pid, self.generate_public_desc_md, 'mods')
         | 
| 60 60 | 
             
                    end
         | 
| 61 61 | 
             
                  else
         | 
| 62 62 | 
             
                    # Clear out the document cache for this item
         | 
    
        data/lib/dor/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: dor-services
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 4. | 
| 4 | 
            +
              version: 4.6.0
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -13,7 +13,7 @@ authors: | |
| 13 13 | 
             
            autorequire: 
         | 
| 14 14 | 
             
            bindir: bin
         | 
| 15 15 | 
             
            cert_chain: []
         | 
| 16 | 
            -
            date: 2014-02- | 
| 16 | 
            +
            date: 2014-02-28 00:00:00.000000000 Z
         | 
| 17 17 | 
             
            dependencies:
         | 
| 18 18 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 19 19 | 
             
              name: active-fedora
         |