ddr-models 1.5.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/db/migrate/20141216040225_drop_minted_ids.rb +9 -0
- data/db/migrate/20141218020612_add_exception_to_events.rb +7 -0
- data/lib/ddr/datastreams.rb +1 -0
- data/lib/ddr/datastreams/preservation_metadata_datastream.rb +13 -0
- data/lib/ddr/events/event.rb +6 -0
- data/lib/ddr/index_fields.rb +1 -0
- data/lib/ddr/managers.rb +8 -0
- data/lib/ddr/managers/permanent_id_manager.rb +93 -0
- data/lib/ddr/metadata/#permanent_id_record.rb# +13 -0
- data/lib/ddr/models.rb +9 -5
- data/lib/ddr/models/#has_ezid_identifier.rb# +26 -0
- data/lib/ddr/models/#has_permanent_identifier.rb# +9 -0
- data/lib/ddr/models/base.rb +5 -5
- data/lib/ddr/models/engine.rb +11 -0
- data/lib/ddr/models/has_preservation_metadata.rb +28 -0
- data/lib/ddr/models/indexing.rb +7 -2
- data/lib/ddr/models/version.rb +1 -1
- data/lib/ddr/vocab.rb +8 -0
- data/lib/ddr/vocab.rb~ +9 -0
- data/lib/ddr/vocab/preservation.rb +14 -0
- data/spec/dummy/Rakefile +2 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +2 -11
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +1845 -2902
- data/spec/dummy/log/test.log +67166 -69478
- data/spec/models/has_preservation_metadata_spec.rb +109 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/support/shared_examples_for_events.rb +8 -0
- metadata +44 -20
- data/lib/ddr/models/minted_id.rb +0 -10
- data/lib/ddr/models/permanent_identification.rb +0 -23
- data/spec/models/permanent_identification_spec.rb +0 -67
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b7c6859f35b96af9cad8b5b91ed7b10e977b661
|
4
|
+
data.tar.gz: 75abf6c0b0abf5744fa84b2340bb0bf22cc39879
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e53213dd9dd3d14e582ce2558b7e4efb0c66656de2f4a6232aa0c91bedbb12212eecad26982f32bfdd2b0218b15a5f6f002e92c92fdbb9887631a6cbb4871c48
|
7
|
+
data.tar.gz: eb9a5b39e08e90d70321ade9812d2f69440d4b4fa1f5cbd73e2450ca22f34f68edd6d23cbbdd50c46beb3681e026e8469f04c9a16abf9bee2a2f3ef75a93fbd5
|
data/README.md
CHANGED
@@ -25,6 +25,7 @@ ddr-models has several runtime dependencies that are independently configurable:
|
|
25
25
|
- [hydra-head](https://github.com/projecthydra/hydra-head)
|
26
26
|
- [ddr-antivirus](https://github.com/duke-libraries/ddr-antivirus)
|
27
27
|
- [devise-remote-user](https://github.com/duke-libraries/devise-remote-user)
|
28
|
+
- [ezid-client](https://github.com/duke-libaries/ezid-client)
|
28
29
|
|
29
30
|
ddr-models configuration options:
|
30
31
|
|
data/lib/ddr/datastreams.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Datastreams
|
3
|
+
class PreservationMetadataDatastream < ActiveFedora::NtriplesRDFDatastream
|
4
|
+
|
5
|
+
property :permanent_id,
|
6
|
+
predicate: Ddr::Vocab::Preservation.permanentId
|
7
|
+
|
8
|
+
property :permanent_url,
|
9
|
+
predicate: Ddr::Vocab::Preservation.permanentUrl
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/ddr/events/event.rb
CHANGED
@@ -4,6 +4,11 @@ module Ddr
|
|
4
4
|
|
5
5
|
belongs_to :user, inverse_of: :events
|
6
6
|
|
7
|
+
# ActiveSupport::Notifications::Instrumenter sets payload[:exception]
|
8
|
+
# to an array of [<exception class name>, <exception message>]
|
9
|
+
# and we want to store this data in a string field.
|
10
|
+
serialize :exception, JSON
|
11
|
+
|
7
12
|
# Event date time - for PREMIS and Solr
|
8
13
|
DATE_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%LZ"
|
9
14
|
|
@@ -32,6 +37,7 @@ module Ddr
|
|
32
37
|
validate :object_exists # unless/until we have a deaccession-type of event
|
33
38
|
|
34
39
|
after_initialize :set_defaults
|
40
|
+
before_save { failure! if exception.present? }
|
35
41
|
|
36
42
|
# Receive message sent by ActiveSupport::Notifications
|
37
43
|
def self.call(*args)
|
data/lib/ddr/index_fields.rb
CHANGED
@@ -32,6 +32,7 @@ module Ddr
|
|
32
32
|
OBJECT_MODIFIED_DATE = solr_name :system_modified, :stored_sortable, type: :date
|
33
33
|
ORIGINAL_FILENAME = solr_name :original_filename, :symbol
|
34
34
|
PERMANENT_ID = solr_name :permanent_id, :stored_sortable, type: :string
|
35
|
+
PERMANENT_URL = solr_name :permanent_url, :stored_sortable, type: :string
|
35
36
|
TITLE = solr_name :title, :stored_sortable
|
36
37
|
WORKFLOW_STATE = solr_name :workflow_state, :stored_sortable
|
37
38
|
|
data/lib/ddr/managers.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
require "ezid-client"
|
2
|
+
require "resque"
|
3
|
+
|
4
|
+
module Ddr
|
5
|
+
module Managers
|
6
|
+
#
|
7
|
+
# PermanentIdManager is responsible for managing the permanent id for an object.
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
class PermanentIdManager
|
11
|
+
|
12
|
+
PERMANENT_URL_BASE = "http://id.library.duke.edu/"
|
13
|
+
TARGET_URL_BASE = "http://repository.lib.duke.edu/"
|
14
|
+
|
15
|
+
ASSIGN_EVENT_SUMMARY = "Permanent ID assigned"
|
16
|
+
|
17
|
+
SOFTWARE = Ezid::Client.version
|
18
|
+
|
19
|
+
attr_reader :object
|
20
|
+
|
21
|
+
def initialize(object)
|
22
|
+
@object = object
|
23
|
+
end
|
24
|
+
|
25
|
+
def assign_later
|
26
|
+
Resque.enqueue(AssignmentJob, object.pid)
|
27
|
+
end
|
28
|
+
|
29
|
+
def assign
|
30
|
+
raise Ddr::Models::Error, "Permanent ID already assigned." if object.permanent_id
|
31
|
+
ActiveSupport::Notifications.instrument(Ddr::Notifications::UPDATE,
|
32
|
+
pid: object.pid,
|
33
|
+
software: SOFTWARE,
|
34
|
+
summary: ASSIGN_EVENT_SUMMARY
|
35
|
+
) do |payload|
|
36
|
+
|
37
|
+
assign!
|
38
|
+
payload[:detail] = <<-EOS
|
39
|
+
Permanent ID: #{object.permanent_id}
|
40
|
+
Permanent URL: #{object.permanent_url}
|
41
|
+
EZID Metadata:
|
42
|
+
#{record.metadata}
|
43
|
+
EOS
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# A job class for background execution
|
48
|
+
class AssignmentJob
|
49
|
+
@queue = :permanent_id
|
50
|
+
|
51
|
+
def self.perform(pid)
|
52
|
+
object = ActiveFedora::Base.find(pid)
|
53
|
+
object.permanent_id_manager.assign
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def default_metadata
|
58
|
+
{ profile: "dc",
|
59
|
+
export: "no"
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
def record
|
64
|
+
return @record if @record
|
65
|
+
if object.permanent_id
|
66
|
+
@record = Ezid::Identifier.find(object.permanent_id.to_s)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def assign!
|
73
|
+
@record = mint
|
74
|
+
object.permanent_id = record.id
|
75
|
+
object.permanent_url = (PERMANENT_URL_BASE + object.permanent_id)
|
76
|
+
object.save
|
77
|
+
end
|
78
|
+
|
79
|
+
# @return [Ezid::Identifier]
|
80
|
+
def mint
|
81
|
+
ezid = Ezid::Identifier.create(default_metadata)
|
82
|
+
ezid.target = default_target_url(ezid.id)
|
83
|
+
ezid.save
|
84
|
+
ezid
|
85
|
+
end
|
86
|
+
|
87
|
+
def default_target_url(id)
|
88
|
+
TARGET_URL_BASE + id
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/lib/ddr/models.rb
CHANGED
@@ -15,9 +15,11 @@ require 'ddr/auth'
|
|
15
15
|
require 'ddr/datastreams'
|
16
16
|
require 'ddr/events'
|
17
17
|
require 'ddr/index_fields'
|
18
|
+
require 'ddr/managers'
|
18
19
|
require 'ddr/metadata'
|
19
20
|
require 'ddr/notifications'
|
20
21
|
require 'ddr/utils'
|
22
|
+
require 'ddr/vocab'
|
21
23
|
require 'ddr/workflow'
|
22
24
|
|
23
25
|
module Ddr
|
@@ -36,6 +38,7 @@ module Ddr
|
|
36
38
|
autoload :HasChildren
|
37
39
|
autoload :HasContent
|
38
40
|
autoload :HasContentMetadata
|
41
|
+
autoload :HasPreservationMetadata
|
39
42
|
autoload :HasProperties
|
40
43
|
autoload :HasRoleAssignments
|
41
44
|
autoload :HasThumbnail
|
@@ -43,16 +46,17 @@ module Ddr
|
|
43
46
|
autoload :Indexing
|
44
47
|
autoload :FileManagement
|
45
48
|
autoload :Licensable
|
46
|
-
autoload :MintedId
|
47
|
-
autoload :PermanentIdentification
|
48
49
|
autoload :SolrDocument
|
49
|
-
|
50
|
+
|
50
51
|
# Base directory of external file store
|
51
|
-
mattr_accessor :external_file_store
|
52
|
+
mattr_accessor :external_file_store
|
52
53
|
|
53
54
|
# Regexp for building external file subpath from hex digest
|
54
55
|
mattr_accessor :external_file_subpath_regexp
|
55
|
-
|
56
|
+
|
57
|
+
# Whether permanent IDs should be automatically assigned on create
|
58
|
+
mattr_accessor :auto_assign_permanent_ids
|
59
|
+
|
56
60
|
# Yields an object with module configuration accessors
|
57
61
|
def self.configure
|
58
62
|
yield self
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module HasEzidIdentifier
|
4
|
+
|
5
|
+
protected
|
6
|
+
|
7
|
+
|
8
|
+
def create_identifier
|
9
|
+
create_ezid
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def create_ezid
|
15
|
+
metadata = Ddr::Metadata::Ezid.new(self)
|
16
|
+
ezid_identifier = Ezid::Identifier.create(metadata)
|
17
|
+
Ddr::Metadata::PermanentIdentifier.new(ezid_identifier.id)
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_ezid
|
21
|
+
Ezid::Identifier.find(permanent_id.value)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/ddr/models/base.rb
CHANGED
@@ -13,24 +13,24 @@ module Ddr
|
|
13
13
|
include FixityCheckable
|
14
14
|
include FileManagement
|
15
15
|
include Indexing
|
16
|
-
include PermanentIdentification
|
17
16
|
include HasRoleAssignments
|
18
17
|
include Hydra::Validations
|
19
18
|
include HasWorkflow
|
20
|
-
|
19
|
+
include HasPreservationMetadata
|
20
|
+
|
21
21
|
def copy_admin_policy_or_permissions_from(other)
|
22
22
|
copy_permissions_from(other) unless copy_admin_policy_from(other)
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def association_query(association)
|
26
26
|
# XXX Ideally we would include a clause to limit by AF model, but this should suffice
|
27
27
|
ActiveFedora::SolrService.construct_query_for_rel(reflections[association].options[:property] => internal_uri)
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
# e.g., "Collection duke:1"
|
31
31
|
def model_pid
|
32
32
|
[self.class.to_s, pid].join(" ")
|
33
|
-
end
|
33
|
+
end
|
34
34
|
|
35
35
|
end
|
36
36
|
end
|
data/lib/ddr/models/engine.rb
CHANGED
@@ -23,6 +23,10 @@ module Ddr
|
|
23
23
|
ActiveFedora::Predicates.set_predicates(Ddr::Metadata::PREDICATES)
|
24
24
|
end
|
25
25
|
|
26
|
+
initializer "ddr_models.permanent_ids" do
|
27
|
+
Ddr::Models.auto_assign_permanent_ids = Rails.env.production?
|
28
|
+
end
|
29
|
+
|
26
30
|
# Configure devise-remote-user
|
27
31
|
initializer "ddr_auth.remote_user" do
|
28
32
|
require "devise_remote_user"
|
@@ -62,6 +66,13 @@ module Ddr
|
|
62
66
|
Ddr::Auth.collection_creators_group = ENV["COLLECTION_CREATORS_GROUP"]
|
63
67
|
end
|
64
68
|
|
69
|
+
initializer "ezid_client" do
|
70
|
+
unless Rails.env.production?
|
71
|
+
require "ezid/test_helper"
|
72
|
+
ezid_test_mode!
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
65
76
|
end
|
66
77
|
end
|
67
78
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module HasPreservationMetadata
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
has_metadata "preservationMetadata",
|
8
|
+
type: Ddr::Datastreams::PreservationMetadataDatastream,
|
9
|
+
versionable: true,
|
10
|
+
control_group: "M"
|
11
|
+
|
12
|
+
has_attributes :permanent_id, :permanent_url,
|
13
|
+
datastream: "preservationMetadata", multiple: false
|
14
|
+
|
15
|
+
after_create :assign_permanent_id!, if: "Ddr::Models.auto_assign_permanent_ids"
|
16
|
+
end
|
17
|
+
|
18
|
+
def permanent_id_manager
|
19
|
+
@permanent_id_manager ||= Ddr::Managers::PermanentIdManager.new(self)
|
20
|
+
end
|
21
|
+
|
22
|
+
def assign_permanent_id!
|
23
|
+
permanent_id_manager.assign_later
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/ddr/models/indexing.rb
CHANGED
@@ -12,9 +12,14 @@ module Ddr
|
|
12
12
|
Ddr::IndexFields::TITLE => title_display,
|
13
13
|
Ddr::IndexFields::INTERNAL_URI => internal_uri,
|
14
14
|
Ddr::IndexFields::IDENTIFIER => identifier_sort,
|
15
|
-
Ddr::IndexFields::PERMANENT_ID => permanent_id,
|
16
15
|
Ddr::IndexFields::WORKFLOW_STATE => workflow_state
|
17
16
|
}
|
17
|
+
if permanent_id.present?
|
18
|
+
fields[Ddr::IndexFields::PERMANENT_ID] = permanent_id
|
19
|
+
end
|
20
|
+
if permanent_url.present?
|
21
|
+
fields[Ddr::IndexFields::PERMANENT_URL] = permanent_url
|
22
|
+
end
|
18
23
|
if respond_to? :fixity_checks
|
19
24
|
last_fixity_check = fixity_checks.last
|
20
25
|
fields.merge!(last_fixity_check.to_solr) if last_fixity_check
|
@@ -50,4 +55,4 @@ module Ddr
|
|
50
55
|
|
51
56
|
end
|
52
57
|
end
|
53
|
-
end
|
58
|
+
end
|
data/lib/ddr/models/version.rb
CHANGED
data/lib/ddr/vocab.rb
ADDED
data/lib/ddr/vocab.rb~
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Vocab
|
3
|
+
class Preservation < RDF::StrictVocabulary("http://repository.lib.duke.edu/vocab/preservation/")
|
4
|
+
|
5
|
+
property "permanentId",
|
6
|
+
label: "Permanent Identifier",
|
7
|
+
subPropertyOf: RDF::DC.identifier
|
8
|
+
|
9
|
+
property "permanentUrl",
|
10
|
+
label: "Permanent URL"
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|