dor-services 5.2.0 → 5.3.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 +5 -13
- data/config/certs/robots-dor-dev.crt +29 -0
- data/config/certs/robots-dor-dev.key +27 -0
- data/config/config_defaults.yml +2 -0
- data/config/dev_console_env.rb +77 -0
- data/lib/dor-services.rb +31 -27
- data/lib/dor/config.rb +25 -19
- data/lib/dor/datastreams/administrative_metadata_ds.rb +19 -20
- data/lib/dor/datastreams/content_metadata_ds.rb +238 -177
- data/lib/dor/datastreams/datastream_spec_solrizer.rb +1 -1
- data/lib/dor/datastreams/default_object_rights_ds.rb +99 -16
- data/lib/dor/datastreams/desc_metadata_ds.rb +37 -34
- data/lib/dor/datastreams/embargo_metadata_ds.rb +16 -16
- data/lib/dor/datastreams/events_ds.rb +2 -2
- data/lib/dor/datastreams/geo_metadata_ds.rb +5 -10
- data/lib/dor/datastreams/identity_metadata_ds.rb +22 -22
- data/lib/dor/datastreams/rights_metadata_ds.rb +43 -32
- data/lib/dor/datastreams/role_metadata_ds.rb +5 -5
- data/lib/dor/datastreams/simple_dublin_core_ds.rb +13 -14
- data/lib/dor/datastreams/version_metadata_ds.rb +22 -23
- data/lib/dor/datastreams/workflow_definition_ds.rb +15 -15
- data/lib/dor/datastreams/workflow_ds.rb +64 -70
- data/lib/dor/exceptions.rb +0 -1
- data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +4 -4
- data/lib/dor/migrations/processable/unify_workflows.rb +1 -1
- data/lib/dor/models/admin_policy_object.rb +4 -4
- data/lib/dor/models/assembleable.rb +2 -3
- data/lib/dor/models/collection.rb +1 -1
- data/lib/dor/models/contentable.rb +113 -108
- data/lib/dor/models/describable.rb +136 -95
- data/lib/dor/models/editable.rb +205 -119
- data/lib/dor/models/embargoable.rb +16 -16
- data/lib/dor/models/eventable.rb +2 -2
- data/lib/dor/models/geoable.rb +3 -3
- data/lib/dor/models/governable.rb +25 -26
- data/lib/dor/models/identifiable.rb +66 -55
- data/lib/dor/models/item.rb +0 -1
- data/lib/dor/models/itemizable.rb +7 -8
- data/lib/dor/models/preservable.rb +7 -8
- data/lib/dor/models/processable.rb +76 -73
- data/lib/dor/models/publishable.rb +25 -30
- data/lib/dor/models/releaseable.rb +118 -155
- data/lib/dor/models/rightsable.rb +2 -3
- data/lib/dor/models/set.rb +1 -1
- data/lib/dor/models/shelvable.rb +8 -10
- data/lib/dor/models/upgradable.rb +5 -6
- data/lib/dor/models/versionable.rb +3 -4
- data/lib/dor/models/workflow_object.rb +15 -16
- data/lib/dor/services/cleanup_reset_service.rb +15 -16
- data/lib/dor/services/cleanup_service.rb +2 -4
- data/lib/dor/services/digital_stacks_service.rb +10 -13
- data/lib/dor/services/merge_service.rb +8 -9
- data/lib/dor/services/metadata_handlers/catalog_handler.rb +1 -1
- data/lib/dor/services/metadata_handlers/mdtoolkit_handler.rb +3 -3
- data/lib/dor/services/metadata_service.rb +19 -20
- data/lib/dor/services/registration_service.rb +80 -61
- data/lib/dor/services/reset_workspace_service.rb +6 -10
- data/lib/dor/services/sdr_ingest_service.rb +15 -16
- data/lib/dor/services/search_service.rb +18 -23
- data/lib/dor/services/suri_service.rb +6 -6
- data/lib/dor/services/technical_metadata_service.rb +27 -44
- data/lib/dor/utils/ng_tidy.rb +3 -3
- data/lib/dor/utils/sdr_client.rb +2 -3
- data/lib/dor/utils/solr_doc_helper.rb +1 -3
- data/lib/dor/version.rb +1 -1
- data/lib/dor/workflow/document.rb +43 -40
- data/lib/dor/workflow/graph.rb +26 -26
- data/lib/dor/workflow/process.rb +34 -35
- data/lib/tasks/rdoc.rake +5 -5
- metadata +129 -111
- data/lib/dor/models/presentable.rb +0 -146
data/lib/dor/models/editable.rb
CHANGED
@@ -1,147 +1,240 @@
|
|
1
1
|
module Dor
|
2
|
-
|
3
2
|
## This is basically used just by APOs. Arguably "editable" is the wrong name.
|
4
3
|
module Editable
|
5
4
|
extend ActiveSupport::Concern
|
6
5
|
|
7
6
|
included do
|
8
|
-
belongs_to :agreement_object, :property => :referencesAgreement, :class_name =>
|
7
|
+
belongs_to :agreement_object, :property => :referencesAgreement, :class_name => 'Dor::Item'
|
9
8
|
end
|
10
9
|
|
11
|
-
|
10
|
+
# these hashes map short ("machine") license codes to their corresponding URIs and human readable titles. they
|
11
|
+
# also allow for deprecated entries (via optional :deprecation_warning). clients that use these maps are advised to
|
12
|
+
# only display undeprecated entries, except where a deprecated entry is already in use by an object. e.g., an APO
|
13
|
+
# that already specifies "by_sa" for its default license code could continue displaying that in a list of license options
|
14
|
+
# for editing, preferably with the deprecation warning. but other deprecated entries would be omitted in such a
|
15
|
+
# selectbox.
|
16
|
+
# TODO: seems like Editable is not the most semantically appropriate place for these mappings? though they're used
|
17
|
+
# by methods that live in Editable.
|
18
|
+
# TODO: need some way to do versioning. for instance, what happens when a new version of an existing license comes
|
19
|
+
# out, since it will presumably use the same license code, but a different title and URI?
|
20
|
+
CREATIVE_COMMONS_USE_LICENSES = {
|
21
|
+
'by' => { :human_readable => 'Attribution 3.0 Unported',
|
22
|
+
:uri => 'https://creativecommons.org/licenses/by/3.0/' },
|
23
|
+
'by-sa' => { :human_readable => 'Attribution Share Alike 3.0 Unported',
|
24
|
+
:uri => 'https://creativecommons.org/licenses/by-sa/3.0/' },
|
25
|
+
'by_sa' => { :human_readable => 'Attribution Share Alike 3.0 Unported',
|
26
|
+
:uri => 'https://creativecommons.org/licenses/by-sa/3.0/',
|
27
|
+
:deprecation_warning => 'license code "by_sa" was a typo in argo, prefer "by-sa"' },
|
28
|
+
'by-nd' => { :human_readable => 'Attribution No Derivatives 3.0 Unported',
|
29
|
+
:uri => 'https://creativecommons.org/licenses/by-nd/3.0/' },
|
30
|
+
'by-nc' => { :human_readable => 'Attribution Non-Commercial 3.0 Unported',
|
31
|
+
:uri => 'https://creativecommons.org/licenses/by-nc/3.0/' },
|
32
|
+
'by-nc-sa' => { :human_readable => 'Attribution Non-Commercial Share Alike 3.0 Unported',
|
33
|
+
:uri => 'https://creativecommons.org/licenses/by-nc-sa/3.0/' },
|
34
|
+
'by-nc-nd' => { :human_readable => 'Attribution Non-Commercial, No Derivatives 3.0 Unported',
|
35
|
+
:uri => 'https://creativecommons.org/licenses/by-nc-nd/3.0/' },
|
36
|
+
'pdm' => { :human_readable => 'Public Domain Mark 1.0',
|
37
|
+
:uri => 'https://creativecommons.org/publicdomain/mark/1.0/'}
|
38
|
+
}
|
39
|
+
OPEN_DATA_COMMONS_USE_LICENSES = {
|
40
|
+
'pddl' => { :human_readable => 'Open Data Commons Public Domain Dedication and License 1.0',
|
41
|
+
:uri => 'http://opendatacommons.org/licenses/pddl/1.0/' },
|
42
|
+
'odc-by' => { :human_readable => 'Open Data Commons Attribution License 1.0',
|
43
|
+
:uri => 'http://opendatacommons.org/licenses/by/1.0/' },
|
44
|
+
'odc-odbl' => { :human_readable => 'Open Data Commons Open Database License 1.0',
|
45
|
+
:uri => 'http://opendatacommons.org/licenses/odbl/1.0/' }
|
46
|
+
}
|
47
|
+
|
48
|
+
def to_solr(solr_doc = {}, *args)
|
12
49
|
super(solr_doc, *args)
|
13
|
-
add_solr_value(solr_doc,
|
14
|
-
add_solr_value(solr_doc,
|
50
|
+
add_solr_value(solr_doc, 'default_rights', default_rights, :string, [:symbol])
|
51
|
+
add_solr_value(solr_doc, 'agreement', agreement, :string, [:symbol]) if agreement_object
|
52
|
+
add_solr_value(solr_doc, 'default_use_license_machine', use_license, :string, [:stored_sortable])
|
15
53
|
solr_doc
|
16
54
|
end
|
17
55
|
|
18
|
-
#Adds a person or group to a role in the APO role metadata datastream
|
56
|
+
# Adds a person or group to a role in the APO role metadata datastream
|
19
57
|
#
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
def add_roleplayer
|
24
|
-
xml=
|
58
|
+
# @param role [String] the role the group or person will be filed under, ex. dor-apo-manager
|
59
|
+
# @param entity [String] the name of the person or group, ex dlss:developers or sunetid:someone
|
60
|
+
# @param type [Symbol] :workgroup for a group or :person for a person
|
61
|
+
def add_roleplayer(role, entity, type = :workgroup)
|
62
|
+
xml = roleMetadata.ng_xml
|
25
63
|
group = type == :workgroup ? 'group' : 'person'
|
26
|
-
nodes = xml.search('/roleMetadata/role[@type=\''+role+'\']')
|
64
|
+
nodes = xml.search('/roleMetadata/role[@type=\'' + role + '\']')
|
27
65
|
if nodes.length > 0
|
28
|
-
group_node=Nokogiri::XML::Node.new(group, xml)
|
29
|
-
id_node=Nokogiri::XML::Node.new('identifier', xml)
|
66
|
+
group_node = Nokogiri::XML::Node.new(group, xml)
|
67
|
+
id_node = Nokogiri::XML::Node.new('identifier', xml)
|
30
68
|
group_node.add_child(id_node)
|
31
|
-
id_node.content=entity
|
32
|
-
id_node['type']=type.to_s
|
69
|
+
id_node.content = entity
|
70
|
+
id_node['type'] = type.to_s
|
33
71
|
nodes.first.add_child(group_node)
|
34
72
|
else
|
35
|
-
node=Nokogiri::XML::Node.new('role', xml)
|
36
|
-
node['type']=role
|
37
|
-
group_node=Nokogiri::XML::Node.new(group, xml)
|
73
|
+
node = Nokogiri::XML::Node.new('role', xml)
|
74
|
+
node['type'] = role
|
75
|
+
group_node = Nokogiri::XML::Node.new(group, xml)
|
38
76
|
node.add_child group_node
|
39
|
-
id_node=Nokogiri::XML::Node.new('identifier', xml)
|
77
|
+
id_node = Nokogiri::XML::Node.new('identifier', xml)
|
40
78
|
group_node.add_child(id_node)
|
41
|
-
id_node.content=entity
|
42
|
-
id_node['type']=type.to_s
|
79
|
+
id_node.content = entity
|
80
|
+
id_node['type'] = type.to_s
|
43
81
|
xml.search('/roleMetadata').first.add_child(node)
|
44
82
|
end
|
45
|
-
|
83
|
+
roleMetadata.content = xml.to_s
|
46
84
|
end
|
47
85
|
|
48
|
-
#remove all people groups and roles from the APO role metadata datastream
|
86
|
+
# remove all people groups and roles from the APO role metadata datastream
|
49
87
|
def purge_roles
|
50
|
-
|
88
|
+
roleMetadata.ng_xml.search('/roleMetadata/role').each do |node|
|
51
89
|
node.remove
|
52
90
|
end
|
53
91
|
end
|
54
92
|
|
55
93
|
def mods_title
|
56
|
-
|
94
|
+
descMetadata.term_values(:title_info, :main_title).first
|
57
95
|
end
|
58
96
|
def mods_title=(val)
|
59
|
-
|
97
|
+
descMetadata.update_values({[:title_info, :main_title] => val})
|
60
98
|
end
|
61
|
-
|
62
|
-
|
99
|
+
|
100
|
+
# get all collections listed for this APO, used during registration
|
101
|
+
# @return [Array] array of pids
|
63
102
|
def default_collections
|
64
|
-
|
103
|
+
administrativeMetadata.term_values(:registration, :default_collection)
|
65
104
|
end
|
66
|
-
#Add a collection to the listing of collections for items governed by this apo.
|
67
|
-
|
68
|
-
def add_default_collection
|
69
|
-
xml =
|
70
|
-
reg=xml.search('//administrativeMetadata/registration').first
|
105
|
+
# Add a collection to the listing of collections for items governed by this apo.
|
106
|
+
# @param val [String] pid of the collection, ex. druid:ab123cd4567
|
107
|
+
def add_default_collection(val)
|
108
|
+
xml = administrativeMetadata.ng_xml
|
109
|
+
reg = xml.search('//administrativeMetadata/registration').first
|
71
110
|
unless reg
|
72
|
-
reg=Nokogiri::XML::Node.new('registration',xml)
|
111
|
+
reg = Nokogiri::XML::Node.new('registration', xml)
|
73
112
|
xml.search('/administrativeMetadata').first.add_child(reg)
|
74
113
|
end
|
75
|
-
node=Nokogiri::XML::Node.new('collection',xml)
|
76
|
-
node['id']=val
|
114
|
+
node = Nokogiri::XML::Node.new('collection', xml)
|
115
|
+
node['id'] = val
|
77
116
|
reg.add_child(node)
|
78
|
-
|
117
|
+
administrativeMetadata.content = xml.to_s
|
79
118
|
end
|
80
|
-
|
81
|
-
|
82
|
-
xml
|
83
|
-
xml.
|
84
|
-
self.administrativeMetadata.content=xml.to_s
|
119
|
+
def remove_default_collection(val)
|
120
|
+
xml = administrativeMetadata.ng_xml
|
121
|
+
xml.search('//administrativeMetadata/registration/collection[@id=\'' + val + '\']').remove
|
122
|
+
administrativeMetadata.content = xml.to_s
|
85
123
|
end
|
86
|
-
|
87
|
-
|
124
|
+
|
125
|
+
# Get all roles defined in the role metadata, and the people or groups in those roles. Groups are prefixed with 'workgroup:'
|
126
|
+
# @return [Hash] role => ['person','group'] ex. {"dor-apo-manager" => ["workgroup:dlss:developers", "sunetid:lmcrae"]
|
88
127
|
def roles
|
89
|
-
roles={}
|
90
|
-
|
91
|
-
roles[role['type']]=[]
|
128
|
+
roles = {}
|
129
|
+
roleMetadata.ng_xml.search('/roleMetadata/role').each do |role|
|
130
|
+
roles[role['type']] = []
|
92
131
|
role.search('identifier').each do |entity|
|
93
|
-
roles[role['type']] << entity['type'] + ':' + entity.text
|
132
|
+
roles[role['type']] << entity['type'] + ':' + entity.text
|
94
133
|
end
|
95
134
|
end
|
96
135
|
roles
|
97
136
|
end
|
137
|
+
|
98
138
|
def metadata_source
|
99
|
-
|
139
|
+
administrativeMetadata.metadata_source.first
|
100
140
|
end
|
101
141
|
def metadata_source=(val)
|
102
|
-
if
|
103
|
-
|
142
|
+
if administrativeMetadata.descMetadata.nil?
|
143
|
+
administrativeMetadata.add_child_node(administrativeMetadata, :descMetadata)
|
104
144
|
end
|
105
|
-
|
145
|
+
administrativeMetadata.update_values({[:descMetadata, :source] => val})
|
106
146
|
end
|
147
|
+
|
107
148
|
def use_statement
|
108
|
-
|
149
|
+
defaultObjectRights.use_statement.first
|
109
150
|
end
|
110
151
|
def use_statement=(val)
|
111
|
-
|
152
|
+
defaultObjectRights.update_term!(:use_statement, val.nil? ? '' : val)
|
112
153
|
end
|
154
|
+
|
113
155
|
def copyright_statement
|
114
|
-
|
156
|
+
defaultObjectRights.copyright.first
|
115
157
|
end
|
116
158
|
def copyright_statement=(val)
|
117
|
-
|
159
|
+
defaultObjectRights.update_term!(:copyright, val.nil? ? '' : val)
|
118
160
|
end
|
161
|
+
|
119
162
|
def creative_commons_license
|
120
|
-
|
163
|
+
defaultObjectRights.creative_commons.first
|
121
164
|
end
|
122
165
|
def creative_commons_license_human
|
123
|
-
|
166
|
+
defaultObjectRights.creative_commons_human.first
|
124
167
|
end
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
168
|
+
|
169
|
+
def open_data_commons_license
|
170
|
+
defaultObjectRights.open_data_commons.first
|
171
|
+
end
|
172
|
+
def open_data_commons_license_human
|
173
|
+
defaultObjectRights.open_data_commons_human.first
|
174
|
+
end
|
175
|
+
|
176
|
+
def use_license
|
177
|
+
return creative_commons_license unless ['', nil].include?(creative_commons_license)
|
178
|
+
return open_data_commons_license unless ['', nil].include?(open_data_commons_license)
|
179
|
+
''
|
180
|
+
end
|
181
|
+
def use_license_uri
|
182
|
+
return defaultObjectRights.creative_commons.uri.first unless ['', nil].include?(defaultObjectRights.creative_commons.uri)
|
183
|
+
return defaultObjectRights.open_data_commons.uri.first unless ['', nil].include?(defaultObjectRights.open_data_commons.uri)
|
184
|
+
''
|
131
185
|
end
|
132
|
-
def
|
133
|
-
|
134
|
-
|
135
|
-
|
186
|
+
def use_license_human
|
187
|
+
return creative_commons_license_human unless ['', nil].include?(creative_commons_license_human)
|
188
|
+
return open_data_commons_license_human unless ['', nil].include?(open_data_commons_license_human)
|
189
|
+
''
|
190
|
+
end
|
191
|
+
|
192
|
+
def creative_commons_license=(use_license_machine)
|
193
|
+
defaultObjectRights.initialize_term!(:creative_commons)
|
194
|
+
defaultObjectRights.creative_commons = use_license_machine
|
195
|
+
defaultObjectRights.creative_commons.uri = CREATIVE_COMMONS_USE_LICENSES[use_license_machine][:uri]
|
196
|
+
end
|
197
|
+
def creative_commons_license_human=(use_license_human)
|
198
|
+
defaultObjectRights.initialize_term!(:creative_commons_human)
|
199
|
+
defaultObjectRights.creative_commons_human = use_license_human
|
200
|
+
end
|
201
|
+
|
202
|
+
def open_data_commons_license=(use_license_machine)
|
203
|
+
defaultObjectRights.initialize_term!(:open_data_commons)
|
204
|
+
defaultObjectRights.open_data_commons = use_license_machine
|
205
|
+
defaultObjectRights.open_data_commons.uri = OPEN_DATA_COMMONS_USE_LICENSES[use_license_machine][:uri]
|
206
|
+
end
|
207
|
+
def open_data_commons_license_human=(use_license_human)
|
208
|
+
defaultObjectRights.initialize_term!(:open_data_commons_human)
|
209
|
+
defaultObjectRights.open_data_commons_human = use_license_human
|
210
|
+
end
|
211
|
+
|
212
|
+
# @param [String|Symbol] use_license_machine The machine code for the desired Use License
|
213
|
+
# If set to `:none` then Use License is removed
|
214
|
+
def use_license=(use_license_machine)
|
215
|
+
if use_license_machine.blank? || use_license_machine == :none
|
216
|
+
# delete use license by directly removing the XML used to define the use license
|
217
|
+
defaultObjectRights.update_term!(:creative_commons, ' ')
|
218
|
+
defaultObjectRights.update_term!(:creative_commons_human, ' ')
|
219
|
+
defaultObjectRights.update_term!(:open_data_commons, ' ')
|
220
|
+
defaultObjectRights.update_term!(:open_data_commons_human, ' ')
|
221
|
+
elsif CREATIVE_COMMONS_USE_LICENSES.include? use_license_machine
|
222
|
+
self.creative_commons_license = use_license_machine
|
223
|
+
self.creative_commons_license_human = CREATIVE_COMMONS_USE_LICENSES[use_license_machine][:human_readable]
|
224
|
+
elsif OPEN_DATA_COMMONS_USE_LICENSES.include? use_license_machine
|
225
|
+
self.open_data_commons_license = use_license_machine
|
226
|
+
self.open_data_commons_license_human = OPEN_DATA_COMMONS_USE_LICENSES[use_license_machine][:human_readable]
|
227
|
+
else
|
228
|
+
fail ArgumentError, "'#{use_license_machine}' is not a valid license code"
|
136
229
|
end
|
137
|
-
self.defaultObjectRights.update_values({[:creative_commons_human] => val})
|
138
230
|
end
|
139
|
-
|
231
|
+
|
232
|
+
# @return [String] A description of the rights defined in the default object rights datastream. Can be 'Stanford', 'World', 'Dark' or 'None'
|
140
233
|
def default_rights
|
141
|
-
xml=
|
234
|
+
xml = defaultObjectRights.ng_xml
|
142
235
|
if xml.search('//rightsMetadata/access[@type=\'read\']/machine/group').length == 1
|
143
236
|
'Stanford'
|
144
|
-
elsif xml.search('//rightsMetadata/access[@type=\'read\']/machine/world').length ==1
|
237
|
+
elsif xml.search('//rightsMetadata/access[@type=\'read\']/machine/world').length == 1
|
145
238
|
'World'
|
146
239
|
elsif xml.search('//rightsMetadata/access[@type=\'discover\']/machine/none').length == 1
|
147
240
|
'Dark'
|
@@ -149,32 +242,31 @@ module Dor
|
|
149
242
|
'None'
|
150
243
|
end
|
151
244
|
end
|
152
|
-
#Set the rights in default object rights
|
153
|
-
|
245
|
+
# Set the rights in default object rights
|
246
|
+
# @param rights [String] Stanford, World, Dark, or None
|
154
247
|
def default_rights=(rights)
|
155
|
-
rights=rights.downcase
|
156
|
-
rights_xml =
|
248
|
+
rights = rights.downcase
|
249
|
+
rights_xml = defaultObjectRights.ng_xml
|
157
250
|
rights_xml.search('//rightsMetadata/access[@type=\'discover\']/machine').each do |node|
|
158
251
|
node.children.remove
|
159
|
-
world_node=Nokogiri::XML::Node.new((rights=='dark' ? 'none' : 'world'),rights_xml)
|
252
|
+
world_node = Nokogiri::XML::Node.new((rights == 'dark' ? 'none' : 'world'), rights_xml)
|
160
253
|
node.add_child(world_node)
|
161
254
|
end
|
162
255
|
rights_xml.search('//rightsMetadata/access[@type=\'read\']').each do |node|
|
163
256
|
node.children.remove
|
164
|
-
machine_node=Nokogiri::XML::Node.new('machine',rights_xml)
|
257
|
+
machine_node = Nokogiri::XML::Node.new('machine', rights_xml)
|
165
258
|
if rights == 'world'
|
166
|
-
world_node=Nokogiri::XML::Node.new(rights,rights_xml)
|
259
|
+
world_node = Nokogiri::XML::Node.new(rights, rights_xml)
|
167
260
|
node.add_child(machine_node)
|
168
261
|
machine_node.add_child(world_node)
|
169
262
|
elsif rights == 'stanford'
|
170
|
-
world_node=Nokogiri::XML::Node.new(rights,rights_xml)
|
171
263
|
node.add_child(machine_node)
|
172
|
-
group_node=Nokogiri::XML::Node.new('group',rights_xml)
|
173
|
-
group_node.content=
|
264
|
+
group_node = Nokogiri::XML::Node.new('group', rights_xml)
|
265
|
+
group_node.content = 'Stanford'
|
174
266
|
node.add_child(machine_node)
|
175
267
|
machine_node.add_child(group_node)
|
176
268
|
elsif rights == 'none' || rights == 'dark'
|
177
|
-
none_node=Nokogiri::XML::Node.new('none',rights_xml)
|
269
|
+
none_node = Nokogiri::XML::Node.new('none', rights_xml)
|
178
270
|
node.add_child(machine_node)
|
179
271
|
machine_node.add_child(none_node)
|
180
272
|
else
|
@@ -184,65 +276,59 @@ module Dor
|
|
184
276
|
end
|
185
277
|
|
186
278
|
def desc_metadata_format
|
187
|
-
|
279
|
+
administrativeMetadata.metadata_format.first
|
188
280
|
end
|
189
281
|
def desc_metadata_format=(format)
|
190
|
-
#create the node if it isnt there already
|
191
|
-
unless
|
192
|
-
|
282
|
+
# create the node if it isnt there already
|
283
|
+
unless administrativeMetadata.metadata_format.first
|
284
|
+
administrativeMetadata.add_child_node(administrativeMetadata.ng_xml.root, :metadata_format)
|
193
285
|
end
|
194
|
-
|
286
|
+
administrativeMetadata.update_values({[:metadata_format] => format})
|
195
287
|
end
|
288
|
+
|
196
289
|
def desc_metadata_source
|
197
|
-
|
290
|
+
administrativeMetadata.metadata_source.first
|
198
291
|
end
|
199
292
|
def desc_metadata_source=(source)
|
200
|
-
#create the node if it isnt there already
|
201
|
-
unless
|
202
|
-
|
293
|
+
# create the node if it isnt there already
|
294
|
+
unless administrativeMetadata.metadata_source.first
|
295
|
+
administrativeMetadata.add_child_node(administrativeMetadata.ng_xml.root, :metadata_source)
|
203
296
|
end
|
204
|
-
|
297
|
+
administrativeMetadata.update_values({[:metadata_source] => format})
|
205
298
|
end
|
206
|
-
|
207
|
-
|
299
|
+
|
300
|
+
# List of default workflows, used to provide choices at registration
|
301
|
+
# @return [Array] and array of pids, ex ['druid:ab123cd4567']
|
208
302
|
def default_workflows
|
209
|
-
|
210
|
-
nodes=self.administrativeMetadata.term_values(:registration, :workflow_id)
|
211
|
-
if nodes.length > 0
|
212
|
-
wfs=[]
|
213
|
-
nodes.each do |node|
|
214
|
-
wfs << node
|
215
|
-
end
|
216
|
-
wfs
|
217
|
-
else
|
218
|
-
[]
|
219
|
-
end
|
303
|
+
administrativeMetadata.term_values(:registration, :workflow_id)
|
220
304
|
end
|
221
|
-
#set a single default workflow
|
222
|
-
|
305
|
+
# set a single default workflow
|
306
|
+
# @param wf [String] the name of the workflow, ex. 'digitizationWF'
|
223
307
|
def default_workflow=(wf)
|
224
|
-
|
225
|
-
|
308
|
+
fail ArgumentError, 'Must have a valid workflow for default' if wf.blank?
|
309
|
+
xml = administrativeMetadata.ng_xml
|
310
|
+
nodes = xml.search('//registration/workflow')
|
226
311
|
if nodes.first
|
227
|
-
nodes.first['id']=wf
|
312
|
+
nodes.first['id'] = wf
|
228
313
|
else
|
229
|
-
nodes=xml.search('//registration')
|
314
|
+
nodes = xml.search('//registration')
|
230
315
|
unless nodes.first
|
231
|
-
reg_node=Nokogiri::XML::Node.new('registration',xml)
|
316
|
+
reg_node = Nokogiri::XML::Node.new('registration', xml)
|
232
317
|
xml.root.add_child(reg_node)
|
233
318
|
end
|
234
|
-
nodes=xml.search('//registration')
|
235
|
-
wf_node=Nokogiri::XML::Node.new('workflow',xml)
|
236
|
-
wf_node['id']=wf
|
319
|
+
nodes = xml.search('//registration')
|
320
|
+
wf_node = Nokogiri::XML::Node.new('workflow', xml)
|
321
|
+
wf_node['id'] = wf
|
237
322
|
nodes.first.add_child(wf_node)
|
238
323
|
end
|
239
324
|
end
|
325
|
+
|
240
326
|
def agreement
|
241
327
|
agreement_object ? agreement_object.pid : ''
|
242
328
|
end
|
243
329
|
def agreement=(val)
|
330
|
+
fail ArgumentError, 'agreement must have a valid druid' if val.blank?
|
244
331
|
self.agreement_object = Dor::Item.find val.to_s, :cast => true
|
245
332
|
end
|
246
333
|
end
|
247
|
-
|
248
334
|
end
|
@@ -15,7 +15,7 @@ module Dor
|
|
15
15
|
# Modifies rightsMetadata to remove embargoReleaseDate and updates/adds access from embargoMetadata/releaseAccess
|
16
16
|
# @param [String] release_agent name of the person, application or thing that released embargo
|
17
17
|
# @note The caller should save the object to fedora to commit the changes
|
18
|
-
def release_embargo(release_agent=
|
18
|
+
def release_embargo(release_agent = 'unknown')
|
19
19
|
# Set status to released
|
20
20
|
embargo_md = datastreams['embargoMetadata']
|
21
21
|
embargo_md.status = 'released'
|
@@ -27,7 +27,7 @@ module Dor
|
|
27
27
|
# Replace rights <access> nodes with those from embargoMetadta
|
28
28
|
release_access = embargo_md.release_access_node
|
29
29
|
release_access.xpath('//releaseAccess/access').each do |new_access|
|
30
|
-
access_sibling = rights_xml.at_xpath(
|
30
|
+
access_sibling = rights_xml.at_xpath('//rightsMetadata/access[last()]')
|
31
31
|
if access_sibling
|
32
32
|
access_sibling.add_next_sibling(new_access.clone)
|
33
33
|
else
|
@@ -36,10 +36,10 @@ module Dor
|
|
36
36
|
end
|
37
37
|
|
38
38
|
datastreams['rightsMetadata'].content_will_change!
|
39
|
-
datastreams['events'].add_event(
|
39
|
+
datastreams['events'].add_event('embargo', release_agent, 'Embargo released')
|
40
40
|
end
|
41
41
|
|
42
|
-
def release_20_pct_vis_embargo(release_agent=
|
42
|
+
def release_20_pct_vis_embargo(release_agent = 'unknown')
|
43
43
|
# Set status to released
|
44
44
|
embargo_md = datastreams['embargoMetadata']
|
45
45
|
embargo_md.twenty_pct_status = 'released'
|
@@ -49,7 +49,7 @@ module Dor
|
|
49
49
|
rights_xml.xpath("//rightsMetadata/access[@type='read']").each { |n| n.remove }
|
50
50
|
|
51
51
|
# Replace rights <access> nodes with 1 machine/world node
|
52
|
-
access_sibling = rights_xml.at_xpath(
|
52
|
+
access_sibling = rights_xml.at_xpath('//rightsMetadata/access[last()]')
|
53
53
|
if access_sibling
|
54
54
|
access_sibling.add_next_sibling(world_doc.root.clone)
|
55
55
|
else
|
@@ -57,7 +57,7 @@ module Dor
|
|
57
57
|
end
|
58
58
|
|
59
59
|
datastreams['rightsMetadata'].content_will_change!
|
60
|
-
datastreams['events'].add_event(
|
60
|
+
datastreams['events'].add_event('embargo', release_agent, '20% Visibility Embargo released')
|
61
61
|
end
|
62
62
|
|
63
63
|
def update_embargo(new_date)
|
@@ -67,19 +67,19 @@ module Dor
|
|
67
67
|
if new_date.past?
|
68
68
|
raise ArgumentError, 'You cannot set the embargo date to a past date.'
|
69
69
|
end
|
70
|
-
updated=false
|
71
|
-
|
72
|
-
node.content=new_date.beginning_of_day.utc.xmlschema
|
73
|
-
updated=true
|
70
|
+
updated = false
|
71
|
+
rightsMetadata.ng_xml.search('//embargoReleaseDate').each do |node|
|
72
|
+
node.content = new_date.beginning_of_day.utc.xmlschema
|
73
|
+
updated = true
|
74
74
|
end
|
75
|
-
|
76
|
-
|
75
|
+
rightsMetadata.content = rightsMetadata.ng_xml.to_s
|
76
|
+
rightsMetadata.save
|
77
77
|
raise 'No release date in rights metadata, cannot proceed!' unless updated
|
78
|
-
|
79
|
-
node.content=new_date.beginning_of_day.utc.xmlschema
|
78
|
+
embargoMetadata.ng_xml.xpath('//releaseDate').each do |node|
|
79
|
+
node.content = new_date.beginning_of_day.utc.xmlschema
|
80
80
|
end
|
81
|
-
|
82
|
-
|
81
|
+
embargoMetadata.content = embargoMetadata.ng_xml.to_s
|
82
|
+
embargoMetadata.save
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|