ddr-core 0.3.0 → 1.2.0.rc1

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