ddr-models 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +12 -0
- data/README.md +5 -0
- data/Rakefile +37 -0
- data/app/models/attachment.rb +7 -0
- data/app/models/collection.rb +54 -0
- data/app/models/component.rb +15 -0
- data/app/models/item.rb +19 -0
- data/app/models/solr_document.rb +36 -0
- data/app/models/target.rb +8 -0
- data/config/initializers/active_fedora_base.rb +77 -0
- data/config/initializers/active_fedora_datastream.rb +5 -0
- data/config/initializers/ddr.rb +8 -0
- data/config/initializers/devise.rb +245 -0
- data/config/initializers/devise.rb~ +245 -0
- data/config/initializers/subscriptions.rb +15 -0
- data/config/routes.rb +2 -0
- data/db/migrate/20141021233359_create_events.rb +28 -0
- data/db/migrate/20141021234156_create_minted_ids.rb +19 -0
- data/db/migrate/20141103192146_create_workflow_state.rb +13 -0
- data/db/migrate/20141104181418_create_users.rb +34 -0
- data/db/migrate/20141104181418_create_users.rb~ +6 -0
- data/lib/ddr-models.rb +1 -0
- data/lib/ddr/actions.rb +8 -0
- data/lib/ddr/actions/fixity_check.rb +35 -0
- data/lib/ddr/auth.rb +45 -0
- data/lib/ddr/auth.rb~ +47 -0
- data/lib/ddr/auth/ability.rb +204 -0
- data/lib/ddr/auth/ability.rb~ +204 -0
- data/lib/ddr/auth/group_service.rb +53 -0
- data/lib/ddr/auth/group_service.rb~ +53 -0
- data/lib/ddr/auth/grouper_service.rb +76 -0
- data/lib/ddr/auth/grouper_service.rb~ +77 -0
- data/lib/ddr/auth/remote_group_service.rb +35 -0
- data/lib/ddr/auth/remote_group_service.rb~ +35 -0
- data/lib/ddr/auth/superuser.rb +13 -0
- data/lib/ddr/auth/superuser.rb~ +9 -0
- data/lib/ddr/auth/user.rb +71 -0
- data/lib/ddr/auth/user.rb~ +65 -0
- data/lib/ddr/configurable.rb +34 -0
- data/lib/ddr/datastreams.rb +32 -0
- data/lib/ddr/datastreams/content_metadata_datastream.rb +147 -0
- data/lib/ddr/datastreams/datastream_behavior.rb +95 -0
- data/lib/ddr/datastreams/descriptive_metadata_datastream.rb +84 -0
- data/lib/ddr/datastreams/properties_datastream.rb +25 -0
- data/lib/ddr/datastreams/role_assignments_datastream.rb +19 -0
- data/lib/ddr/events.rb +17 -0
- data/lib/ddr/events/creation_event.rb +12 -0
- data/lib/ddr/events/event.rb +163 -0
- data/lib/ddr/events/fixity_check_event.rb +43 -0
- data/lib/ddr/events/ingestion_event.rb +12 -0
- data/lib/ddr/events/preservation_event_behavior.rb +37 -0
- data/lib/ddr/events/preservation_event_type.rb +24 -0
- data/lib/ddr/events/reindex_object_after_save.rb +18 -0
- data/lib/ddr/events/update_event.rb +9 -0
- data/lib/ddr/events/validation_event.rb +11 -0
- data/lib/ddr/events/virus_check_event.rb +30 -0
- data/lib/ddr/index_fields.rb +39 -0
- data/lib/ddr/metadata.rb +22 -0
- data/lib/ddr/metadata/duke_terms.rb +15 -0
- data/lib/ddr/metadata/premis_event.rb +59 -0
- data/lib/ddr/metadata/rdf_vocabulary_parser.rb +45 -0
- data/lib/ddr/metadata/roles_vocabulary.rb +10 -0
- data/lib/ddr/metadata/sources/duketerms.rdf.xml +856 -0
- data/lib/ddr/metadata/vocabulary.rb +37 -0
- data/lib/ddr/models.rb +60 -0
- data/lib/ddr/models/access_controllable.rb +23 -0
- data/lib/ddr/models/base.rb +37 -0
- data/lib/ddr/models/describable.rb +81 -0
- data/lib/ddr/models/engine.rb +58 -0
- data/lib/ddr/models/error.rb +12 -0
- data/lib/ddr/models/event_loggable.rb +36 -0
- data/lib/ddr/models/file_management.rb +183 -0
- data/lib/ddr/models/fixity_checkable.rb +20 -0
- data/lib/ddr/models/governable.rb +48 -0
- data/lib/ddr/models/has_attachments.rb +12 -0
- data/lib/ddr/models/has_children.rb +21 -0
- data/lib/ddr/models/has_content.rb +114 -0
- data/lib/ddr/models/has_content_metadata.rb +16 -0
- data/lib/ddr/models/has_properties.rb +15 -0
- data/lib/ddr/models/has_role_assignments.rb +17 -0
- data/lib/ddr/models/has_thumbnail.rb +27 -0
- data/lib/ddr/models/has_workflow.rb +29 -0
- data/lib/ddr/models/indexing.rb +53 -0
- data/lib/ddr/models/licensable.rb +28 -0
- data/lib/ddr/models/minted_id.rb +10 -0
- data/lib/ddr/models/permanent_identification.rb +48 -0
- data/lib/ddr/models/solr_document.rb +193 -0
- data/lib/ddr/models/version.rb +5 -0
- data/lib/ddr/notifications.rb +15 -0
- data/lib/ddr/services.rb +8 -0
- data/lib/ddr/services/id_service.rb +48 -0
- data/lib/ddr/utils.rb +153 -0
- data/lib/ddr/workflow.rb +8 -0
- data/lib/ddr/workflow/workflow_state.rb +39 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/user.rb +5 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +29 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +78 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/assets.rb +8 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +56 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +80 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +4974 -0
- data/spec/dummy/log/test.log +55627 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/attachment_factories.rb +15 -0
- data/spec/factories/collection_factories.rb +16 -0
- data/spec/factories/component_factories.rb +15 -0
- data/spec/factories/event_factories.rb +7 -0
- data/spec/factories/item_factories.rb +16 -0
- data/spec/factories/target_factories.rb +11 -0
- data/spec/factories/test_model_factories.rb +133 -0
- data/spec/factories/user_factories.rb +7 -0
- data/spec/factories/user_factories.rb~ +7 -0
- data/spec/features/grouper_integration_spec.rb~ +21 -0
- data/spec/fixtures/contentMetadata.xml +37 -0
- data/spec/fixtures/image1.tiff +0 -0
- data/spec/fixtures/image2.tiff +0 -0
- data/spec/fixtures/image3.tiff +0 -0
- data/spec/fixtures/library-devil.tiff +0 -0
- data/spec/fixtures/sample.docx +0 -0
- data/spec/fixtures/sample.pdf +0 -0
- data/spec/fixtures/target.png +0 -0
- data/spec/models/ability_spec.rb +248 -0
- data/spec/models/ability_spec.rb~ +245 -0
- data/spec/models/active_fedora_base_spec.rb +107 -0
- data/spec/models/active_fedora_datastream_spec.rb +121 -0
- data/spec/models/attachment_spec.rb +13 -0
- data/spec/models/collection_spec.rb +33 -0
- data/spec/models/component_spec.rb +8 -0
- data/spec/models/descriptive_metadata_datastream_spec.rb +102 -0
- data/spec/models/events_spec.rb +64 -0
- data/spec/models/file_management_spec.rb +179 -0
- data/spec/models/has_role_assignments_spec.rb +29 -0
- data/spec/models/has_workflow_spec.rb +54 -0
- data/spec/models/item_spec.rb +8 -0
- data/spec/models/permanent_identification_spec.rb +65 -0
- data/spec/models/role_assignments_datastream_spec.rb +25 -0
- data/spec/models/superuser_spec.rb +13 -0
- data/spec/models/superuser_spec.rb~ +13 -0
- data/spec/models/target_spec.rb +8 -0
- data/spec/models/user_spec.rb +60 -0
- data/spec/models/user_spec.rb~ +56 -0
- data/spec/services/group_service_spec.rb +75 -0
- data/spec/services/group_service_spec.rb~ +71 -0
- data/spec/services/id_service_spec.rb +33 -0
- data/spec/spec_helper.rb +125 -0
- data/spec/support/shared_examples_for_access_controllables.rb +6 -0
- data/spec/support/shared_examples_for_associations.rb +8 -0
- data/spec/support/shared_examples_for_ddr_models.rb +7 -0
- data/spec/support/shared_examples_for_describables.rb +63 -0
- data/spec/support/shared_examples_for_event_loggables.rb +3 -0
- data/spec/support/shared_examples_for_events.rb +179 -0
- data/spec/support/shared_examples_for_governables.rb +17 -0
- data/spec/support/shared_examples_for_has_content.rb +136 -0
- data/spec/support/shared_examples_for_has_content_metadata.rb +74 -0
- data/spec/support/shared_examples_for_has_properties.rb +5 -0
- data/spec/support/shared_examples_for_indexing.rb +36 -0
- metadata +562 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module FixityCheckable
|
4
|
+
|
5
|
+
def datastreams_to_validate
|
6
|
+
datastreams.select { |dsid, ds| ds.has_content? }
|
7
|
+
end
|
8
|
+
|
9
|
+
def fixity_checks
|
10
|
+
Ddr::Events::FixityCheckEvent.for_object(self)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns a Ddr::Actions::FixityCheck::Result for the object
|
14
|
+
def fixity_check
|
15
|
+
Ddr::Actions::FixityCheck.execute(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module Governable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
belongs_to :admin_policy, :property => :is_governed_by, :class_name => "Collection"
|
8
|
+
end
|
9
|
+
|
10
|
+
def inherited_permissions
|
11
|
+
admin_policy ? admin_policy.default_permissions : []
|
12
|
+
end
|
13
|
+
|
14
|
+
def inherited_rights
|
15
|
+
admin_policy.datastreams[Ddr::Datastreams::DEFAULT_RIGHTS] if admin_policy
|
16
|
+
end
|
17
|
+
|
18
|
+
# Creates convenience methods:
|
19
|
+
# inherited_discover_users, inherited_discover_groups,
|
20
|
+
# inherited_read_users, inherited_read_groups,
|
21
|
+
# inherited_edit_user, inherited_edit_groups
|
22
|
+
["discover", "read", "edit"].each do |access|
|
23
|
+
["user", "group"].each do |type|
|
24
|
+
define_method("inherited_#{access}_#{type}s") do
|
25
|
+
admin_policy ? admin_policy.send("default_#{access}_#{type}s") : []
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def inherited_license
|
31
|
+
admin_policy.default_license if admin_policy
|
32
|
+
end
|
33
|
+
|
34
|
+
def copy_admin_policy_from(other)
|
35
|
+
# XXX In active-fedora 7.0 can do
|
36
|
+
# self.admin_policy = other.admin_policy
|
37
|
+
self.admin_policy_id = case
|
38
|
+
when other.has_admin_policy?
|
39
|
+
other.admin_policy_id
|
40
|
+
when other.is_a?(Collection)
|
41
|
+
other.pid
|
42
|
+
end
|
43
|
+
# self.admin_policy_id = other.admin_policy_id if other.has_admin_policy?
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module HasChildren
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
def first_child
|
7
|
+
if datastreams.include?(Ddr::Datastreams::CONTENT_METADATA) && datastreams[Ddr::Datastreams::CONTENT_METADATA].has_content?
|
8
|
+
first_child_pid = datastreams[Ddr::Datastreams::CONTENT_METADATA].first_pid
|
9
|
+
else
|
10
|
+
first_child_pid = ActiveFedora::SolrService.query(association_query(:children), rows: 1, sort: "#{Ddr::IndexFields::IDENTIFIER} ASC").first["id"]
|
11
|
+
end
|
12
|
+
begin
|
13
|
+
ActiveFedora::Base.find(first_child_pid, :cast => true) if first_child_pid
|
14
|
+
rescue ActiveFedora::ObjectNotFound
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
|
3
|
+
module Ddr
|
4
|
+
module Models
|
5
|
+
module HasContent
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
has_file_datastream name: Ddr::Datastreams::CONTENT,
|
10
|
+
versionable: true,
|
11
|
+
label: "Content file for this object",
|
12
|
+
control_group: "M"
|
13
|
+
|
14
|
+
has_attributes :original_filename, datastream: "properties", multiple: false
|
15
|
+
|
16
|
+
validates_presence_of :content
|
17
|
+
|
18
|
+
include Hydra::Derivatives
|
19
|
+
include FileManagement unless include?(FileManagement)
|
20
|
+
|
21
|
+
around_save :update_thumbnail, if: :content_changed?
|
22
|
+
|
23
|
+
after_add_file do
|
24
|
+
if file_to_add.original_name && file_to_add.dsid == "content"
|
25
|
+
self.original_filename = file_to_add.original_name
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
delegate :validate_checksum!, to: :content
|
30
|
+
end
|
31
|
+
|
32
|
+
# Convenience method wrapping FileManagement#add_file
|
33
|
+
def upload file, opts={}
|
34
|
+
add_file(file, Ddr::Datastreams::CONTENT, opts)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Set content to file and save
|
38
|
+
def upload! file, opts={}
|
39
|
+
upload(file, opts)
|
40
|
+
save
|
41
|
+
end
|
42
|
+
|
43
|
+
def content_size
|
44
|
+
content.external? ? content.file_size : content.dsSize
|
45
|
+
end
|
46
|
+
|
47
|
+
def content_human_size
|
48
|
+
ActiveSupport::NumberHelper.number_to_human_size(content_size) if content_size
|
49
|
+
end
|
50
|
+
|
51
|
+
def content_type
|
52
|
+
content.mimeType
|
53
|
+
end
|
54
|
+
|
55
|
+
def content_major_type
|
56
|
+
content_type.split("/").first
|
57
|
+
end
|
58
|
+
|
59
|
+
def content_sub_type
|
60
|
+
content_type.split("/").last
|
61
|
+
end
|
62
|
+
|
63
|
+
def content_type= mime_type
|
64
|
+
self.content.mimeType = mime_type
|
65
|
+
end
|
66
|
+
|
67
|
+
def image?
|
68
|
+
content_major_type == "image"
|
69
|
+
end
|
70
|
+
|
71
|
+
def pdf?
|
72
|
+
content_type == "application/pdf"
|
73
|
+
end
|
74
|
+
|
75
|
+
def generate_thumbnail
|
76
|
+
return false unless thumbnailable?
|
77
|
+
transform_datastream :content, { thumbnail: { size: "100x100>", datastream: "thumbnail" } }
|
78
|
+
thumbnail_changed?
|
79
|
+
end
|
80
|
+
|
81
|
+
def generate_thumbnail!
|
82
|
+
generate_thumbnail && save
|
83
|
+
end
|
84
|
+
|
85
|
+
def virus_checks
|
86
|
+
Ddr::Events::VirusCheckEvent.for_object(self)
|
87
|
+
end
|
88
|
+
|
89
|
+
def content_changed?
|
90
|
+
content.external? ? content.dsLocation_changed? : content.content_changed?
|
91
|
+
end
|
92
|
+
|
93
|
+
protected
|
94
|
+
|
95
|
+
def update_thumbnail
|
96
|
+
yield
|
97
|
+
if thumbnailable?
|
98
|
+
generate_thumbnail!
|
99
|
+
else
|
100
|
+
thumbnail.delete
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def thumbnailable?
|
105
|
+
has_content? && (image? || pdf?)
|
106
|
+
end
|
107
|
+
|
108
|
+
def default_content_type
|
109
|
+
"application/octet-stream"
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module HasContentMetadata
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
has_file_datastream :name => Ddr::Datastreams::CONTENT_METADATA,
|
8
|
+
:type => Ddr::Datastreams::ContentMetadataDatastream,
|
9
|
+
:versionable => true,
|
10
|
+
:label => "Structural Content Data for this object",
|
11
|
+
:control_group => 'M'
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module HasProperties
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
has_metadata name: Ddr::Datastreams::PROPERTIES,
|
8
|
+
type: Ddr::Datastreams::PropertiesDatastream,
|
9
|
+
versionable: true,
|
10
|
+
label: "Properties for this object",
|
11
|
+
control_group: 'M'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module HasRoleAssignments
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
has_metadata name: "roleAssignments",
|
8
|
+
type: Ddr::Datastreams::RoleAssignmentsDatastream,
|
9
|
+
versionable: true,
|
10
|
+
control_group: "M"
|
11
|
+
|
12
|
+
delegate :principal_has_role?, to: :roleAssignments
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module HasThumbnail
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
has_file_datastream name: Ddr::Datastreams::THUMBNAIL,
|
8
|
+
versionable: true,
|
9
|
+
label: "Thumbnail for this object",
|
10
|
+
control_group: 'M'
|
11
|
+
end
|
12
|
+
|
13
|
+
def thumbnail_changed?
|
14
|
+
thumbnail.content_changed?
|
15
|
+
end
|
16
|
+
|
17
|
+
def copy_thumbnail_from(other)
|
18
|
+
if other && other.has_thumbnail?
|
19
|
+
self.thumbnail.content = other.thumbnail.content
|
20
|
+
self.thumbnail.mimeType = other.thumbnail.mimeType if thumbnail_changed?
|
21
|
+
end
|
22
|
+
thumbnail_changed?
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module HasWorkflow
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
PUBLISHED = Ddr::Workflow::WorkflowState::PUBLISHED
|
7
|
+
UNPUBLISHED = nil
|
8
|
+
|
9
|
+
def workflow_state
|
10
|
+
Ddr::Workflow::WorkflowState.workflow_state_for_object(self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def published?
|
14
|
+
self.workflow_state == PUBLISHED
|
15
|
+
end
|
16
|
+
|
17
|
+
def publish!
|
18
|
+
Ddr::Workflow::WorkflowState.set_for_object(self, PUBLISHED)
|
19
|
+
update_index
|
20
|
+
end
|
21
|
+
|
22
|
+
def unpublish!
|
23
|
+
Ddr::Workflow::WorkflowState.set_for_object(self, UNPUBLISHED)
|
24
|
+
update_index
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module Indexing
|
4
|
+
|
5
|
+
def to_solr(solr_doc=Hash.new, opts={})
|
6
|
+
solr_doc = super(solr_doc, opts)
|
7
|
+
solr_doc.merge index_fields
|
8
|
+
end
|
9
|
+
|
10
|
+
def index_fields
|
11
|
+
fields = {
|
12
|
+
Ddr::IndexFields::TITLE => title_display,
|
13
|
+
Ddr::IndexFields::INTERNAL_URI => internal_uri,
|
14
|
+
Ddr::IndexFields::IDENTIFIER => identifier_sort,
|
15
|
+
Ddr::IndexFields::PERMANENT_ID => permanent_id,
|
16
|
+
Ddr::IndexFields::WORKFLOW_STATE => workflow_state
|
17
|
+
}
|
18
|
+
if respond_to? :fixity_checks
|
19
|
+
last_fixity_check = fixity_checks.last
|
20
|
+
fields.merge!(last_fixity_check.to_solr) if last_fixity_check
|
21
|
+
end
|
22
|
+
if respond_to? :virus_checks
|
23
|
+
last_virus_check = virus_checks.last
|
24
|
+
fields.merge!(last_virus_check.to_solr) if last_virus_check
|
25
|
+
end
|
26
|
+
if respond_to?(:original_filename) && original_filename.present?
|
27
|
+
fields[Ddr::IndexFields::ORIGINAL_FILENAME] = original_filename
|
28
|
+
end
|
29
|
+
if has_content?
|
30
|
+
fields[Ddr::IndexFields::CONTENT_CONTROL_GROUP] = content.controlGroup
|
31
|
+
fields[Ddr::IndexFields::CONTENT_SIZE] = content_size
|
32
|
+
fields[Ddr::IndexFields::CONTENT_SIZE_HUMAN] = content_human_size
|
33
|
+
fields[Ddr::IndexFields::MEDIA_TYPE] = content_type
|
34
|
+
fields[Ddr::IndexFields::MEDIA_MAJOR_TYPE] = content_major_type
|
35
|
+
fields[Ddr::IndexFields::MEDIA_SUB_TYPE] = content_sub_type
|
36
|
+
end
|
37
|
+
fields
|
38
|
+
end
|
39
|
+
|
40
|
+
def title_display
|
41
|
+
return title.first if title.present?
|
42
|
+
return identifier.first if identifier.present?
|
43
|
+
return original_filename if respond_to?(:original_filename) && original_filename.present?
|
44
|
+
"[#{pid}]"
|
45
|
+
end
|
46
|
+
|
47
|
+
def identifier_sort
|
48
|
+
identifier.first
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module Licensable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
has_attributes :license_title, datastream: Ddr::Datastreams::RIGHTS_METADATA, at: [:license, :title], multiple: false
|
8
|
+
has_attributes :license_description, datastream: Ddr::Datastreams::RIGHTS_METADATA, at: [:license, :description], multiple: false
|
9
|
+
has_attributes :license_url, datastream: Ddr::Datastreams::RIGHTS_METADATA, at: [:license, :url], multiple: false
|
10
|
+
end
|
11
|
+
|
12
|
+
def license
|
13
|
+
if license_title.present? or license_description.present? or license_url.present?
|
14
|
+
{title: license_title, description: license_description, url: license_url}.with_indifferent_access
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def license=(new_license)
|
19
|
+
raise ArgumentError unless new_license.is_a?(Hash)
|
20
|
+
l = new_license.with_indifferent_access
|
21
|
+
self.license_title = l[:title]
|
22
|
+
self.license_description = l[:description]
|
23
|
+
self.license_url = l[:url]
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Models
|
3
|
+
module PermanentIdentification
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
PERMALINK_BASE_URL = 'http://id.library.duke.edu/'
|
7
|
+
|
8
|
+
included do
|
9
|
+
has_attributes :permanent_id, datastream: Ddr::Datastreams::PROPERTIES, multiple: false
|
10
|
+
after_create :assign_permanent_identifier
|
11
|
+
|
12
|
+
def self.permalink(permanent_id)
|
13
|
+
PERMALINK_BASE_URL + permanent_id
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
def permalink
|
19
|
+
self.class.permalink(permanent_id)
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
def assign_permanent_identifier
|
25
|
+
reload
|
26
|
+
unless permanent_id.present?
|
27
|
+
event_args = { pid: self.pid, summary: "Assigned permanent ID" }
|
28
|
+
begin
|
29
|
+
self.permanent_id = Ddr::Services::IdService.mint
|
30
|
+
if save(validate: false)
|
31
|
+
MintedId.find_by(minted_id: self.permanent_id).update(referent: self.pid)
|
32
|
+
event_args[:outcome] = Ddr::Events::Event::SUCCESS
|
33
|
+
event_args[:detail] = "Assigned permanent ID #{self.permanent_id} to #{self.pid}"
|
34
|
+
else
|
35
|
+
raise "Could not save object #{self.pid} with permanent identifier #{self.permanent_id}"
|
36
|
+
end
|
37
|
+
rescue Exception => e
|
38
|
+
event_args[:outcome] = Ddr::Events::Event::FAILURE
|
39
|
+
event_args[:detail] = "Unable to assign permanent ID to #{self.pid}"
|
40
|
+
Rails.logger.error("Error assigning permanent ID to #{self.pid}: #{e}")
|
41
|
+
end
|
42
|
+
Ddr::Notifications.notify_event(:update, event_args)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|