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.
Files changed (106) hide show
  1. checksums.yaml +15 -0
  2. data/bin/dor-indexer +108 -0
  3. data/bin/dor-indexerd +73 -0
  4. data/bin/nokogiri +19 -0
  5. data/bin/rake +19 -0
  6. data/bin/ruby_noexec_wrapper +14 -0
  7. data/bin/solrizer +19 -0
  8. data/bin/solrizerd +19 -0
  9. data/config/certs/README +1 -0
  10. data/config/config_defaults.yml +62 -0
  11. data/config/dev_console_env.rb.example +67 -0
  12. data/config/predicate_mappings.yml +55 -0
  13. data/lib/dor-services.rb +152 -19
  14. data/lib/dor/config.rb +133 -35
  15. data/lib/dor/datastreams/administrative_metadata_ds.rb +84 -0
  16. data/lib/dor/datastreams/content_metadata_ds.rb +337 -0
  17. data/lib/dor/datastreams/datastream_spec_solrizer.rb +18 -0
  18. data/lib/dor/datastreams/default_object_rights_ds.rb +52 -0
  19. data/lib/dor/datastreams/desc_metadata_ds.rb +39 -0
  20. data/lib/{datastreams → dor/datastreams}/embargo_metadata_ds.rb +25 -20
  21. data/lib/{datastreams → dor/datastreams}/events_ds.rb +14 -9
  22. data/lib/dor/datastreams/identity.xsl +8 -0
  23. data/lib/dor/datastreams/identity_metadata_ds.rb +112 -0
  24. data/lib/dor/datastreams/role_metadata_ds.rb +51 -0
  25. data/lib/dor/datastreams/simple_dublin_core_ds.rb +45 -0
  26. data/lib/dor/datastreams/version_metadata_ds.rb +214 -0
  27. data/lib/dor/datastreams/workflow_definition_ds.rb +113 -0
  28. data/lib/dor/datastreams/workflow_ds.rb +103 -0
  29. data/lib/dor/exceptions.rb +0 -1
  30. data/lib/dor/migrations/content_metadata_ds/change_content_type.rb +7 -0
  31. data/lib/dor/migrations/identifiable/assert_adminPolicy.rb +9 -0
  32. data/lib/dor/migrations/identifiable/fix_model_assertions.rb +13 -0
  33. data/lib/dor/migrations/identifiable/record_remediation.rb +18 -0
  34. data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +18 -0
  35. data/lib/dor/migrations/identifiable/uriify_contentlocation_refs.rb +18 -0
  36. data/lib/dor/migrations/processable/unify_workflows.rb +17 -0
  37. data/lib/dor/migrations/versionable/add_missing_version_md.rb +9 -0
  38. data/lib/dor/models/admin_policy_object.rb +16 -0
  39. data/lib/dor/models/assembleable.rb +14 -0
  40. data/lib/dor/models/collection.rb +14 -0
  41. data/lib/dor/models/contentable.rb +227 -0
  42. data/lib/dor/models/describable.rb +194 -0
  43. data/lib/dor/models/discoverable.rb +66 -0
  44. data/lib/dor/models/editable.rb +267 -0
  45. data/lib/dor/models/embargoable.rb +97 -0
  46. data/lib/dor/models/eventable.rb +12 -0
  47. data/lib/dor/models/governable.rb +162 -0
  48. data/lib/dor/models/identifiable.rb +211 -0
  49. data/lib/dor/models/item.rb +44 -0
  50. data/lib/dor/models/itemizable.rb +66 -0
  51. data/lib/dor/{mods2dc.xslt → models/mods2dc.xslt} +39 -12
  52. data/lib/dor/models/preservable.rb +50 -0
  53. data/lib/dor/models/processable.rb +229 -0
  54. data/lib/dor/models/publishable.rb +74 -0
  55. data/lib/dor/models/set.rb +12 -0
  56. data/lib/dor/models/shelvable.rb +27 -0
  57. data/lib/dor/models/upgradable.rb +74 -0
  58. data/lib/dor/models/versionable.rb +94 -0
  59. data/lib/dor/models/workflow_object.rb +54 -0
  60. data/lib/dor/services/cleanup_service.rb +47 -0
  61. data/lib/dor/services/digital_stacks_service.rb +55 -0
  62. data/lib/dor/services/merge_service.rb +96 -0
  63. data/lib/dor/{metadata_handlers → services/metadata_handlers}/catalog_handler.rb +0 -2
  64. data/lib/dor/{metadata_handlers → services/metadata_handlers}/mdtoolkit_handler.rb +0 -2
  65. data/lib/dor/{metadata_service.rb → services/metadata_service.rb} +1 -3
  66. data/lib/dor/services/registration_service.rb +181 -0
  67. data/lib/dor/services/sdr_ingest_service.rb +181 -0
  68. data/lib/dor/services/search_service.rb +131 -0
  69. data/lib/dor/services/suri_service.rb +32 -0
  70. data/lib/dor/services/technical_metadata_service.rb +226 -0
  71. data/lib/dor/{tei2dc.xslt → services/tei2dc.xslt} +0 -0
  72. data/lib/dor/utils/ng_tidy.rb +37 -0
  73. data/lib/dor/utils/predicate_patch.rb +23 -0
  74. data/lib/dor/utils/solr_doc_helper.rb +9 -0
  75. data/lib/dor/utils/utc_date_field_mapper.rb +7 -0
  76. data/lib/dor/version.rb +3 -0
  77. data/lib/dor/workflow/document.rb +131 -0
  78. data/lib/dor/workflow/graph.rb +166 -0
  79. data/lib/dor/workflow/process.rb +99 -0
  80. data/lib/gsearch/demoFoxmlToSolr.xslt +340 -122
  81. data/lib/tasks/dor.rake +39 -0
  82. metadata +494 -384
  83. data/lib/datastreams/content_metadata_ds.rb +0 -12
  84. data/lib/datastreams/identity_metadata_ds.rb +0 -28
  85. data/lib/datastreams/ng_tidy.rb +0 -19
  86. data/lib/datastreams/simple_dublin_core_ds.rb +0 -23
  87. data/lib/datastreams/workflow_definition_ds.rb +0 -105
  88. data/lib/datastreams/workflow_ds.rb +0 -16
  89. data/lib/dor/admin_policy_object.rb +0 -11
  90. data/lib/dor/base.rb +0 -81
  91. data/lib/dor/cleanup_service.rb +0 -32
  92. data/lib/dor/digital_stacks_service.rb +0 -82
  93. data/lib/dor/druid_utils.rb +0 -41
  94. data/lib/dor/embargo.rb +0 -41
  95. data/lib/dor/item.rb +0 -141
  96. data/lib/dor/provenance_metadata_service.rb +0 -65
  97. data/lib/dor/registration_service.rb +0 -87
  98. data/lib/dor/rsolr.rb +0 -27
  99. data/lib/dor/sdr_ingest_service.rb +0 -117
  100. data/lib/dor/search_service.rb +0 -86
  101. data/lib/dor/suri_service.rb +0 -37
  102. data/lib/dor/workflow_object.rb +0 -13
  103. data/lib/dor/workflow_service.rb +0 -111
  104. data/lib/xml_models/foxml.rb +0 -261
  105. data/lib/xml_models/identity_metadata/dublin_core.rb +0 -119
  106. 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,12 @@
1
+ module Dor
2
+ module Eventable
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ has_metadata :name => 'events', :type => Dor::EventsDS, :label => 'Events'
6
+ end
7
+
8
+ def add_event *args
9
+ self.datastreams['events'].add_event *args
10
+ end
11
+ end
12
+ 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