ddr-core 0.3.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 72f6e405acd06621c1a3f1001264c0d8d8bd5302c3e0f36b7ad5805f990eaa99
4
- data.tar.gz: 826a0ae2eda2c5937b4c312e140e55672a4e55af807e2980082e0beae85342d0
3
+ metadata.gz: 60adcaf5e15fb5ddb0ec7163481f5eb858ced50f7937a64574582c68fe37fa3c
4
+ data.tar.gz: c5cc93ef14e694f2a30f7e63879cef2a2ac7d19b496526ea13c07f1351652e64
5
5
  SHA512:
6
- metadata.gz: 03b21dcd66f1a220167fc421849d4a1f7996be806c310f92adfad14ee8f7f9cc0ca030f4d718a29be95586eac0b757d5d78e086ac9b5442d7865bab1d326a438
7
- data.tar.gz: cf249bc22b8b381f20b3149ba421496098aa4576528460cbde047e7fdded8396ceb66f522428ed11677799c5bbd0ea53676bb199ea80c9b8c3d75d05508e1eab
6
+ metadata.gz: c7db02ca1d702c76c77327b877be521f6d894abcf209a0fa1d7cb65dc330b3bf192e046e3928a8acf4ba16b98fb474a45ce9db058ee98d4696b818fd25cb068d
7
+ data.tar.gz: ddb6721a92c1a73a69d7ef43a36445fb8fc94dfddfa0ede552bb2460f197e1ae053c7a861150b506ca3f5a4558a9154aece1c446065756c0d44d8a21ec39e5dd
@@ -54,47 +54,6 @@ module Ddr
54
54
  workflow_state == Ddr::Workflow::UNPUBLISHED
55
55
  end
56
56
 
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
- #
97
-
98
57
  def resource_roles
99
58
  roles.select(&:in_resource_scope?)
100
59
  end
@@ -107,36 +66,19 @@ module Ddr
107
66
  ( has_admin_policy? && admin_policy.policy_roles ) || []
108
67
  end
109
68
 
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
- #
69
+ def effective_roles(agents = nil)
70
+ Ddr::Auth::EffectiveRoles.call(self, agents)
71
+ end
128
72
 
129
73
  def effective_permissions(agents)
130
74
  Ddr::Auth::EffectivePermissions.call(self, agents)
131
75
  end
132
76
 
133
- #
134
- # def finding_aid
135
- # if ead_id
136
- # FindingAid.new(ead_id)
137
- # end
138
- # end
139
- #
77
+ def finding_aid
78
+ if ead_id
79
+ FindingAid.new(ead_id)
80
+ end
81
+ end
140
82
 
141
83
  end
142
84
  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
@@ -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
@@ -1,9 +1,5 @@
1
- require "active_resource"
2
-
3
1
  module Ddr
4
- class AdminSet < ActiveResource::Base
5
-
6
- self.site = ENV["DDR_AUX_API_URL"]
2
+ class AdminSet < AuxiliaryResource
7
3
 
8
4
  def self.call(obj)
9
5
  find_by_code(obj.admin_set)
@@ -13,11 +9,11 @@ module Ddr
13
9
 
14
10
  def self.find_by_code(code)
15
11
  return unless code
16
- new get(:find, code: code)
12
+ fetch(code) { new get(:find, code: code) }
17
13
  end
18
14
 
19
15
  def self.keys
20
- all.map(&:code)
16
+ fetch("codes") { all.map(&:code) }
21
17
  end
22
18
 
23
19
  def to_s
@@ -0,0 +1,16 @@
1
+ module Ddr
2
+ class Alert < AuxiliaryResource
3
+
4
+ ADMIN_SITE = 'admin'
5
+ PUBLIC_SITE = 'public'
6
+
7
+ # @param [String] the application ('admin' or 'public') for which to return active alerts
8
+ # @return [Array] the active alerts for the requested application site
9
+ def self.call(site)
10
+ get(:active, site: site).map { |resp| new(resp) }
11
+ rescue ActiveResource::ServerError => e
12
+ []
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ require 'active_resource'
2
+
3
+ module Ddr
4
+ #
5
+ # Abstract superclass for resources bound to ddr-aux API data
6
+ #
7
+ class AuxiliaryResource < ActiveResource::Base
8
+
9
+ # ActiveResource freezes `site` in subclasses
10
+ self.site = Ddr.ddr_aux_api_url
11
+
12
+ class_attribute :cache_expiry, instance_accessor: false
13
+ self.cache_expiry = 1.hour
14
+
15
+ def self.fetch(value_key, &block)
16
+ Rails.cache.fetch(cache_key(value_key), expires_in: cache_expiry, &block)
17
+ end
18
+
19
+ def self.cache_key(suffix)
20
+ [ model_name.cache_key, suffix ].join('/')
21
+ end
22
+
23
+ end
24
+ end
@@ -1,9 +1,5 @@
1
- require 'activeresource'
2
-
3
1
  module Ddr
4
- class Contact < ActiveResource::Base
5
-
6
- self.site = ENV["DDR_AUX_API_URL"]
2
+ class Contact < AuxiliaryResource
7
3
 
8
4
  def self.call(slug)
9
5
  new get(:find, slug: slug)
@@ -0,0 +1,62 @@
1
+ # TODO: 'https://duldev.atlassian.net/browse/DDR-1755'
2
+
3
+ module Ddr
4
+ class FindingAid
5
+ attr_reader :ead_id
6
+
7
+ EAD_XMLNS = "urn:isbn:1-931666-22-9"
8
+
9
+ def initialize(ead_id)
10
+ @ead_id = ead_id
11
+ end
12
+
13
+ def url
14
+ doc.css("eadid").attr("url").text
15
+ end
16
+
17
+ # The finding aid title
18
+ def title
19
+ doc.css("titleproper").children.first.text.strip
20
+ end
21
+
22
+ def repository
23
+ collection.xpath('ead:did/ead:repository/ead:corpname', ead: EAD_XMLNS).text
24
+ end
25
+
26
+ def collection_date_span
27
+ collection.xpath('ead:did/ead:unitdate[@type="inclusive"]', ead: EAD_XMLNS).text
28
+ end
29
+
30
+ def collection_number
31
+ collection.xpath('ead:did/ead:unitid', ead: EAD_XMLNS).text
32
+ end
33
+
34
+ def collection_title
35
+ collection.xpath('ead:did/ead:unittitle', ead: EAD_XMLNS).text
36
+ end
37
+
38
+ def extent
39
+ collection.xpath('ead:did/ead:physdesc/ead:extent', ead: EAD_XMLNS).map(&:text).join("; ")
40
+ end
41
+
42
+ def abstract
43
+ collection.xpath('ead:did/ead:abstract', ead: EAD_XMLNS).text
44
+ end
45
+
46
+ private
47
+
48
+ def collection
49
+ doc.xpath('//ead:archdesc[@level="collection"]', ead: EAD_XMLNS)
50
+ end
51
+
52
+ # @raise [OpenURI::HTTPError] if 404, etc.
53
+ def doc
54
+ @doc ||= Nokogiri::XML(open(ead_xml_url))
55
+ end
56
+
57
+ def ead_xml_url
58
+ Ddr::Models.ead_xml_base_url + ead_id + ".xml"
59
+ end
60
+
61
+ end
62
+ end
@@ -12,25 +12,11 @@ module Ddr
12
12
 
13
13
  self.parent_class = Ddr::Collection
14
14
 
15
- ### DDRevo #####################
16
- # TODO: We may want to revisit this alternate implementation once ddr-core is more fully baked
17
- # or it may be fine just as it is
18
- ### DDRevo #####################
19
15
  def children_having_extracted_text
20
- # Ddr::Index::Query.build(self) do |item|
21
- # is_part_of item
22
- # where attached_files_having_content: "extractedText"
23
- # fields :id, :extracted_text
24
- # end
25
16
  children.select { |child| child.attached_files_having_content.include?(:extracted_text) }
26
17
  end
27
18
 
28
- ### DDRevo #####################
29
- # TODO: We may want to revisit this alternate implementation once ddr-core is more fully baked
30
- # or it may be fine just as it is
31
- ### DDRevo #####################
32
19
  def all_text
33
- # children_having_extracted_text.docs.map(&:extracted_text).flatten
34
20
  children_having_extracted_text.map { |child| child.extracted_text.content }.to_a.flatten
35
21
  end
36
22
 
@@ -1,9 +1,5 @@
1
- require "active_resource"
2
-
3
1
  module Ddr
4
- class Language < ActiveResource::Base
5
-
6
- self.site = ENV["DDR_AUX_API_URL"]
2
+ class Language < AuxiliaryResource
7
3
 
8
4
  def self.call(obj)
9
5
  obj.language.map do |lang|
@@ -28,4 +24,3 @@ module Ddr
28
24
 
29
25
  end
30
26
  end
31
-
@@ -47,6 +47,10 @@ module Ddr
47
47
  can_have_streamable_media?
48
48
  end
49
49
 
50
+ def self.canonical_model_name(model_name)
51
+ model_name.starts_with?('Ddr::') ? model_name : "Ddr::#{model_name}"
52
+ end
53
+
50
54
  def self.common_model_name
51
55
  name.split('::').last
52
56
  end
@@ -65,6 +69,10 @@ module Ddr
65
69
  alias_method :new_record?, :new_record
66
70
  alias_method :resource_model, :internal_resource
67
71
 
72
+ def rights_statement
73
+ RightsStatement.call(self)
74
+ end
75
+
68
76
  def title_display
69
77
  return title.first if title.present?
70
78
  return identifier.first if identifier.present?
@@ -1,9 +1,5 @@
1
- require "active_resource"
2
-
3
1
  module Ddr
4
- class RightsStatement < ActiveResource::Base
5
-
6
- self.site = ENV["DDR_AUX_API_URL"]
2
+ class RightsStatement < AuxiliaryResource
7
3
 
8
4
  def self.call(obj)
9
5
  if obj.rights.present?
@@ -22,4 +18,4 @@ module Ddr
22
18
  end
23
19
 
24
20
  end
25
- end
21
+ end
@@ -16,7 +16,8 @@ en:
16
16
  aspace_id:
17
17
  label: "ArchivesSpace ID"
18
18
  common_model_name:
19
- label: "Common Model Name"
19
+ label: Model
20
+ heading: model
20
21
  doi:
21
22
  label: DOI
22
23
  ead_id:
@@ -30,8 +30,8 @@ module Ddr
30
30
  end
31
31
  end
32
32
 
33
- def cached_permissions(pid, &block)
34
- cache[pid] ||= block.call
33
+ def cached_permissions(id, &block)
34
+ cache[id] ||= block.call
35
35
  end
36
36
 
37
37
  end
@@ -1,7 +1,8 @@
1
1
  module Ddr::Auth
2
2
  class EffectivePermissions
3
3
 
4
- # @param obj [Object] an object that receives :roles and returns a RoleSet
4
+ # @param obj [Object] an object that receives :roles and returns an Array
5
+ # of Ddr::Auth::Roles::Role.
5
6
  # @param agents [String, Array<String>] agent(s) to match roles
6
7
  # @return [Array<Symbol>]
7
8
  def self.call(obj, agents)
@@ -1,8 +1,12 @@
1
1
  module Ddr::Auth
2
2
  class EffectiveRoles
3
3
 
4
- def self.call(obj, agents)
5
- ( obj.resource_roles | obj.inherited_roles ).select { |r| agents.include?(r.agent) }
4
+ def self.call(obj, agents = nil)
5
+ ( obj.resource_roles | obj.inherited_roles ).tap do |roles|
6
+ if agents
7
+ roles.select! { |r| agents.include?(r.agent) }
8
+ end
9
+ end
6
10
  end
7
11
 
8
12
  end
@@ -5,7 +5,7 @@ module Ddr
5
5
  def respond
6
6
  if scope == :user && Ddr::Auth.require_shib_user_authn
7
7
  store_location!
8
- redirect_to user_omniauth_authorize_path(:shibboleth)
8
+ redirect_to user_shibboleth_omniauth_authorize_path
9
9
  else
10
10
  super
11
11
  end
@@ -25,7 +25,7 @@ module Ddr
25
25
 
26
26
  # List of all grouper groups for the repository
27
27
  def repository_groups(raw = false)
28
- repo_groups = groups(REPOSITORY_GROUP_FILTER)
28
+ repo_groups = groups(Ddr::Auth.repository_group_filter)
29
29
  if ok?
30
30
  return repo_groups if raw
31
31
  repo_groups.map do |g|
@@ -52,7 +52,7 @@ module Ddr
52
52
  result = response["WsGetGroupsResults"]["results"].first
53
53
  # Have to manually filter results b/c Grouper WS version 1.5 does not support filter parameter
54
54
  if result && result["wsGroups"]
55
- groups = result["wsGroups"].select { |g| g["name"] =~ /^#{REPOSITORY_GROUP_FILTER}/ }
55
+ groups = result["wsGroups"].select { |g| g["name"] =~ /^#{Ddr::Auth.repository_group_filter}/ }
56
56
  end
57
57
  end
58
58
  rescue StandardError => e
@@ -1,11 +1,5 @@
1
1
  module Ddr
2
2
  module Auth
3
- #
4
- # Hydra controller mixin for role-based access control
5
- #
6
- # Overrides Hydra::AccessControlsEnforcement#gated_discovery_filters
7
- # to apply role filters instead of permissions filters.
8
- #
9
3
  module RoleBasedAccessControlsEnforcement
10
4
 
11
5
  def self.included(controller)
@@ -17,36 +11,6 @@ module Ddr
17
11
  @current_ability ||= AbilityFactory.call(current_user, request.env)
18
12
  end
19
13
 
20
- # List of URIs for policies on which any of the current user's agent has a role in policy scope
21
- def policy_role_policies
22
- @policy_role_policies ||= Array.new.tap do |uris|
23
- filters = current_ability.agents.map do |agent|
24
- "#{Ddr::Index::Fields::POLICY_ROLE}:\"#{agent}\""
25
- end.join(" OR ")
26
- query = "#{Ddr::Index::Fields::ACTIVE_FEDORA_MODEL}:Collection AND (#{filters})"
27
- results = ActiveFedora::SolrService.query(query, rows: Collection.count, fl: Ddr::Index::Fields::INTERNAL_URI)
28
- results.each_with_object(uris) { |r, memo| memo << r[Ddr::Index::Fields::INTERNAL_URI] }
29
- end
30
- end
31
-
32
- def policy_role_filters
33
- if policy_role_policies.present?
34
- rels = policy_role_policies.map { |pid| [:is_governed_by, pid] }
35
- ActiveFedora::SolrService.construct_query_for_rel(rels, "OR")
36
- end
37
- end
38
-
39
- def resource_role_filters
40
- current_ability.agents.map do |agent|
41
- ActiveFedora::SolrService.raw_query(Ddr::Index::Fields::RESOURCE_ROLE, agent)
42
- end.join(" OR ")
43
- end
44
-
45
- def gated_discovery_filters
46
- [resource_role_filters, policy_role_filters].compact
47
- end
48
-
49
- # Overrides Hydra::AccessControlsEnforcement
50
14
  def enforce_show_permissions
51
15
  authorize! :read, params[:id]
52
16
  end
@@ -36,38 +36,6 @@ module Ddr
36
36
  end
37
37
  end
38
38
 
39
- ###############
40
- # FIXME or remove serialization/deserialization
41
- ###############
42
- #
43
- # # Deserialize a Role from JSON
44
- # # @param json [String] the JSON string
45
- # # @return [Role] the role
46
- # def from_json(json)
47
- # build JSON.parse(json)
48
- # end
49
-
50
- # alias_method :deserialize, :from_json
51
-
52
- private
53
-
54
- #
55
- # DELETEME
56
- #
57
- # def build_attributes(args={})
58
- # # symbolize keys and stringify values
59
- # attrs = args.each_with_object({}) do |(k, v), memo|
60
- # memo[k.to_sym] = Array(v).first.to_s
61
- # end
62
- # # set default scope if necessary
63
- # attrs[:scope] ||= DEFAULT_SCOPE
64
- # # accept :type key for role_type attribute
65
- # if attrs.key?(:type)
66
- # attrs[:role_type] = attrs.delete(:type)
67
- # end
68
- # attrs
69
- # end
70
-
71
39
  end # class << self
72
40
 
73
41
  # Roles are considered equal (==) if they
@@ -96,19 +64,6 @@ module Ddr
96
64
  "agent=#{agent.inspect}, scope=#{scope.inspect}>"
97
65
  end
98
66
 
99
- # TODO refactor up?
100
- def proper_attributes
101
- attributes.slice(self.class.fields - self.class.reserved_attributes)
102
- end
103
-
104
- ###############
105
- # FIXME or remove serialization/deserialization
106
- ###############
107
- #
108
- # delegate :to_json, to: :proper_attributes
109
- #
110
- # alias_method :serialize, :to_json
111
-
112
67
  # Returns the permissions associated with the role
113
68
  # @return [Array<Symbol>] the permissions
114
69
  def permissions
@@ -9,6 +9,7 @@ module Ddr
9
9
  autoload :Files
10
10
  autoload :NotFoundError, 'ddr/error'
11
11
  autoload :Fits
12
+ autoload :FindingAid
12
13
  autoload :Index
13
14
  autoload :Managers
14
15
  autoload :Utils
@@ -103,6 +104,10 @@ module Ddr
103
104
  false
104
105
  end
105
106
 
107
+ mattr_accessor :ddr_aux_api_url do
108
+ ENV["DDR_AUX_API_URL"]
109
+ end
110
+
106
111
  module Core
107
112
 
108
113
  end
@@ -1,5 +1,5 @@
1
1
  module Ddr
2
2
  module Core
3
- VERSION = '0.3.0'
3
+ VERSION = '1.0.0'
4
4
  end
5
5
  end
@@ -94,96 +94,5 @@ module Ddr
94
94
  xpath('//fits:fits', fits: FITS_XMLNS).first
95
95
  end
96
96
 
97
- ### DDRevo ##########################################
98
- # From Ddr::Datastreams::FitsDatastream. Code above accounts for proxy terms from below and has a private 'root'
99
- # method but does not (yet) provide methods for all the terms in the terminology. Thought it was better to wait
100
- # and see which ones are actually needed.
101
- ### DDRevo ##########################################
102
- # set_terminology do |t|
103
- # t.root(path: "fits",
104
- # xmlns: FITS_XMLNS,
105
- # schema: FITS_SCHEMA)
106
- # t.version(path: {attribute: "version"})
107
- # t.timestamp(path: {attribute: "timestamp"})
108
- # t.identification {
109
- # t.identity {
110
- # t.mimetype(path: {attribute: "mimetype"})
111
- # t.format_label(path: {attribute: "format"})
112
- # t.version
113
- # t.externalIdentifier
114
- # t.pronom_identifier(path: "externalIdentifier", attributes: {type: "puid"})
115
- # }
116
- # }
117
- # t.fileinfo {
118
- # t.created
119
- # t.creatingApplicationName
120
- # t.creatingos
121
- # t.filename
122
- # t.filepath
123
- # t.fslastmodified
124
- # t.lastmodified
125
- # t.md5checksum
126
- # t.size
127
- # }
128
- # t.filestatus {
129
- # t.valid
130
- # t.well_formed(path: "well-formed")
131
- # }
132
- # t.metadata {
133
- # t.image {
134
- # t.imageWidth
135
- # t.imageHeight
136
- # t.colorSpace
137
- # t.iccProfileName
138
- # t.iccProfileVersion
139
- # }
140
- # t.document {
141
- # # TODO - configure to get from Tika?
142
- # # t.encoding
143
- # }
144
- # t.text
145
- # t.audio
146
- # t.video
147
- # }
148
- #
149
- # ## proxy terms
150
- #
151
- # # identification / identity
152
- # t.format_label proxy: [:identification, :identity, :format_label]
153
- # t.format_version proxy: [:identification, :identity, :version]
154
- # t.media_type proxy: [:identification, :identity, :mimetype]
155
- # t.pronom_identifier proxy: [:identification, :identity, :pronom_identifier]
156
- #
157
- # # filestatus
158
- # t.valid proxy: [:filestatus, :valid]
159
- # t.well_formed proxy: [:filestatus, :well_formed]
160
- #
161
- # # fileinfo
162
- # t.created proxy: [:fileinfo, :created]
163
- # t.creating_application proxy: [:fileinfo, :creatingApplicationName]
164
- # t.extent proxy: [:fileinfo, :size]
165
- # t.md5 proxy: [:fileinfo, :md5checksum]
166
- #
167
- # # image metadata
168
- # t.color_space proxy: [:metadata, :image, :colorSpace]
169
- # t.icc_profile_name proxy: [:metadata, :image, :iccProfileName]
170
- # t.icc_profile_version proxy: [:metadata, :image, :iccProfileVersion]
171
- # t.image_height proxy: [:metadata, :image, :imageHeight]
172
- # t.image_width proxy: [:metadata, :image, :imageWidth]
173
- # end
174
- #
175
- # def self.xml_template
176
- # builder = Nokogiri::XML::Builder.new do |xml|
177
- # xml.fits("xmlns"=>FITS_XMLNS,
178
- # "xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
179
- # "xsi:schemaLocation"=>"http://hul.harvard.edu/ois/xml/ns/fits/fits_output http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd")
180
- # end
181
- # builder.doc
182
- # end
183
- #
184
- # def prefix
185
- # "fits__"
186
- # end
187
-
188
97
  end
189
98
  end
@@ -19,10 +19,10 @@ module Ddr
19
19
  autoload :SortOrder
20
20
  autoload :UniqueKeyField
21
21
 
22
- def self.pids
22
+ def self.ids
23
23
  builder = QueryBuilder.new { field UniqueKeyField.instance }
24
24
  query = builder.query
25
- query.pids
25
+ query.ids
26
26
  end
27
27
 
28
28
  end
@@ -38,6 +38,7 @@ module Ddr::Index
38
38
  DISPLAY_FORMAT = Field.new :display_format, :stored_sortable
39
39
  DOI = Field.new :doi, :symbol
40
40
  EAD_ID = Field.new :ead_id, :stored_sortable
41
+ EFFECTIVE_ROLE = Field.new :effective_role, :symbol
41
42
  ENGRAVER_FACET = Field.new :engraver_facet, :facetable
42
43
  EXTRACTED_TEXT = Field.new :extracted_text, solr_name: "extracted_text_tsm"
43
44
  FCREPO3_PID = Field.new :fcrepo3_pid, :stored_sortable
@@ -2,7 +2,9 @@ module Ddr
2
2
  module Managers
3
3
  class TechnicalMetadataManager < Manager
4
4
 
5
- FITS_TIMESTAMP_FORMAT = "%D %l:%M %p" # Ex. 7/3/15 8:29 PM
5
+ FITS_141_TIMESTAMP_FORMAT = "%D %l:%M %p" # Ex. 7/3/15 8:29 PM
6
+ FITS_150_TIMESTAMP_FORMAT = "%D, %l:%M %p" # Ex. 7/3/15, 8:29 PM
7
+ FITS_TIMESTAMP_FORMATS = [ FITS_141_TIMESTAMP_FORMAT, FITS_150_TIMESTAMP_FORMAT ]
6
8
 
7
9
  delegate :content, to: :object
8
10
 
@@ -43,9 +45,12 @@ module Ddr
43
45
 
44
46
  def fits_datetime
45
47
  if fits_timestamp = fits.timestamp.first
46
- # no_zone = DateTime.strptime(fits_timestamp, FITS_TIMESTAMP_FORMAT)
47
- # no_zone.change(offset: no_zone.to_time.zone)
48
- Time.zone.strptime(fits_timestamp, FITS_TIMESTAMP_FORMAT)
48
+ parsed = nil
49
+ FITS_TIMESTAMP_FORMATS.each do |format|
50
+ parsed = Time.zone.strptime(fits_timestamp, format) rescue nil
51
+ break if parsed
52
+ end
53
+ parsed
49
54
  end
50
55
  end
51
56
 
@@ -82,6 +82,7 @@ module Ddr
82
82
 
83
83
  def add_filesec(id:nil)
84
84
  filesec = Ddr::Structures::FileSec.build(id: id, document: as_xml_document)
85
+
85
86
  root.add_child(filesec)
86
87
  filesec
87
88
  end
@@ -92,7 +93,7 @@ module Ddr
92
93
  filegrp
93
94
  end
94
95
 
95
- def add_file(parent:, id:SecureRandom.uuid, use:nil)
96
+ def add_file(parent:, id: "id_" + SecureRandom.uuid, use:nil)
96
97
  file = Ddr::Structures::File.build(id: id, use: use, document: as_xml_document)
97
98
  parent.add_child(file)
98
99
  file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ddr-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Coble
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2019-08-05 00:00:00.000000000 Z
14
+ date: 2019-11-18 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activeresource
@@ -209,6 +209,20 @@ dependencies:
209
209
  - - ">="
210
210
  - !ruby/object:Gem::Version
211
211
  version: '0'
212
+ - !ruby/object:Gem::Dependency
213
+ name: equivalent-xml
214
+ requirement: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - ">="
217
+ - !ruby/object:Gem::Version
218
+ version: '0'
219
+ type: :development
220
+ prerelease: false
221
+ version_requirements: !ruby/object:Gem::Requirement
222
+ requirements:
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ version: '0'
212
226
  - !ruby/object:Gem::Dependency
213
227
  name: factory_bot_rails
214
228
  requirement: !ruby/object:Gem::Requirement
@@ -308,12 +322,15 @@ files:
308
322
  - app/models/concerns/ddr/solr_document_behavior.rb
309
323
  - app/models/concerns/ddr/streamable.rb
310
324
  - app/models/ddr/admin_set.rb
325
+ - app/models/ddr/alert.rb
311
326
  - app/models/ddr/attachment.rb
327
+ - app/models/ddr/auxiliary_resource.rb
312
328
  - app/models/ddr/collection.rb
313
329
  - app/models/ddr/component.rb
314
330
  - app/models/ddr/contact.rb
315
331
  - app/models/ddr/digest.rb
316
332
  - app/models/ddr/file.rb
333
+ - app/models/ddr/finding_aid.rb
317
334
  - app/models/ddr/item.rb
318
335
  - app/models/ddr/language.rb
319
336
  - app/models/ddr/media_type.rb
@@ -419,7 +436,8 @@ files:
419
436
  homepage: https://gitlab.oit.duke.edu/ddr/ddr-core
420
437
  licenses:
421
438
  - BSD-3-Clause
422
- metadata: {}
439
+ metadata:
440
+ allowed_push_host: https://rubygems.org
423
441
  post_install_message:
424
442
  rdoc_options: []
425
443
  require_paths:
@@ -435,8 +453,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
435
453
  - !ruby/object:Gem::Version
436
454
  version: '0'
437
455
  requirements: []
438
- rubyforge_project:
439
- rubygems_version: 2.7.9
456
+ rubygems_version: 3.0.6
440
457
  signing_key:
441
458
  specification_version: 4
442
459
  summary: Models used in the Duke Digital Repository