dor-services 5.1.1 → 5.2.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.
- checksums.yaml +8 -8
- data/lib/dor-services.rb +1 -2
- data/lib/dor/config.rb +5 -6
- data/lib/dor/datastreams/content_metadata_ds.rb +17 -20
- data/lib/dor/datastreams/datastream_spec_solrizer.rb +1 -1
- data/lib/dor/datastreams/desc_metadata_ds.rb +7 -7
- data/lib/dor/datastreams/embargo_metadata_ds.rb +2 -7
- data/lib/dor/datastreams/events_ds.rb +9 -9
- data/lib/dor/datastreams/identity_metadata_ds.rb +29 -34
- data/lib/dor/datastreams/rights_metadata_ds.rb +1 -1
- data/lib/dor/datastreams/role_metadata_ds.rb +0 -1
- data/lib/dor/datastreams/simple_dublin_core_ds.rb +12 -13
- data/lib/dor/datastreams/version_metadata_ds.rb +11 -15
- data/lib/dor/datastreams/workflow_definition_ds.rb +18 -22
- data/lib/dor/datastreams/workflow_ds.rb +24 -36
- data/lib/dor/migrations/identifiable/assert_adminPolicy.rb +1 -1
- data/lib/dor/migrations/identifiable/fix_model_assertions.rb +1 -1
- data/lib/dor/migrations/identifiable/record_remediation.rb +2 -2
- data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +1 -1
- data/lib/dor/migrations/identifiable/uriify_contentlocation_refs.rb +1 -1
- data/lib/dor/migrations/processable/unify_workflows.rb +4 -4
- data/lib/dor/migrations/versionable/add_missing_version_md.rb +2 -2
- data/lib/dor/models/assembleable.rb +2 -2
- data/lib/dor/models/collection.rb +1 -0
- data/lib/dor/models/contentable.rb +3 -3
- data/lib/dor/models/describable.rb +16 -13
- data/lib/dor/models/editable.rb +3 -3
- data/lib/dor/models/embargoable.rb +2 -2
- data/lib/dor/models/eventable.rb +2 -2
- data/lib/dor/models/geoable.rb +14 -18
- data/lib/dor/models/governable.rb +1 -1
- data/lib/dor/models/identifiable.rb +36 -57
- data/lib/dor/models/itemizable.rb +6 -6
- data/lib/dor/models/presentable.rb +12 -12
- data/lib/dor/models/preservable.rb +2 -5
- data/lib/dor/models/processable.rb +19 -25
- data/lib/dor/models/publishable.rb +2 -2
- data/lib/dor/models/releaseable.rb +165 -212
- data/lib/dor/models/shelvable.rb +10 -14
- data/lib/dor/models/upgradable.rb +11 -11
- data/lib/dor/models/versionable.rb +16 -21
- data/lib/dor/models/workflow_object.rb +3 -3
- data/lib/dor/services/cleanup_reset_service.rb +32 -27
- data/lib/dor/services/digital_stacks_service.rb +3 -3
- data/lib/dor/services/merge_service.rb +4 -8
- data/lib/dor/services/metadata_handlers/catalog_handler.rb +1 -1
- data/lib/dor/services/metadata_handlers/mdtoolkit_handler.rb +4 -6
- data/lib/dor/services/metadata_service.rb +20 -22
- data/lib/dor/services/registration_service.rb +6 -8
- data/lib/dor/services/reset_workspace_service.rb +14 -16
- data/lib/dor/services/sdr_ingest_service.rb +2 -6
- data/lib/dor/services/search_service.rb +3 -3
- data/lib/dor/services/suri_service.rb +2 -3
- data/lib/dor/services/technical_metadata_service.rb +2 -3
- data/lib/dor/utils/ng_tidy.rb +6 -6
- data/lib/dor/utils/predicate_patch.rb +1 -1
- data/lib/dor/utils/solr_doc_helper.rb +2 -2
- data/lib/dor/version.rb +1 -1
- data/lib/dor/workflow/document.rb +27 -33
- data/lib/dor/workflow/graph.rb +34 -37
- data/lib/dor/workflow/process.rb +8 -8
- data/lib/tasks/rdoc.rake +5 -5
- metadata +4 -11
- data/bin/dor-indexer +0 -108
- data/bin/dor-indexerd +0 -73
- data/config/certs/robots-dor-dev.crt +0 -29
- data/config/certs/robots-dor-dev.key +0 -27
- data/config/dev_console_env.rb +0 -78
data/lib/dor/models/editable.rb
CHANGED
@@ -99,7 +99,7 @@ module Dor
|
|
99
99
|
self.administrativeMetadata.metadata_source.first
|
100
100
|
end
|
101
101
|
def metadata_source=(val)
|
102
|
-
if self.administrativeMetadata.descMetadata
|
102
|
+
if self.administrativeMetadata.descMetadata.nil?
|
103
103
|
self.administrativeMetadata.add_child_node(self.administrativeMetadata, :descMetadata)
|
104
104
|
end
|
105
105
|
self.administrativeMetadata.update_values({[:descMetadata, :source] => val})
|
@@ -124,13 +124,13 @@ module Dor
|
|
124
124
|
end
|
125
125
|
def creative_commons_license=(val)
|
126
126
|
(machine, human)=val
|
127
|
-
if creative_commons_license
|
127
|
+
if creative_commons_license.nil?
|
128
128
|
self.defaultObjectRights.add_child_node(self.defaultObjectRights.ng_xml.root, :creative_commons)
|
129
129
|
end
|
130
130
|
self.defaultObjectRights.update_values({[:creative_commons] => val})
|
131
131
|
end
|
132
132
|
def creative_commons_license_human=(val)
|
133
|
-
if creative_commons_license_human
|
133
|
+
if creative_commons_license_human.nil?
|
134
134
|
#add the nodes
|
135
135
|
self.defaultObjectRights.add_child_node(self.defaultObjectRights.ng_xml.root, :creative_commons)
|
136
136
|
end
|
@@ -28,7 +28,7 @@ module Dor
|
|
28
28
|
release_access = embargo_md.release_access_node
|
29
29
|
release_access.xpath('//releaseAccess/access').each do |new_access|
|
30
30
|
access_sibling = rights_xml.at_xpath("//rightsMetadata/access[last()]")
|
31
|
-
if
|
31
|
+
if access_sibling
|
32
32
|
access_sibling.add_next_sibling(new_access.clone)
|
33
33
|
else
|
34
34
|
rights_xml.root.add_child(new_access.clone)
|
@@ -50,7 +50,7 @@ module Dor
|
|
50
50
|
|
51
51
|
# Replace rights <access> nodes with 1 machine/world node
|
52
52
|
access_sibling = rights_xml.at_xpath("//rightsMetadata/access[last()]")
|
53
|
-
if
|
53
|
+
if access_sibling
|
54
54
|
access_sibling.add_next_sibling(world_doc.root.clone)
|
55
55
|
else
|
56
56
|
rights_xml.root.add_child(world_doc.root.clone)
|
data/lib/dor/models/eventable.rb
CHANGED
data/lib/dor/models/geoable.rb
CHANGED
@@ -2,34 +2,30 @@ module Dor
|
|
2
2
|
module Geoable
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
-
class CrosswalkError < Exception; end
|
6
|
-
|
5
|
+
class CrosswalkError < Exception; end
|
6
|
+
|
7
7
|
included do
|
8
|
-
has_metadata :name => 'geoMetadata',
|
9
|
-
:type => Dor::GeoMetadataDS,
|
10
|
-
:label => 'Geographic Information Metadata in ISO 19139',
|
8
|
+
has_metadata :name => 'geoMetadata',
|
9
|
+
:type => Dor::GeoMetadataDS,
|
10
|
+
:label => 'Geographic Information Metadata in ISO 19139',
|
11
11
|
:control_group => 'M'
|
12
12
|
end
|
13
|
-
|
14
|
-
# @return [String] XML
|
13
|
+
|
14
|
+
# @return [String, nil] XML
|
15
15
|
def fetch_geoMetadata_datastream
|
16
16
|
candidates = self.datastreams['identityMetadata'].otherId.collect { |oid| oid.to_s }
|
17
17
|
metadata_id = Dor::MetadataService.resolvable(candidates).first
|
18
|
-
|
19
|
-
|
20
|
-
else
|
21
|
-
return nil
|
22
|
-
end
|
18
|
+
return nil if metadata_id.nil?
|
19
|
+
return Dor::MetadataService.fetch(metadata_id.to_s)
|
23
20
|
end
|
24
21
|
|
25
22
|
def build_geoMetadata_datastream(ds)
|
26
23
|
content = fetch_geoMetadata_datastream
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
24
|
+
return nil if content.nil?
|
25
|
+
ds.dsLabel = self.label
|
26
|
+
ds.ng_xml = Nokogiri::XML(content)
|
27
|
+
ds.ng_xml.normalize_text!
|
28
|
+
ds.content = ds.ng_xml.to_xml
|
33
29
|
end
|
34
30
|
end
|
35
31
|
end
|
@@ -19,10 +19,8 @@ module Dor
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def initialize attrs={}
|
22
|
-
if Dor::Config.suri.mint_ids
|
23
|
-
|
24
|
-
attrs = attrs.merge!({:pid=>Dor::SuriService.mint_id, :new_object => true})
|
25
|
-
end
|
22
|
+
if Dor::Config.suri.mint_ids && !attrs[:pid]
|
23
|
+
attrs = attrs.merge!({:pid=>Dor::SuriService.mint_id, :new_object => true})
|
26
24
|
end
|
27
25
|
super
|
28
26
|
end
|
@@ -80,7 +78,7 @@ module Dor
|
|
80
78
|
return solr_doc
|
81
79
|
end
|
82
80
|
|
83
|
-
|
81
|
+
# @return [String] calculated value for Solr index
|
84
82
|
def identity_metadata_source
|
85
83
|
if self.identityMetadata.otherId('catkey').first ||
|
86
84
|
self.identityMetadata.otherId('barcode').first
|
@@ -104,25 +102,17 @@ module Dor
|
|
104
102
|
end
|
105
103
|
|
106
104
|
def update_other_Id(type, new_val, val=nil)
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
updated=true
|
112
|
-
end
|
113
|
-
end
|
114
|
-
return updated
|
105
|
+
self.identityMetadata.ng_xml.search('//otherId[@name=\''+type+'\']')
|
106
|
+
.select{ |node| val.nil? || node.content == val }
|
107
|
+
.each { |node| node.content = new_val }
|
108
|
+
.any?
|
115
109
|
end
|
116
110
|
|
117
111
|
def remove_other_Id(type, val=nil)
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
removed=true
|
123
|
-
end
|
124
|
-
end
|
125
|
-
return removed
|
112
|
+
self.identityMetadata.ng_xml.search('//otherId[@name=\''+type+'\']')
|
113
|
+
.select{ |node| val.nil? || node.content == val }
|
114
|
+
.each(&:remove)
|
115
|
+
.any?
|
126
116
|
end
|
127
117
|
|
128
118
|
# turns a tag string into an array with one element per tag part.
|
@@ -158,11 +148,9 @@ module Dor
|
|
158
148
|
return normalized_tag
|
159
149
|
end
|
160
150
|
|
161
|
-
#Ensure that an administrative tag meets the proper mininum format
|
162
|
-
#
|
163
|
-
|
164
|
-
#
|
165
|
-
#@return [Array] the tag split into an array via ':'
|
151
|
+
# Ensure that an administrative tag meets the proper mininum format
|
152
|
+
# @param tag_str [String] the tag
|
153
|
+
# @return [Array] the tag split into an array via ':'
|
166
154
|
def validate_tag_format(tag_str)
|
167
155
|
tag_arr = split_tag_to_arr(tag_str)
|
168
156
|
|
@@ -176,9 +164,8 @@ module Dor
|
|
176
164
|
return tag_arr
|
177
165
|
end
|
178
166
|
|
179
|
-
#Add an administrative tag to an item, you will need to seperately save the item to write it to fedora
|
180
|
-
#
|
181
|
-
#@param tag [string] The tag you wish to add
|
167
|
+
# Add an administrative tag to an item, you will need to seperately save the item to write it to fedora
|
168
|
+
# @param tag [string] The tag you wish to add
|
182
169
|
def add_tag(tag)
|
183
170
|
identity_metadata_ds = self.identityMetadata
|
184
171
|
normalized_tag = validate_and_normalize_tag(tag, identity_metadata_ds.tags)
|
@@ -186,37 +173,30 @@ module Dor
|
|
186
173
|
end
|
187
174
|
|
188
175
|
def remove_tag(tag)
|
189
|
-
|
190
|
-
self.identityMetadata.ng_xml.search('//tag')
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
end
|
195
|
-
end
|
196
|
-
return removed
|
176
|
+
normtag = normalize_tag(tag)
|
177
|
+
self.identityMetadata.ng_xml.search('//tag')
|
178
|
+
.select{ |node| normalize_tag(node.content) == normtag }
|
179
|
+
.each(&:remove)
|
180
|
+
.any?
|
197
181
|
end
|
198
|
-
|
199
|
-
#Removes all displayTypes from an item in preparation of adding a new display type
|
200
|
-
#
|
201
|
-
#@return Boolean True if displayTypes were removed, False if no displayTypes were removed
|
182
|
+
|
183
|
+
# Removes all displayTypes from an item in preparation of adding a new display type
|
184
|
+
# @return Boolean True if displayTypes were removed, False if no displayTypes were removed
|
202
185
|
def remove_displayTypes
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
186
|
+
nodes = self.identityMetadata.ng_xml.search('//displayType')
|
187
|
+
# NOTE: .each after search is different than normal ruby enumerator:
|
188
|
+
# ~ ng_xml.search('//nonexistant_tag').each(&:foo) == 0
|
189
|
+
# ~ [].each(&:foo) == []
|
190
|
+
nodes.each(&:remove)
|
191
|
+
nodes.any?
|
209
192
|
end
|
210
193
|
|
211
194
|
def update_tag(old_tag, new_tag)
|
212
|
-
|
213
|
-
self.identityMetadata.ng_xml.search('//tag')
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
end
|
218
|
-
end
|
219
|
-
return updated
|
195
|
+
normtag = normalize_tag(old_tag)
|
196
|
+
self.identityMetadata.ng_xml.search('//tag')
|
197
|
+
.select{ |node| normalize_tag(node.content) == normtag }
|
198
|
+
.each { |node| node.content = normalize_tag(new_tag) }
|
199
|
+
.any?
|
220
200
|
end
|
221
201
|
|
222
202
|
def get_related_obj_display_title(related_obj, default_title)
|
@@ -231,7 +211,6 @@ module Dor
|
|
231
211
|
return default_title
|
232
212
|
end
|
233
213
|
|
234
|
-
|
235
214
|
private
|
236
215
|
def solrize_related_obj_titles(solr_doc, relationships, title_hash, field_name)
|
237
216
|
title_type = :symbol # we'll get an _ssim because of the type
|
@@ -240,7 +219,7 @@ module Dor
|
|
240
219
|
rel_druid = rel_node['rdf:resource']
|
241
220
|
next unless rel_druid # TODO: warning here would also be useful
|
242
221
|
rel_druid = rel_druid.gsub('info:fedora/', '')
|
243
|
-
if title_hash.
|
222
|
+
if title_hash.key?(rel_druid)
|
244
223
|
add_solr_value(solr_doc, field_name, title_hash[rel_druid], title_type, title_attrs)
|
245
224
|
else
|
246
225
|
related_obj = Dor.find(rel_druid)
|
@@ -8,20 +8,20 @@ module Dor
|
|
8
8
|
included do
|
9
9
|
has_metadata :name => "contentMetadata", :type => Dor::ContentMetadataDS, :label => 'Content Metadata', :control_group => 'M'
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
DIFF_FILENAME = 'cm_inv_diff'
|
13
13
|
DIFF_QUERY = DIFF_FILENAME.gsub('_', '-')
|
14
14
|
|
15
15
|
# Deletes all cm_inv_diff files in the workspace for the Item
|
16
16
|
def clear_diff_cache
|
17
17
|
if Dor::Config.stacks.local_workspace_root.nil?
|
18
|
-
raise ArgumentError, 'Missing Dor::Config.stacks.local_workspace_root'
|
18
|
+
raise ArgumentError, 'Missing Dor::Config.stacks.local_workspace_root'
|
19
19
|
end
|
20
20
|
druid = DruidTools::Druid.new(self.pid, Dor::Config.stacks.local_workspace_root)
|
21
21
|
diff_pattern = File.join(druid.temp_dir, DIFF_FILENAME + '.*')
|
22
22
|
FileUtils.rm_f Dir.glob(diff_pattern)
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
# Retrieves file difference manifest for contentMetadata from SDR
|
26
26
|
#
|
27
27
|
# @param [String] subset keyword for file attributes :shelve, :preserve, :publish. Default is :all.
|
@@ -29,7 +29,7 @@ module Dor
|
|
29
29
|
# @return [String] XML contents of cm_inv_diff manifest
|
30
30
|
def get_content_diff(subset = :all, version = nil)
|
31
31
|
if Dor::Config.stacks.local_workspace_root.nil?
|
32
|
-
raise Dor::ParameterError, 'Missing Dor::Config.stacks.local_workspace_root'
|
32
|
+
raise Dor::ParameterError, 'Missing Dor::Config.stacks.local_workspace_root'
|
33
33
|
end
|
34
34
|
unless %w{all shelve preserve publish}.include?(subset.to_s)
|
35
35
|
raise Dor::ParameterError, "Invalid subset value: #{subset}"
|
@@ -51,6 +51,6 @@ module Dor
|
|
51
51
|
response = sdr_client[sdr_query].post(current_content, :content_type => 'application/xml')
|
52
52
|
response
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
end
|
56
|
-
end
|
56
|
+
end
|
@@ -6,9 +6,9 @@ module Dor
|
|
6
6
|
DC_NS = {"dc"=>"http://purl.org/dc/elements/1.1/", "oai_dc"=>"http://www.openarchives.org/OAI/2.0/oai_dc/"}
|
7
7
|
|
8
8
|
def iiif_presentation_manifest_needed? pub_obj_doc
|
9
|
-
if
|
9
|
+
if pub_obj_doc.at_xpath('/publicObject/contentMetadata[contains(@type,"image") or contains(@type,"map")]/resource[@type="image"]')
|
10
10
|
return true
|
11
|
-
elsif
|
11
|
+
elsif pub_obj_doc.at_xpath('/publicObject/contentMetadata[@type="book"]/resource[@type="page"]')
|
12
12
|
return true
|
13
13
|
else
|
14
14
|
return false
|
@@ -32,13 +32,13 @@ module Dor
|
|
32
32
|
'@id' => "#{purl_base_uri}/iiif/manifest.json",
|
33
33
|
'label' => lbl,
|
34
34
|
'attribution' => 'Provided by the Stanford University Libraries',
|
35
|
-
'logo' => {
|
36
|
-
'@id' => "
|
37
|
-
'service' => {
|
38
|
-
'@context' => "http://iiif.io/api/image/2/context.json",
|
39
|
-
'@id' => "
|
40
|
-
'profile' => "http://iiif.io/api/image/2/level1.json"
|
41
|
-
}
|
35
|
+
'logo' => {
|
36
|
+
'@id' => "https://stacks.stanford.edu/image/iiif/wy534zh7137%2FSULAIR_rosette/full/400,/0/default.jpg",
|
37
|
+
'service' => {
|
38
|
+
'@context' => "http://iiif.io/api/image/2/context.json",
|
39
|
+
'@id' => "https://stacks.stanford.edu/image/iiif/wy534zh7137%2FSULAIR_rosette",
|
40
|
+
'profile' => "http://iiif.io/api/image/2/level1.json"
|
41
|
+
}
|
42
42
|
},
|
43
43
|
'seeAlso' => {
|
44
44
|
'@id' => "#{purl_base_uri}.mods",
|
@@ -46,14 +46,14 @@ module Dor
|
|
46
46
|
}
|
47
47
|
}
|
48
48
|
# Use the human copyright statement for attribution if present
|
49
|
-
if(cr = pub_obj_doc.at_xpath('/publicObject/rightsMetadata/copyright/human[@type="copyright"]'))
|
49
|
+
if (cr = pub_obj_doc.at_xpath('/publicObject/rightsMetadata/copyright/human[@type="copyright"]'))
|
50
50
|
manifest_data['attribution'] = cr.text
|
51
51
|
end
|
52
52
|
|
53
53
|
manifest = IIIF::Presentation::Manifest.new manifest_data
|
54
54
|
|
55
55
|
# Set viewingHint to paged if this is a book
|
56
|
-
if
|
56
|
+
if pub_obj_doc.at_xpath('/publicObject/contentMetadata[@type="book"]')
|
57
57
|
manifest.viewingHint = "paged"
|
58
58
|
end
|
59
59
|
|
@@ -65,7 +65,7 @@ module Dor
|
|
65
65
|
add_metadata 'Date', '//oai_dc:dc/dc:date', metadata, pub_obj_doc
|
66
66
|
|
67
67
|
# Save off the first dc:description without displayLabel
|
68
|
-
if(desc = pub_obj_doc.at_xpath('//oai_dc:dc/dc:description[not(@displayLabel)]', DC_NS))
|
68
|
+
if (desc = pub_obj_doc.at_xpath('//oai_dc:dc/dc:description[not(@displayLabel)]', DC_NS))
|
69
69
|
manifest.description = desc.text
|
70
70
|
end
|
71
71
|
|
@@ -13,11 +13,9 @@ module Dor
|
|
13
13
|
workflow_provenance = create_workflow_provenance(workflow_id, event_text)
|
14
14
|
dsname = 'provenanceMetadata'
|
15
15
|
ds = datastreams[dsname]
|
16
|
-
unless datastreams.keys.include?(dsname)
|
17
|
-
ds.label = 'Provenance Metadata'
|
18
|
-
end
|
16
|
+
ds.label = 'Provenance Metadata' unless datastreams.keys.include?(dsname)
|
19
17
|
ds.ng_xml = workflow_provenance
|
20
|
-
|
18
|
+
ds.content=ds.ng_xml.to_s
|
21
19
|
ds.save
|
22
20
|
end
|
23
21
|
|
@@ -29,7 +27,6 @@ module Dor
|
|
29
27
|
SdrIngestService.transfer(self,agreement_id)
|
30
28
|
end
|
31
29
|
|
32
|
-
|
33
30
|
# @return [Nokogiri::Document]
|
34
31
|
def create_workflow_provenance(workflow_id, event_text)
|
35
32
|
builder = Nokogiri::XML::Builder.new do |xml|
|
@@ -38,23 +38,21 @@ module Dor
|
|
38
38
|
'opened' => 1
|
39
39
|
}
|
40
40
|
|
41
|
+
# This is a work-around for some strange logic in ActiveFedora that
|
42
|
+
# don't allow self.workflows.new? to work if we load the object using
|
43
|
+
# .load_instance_from_solr.
|
41
44
|
def set_workflows_datastream_location
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
if self.workflows.new?
|
48
|
-
workflows.mimeType = 'application/xml'
|
49
|
-
workflows.dsLocation = File.join(Dor::Config.workflow.url,"dor/objects/#{self.pid}/workflows")
|
50
|
-
end
|
45
|
+
return if self.respond_to?(:inner_object) && self.inner_object.is_a?(ActiveFedora::SolrDigitalObject)
|
46
|
+
return unless self.workflows.new?
|
47
|
+
workflows.mimeType = 'application/xml'
|
48
|
+
workflows.dsLocation = File.join(Dor::Config.workflow.url,"dor/objects/#{self.pid}/workflows")
|
51
49
|
end
|
52
50
|
|
53
51
|
def empty_datastream?(datastream)
|
54
52
|
if datastream.new?
|
55
53
|
true
|
56
54
|
elsif datastream.class.respond_to?(:xml_template)
|
57
|
-
datastream.content.to_s.empty?
|
55
|
+
datastream.content.to_s.empty? || EquivalentXml.equivalent?(datastream.content, datastream.class.xml_template)
|
58
56
|
else
|
59
57
|
datastream.content.to_s.empty?
|
60
58
|
end
|
@@ -84,7 +82,7 @@ module Dor
|
|
84
82
|
ds.content = content
|
85
83
|
ds.ng_xml = Nokogiri::XML(content) if ds.respond_to?(:ng_xml)
|
86
84
|
ds.save unless ds.digital_object.new?
|
87
|
-
elsif force
|
85
|
+
elsif force || empty_datastream?(ds)
|
88
86
|
meth = "build_#{datastream}_datastream".to_sym
|
89
87
|
if respond_to?(meth)
|
90
88
|
content = self.send(meth, ds)
|
@@ -98,7 +96,7 @@ module Dor
|
|
98
96
|
return ds
|
99
97
|
end
|
100
98
|
|
101
|
-
def cleanup
|
99
|
+
def cleanup
|
102
100
|
CleanupService.cleanup(self)
|
103
101
|
end
|
104
102
|
|
@@ -107,7 +105,7 @@ module Dor
|
|
107
105
|
end
|
108
106
|
|
109
107
|
# @return [Hash] including :current_version, :status_code and :status_time
|
110
|
-
def status_info
|
108
|
+
def status_info
|
111
109
|
current_version = '1'
|
112
110
|
begin
|
113
111
|
current_version = self.versionMetadata.current_version_id
|
@@ -118,8 +116,8 @@ module Dor
|
|
118
116
|
#only get steps that are part of accessioning and part of the current version. That can mean they were archived with the current version
|
119
117
|
#number, or they might be active (no version number).
|
120
118
|
milestones.each do |m|
|
121
|
-
if STEPS.keys.include?(m[:milestone])
|
122
|
-
current_milestones << m unless m[:milestone] == 'registered'
|
119
|
+
if STEPS.keys.include?(m[:milestone]) && (m[:version].nil? || m[:version] == current_version)
|
120
|
+
current_milestones << m unless m[:milestone] == 'registered' && current_version.to_i > 1
|
123
121
|
end
|
124
122
|
end
|
125
123
|
|
@@ -129,12 +127,9 @@ module Dor
|
|
129
127
|
current_milestones.each do |m|
|
130
128
|
name = m[:milestone]
|
131
129
|
time = m[:at].utc.xmlschema
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
status_time = time
|
136
|
-
end
|
137
|
-
end
|
130
|
+
next unless STEPS.keys.include?(name) && STEPS[name] > status_code
|
131
|
+
status_code = STEPS[name]
|
132
|
+
status_time = time
|
138
133
|
end
|
139
134
|
|
140
135
|
return {:current_version => current_version, :status_code => status_code, :status_time => status_time}
|
@@ -220,7 +215,7 @@ module Dor
|
|
220
215
|
def initialize_workflow(name, create_ds=true, priority=0)
|
221
216
|
priority = workflows.current_priority if priority == 0
|
222
217
|
opts = { :create_ds => create_ds, :lane_id => default_workflow_lane }
|
223
|
-
opts[:priority] = priority if
|
218
|
+
opts[:priority] = priority if priority > 0
|
224
219
|
Dor::WorkflowService.create_workflow(Dor::WorkflowObject.initial_repo(name), self.pid, name, Dor::WorkflowObject.initial_workflow(name), opts)
|
225
220
|
end
|
226
221
|
|
@@ -228,16 +223,15 @@ module Dor
|
|
228
223
|
#handles formating utc date/time to human readable
|
229
224
|
# XXX: bad form to hardcode TZ here. Code smell abounds.
|
230
225
|
def format_date datetime
|
231
|
-
|
226
|
+
|
232
227
|
d = datetime.is_a?(Time) ? datetime :
|
233
228
|
DateTime.parse(datetime).in_time_zone(ActiveSupport::TimeZone.new("Pacific Time (US & Canada)"))
|
234
229
|
I18n.l(d).strftime('%Y-%m-%d %I:%M%p')
|
235
230
|
rescue
|
236
231
|
d = datetime.is_a?(Time) ? datetime : Time.parse(datetime.to_s)
|
237
232
|
d.strftime('%Y-%m-%d %I:%M%p')
|
238
|
-
|
233
|
+
|
239
234
|
end
|
240
235
|
end
|
241
236
|
|
242
|
-
|
243
237
|
end
|