dor-services 5.2.0 → 5.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|