ddr-core 0.3.0 → 1.2.0.rc1

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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/models/concerns/ddr/#search_builder_behavior.rb# +10 -0
  4. data/app/models/concerns/ddr/describable.rb +8 -12
  5. data/app/models/concerns/ddr/has_admin_metadata.rb +13 -65
  6. data/app/models/concerns/ddr/has_children.rb +8 -0
  7. data/app/models/concerns/ddr/has_content.rb +1 -0
  8. data/app/models/concerns/ddr/has_parent.rb +14 -2
  9. data/app/models/concerns/ddr/search_builder_behavior.rb~ +9 -0
  10. data/app/models/concerns/ddr/solr_document_behavior.rb +11 -90
  11. data/app/models/ddr/#admin_set.rb# +26 -0
  12. data/app/models/ddr/#auxiliary_resource_cache.rb# +34 -0
  13. data/app/models/ddr/admin_set.rb +3 -7
  14. data/app/models/ddr/alert.rb +16 -0
  15. data/app/models/ddr/auxiliary_resource.rb +24 -0
  16. data/app/models/ddr/auxiliary_resource.rb~ +13 -0
  17. data/app/models/ddr/cacheable_auxiliary_resource.rb~ +20 -0
  18. data/app/models/ddr/collection.rb +5 -4
  19. data/app/models/ddr/component.rb +8 -0
  20. data/app/models/ddr/contact.rb +1 -5
  21. data/app/models/ddr/finding_aid.rb +61 -0
  22. data/app/models/ddr/item.rb +0 -14
  23. data/app/models/ddr/language.rb +1 -6
  24. data/app/models/ddr/resource.rb +14 -0
  25. data/app/models/ddr/rights_statement.rb +2 -6
  26. data/config/locales/ddr-core.en.yml +4 -1
  27. data/db/migrate/20200207194453_add_default_to_lock_version.rb +6 -0
  28. data/lib/ddr/auth/#duke_person.rb# +9 -0
  29. data/lib/ddr/auth/ability_definitions/publication_ability_definitions.rb +7 -0
  30. data/lib/ddr/auth/ability_definitions/role_based_ability_definitions.rb +2 -2
  31. data/lib/ddr/auth/ability_definitions/superuser_ability_definitions.rb +3 -0
  32. data/lib/ddr/auth/duke_directory.rb~ +7 -0
  33. data/lib/ddr/auth/effective_permissions.rb +2 -1
  34. data/lib/ddr/auth/effective_roles.rb +6 -2
  35. data/lib/ddr/auth/failure_app.rb +1 -1
  36. data/lib/ddr/auth/grouper_gateway.rb +2 -2
  37. data/lib/ddr/auth/permissions.rb +14 -11
  38. data/lib/ddr/auth/role_based_access_controls_enforcement.rb +1 -37
  39. data/lib/ddr/auth/roles.rb +15 -3
  40. data/lib/ddr/auth/roles/role.rb +27 -69
  41. data/lib/ddr/auth/roles/role_types.rb +13 -6
  42. data/lib/ddr/core.rb +9 -0
  43. data/lib/ddr/core/version.rb +1 -1
  44. data/lib/ddr/fits.rb +0 -91
  45. data/lib/ddr/index.rb +2 -2
  46. data/lib/ddr/index/csv_query_result.rb +27 -20
  47. data/lib/ddr/index/fields.rb +5 -0
  48. data/lib/ddr/managers/technical_metadata_manager.rb +9 -4
  49. data/lib/ddr/structure.rb +2 -1
  50. data/lib/ddr/vocab/asset.rb +4 -0
  51. data/lib/ddr/workflow.rb +1 -0
  52. metadata +35 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 72f6e405acd06621c1a3f1001264c0d8d8bd5302c3e0f36b7ad5805f990eaa99
4
- data.tar.gz: 826a0ae2eda2c5937b4c312e140e55672a4e55af807e2980082e0beae85342d0
3
+ metadata.gz: c58f60f94bc6a54ea670eb5a7a096e69221e5b8e6fce28191b939f283d4c3528
4
+ data.tar.gz: 170f607020dfabfa89c77c4a31b3daa10bc7d40bd06c251ff3e3d0a0372159e2
5
5
  SHA512:
6
- metadata.gz: 03b21dcd66f1a220167fc421849d4a1f7996be806c310f92adfad14ee8f7f9cc0ca030f4d718a29be95586eac0b757d5d78e086ac9b5442d7865bab1d326a438
7
- data.tar.gz: cf249bc22b8b381f20b3149ba421496098aa4576528460cbde047e7fdded8396ceb66f522428ed11677799c5bbd0ea53676bb199ea80c9b8c3d75d05508e1eab
6
+ metadata.gz: 7ff5d87897742e3f736e3313a06145a6d378e168e72d6872effc563906370fe66865bf663027defe32041a45ab92910dab97e9d9a1ebd6d21bdf1d9b0b381b84
7
+ data.tar.gz: 48869cd2b81bd88378779ab319fb4a13407bc9060aa099b6b45d33469e8d6605af177aecff033b921f5588bca616f94e077ce75455d45ddba2a619fc7d0119a7
data/README.md CHANGED
@@ -6,7 +6,7 @@ A port of ddr-models based on Valkyrie.
6
6
 
7
7
  Install docker (Docker for Mac includes all the required components).
8
8
 
9
- Change to the `.docker` directory.
9
+ Change to the `.docker` directory.
10
10
 
11
11
  Start the *development* stack:
12
12
 
@@ -0,0 +1,10 @@
1
+ module Ddr
2
+ module SearchBuilderBehavior
3
+
4
+ def effective_role_filter(agents)
5
+ # https://lucene.apache.org/solr/guide/7_7/other-parsers.html#term-query-parser
6
+ "{!terms f=#{Ddr::Index::Fields::EFFECTIVE_ROLE} method=booleanQuery}#{agents.join(',')}"
7
+ end
8
+
9
+ end
10
+ end
@@ -15,6 +15,8 @@ module Ddr
15
15
  term_names
16
16
  end
17
17
 
18
+ # Dublin Core vocabulary comes from the rdf-vocab gem (https://github.com/ruby-rdf/rdf-vocab)
19
+ # DDR vocabulary is defined locally
18
20
  def self.vocabularies
19
21
  [RDF::Vocab::DC, Ddr::Vocab::DukeTerms].freeze
20
22
  end
@@ -34,7 +36,11 @@ module Ddr
34
36
 
35
37
  included do
36
38
  Ddr::Describable.term_names.each do |term_name|
37
- attribute term_name, Valkyrie::Types::Set
39
+ if term_name == :available # Intercept dcterms:available and set it to a single date so it can be used for embargoes
40
+ attribute term_name, Valkyrie::Types::DateTime.optional
41
+ else
42
+ attribute term_name, Valkyrie::Types::Set
43
+ end
38
44
  end
39
45
  end
40
46
 
@@ -53,7 +59,7 @@ module Ddr
53
59
  arg = args.pop
54
60
  terms = case arg.to_sym
55
61
  when :empty
56
- desc_metadata_terms.select { |t| values(t).empty? }
62
+ desc_metadata_terms.select { |t| values(t).nil? || values(t).empty? }
57
63
  when :present
58
64
  desc_metadata_terms.select { |t| values(t).present? }
59
65
  when :defined_attributes
@@ -94,15 +100,5 @@ module Ddr
94
100
  desc_metadata_terms.each { |t| set_desc_metadata_values(t, term_values_hash[t]) }
95
101
  end
96
102
 
97
- ################
98
- # I do not believe this method is needed any longer since I can't find any usage of it in ddr-models, ddr-batch,
99
- # dul-hydra, ddr-public, or ddr-portals
100
- ################
101
- # module ClassMethods
102
- # def find_by_identifier(identifier)
103
- # find(Ddr::Index::Fields::IDENTIFIER_ALL => identifier)
104
- # end
105
- # end
106
-
107
103
  end
108
104
  end
@@ -7,6 +7,7 @@ module Ddr
7
7
  affiliation: Valkyrie::Types::Set,
8
8
  aleph_id: Valkyrie::Types::Strict::String.optional,
9
9
  aspace_id: Valkyrie::Types::Strict::String.optional,
10
+ contentdm_id: Valkyrie::Types::Strict::String.optional,
10
11
  depositor: Valkyrie::Types::Strict::String.optional,
11
12
  display_format: Valkyrie::Types::Strict::String.optional,
12
13
  doi: Valkyrie::Types::Strict::String.optional,
@@ -54,46 +55,10 @@ module Ddr
54
55
  workflow_state == Ddr::Workflow::UNPUBLISHED
55
56
  end
56
57
 
57
- ##############
58
- # Move to dul-hydra?
59
- ##############
60
- # def lock
61
- # self.is_locked = true
62
- # end
63
- #
64
- # def unlock
65
- # self.is_locked = false
66
- # end
67
- #
68
- # def lock!
69
- # lock
70
- # save
71
- # end
72
- #
73
- # def unlock!
74
- # unlock
75
- # save
76
- # end
77
- #
78
- # Same with publish! and unpublish!, which is currently delegated to Ddr::Managers::WorkflowManager
79
- #
80
- ###############
81
-
82
- ###############
83
- # attribute defined in has_content, single-valued, stored in adminMetadata datastream
84
- ###############
85
- # property :original_filename,
86
- # predicate: Ddr::Vocab::PREMIS.hasOriginalName do |index|
87
- # index.as :stored_sortable
88
- # end
89
- #
90
-
91
- # included do
92
- #
93
- # delegate :publish!, :unpublish!, :published?, :unpublished?,
94
- # to: :workflow
95
- # end
96
- #
58
+ # Usually won't be called directly. See `publishable?` on Resource and its derivatives
59
+ def nonpublishable?
60
+ workflow_state == Ddr::Workflow::NONPUBLISHABLE
61
+ end
97
62
 
98
63
  def resource_roles
99
64
  roles.select(&:in_resource_scope?)
@@ -107,36 +72,19 @@ module Ddr
107
72
  ( has_admin_policy? && admin_policy.policy_roles ) || []
108
73
  end
109
74
 
110
- # def effective_roles(agents)
111
- # ( resource_roles | policy_roles ).select { |r| agents.include?(r.agent) }
112
- # end
113
-
114
- # def workflow
115
- # @workflow ||= Ddr::Managers::WorkflowManager.new(self)
116
- # end
117
- #
118
- # def grant_roles_to_creator(creator)
119
- # roles.grant type: Ddr::Auth::Roles::EDITOR,
120
- # agent: creator,
121
- # scope: Ddr::Auth::Roles::RESOURCE_SCOPE
122
- # end
123
- #
124
- # def copy_resource_roles_from(other)
125
- # roles.grant *(other.roles.in_resource_scope)
126
- # end
127
- #
75
+ def effective_roles(agents = nil)
76
+ Ddr::Auth::EffectiveRoles.call(self, agents)
77
+ end
128
78
 
129
79
  def effective_permissions(agents)
130
80
  Ddr::Auth::EffectivePermissions.call(self, agents)
131
81
  end
132
82
 
133
- #
134
- # def finding_aid
135
- # if ead_id
136
- # FindingAid.new(ead_id)
137
- # end
138
- # end
139
- #
83
+ def finding_aid
84
+ if ead_id
85
+ FindingAid.new(ead_id)
86
+ end
87
+ end
140
88
 
141
89
  end
142
90
  end
@@ -6,5 +6,13 @@ module Ddr
6
6
  Ddr.query_service.find_inverse_references_by(resource: self, property: 'parent_id')
7
7
  end
8
8
 
9
+ def first_child
10
+ sorted_children.first
11
+ end
12
+
13
+ def sorted_children
14
+ children.sort_by{ |e| [ e.local_id || '', e.ingestion_date ] }
15
+ end
16
+
9
17
  end
10
18
  end
@@ -66,6 +66,7 @@ module Ddr
66
66
  def content_human_size
67
67
  ActiveSupport::NumberHelper.number_to_human_size(content_size) if content_size
68
68
  end
69
+ alias_method :content_size_human, :content_human_size
69
70
 
70
71
  def content_type
71
72
  content&.media_type
@@ -7,12 +7,24 @@ module Ddr
7
7
  attribute :parent_id, Valkyrie::Types::ID.optional
8
8
  end
9
9
 
10
+ def has_parent?
11
+ parent_id.present?
12
+ end
13
+
10
14
  def parent
11
- Ddr.query_service.find_by(id: parent_id) if parent_id
15
+ Ddr.query_service.find_by(id: parent_id) if has_parent?
12
16
  end
13
17
 
18
+ # Resources with parents (currently, Items and Components) are publishable only if they have not been marked
19
+ # nonpublishable and their parent is published
14
20
  def publishable?
15
- parent&.published? || false
21
+ !nonpublishable? && parental_publication_guard
22
+ end
23
+
24
+ private
25
+
26
+ def parental_publication_guard
27
+ parent.present? && parent.published?
16
28
  end
17
29
 
18
30
  end
@@ -0,0 +1,9 @@
1
+ module Ddr
2
+ module SearchBuilderBehavior
3
+
4
+ def effective_role_filter
5
+
6
+ end
7
+
8
+ end
9
+ end
@@ -54,29 +54,9 @@ module Ddr
54
54
  end
55
55
 
56
56
  def resource
57
- @resource = Valkyrie::MetadataAdapter.find(:index_solr).query_service.find_by(id: id)
57
+ @resource ||= Valkyrie::MetadataAdapter.find(:index_solr).query_service.find_by(id: id)
58
58
  end
59
59
 
60
- ### DDRevo: Not sure if / where this is used
61
- def to_partial_path
62
- 'document'
63
- end
64
-
65
- ### DDRevo: This is probably no longer needed
66
- def safe_id
67
- id.sub(/:/, "-")
68
- end
69
-
70
- ### DDRevo: No longer relevant
71
- # def object_profile
72
- # @object_profile ||= get_json(Ddr::Index::Fields::OBJECT_PROFILE)
73
- # end
74
-
75
- ### DDRevo: No longer relevant
76
- # def object_state
77
- # object_profile["objState"]
78
- # end
79
-
80
60
  def object_create_date
81
61
  parse_date(self[Ddr::Index::Fields::RESOURCE_CREATE_DATE])
82
62
  end
@@ -93,23 +73,13 @@ module Ddr
93
73
  get_date(Ddr::Index::Fields::LAST_VIRUS_CHECK_ON)
94
74
  end
95
75
 
96
- ### DDRevo: No longer relevant
97
- # def datastreams
98
- # object_profile["datastreams"]
99
- # end
100
-
101
- ### DDRevo: No longer relevant
102
- # def has_datastream?(dsID)
103
- # datastreams[dsID].present?
104
- # end
105
-
106
76
  def has_admin_policy?
107
77
  admin_policy_id.present?
108
78
  end
109
79
 
110
80
  def admin_policy
111
81
  if has_admin_policy?
112
- self.class.find(admin_policy_id)
82
+ self.class.find(admin_policy_id.gsub(/^id-/,''))
113
83
  end
114
84
  end
115
85
 
@@ -117,11 +87,6 @@ module Ddr
117
87
  resource.children.present?
118
88
  end
119
89
 
120
- ### DDRevo: No longer relevant
121
- # def label
122
- # object_profile["objLabel"]
123
- # end
124
-
125
90
  def title_display
126
91
  title
127
92
  end
@@ -151,11 +116,6 @@ module Ddr
151
116
  resource.has_extracted_text?
152
117
  end
153
118
 
154
- ### DDRevo: Not relevant as coded. Not sure if comparable functionality is needed
155
- # def content_ds
156
- # datastreams[Ddr::Datastreams::CONTENT]
157
- # end
158
-
159
119
  def content_mime_type
160
120
  resource.content_type
161
121
  end
@@ -166,11 +126,6 @@ module Ddr
166
126
  resource.content_human_size
167
127
  end
168
128
 
169
- ### DDRevo: Not relevant as coded. Not sure if comparable functionality is needed
170
- # def content_checksum
171
- # content_ds["dsChecksum"] rescue nil
172
- # end
173
-
174
129
  def targets
175
130
  @targets ||= query_service.find_inverse_references_by(resource: resource, property: 'for_collection_id')
176
131
  end
@@ -183,11 +138,6 @@ module Ddr
183
138
  targets_count > 0
184
139
  end
185
140
 
186
- ### DDRevo Still relevant?
187
- # def association(name)
188
- # get_pid(ActiveFedora::SolrService.solr_name(name, :symbol))
189
- # end
190
-
191
141
  def tableized_name
192
142
  resource_model.tableize
193
143
  end
@@ -197,7 +147,6 @@ module Ddr
197
147
  end
198
148
 
199
149
  def roles
200
- # @roles ||= Ddr::Auth::Roles::Role.from_json(access_role)
201
150
  @roles ||= resource.roles
202
151
  end
203
152
 
@@ -246,11 +195,8 @@ module Ddr
246
195
  end
247
196
  end
248
197
 
249
- # DRY HasAdminMetadata
250
198
  def finding_aid
251
- if ead_id
252
- FindingAid.new(ead_id)
253
- end
199
+ resource.finding_aid
254
200
  end
255
201
 
256
202
  def intermediate_type
@@ -280,14 +226,18 @@ module Ddr
280
226
  resource.captionable?
281
227
  end
282
228
 
229
+ def captioned?
230
+ resource.captioned?
231
+ end
232
+
283
233
  def caption_type
284
- if captionable?
234
+ if captioned?
285
235
  resource.caption_type
286
236
  end
287
237
  end
288
238
 
289
239
  def caption_extension
290
- if captionable?
240
+ if captioned?
291
241
  extensions = Ddr.preferred_file_extensions
292
242
  if extensions.include? caption_type
293
243
  extensions[caption_type]
@@ -298,7 +248,7 @@ module Ddr
298
248
  end
299
249
 
300
250
  def caption_path
301
- if captionable?
251
+ if captioned?
302
252
  resource.caption_path
303
253
  end
304
254
  end
@@ -336,9 +286,8 @@ module Ddr
336
286
  end
337
287
  end
338
288
 
339
- # FIXME - Probably need a more general solution mapping object reader methods to index field names.
340
289
  def rights
341
- self["rights_tesim"]
290
+ resource.rights
342
291
  end
343
292
 
344
293
  def children
@@ -351,14 +300,6 @@ module Ddr
351
300
  @query_service ||= Valkyrie::MetadataAdapter.find(:index_solr).query_service
352
301
  end
353
302
 
354
- # def targets_query
355
- # "#{Ddr::Index::Fields::IS_EXTERNAL_TARGET_FOR}:#{internal_uri_for_query}"
356
- # end
357
- #
358
- # def internal_uri_for_query
359
- # ActiveFedora::SolrService.escape_uri_for_query(internal_uri)
360
- # end
361
- #
362
303
  def get_date(field)
363
304
  parse_date(self[field])
364
305
  end
@@ -371,10 +312,6 @@ module Ddr
371
312
  Time.parse(date).localtime if date
372
313
  end
373
314
 
374
- # def get_pid(field)
375
- # ActiveFedora::Base.pid_from_uri(self[field]) rescue nil
376
- # end
377
- #
378
315
  def inherited_research_help_contact
379
316
  if doc = admin_policy
380
317
  doc.research_help_contact
@@ -398,32 +335,16 @@ module Ddr
398
335
  end
399
336
 
400
337
  def intermediate_extension_default
401
- # datastreams[Ddr::Datastreams::INTERMEDIATE_FILE].default_file_extension
402
338
  resource.intermediate_file.default_file_extension
403
339
  end
404
340
 
405
341
  def caption_extension_default
406
- # datastreams[Ddr::Datastreams::CAPTION].default_file_extension
407
342
  resource.caption.default_file_extension
408
343
  end
409
344
 
410
345
  def streamable_media_extension_default
411
- # datastreams[Ddr::Datastreams::STREAMABLE_MEDIA].default_file_extension
412
346
  resource.streamable_media.default_file_extension
413
347
  end
414
348
 
415
- ### DDRevo: Using resource.children rather than this query
416
- # def children_query
417
- # case self[Ddr::Index::Fields::RESOURCE_MODEL]
418
- # when 'Ddr::Collection'
419
- # Ddr::Index::Query.build(self) do |parent|
420
- # is_member_of_collection parent.id
421
- # end
422
- # when 'Ddr::Item'
423
- # Ddr::Index::Query.build(self) do |parent|
424
- # is_part_of parent.id
425
- # end
426
- # end
427
- # end
428
349
  end
429
350
  end