dor-services 2.2.4 → 4.4.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/bin/dor-indexer +108 -0
- data/bin/dor-indexerd +73 -0
- data/bin/nokogiri +19 -0
- data/bin/rake +19 -0
- data/bin/ruby_noexec_wrapper +14 -0
- data/bin/solrizer +19 -0
- data/bin/solrizerd +19 -0
- data/config/certs/README +1 -0
- data/config/config_defaults.yml +62 -0
- data/config/dev_console_env.rb.example +67 -0
- data/config/predicate_mappings.yml +55 -0
- data/lib/dor-services.rb +152 -19
- data/lib/dor/config.rb +133 -35
- data/lib/dor/datastreams/administrative_metadata_ds.rb +84 -0
- data/lib/dor/datastreams/content_metadata_ds.rb +337 -0
- data/lib/dor/datastreams/datastream_spec_solrizer.rb +18 -0
- data/lib/dor/datastreams/default_object_rights_ds.rb +52 -0
- data/lib/dor/datastreams/desc_metadata_ds.rb +39 -0
- data/lib/{datastreams → dor/datastreams}/embargo_metadata_ds.rb +25 -20
- data/lib/{datastreams → dor/datastreams}/events_ds.rb +14 -9
- data/lib/dor/datastreams/identity.xsl +8 -0
- data/lib/dor/datastreams/identity_metadata_ds.rb +112 -0
- data/lib/dor/datastreams/role_metadata_ds.rb +51 -0
- data/lib/dor/datastreams/simple_dublin_core_ds.rb +45 -0
- data/lib/dor/datastreams/version_metadata_ds.rb +214 -0
- data/lib/dor/datastreams/workflow_definition_ds.rb +113 -0
- data/lib/dor/datastreams/workflow_ds.rb +103 -0
- data/lib/dor/exceptions.rb +0 -1
- data/lib/dor/migrations/content_metadata_ds/change_content_type.rb +7 -0
- data/lib/dor/migrations/identifiable/assert_adminPolicy.rb +9 -0
- data/lib/dor/migrations/identifiable/fix_model_assertions.rb +13 -0
- data/lib/dor/migrations/identifiable/record_remediation.rb +18 -0
- data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +18 -0
- data/lib/dor/migrations/identifiable/uriify_contentlocation_refs.rb +18 -0
- data/lib/dor/migrations/processable/unify_workflows.rb +17 -0
- data/lib/dor/migrations/versionable/add_missing_version_md.rb +9 -0
- data/lib/dor/models/admin_policy_object.rb +16 -0
- data/lib/dor/models/assembleable.rb +14 -0
- data/lib/dor/models/collection.rb +14 -0
- data/lib/dor/models/contentable.rb +227 -0
- data/lib/dor/models/describable.rb +194 -0
- data/lib/dor/models/discoverable.rb +66 -0
- data/lib/dor/models/editable.rb +267 -0
- data/lib/dor/models/embargoable.rb +97 -0
- data/lib/dor/models/eventable.rb +12 -0
- data/lib/dor/models/governable.rb +162 -0
- data/lib/dor/models/identifiable.rb +211 -0
- data/lib/dor/models/item.rb +44 -0
- data/lib/dor/models/itemizable.rb +66 -0
- data/lib/dor/{mods2dc.xslt → models/mods2dc.xslt} +39 -12
- data/lib/dor/models/preservable.rb +50 -0
- data/lib/dor/models/processable.rb +229 -0
- data/lib/dor/models/publishable.rb +74 -0
- data/lib/dor/models/set.rb +12 -0
- data/lib/dor/models/shelvable.rb +27 -0
- data/lib/dor/models/upgradable.rb +74 -0
- data/lib/dor/models/versionable.rb +94 -0
- data/lib/dor/models/workflow_object.rb +54 -0
- data/lib/dor/services/cleanup_service.rb +47 -0
- data/lib/dor/services/digital_stacks_service.rb +55 -0
- data/lib/dor/services/merge_service.rb +96 -0
- data/lib/dor/{metadata_handlers → services/metadata_handlers}/catalog_handler.rb +0 -2
- data/lib/dor/{metadata_handlers → services/metadata_handlers}/mdtoolkit_handler.rb +0 -2
- data/lib/dor/{metadata_service.rb → services/metadata_service.rb} +1 -3
- data/lib/dor/services/registration_service.rb +181 -0
- data/lib/dor/services/sdr_ingest_service.rb +181 -0
- data/lib/dor/services/search_service.rb +131 -0
- data/lib/dor/services/suri_service.rb +32 -0
- data/lib/dor/services/technical_metadata_service.rb +226 -0
- data/lib/dor/{tei2dc.xslt → services/tei2dc.xslt} +0 -0
- data/lib/dor/utils/ng_tidy.rb +37 -0
- data/lib/dor/utils/predicate_patch.rb +23 -0
- data/lib/dor/utils/solr_doc_helper.rb +9 -0
- data/lib/dor/utils/utc_date_field_mapper.rb +7 -0
- data/lib/dor/version.rb +3 -0
- data/lib/dor/workflow/document.rb +131 -0
- data/lib/dor/workflow/graph.rb +166 -0
- data/lib/dor/workflow/process.rb +99 -0
- data/lib/gsearch/demoFoxmlToSolr.xslt +340 -122
- data/lib/tasks/dor.rake +39 -0
- metadata +494 -384
- data/lib/datastreams/content_metadata_ds.rb +0 -12
- data/lib/datastreams/identity_metadata_ds.rb +0 -28
- data/lib/datastreams/ng_tidy.rb +0 -19
- data/lib/datastreams/simple_dublin_core_ds.rb +0 -23
- data/lib/datastreams/workflow_definition_ds.rb +0 -105
- data/lib/datastreams/workflow_ds.rb +0 -16
- data/lib/dor/admin_policy_object.rb +0 -11
- data/lib/dor/base.rb +0 -81
- data/lib/dor/cleanup_service.rb +0 -32
- data/lib/dor/digital_stacks_service.rb +0 -82
- data/lib/dor/druid_utils.rb +0 -41
- data/lib/dor/embargo.rb +0 -41
- data/lib/dor/item.rb +0 -141
- data/lib/dor/provenance_metadata_service.rb +0 -65
- data/lib/dor/registration_service.rb +0 -87
- data/lib/dor/rsolr.rb +0 -27
- data/lib/dor/sdr_ingest_service.rb +0 -117
- data/lib/dor/search_service.rb +0 -86
- data/lib/dor/suri_service.rb +0 -37
- data/lib/dor/workflow_object.rb +0 -13
- data/lib/dor/workflow_service.rb +0 -111
- data/lib/xml_models/foxml.rb +0 -261
- data/lib/xml_models/identity_metadata/dublin_core.rb +0 -119
- data/lib/xml_models/identity_metadata/identity_metadata.rb +0 -288
@@ -0,0 +1,66 @@
|
|
1
|
+
module Dor
|
2
|
+
module Discoverable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
#index gryphondor fields
|
5
|
+
require 'stanford-mods'
|
6
|
+
def to_solr(solr_doc=Hash.new, *args)
|
7
|
+
super solr_doc, *args
|
8
|
+
|
9
|
+
if self.descMetadata and not self.descMetadata.new?
|
10
|
+
stanford_mods_record=Stanford::Mods::Record.new
|
11
|
+
stanford_mods_record.from_str(self.descMetadata.ng_xml.to_s)
|
12
|
+
doc_hash = {
|
13
|
+
:sw_format_facet => stanford_mods_record.format,
|
14
|
+
# title fields
|
15
|
+
:sw_title_245a_search_facet_facet => stanford_mods_record.sw_short_title,
|
16
|
+
:sw_title_245_search_facet_facet => stanford_mods_record.sw_full_title,
|
17
|
+
:sw_title_variant_search_facet_facet => stanford_mods_record.sw_addl_titles,
|
18
|
+
:sw_title_sort_facet => stanford_mods_record.sw_sort_title,
|
19
|
+
:sw_title_245a_display_facet => stanford_mods_record.sw_short_title,
|
20
|
+
:sw_title_display_facet => stanford_mods_record.sw_full_title,
|
21
|
+
:sw_title_full_display_facet => stanford_mods_record.sw_full_title,
|
22
|
+
|
23
|
+
# author fields
|
24
|
+
:sw_author_1xx_search_facet_facet => stanford_mods_record.sw_main_author,
|
25
|
+
:sw_author_7xx_search_facet_facet => stanford_mods_record.sw_addl_authors,
|
26
|
+
:sw_author_person_facet_facet => stanford_mods_record.sw_person_authors,
|
27
|
+
:sw_author_other_facet_facet => stanford_mods_record.sw_impersonal_authors,
|
28
|
+
#:sw_author_sort_facet => stanford_mods_record.sw_sort_author,
|
29
|
+
:sw_author_corp_display_facet => stanford_mods_record.sw_corporate_authors,
|
30
|
+
:sw_author_meeting_display_facet => stanford_mods_record.sw_meeting_authors,
|
31
|
+
:sw_author_person_display_facet => stanford_mods_record.sw_person_authors,
|
32
|
+
:sw_author_person_full_display_facet => stanford_mods_record.sw_person_authors,
|
33
|
+
|
34
|
+
# subject search fields
|
35
|
+
:sw_topic_search_facet_facet => stanford_mods_record.topic_search,
|
36
|
+
:sw_geographic_search_facet_facet => stanford_mods_record.geographic_search,
|
37
|
+
:sw_subject_other_search_facet_facet => stanford_mods_record.subject_other_search,
|
38
|
+
:sw_subject_other_subvy_search_facet_facet => stanford_mods_record.subject_other_subvy_search,
|
39
|
+
:sw_subject_all_search_facet_facet => stanford_mods_record.subject_all_search,
|
40
|
+
:sw_topic_facet_facet => stanford_mods_record.topic_facet,
|
41
|
+
:sw_geographic_facet_facet => stanford_mods_record.geographic_facet,
|
42
|
+
:sw_era_facet_facet => stanford_mods_record.era_facet,
|
43
|
+
|
44
|
+
:sw_language_facet => stanford_mods_record.sw_language_facet,
|
45
|
+
#:sw_physical => stanford_mods_record.term_values([:sw_physical_description, :sw_extent]),
|
46
|
+
#:sw_summary_search_facet_facet => stanford_mods_record.term_values(:sw_abstract),
|
47
|
+
#:sw_toc_search_facet_facet => stanford_mods_record.term_values(:sw_tableOfContents),
|
48
|
+
#:sw_url_suppl => stanford_mods_record.term_values([:sw_related_item, :sw_location, :sw_url]),
|
49
|
+
|
50
|
+
#publish date fields
|
51
|
+
:sw_pub_search_facet_facet => stanford_mods_record.place,
|
52
|
+
:sw_pub_date_sort_facet => stanford_mods_record.pub_date_sort,
|
53
|
+
:sw_pub_date_group_facet_facet => stanford_mods_record.pub_date_groups(stanford_mods_record.pub_date),
|
54
|
+
:sw_pub_date_facet =>stanford_mods_record.pub_date_facet,
|
55
|
+
:sw_pub_date_display_facet => stanford_mods_record.pub_date_display,
|
56
|
+
:sw_all_search_facet_facet => stanford_mods_record.text
|
57
|
+
|
58
|
+
}
|
59
|
+
if doc_hash
|
60
|
+
solr_doc = solr_doc.merge(doc_hash)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
solr_doc
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,267 @@
|
|
1
|
+
module Dor
|
2
|
+
module Editable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
include ActiveFedora::Relationships
|
5
|
+
|
6
|
+
included do
|
7
|
+
belongs_to 'agreement_object', :property => :referencesAgreement, :class_name => "Dor::Item"
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_solr(solr_doc=Hash.new, *args)
|
11
|
+
super(solr_doc, *args)
|
12
|
+
add_solr_value(solr_doc, "default_rights", default_rights, :string, [:facetable])
|
13
|
+
add_solr_value(solr_doc, "agreement", agreement, :string, [:facetable]) if agreement_object
|
14
|
+
solr_doc
|
15
|
+
end
|
16
|
+
#Adds a person or group to a role in the APO role metadata datastream
|
17
|
+
#
|
18
|
+
#@param role [String] the role the group or person will be filed under, ex. dor-apo-manager
|
19
|
+
#@param entity [String] the name of the person or group, ex dlss:developers or sunetid:someone
|
20
|
+
#@param type [Symbol] :workgroup for a group or :person for a person
|
21
|
+
def add_roleplayer role, entity, type=:workgroup
|
22
|
+
xml=self.roleMetadata.ng_xml
|
23
|
+
group='person'
|
24
|
+
if type == :workgroup
|
25
|
+
group='group'
|
26
|
+
end
|
27
|
+
nodes = xml.search('/roleMetadata/role[@type=\''+role+'\']')
|
28
|
+
if nodes.length > 0
|
29
|
+
group_node=Nokogiri::XML::Node.new(group, xml)
|
30
|
+
id_node=Nokogiri::XML::Node.new('identifier', xml)
|
31
|
+
group_node.add_child(id_node)
|
32
|
+
id_node.content=entity
|
33
|
+
id_node['type']=type.to_s
|
34
|
+
nodes.first.add_child(group_node)
|
35
|
+
else
|
36
|
+
node=Nokogiri::XML::Node.new('role', xml)
|
37
|
+
node['type']=role
|
38
|
+
group_node=Nokogiri::XML::Node.new(group, xml)
|
39
|
+
node.add_child group_node
|
40
|
+
id_node=Nokogiri::XML::Node.new('identifier', xml)
|
41
|
+
group_node.add_child(id_node)
|
42
|
+
id_node.content=entity
|
43
|
+
id_node['type']=type.to_s
|
44
|
+
xml.search('/roleMetadata').first.add_child(node)
|
45
|
+
end
|
46
|
+
self.roleMetadata.content=xml.to_s
|
47
|
+
end
|
48
|
+
#remove all people groups and roles from the APO role metadata datastream
|
49
|
+
def purge_roles
|
50
|
+
xml=self.roleMetadata.ng_xml
|
51
|
+
nodes = xml.search('/roleMetadata/role')
|
52
|
+
nodes.each do |node|
|
53
|
+
node.remove
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def mods_title
|
58
|
+
return self.descMetadata.term_values(:title_info, :main_title).first
|
59
|
+
end
|
60
|
+
def mods_title=(val)
|
61
|
+
self.descMetadata.update_values({[:title_info, :main_title] => val})
|
62
|
+
end
|
63
|
+
#get all collections listed for this APO, used during registration
|
64
|
+
#@return [Array] array of pids
|
65
|
+
def default_collections
|
66
|
+
return administrativeMetadata.term_values(:registration, :default_collection)
|
67
|
+
end
|
68
|
+
#Add a collection to the listing of collections for items governed by this apo.
|
69
|
+
#@param val [String] pid of the collection, ex. druid:ab123cd4567
|
70
|
+
def add_default_collection val
|
71
|
+
ds=self.administrativeMetadata
|
72
|
+
xml=ds.ng_xml
|
73
|
+
reg=xml.search('//administrativeMetadata/registration').first
|
74
|
+
if not reg
|
75
|
+
reg=Nokogiri::XML::Node.new('registration',xml)
|
76
|
+
xml.search('/administrativeMetadata').first.add_child(reg)
|
77
|
+
end
|
78
|
+
node=Nokogiri::XML::Node.new('collection',xml)
|
79
|
+
node['id']=val
|
80
|
+
reg.add_child(node)
|
81
|
+
self.administrativeMetadata.content=xml.to_s
|
82
|
+
end
|
83
|
+
|
84
|
+
def remove_default_collection val
|
85
|
+
ds=self.administrativeMetadata
|
86
|
+
xml=ds.ng_xml
|
87
|
+
xml.search('//administrativeMetadata/registration/collection[@id=\''+val+'\']').remove
|
88
|
+
self.administrativeMetadata.content=xml.to_s
|
89
|
+
end
|
90
|
+
#Get all roles defined in the role metadata, and the people or groups in those roles. Groups are prefixed with 'workgroup:'
|
91
|
+
#@return [Hash] role => ['person','group'] ex. {"dor-apo-manager" => ["workgroup:dlss:developers", "sunetid:lmcrae"]
|
92
|
+
def roles
|
93
|
+
roles={}
|
94
|
+
self.roleMetadata.ng_xml.search('/roleMetadata/role').each do |role|
|
95
|
+
roles[role['type']]=[]
|
96
|
+
role.search('identifier').each do |entity|
|
97
|
+
roles[role['type']] << entity['type'] + ':' + entity.text()
|
98
|
+
end
|
99
|
+
end
|
100
|
+
roles
|
101
|
+
end
|
102
|
+
def metadata_source
|
103
|
+
self.administrativeMetadata.metadata_source.first
|
104
|
+
end
|
105
|
+
def metadata_source=(val)
|
106
|
+
if self.administrativeMetadata.descMetadata == nil
|
107
|
+
self.administrativeMetadata.add_child_node(self.administrativeMetadata, :descMetadata)
|
108
|
+
end
|
109
|
+
self.administrativeMetadata.update_values({[:descMetadata, :source] => val})
|
110
|
+
end
|
111
|
+
def use_statement
|
112
|
+
self.defaultObjectRights.use_statement.first
|
113
|
+
end
|
114
|
+
def use_statement=(val)
|
115
|
+
self.defaultObjectRights.update_values({[:use_statement] => val})
|
116
|
+
end
|
117
|
+
def copyright_statement
|
118
|
+
self.defaultObjectRights.copyright.first
|
119
|
+
end
|
120
|
+
def copyright_statement=(val)
|
121
|
+
self.defaultObjectRights.update_values({[:copyright] => val})
|
122
|
+
end
|
123
|
+
def creative_commons_license
|
124
|
+
self.defaultObjectRights.creative_commons.first
|
125
|
+
end
|
126
|
+
def creative_commons_license_human
|
127
|
+
self.defaultObjectRights.creative_commons_human.first
|
128
|
+
end
|
129
|
+
def creative_commons_license=(val)
|
130
|
+
(machine, human)=val
|
131
|
+
if creative_commons_license == nil
|
132
|
+
self.defaultObjectRights.add_child_node(self.defaultObjectRights.ng_xml.root, :creative_commons)
|
133
|
+
end
|
134
|
+
self.defaultObjectRights.update_values({[:creative_commons] => val})
|
135
|
+
end
|
136
|
+
def creative_commons_license_human=(val)
|
137
|
+
if creative_commons_license_human == nil
|
138
|
+
#add the nodes
|
139
|
+
self.defaultObjectRights.add_child_node(self.defaultObjectRights.ng_xml.root, :creative_commons)
|
140
|
+
end
|
141
|
+
self.defaultObjectRights.update_values({[:creative_commons_human] => val})
|
142
|
+
|
143
|
+
end
|
144
|
+
#@return [String] A description of the rights defined in the default object rights datastream. Can be 'Stanford', 'World', 'Dark' or 'None'
|
145
|
+
def default_rights
|
146
|
+
xml=self.defaultObjectRights.ng_xml
|
147
|
+
if xml.search('//rightsMetadata/access[@type=\'read\']/machine/group').length == 1
|
148
|
+
'Stanford'
|
149
|
+
else
|
150
|
+
if xml.search('//rightsMetadata/access[@type=\'read\']/machine/world').length ==1
|
151
|
+
'World'
|
152
|
+
else
|
153
|
+
if xml.search('//rightsMetadata/access[@type=\'discover\']/machine/none').length == 1
|
154
|
+
'Dark'
|
155
|
+
else
|
156
|
+
'None'
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
#Set the rights in default object rights
|
162
|
+
#@param rights [String] Stanford, World, Dark, or None
|
163
|
+
def default_rights=(rights)
|
164
|
+
rights=rights.downcase
|
165
|
+
ds = self.defaultObjectRights
|
166
|
+
rights_xml=ds.ng_xml
|
167
|
+
rights_xml.search('//rightsMetadata/access[@type=\'discover\']/machine').each do |node|
|
168
|
+
node.children.remove
|
169
|
+
if rights=='dark'
|
170
|
+
world_node=Nokogiri::XML::Node.new('none',rights_xml)
|
171
|
+
node.add_child(world_node)
|
172
|
+
else
|
173
|
+
world_node=Nokogiri::XML::Node.new('world',rights_xml)
|
174
|
+
node.add_child(world_node)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
rights_xml.search('//rightsMetadata/access[@type=\'read\']').each do |node|
|
178
|
+
node.children.remove
|
179
|
+
machine_node=Nokogiri::XML::Node.new('machine',rights_xml)
|
180
|
+
if(rights=='world')
|
181
|
+
world_node=Nokogiri::XML::Node.new(rights,rights_xml)
|
182
|
+
node.add_child(machine_node)
|
183
|
+
machine_node.add_child(world_node)
|
184
|
+
end
|
185
|
+
if rights=='stanford'
|
186
|
+
world_node=Nokogiri::XML::Node.new(rights,rights_xml)
|
187
|
+
node.add_child(machine_node)
|
188
|
+
group_node=Nokogiri::XML::Node.new('group',rights_xml)
|
189
|
+
group_node.content="Stanford"
|
190
|
+
node.add_child(machine_node)
|
191
|
+
machine_node.add_child(group_node)
|
192
|
+
end
|
193
|
+
if rights=='none' || rights == 'dark'
|
194
|
+
none_node=Nokogiri::XML::Node.new('none',rights_xml)
|
195
|
+
node.add_child(machine_node)
|
196
|
+
machine_node.add_child(none_node)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def desc_metadata_format
|
202
|
+
self.administrativeMetadata.metadata_format.first
|
203
|
+
end
|
204
|
+
def desc_metadata_format=(format)
|
205
|
+
#create the node if it isnt there already
|
206
|
+
if not self.administrativeMetadata.metadata_format.first
|
207
|
+
self.administrativeMetadata.add_child_node(self.administrativeMetadata.ng_xml.root, :metadata_format)
|
208
|
+
end
|
209
|
+
self.administrativeMetadata.update_values({[:metadata_format] => format})
|
210
|
+
end
|
211
|
+
def desc_metadata_source
|
212
|
+
self.administrativeMetadata.metadata_source.first
|
213
|
+
end
|
214
|
+
def desc_metadata_source=(source)
|
215
|
+
#create the node if it isnt there already
|
216
|
+
if not self.administrativeMetadata.metadata_source.first
|
217
|
+
self.administrativeMetadata.add_child_node(self.administrativeMetadata.ng_xml.root, :metadata_source)
|
218
|
+
end
|
219
|
+
self.administrativeMetadata.update_values({[:metadata_source] => format})
|
220
|
+
end
|
221
|
+
#List of default workflows, used to provide choices at registration
|
222
|
+
#@return [Array] and array of pids, ex ['druid:ab123cd4567']
|
223
|
+
def default_workflows
|
224
|
+
xml=self.administrativeMetadata.ng_xml
|
225
|
+
nodes=self.administrativeMetadata.term_values(:registration, :workflow_id)
|
226
|
+
if nodes.length > 0
|
227
|
+
wfs=[]
|
228
|
+
nodes.each do |node|
|
229
|
+
wfs << node
|
230
|
+
end
|
231
|
+
wfs
|
232
|
+
else
|
233
|
+
[]
|
234
|
+
end
|
235
|
+
end
|
236
|
+
#set a single default workflow
|
237
|
+
#@param wf [String] the name of the workflow, ex. 'digitizationWF'
|
238
|
+
def default_workflow=(wf)
|
239
|
+
ds=self.administrativeMetadata
|
240
|
+
xml=ds.ng_xml
|
241
|
+
nodes=xml.search('//registration/workflow')
|
242
|
+
if nodes.first
|
243
|
+
nodes.first['id']=wf
|
244
|
+
else
|
245
|
+
nodes=xml.search('//registration')
|
246
|
+
if not nodes.first
|
247
|
+
self.administrativeMetadata.add_child_node(self.administrativeMetadata.ng_xml.root, :registration)
|
248
|
+
end
|
249
|
+
nodes=xml.search('//registration')
|
250
|
+
wf_node=Nokogiri::XML::Node.new('workflow',xml)
|
251
|
+
wf_node['id']=wf
|
252
|
+
nodes.first.add_child(wf_node)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
def agreement
|
256
|
+
if agreement_object and agreement_object.first
|
257
|
+
agreement_object.first.pid
|
258
|
+
else
|
259
|
+
''
|
260
|
+
end
|
261
|
+
end
|
262
|
+
def agreement=(val)
|
263
|
+
self.agreement_object = Dor::Item.find val.to_s, :cast => true
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Dor
|
2
|
+
module Embargoable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
include Dor::Publishable
|
5
|
+
|
6
|
+
included do
|
7
|
+
has_metadata :name => 'embargoMetadata', :type => Dor::EmbargoMetadataDS, :label => 'Embargo metadata'
|
8
|
+
end
|
9
|
+
|
10
|
+
# These methods manipulate the object for embargo purposes
|
11
|
+
# They assume the object has embargoMetadata, rightsMetadata, and events datastreams
|
12
|
+
|
13
|
+
# Manipulates datastreams in the object when embargo is lifted:
|
14
|
+
# Sets embargo status to released in embargoMetadata
|
15
|
+
# Modifies rightsMetadata to remove embargoReleaseDate and updates/adds access from embargoMetadata/releaseAccess
|
16
|
+
# @param [String] release_agent name of the person, application or thing that released embargo
|
17
|
+
# @note The caller should save the object to fedora to commit the changes
|
18
|
+
def release_embargo(release_agent="unknown")
|
19
|
+
# Set status to released
|
20
|
+
embargo_md = datastreams['embargoMetadata']
|
21
|
+
embargo_md.status = 'released'
|
22
|
+
|
23
|
+
# Remove all read acces nodes
|
24
|
+
rights_xml = datastreams['rightsMetadata'].ng_xml
|
25
|
+
rights_xml.xpath("//rightsMetadata/access[@type='read']").each { |n| n.remove }
|
26
|
+
|
27
|
+
# Replace rights <access> nodes with those from embargoMetadta
|
28
|
+
release_access = embargo_md.release_access_node
|
29
|
+
release_access.xpath('//releaseAccess/access').each do |new_access|
|
30
|
+
access_sibling = rights_xml.at_xpath("//rightsMetadata/access[last()]")
|
31
|
+
if(access_sibling)
|
32
|
+
access_sibling.add_next_sibling(new_access.clone)
|
33
|
+
else
|
34
|
+
rights_xml.root.add_child(new_access.clone)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
datastreams['events'].add_event("embargo", release_agent, "Embargo released")
|
39
|
+
end
|
40
|
+
|
41
|
+
def world_doc
|
42
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
43
|
+
xml.access(:type => 'read') {
|
44
|
+
xml.machine {
|
45
|
+
xml.world
|
46
|
+
}
|
47
|
+
}
|
48
|
+
end
|
49
|
+
return builder.doc
|
50
|
+
end
|
51
|
+
|
52
|
+
def release_20_pct_vis_embargo(release_agent="unknown")
|
53
|
+
# Set status to released
|
54
|
+
embargo_md = datastreams['embargoMetadata']
|
55
|
+
embargo_md.twenty_pct_status = 'released'
|
56
|
+
|
57
|
+
# Remove all read acces nodes
|
58
|
+
rights_xml = datastreams['rightsMetadata'].ng_xml
|
59
|
+
rights_xml.xpath("//rightsMetadata/access[@type='read']").each { |n| n.remove }
|
60
|
+
|
61
|
+
# Replace rights <access> nodes with 1 machine/world node
|
62
|
+
access_sibling = rights_xml.at_xpath("//rightsMetadata/access[last()]")
|
63
|
+
if(access_sibling)
|
64
|
+
access_sibling.add_next_sibling(world_doc.root.clone)
|
65
|
+
else
|
66
|
+
rights_xml.root.add_child(world_doc.root.clone)
|
67
|
+
end
|
68
|
+
|
69
|
+
datastreams['rightsMetadata'].content_will_change!
|
70
|
+
datastreams['events'].add_event("embargo", release_agent, "20% Visibility Embargo released")
|
71
|
+
end
|
72
|
+
|
73
|
+
def update_embargo(new_date)
|
74
|
+
if not embargoMetadata.status == 'embargoed'
|
75
|
+
raise 'You cannot change the embargo date of an item thant isnt embargoed.'
|
76
|
+
end
|
77
|
+
if new_date.past?
|
78
|
+
raise 'You cannot set the embargo date to a past date.'
|
79
|
+
end
|
80
|
+
updated=false
|
81
|
+
self.rightsMetadata.ng_xml.search('//embargoReleaseDate').each do |node|
|
82
|
+
node.content=new_date.beginning_of_day.utc.xmlschema
|
83
|
+
updated=true
|
84
|
+
end
|
85
|
+
self.rightsMetadata.content=self.rightsMetadata.ng_xml.to_s
|
86
|
+
self.rightsMetadata.save
|
87
|
+
if not updated
|
88
|
+
raise 'No release date in rights metadata, cannot proceed!'
|
89
|
+
end
|
90
|
+
self.embargoMetadata.ng_xml.xpath('//releaseDate').each do |node|
|
91
|
+
node.content=new_date.beginning_of_day.utc.xmlschema
|
92
|
+
end
|
93
|
+
self.embargoMetadata.content=self.embargoMetadata.ng_xml.to_s
|
94
|
+
self.embargoMetadata.save
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
module Dor
|
2
|
+
module Governable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
include ActiveFedora::Relationships
|
5
|
+
|
6
|
+
included do
|
7
|
+
belongs_to 'admin_policy_object', :property => :is_governed_by, :class_name => "Dor::AdminPolicyObject"
|
8
|
+
has_and_belongs_to_many :collections, :property => :is_member_of_collection, :class_name => "Dor::Collection"
|
9
|
+
has_and_belongs_to_many :sets, :property => :is_member_of, :class_name => "Dor::Collection"
|
10
|
+
end
|
11
|
+
|
12
|
+
def initiate_apo_workflow(name)
|
13
|
+
self.initialize_workflow(name, 'dor', !self.new_object?)
|
14
|
+
end
|
15
|
+
|
16
|
+
def reset_to_apo_default()
|
17
|
+
rights_metadata_ds = self.rightsMetadata
|
18
|
+
#get the apo for this object
|
19
|
+
apo_druid=obj.identityMetadata.adminPolicy.first
|
20
|
+
apo_obj=Dor::Item.find(apo_druid, :lightweight => true)
|
21
|
+
rights_metadata_ds.content=apo_obj.rightsMetadata.ng_xml
|
22
|
+
end
|
23
|
+
|
24
|
+
def set_read_rights(rights)
|
25
|
+
return if not ['world','stanford','none', 'dark'].include? rights
|
26
|
+
rights_metadata_ds = self.rightsMetadata
|
27
|
+
rights_xml=rights_metadata_ds.ng_xml
|
28
|
+
if(rights_xml.search('//rightsMetadata/access[@type=\'read\']').length==0)
|
29
|
+
raise ('The rights metadata stream doesnt contain an entry for machine read permissions. Consider populating it from the APO before trying to change it.')
|
30
|
+
end
|
31
|
+
rights_xml.search('//rightsMetadata/access[@type=\'discover\']/machine').each do |node|
|
32
|
+
node.children.remove
|
33
|
+
if rights=='dark'
|
34
|
+
world_node=Nokogiri::XML::Node.new('none',rights_xml)
|
35
|
+
node.add_child(world_node)
|
36
|
+
else
|
37
|
+
world_node=Nokogiri::XML::Node.new('world',rights_xml)
|
38
|
+
node.add_child(world_node)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
rights_xml.search('//rightsMetadata/access[@type=\'read\']').each do |node|
|
42
|
+
node.children.remove
|
43
|
+
machine_node=Nokogiri::XML::Node.new('machine',rights_xml)
|
44
|
+
if(rights=='world')
|
45
|
+
world_node=Nokogiri::XML::Node.new(rights,rights_xml)
|
46
|
+
node.add_child(machine_node)
|
47
|
+
machine_node.add_child(world_node)
|
48
|
+
end
|
49
|
+
if rights=='stanford'
|
50
|
+
world_node=Nokogiri::XML::Node.new(rights,rights_xml)
|
51
|
+
node.add_child(machine_node)
|
52
|
+
group_node=Nokogiri::XML::Node.new('group',rights_xml)
|
53
|
+
group_node.content="Stanford"
|
54
|
+
node.add_child(machine_node)
|
55
|
+
machine_node.add_child(group_node)
|
56
|
+
end
|
57
|
+
if rights=='none' or rights == 'dark'
|
58
|
+
none_node=Nokogiri::XML::Node.new('none',rights_xml)
|
59
|
+
node.add_child(machine_node)
|
60
|
+
machine_node.add_child(none_node)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def add_collection(collection_or_druid)
|
66
|
+
collection = case collection_or_druid
|
67
|
+
when String
|
68
|
+
Dor::Collection.find(collection_or_druid)
|
69
|
+
when Dor::Collection
|
70
|
+
collection_or_druid
|
71
|
+
end
|
72
|
+
self.collections << collection
|
73
|
+
self.sets << collection
|
74
|
+
end
|
75
|
+
|
76
|
+
def remove_collection(collection_or_druid)
|
77
|
+
|
78
|
+
collection = case collection_or_druid
|
79
|
+
when String
|
80
|
+
Dor::Collection.find(collection_or_druid)
|
81
|
+
when Dor::Collection
|
82
|
+
collection_or_druid
|
83
|
+
end
|
84
|
+
|
85
|
+
self.collections.delete(collection)
|
86
|
+
self.sets.delete(collection)
|
87
|
+
end
|
88
|
+
#set the rights metadata datastream to the content of the APO's default object rights
|
89
|
+
def reapplyAdminPolicyObjectDefaults
|
90
|
+
rightsMetadata.content=admin_policy_object.datastreams['defaultObjectRights'].content
|
91
|
+
end
|
92
|
+
def rights
|
93
|
+
return nil unless self.respond_to? :rightsMetadata
|
94
|
+
xml=self.rightsMetadata.ng_xml
|
95
|
+
return nil if xml.search('//rightsMetadata').length != 1
|
96
|
+
if xml.search('//rightsMetadata/access[@type=\'read\']/machine/group').length == 1
|
97
|
+
'Stanford'
|
98
|
+
else
|
99
|
+
if xml.search('//rightsMetadata/access[@type=\'read\']/machine/world').length ==1
|
100
|
+
'World'
|
101
|
+
else
|
102
|
+
if xml.search('//rightsMetadata/access[@type=\'discover\']/machine/none').length == 1
|
103
|
+
'Dark'
|
104
|
+
else
|
105
|
+
'None'
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
def groups_which_manage_item
|
111
|
+
['dor-administrator','dor-apo-manager', 'dor-apo-depositor']
|
112
|
+
end
|
113
|
+
def groups_which_manage_desc_metadata
|
114
|
+
['dor-administrator','dor-apo-manager', 'dor-apo-depositor', 'dor-apo-metadata']
|
115
|
+
end
|
116
|
+
def groups_which_manage_system_metadata
|
117
|
+
['dor-administrator','dor-apo-manager', 'dor-apo-depositor']
|
118
|
+
end
|
119
|
+
def groups_which_manage_content
|
120
|
+
['dor-administrator','dor-apo-manager', 'dor-apo-depositor']
|
121
|
+
end
|
122
|
+
def groups_which_manage_rights
|
123
|
+
['dor-administrator','dor-apo-manager', 'dor-apo-depositor']
|
124
|
+
end
|
125
|
+
def groups_which_manage_embargo
|
126
|
+
['dor-administrator','dor-apo-manager', 'dor-apo-depositor']
|
127
|
+
end
|
128
|
+
def groups_which_view_content
|
129
|
+
['dor-administrator','dor-apo-manager', 'dor-apo-depositor', 'dor-viewer']
|
130
|
+
end
|
131
|
+
def groups_which_view_metadata
|
132
|
+
['dor-administrator','dor-apo-manager', 'dor-apo-depositor', 'dor-viewer']
|
133
|
+
end
|
134
|
+
def intersect arr1, arr2
|
135
|
+
return (arr1 & arr2).length > 0
|
136
|
+
end
|
137
|
+
def can_manage_item? roles
|
138
|
+
intersect roles, groups_which_manage_item
|
139
|
+
end
|
140
|
+
def can_manage_desc_metadata? roles
|
141
|
+
intersect roles, groups_which_manage_desc_metadata
|
142
|
+
end
|
143
|
+
def can_manage_system_metadata? roles
|
144
|
+
intersect roles, groups_which_manage_system_metadata
|
145
|
+
end
|
146
|
+
def can_manage_content? roles
|
147
|
+
intersect roles, groups_which_manage_content
|
148
|
+
end
|
149
|
+
def can_manage_rights? roles
|
150
|
+
intersect roles, groups_which_manage_rights
|
151
|
+
end
|
152
|
+
def can_manage_embargo? roles
|
153
|
+
intersect roles, groups_which_manage_embargo
|
154
|
+
end
|
155
|
+
def can_view_content? roles
|
156
|
+
intersect roles, groups_which_view_content
|
157
|
+
end
|
158
|
+
def can_view_metadata? roles
|
159
|
+
intersect roles, groups_which_view_metadata
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|