ddr-core 0.2.1
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 +27 -0
- data/Rakefile +30 -0
- data/app/assets/config/ddr_core_manifest.js +0 -0
- data/app/controllers/users/omniauth_callbacks_controller.rb +11 -0
- data/app/controllers/users/sessions_controller.rb +15 -0
- data/app/models/concerns/ddr/captionable.rb +25 -0
- data/app/models/concerns/ddr/describable.rb +108 -0
- data/app/models/concerns/ddr/governable.rb +25 -0
- data/app/models/concerns/ddr/has_admin_metadata.rb +141 -0
- data/app/models/concerns/ddr/has_attachments.rb +10 -0
- data/app/models/concerns/ddr/has_children.rb +10 -0
- data/app/models/concerns/ddr/has_content.rb +132 -0
- data/app/models/concerns/ddr/has_extracted_text.rb +10 -0
- data/app/models/concerns/ddr/has_intermediate_file.rb +25 -0
- data/app/models/concerns/ddr/has_multires_image.rb +14 -0
- data/app/models/concerns/ddr/has_parent.rb +18 -0
- data/app/models/concerns/ddr/has_struct_metadata.rb +21 -0
- data/app/models/concerns/ddr/has_thumbnail.rb +33 -0
- data/app/models/concerns/ddr/solr_document_behavior.rb +429 -0
- data/app/models/concerns/ddr/streamable.rb +25 -0
- data/app/models/ddr/admin_set.rb +28 -0
- data/app/models/ddr/attachment.rb +14 -0
- data/app/models/ddr/collection.rb +28 -0
- data/app/models/ddr/component.rb +31 -0
- data/app/models/ddr/contact.rb +23 -0
- data/app/models/ddr/digest.rb +8 -0
- data/app/models/ddr/file.rb +40 -0
- data/app/models/ddr/item.rb +36 -0
- data/app/models/ddr/language.rb +31 -0
- data/app/models/ddr/media_type.rb +22 -0
- data/app/models/ddr/resource.rb +94 -0
- data/app/models/ddr/rights_statement.rb +25 -0
- data/app/models/ddr/target.rb +17 -0
- data/config/initializers/devise.rb +262 -0
- data/config/locales/ddr-core.en.yml +85 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20141104181418_create_users.rb +34 -0
- data/db/migrate/20141107124012_add_columns_to_user.rb +46 -0
- data/lib/ddr-core.rb +1 -0
- data/lib/ddr/auth.rb +80 -0
- data/lib/ddr/auth/ability.rb +18 -0
- data/lib/ddr/auth/ability_definitions.rb +26 -0
- data/lib/ddr/auth/ability_definitions/admin_set_ability_definitions.rb +9 -0
- data/lib/ddr/auth/ability_definitions/alias_ability_definitions.rb +23 -0
- data/lib/ddr/auth/ability_definitions/attachment_ability_definitions.rb +13 -0
- data/lib/ddr/auth/ability_definitions/collection_ability_definitions.rb +28 -0
- data/lib/ddr/auth/ability_definitions/component_ability_definitions.rb +13 -0
- data/lib/ddr/auth/ability_definitions/item_ability_definitions.rb +13 -0
- data/lib/ddr/auth/ability_definitions/lock_ability_definitions.rb +13 -0
- data/lib/ddr/auth/ability_definitions/publication_ability_definitions.rb +16 -0
- data/lib/ddr/auth/ability_definitions/role_based_ability_definitions.rb +39 -0
- data/lib/ddr/auth/ability_definitions/superuser_ability_definitions.rb +9 -0
- data/lib/ddr/auth/ability_factory.rb +10 -0
- data/lib/ddr/auth/abstract_ability.rb +48 -0
- data/lib/ddr/auth/affiliation.rb +14 -0
- data/lib/ddr/auth/affiliation_groups.rb +20 -0
- data/lib/ddr/auth/anonymous_ability.rb +7 -0
- data/lib/ddr/auth/auth_context.rb +109 -0
- data/lib/ddr/auth/auth_context_factory.rb +13 -0
- data/lib/ddr/auth/detached_auth_context.rb +19 -0
- data/lib/ddr/auth/dynamic_groups.rb +13 -0
- data/lib/ddr/auth/effective_permissions.rb +12 -0
- data/lib/ddr/auth/effective_roles.rb +9 -0
- data/lib/ddr/auth/failure_app.rb +16 -0
- data/lib/ddr/auth/group.rb +40 -0
- data/lib/ddr/auth/grouper_gateway.rb +70 -0
- data/lib/ddr/auth/groups.rb +32 -0
- data/lib/ddr/auth/ldap_gateway.rb +74 -0
- data/lib/ddr/auth/permissions.rb +18 -0
- data/lib/ddr/auth/remote_groups.rb +14 -0
- data/lib/ddr/auth/role_based_access_controls_enforcement.rb +56 -0
- data/lib/ddr/auth/roles.rb +28 -0
- data/lib/ddr/auth/roles/role.rb +121 -0
- data/lib/ddr/auth/roles/role_type.rb +23 -0
- data/lib/ddr/auth/roles/role_types.rb +52 -0
- data/lib/ddr/auth/superuser_ability.rb +7 -0
- data/lib/ddr/auth/test_helpers.rb +22 -0
- data/lib/ddr/auth/user.rb +54 -0
- data/lib/ddr/auth/web_auth_context.rb +29 -0
- data/lib/ddr/core.rb +110 -0
- data/lib/ddr/core/engine.rb +8 -0
- data/lib/ddr/core/version.rb +5 -0
- data/lib/ddr/error.rb +16 -0
- data/lib/ddr/files.rb +13 -0
- data/lib/ddr/fits.rb +189 -0
- data/lib/ddr/index.rb +29 -0
- data/lib/ddr/index/abstract_query_result.rb +22 -0
- data/lib/ddr/index/connection.rb +38 -0
- data/lib/ddr/index/csv_query_result.rb +84 -0
- data/lib/ddr/index/document_builder.rb +9 -0
- data/lib/ddr/index/field.rb +35 -0
- data/lib/ddr/index/field_attribute.rb +22 -0
- data/lib/ddr/index/fields.rb +154 -0
- data/lib/ddr/index/filter.rb +139 -0
- data/lib/ddr/index/query.rb +82 -0
- data/lib/ddr/index/query_builder.rb +185 -0
- data/lib/ddr/index/query_clause.rb +112 -0
- data/lib/ddr/index/query_params.rb +40 -0
- data/lib/ddr/index/query_result.rb +102 -0
- data/lib/ddr/index/response.rb +30 -0
- data/lib/ddr/index/sort_order.rb +28 -0
- data/lib/ddr/index/unique_key_field.rb +12 -0
- data/lib/ddr/managers.rb +9 -0
- data/lib/ddr/managers/manager.rb +13 -0
- data/lib/ddr/managers/technical_metadata_manager.rb +141 -0
- data/lib/ddr/structure.rb +188 -0
- data/lib/ddr/structures/agent.rb +49 -0
- data/lib/ddr/structures/component_type_term.rb +29 -0
- data/lib/ddr/structures/div.rb +64 -0
- data/lib/ddr/structures/f_locat.rb +54 -0
- data/lib/ddr/structures/file.rb +52 -0
- data/lib/ddr/structures/file_grp.rb +35 -0
- data/lib/ddr/structures/file_sec.rb +22 -0
- data/lib/ddr/structures/fptr.rb +31 -0
- data/lib/ddr/structures/mets_hdr.rb +37 -0
- data/lib/ddr/structures/mptr.rb +49 -0
- data/lib/ddr/structures/struct_map.rb +40 -0
- data/lib/ddr/utils.rb +185 -0
- data/lib/ddr/vocab.rb +22 -0
- data/lib/ddr/vocab/asset.rb +51 -0
- data/lib/ddr/vocab/contact.rb +9 -0
- data/lib/ddr/vocab/display.rb +9 -0
- data/lib/ddr/vocab/duke_terms.rb +13 -0
- data/lib/ddr/vocab/rdf_vocabulary_parser.rb +43 -0
- data/lib/ddr/vocab/roles.rb +25 -0
- data/lib/ddr/vocab/sources/duketerms.rdf +870 -0
- data/lib/ddr/vocab/vocabulary.rb +37 -0
- data/lib/ddr/workflow.rb +8 -0
- data/lib/tasks/ddr/core_tasks.rake +4 -0
- metadata +428 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b5680472d74a8c3238ef7988d603d3379e9c48414bc434004623260fcd09a80d
|
4
|
+
data.tar.gz: c9dd0599607565c5ff2f28e9cff4eddad8423e08e8754f86002cc1e68b8d4e01
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a1a2b035ba49e258cb2f79bb03df468f9ddb0e497bcc7fec429354487e70426e93f9b2396b1a6ff9c82f25c719520aea155cab6afb7bcec88626e8fdd099ee81
|
7
|
+
data.tar.gz: 46a32800615641b070023fd05ad6884294a717e5638d0a747e3f74320e2d3507f9a4d9fd8cfdcd31806c125ca0a342d889c19749f30b9c14b5fe2899c3929279
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
Copyright (c) 2019, Duke University
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
5
|
+
|
6
|
+
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
7
|
+
|
8
|
+
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
9
|
+
|
10
|
+
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
11
|
+
|
12
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# Ddr::Core
|
2
|
+
|
3
|
+
A port of ddr-models based on Valkyrie.
|
4
|
+
|
5
|
+
## Using the docker stack
|
6
|
+
|
7
|
+
Install docker (Docker for Mac includes all the required components).
|
8
|
+
|
9
|
+
Start the stack:
|
10
|
+
|
11
|
+
$ docker-compose up -d --build
|
12
|
+
|
13
|
+
To run a Bash shell on the app server:
|
14
|
+
|
15
|
+
$ docker-compose run --rm app bash
|
16
|
+
|
17
|
+
To connect to the development database:
|
18
|
+
|
19
|
+
$ docker-compose run --rm app psql -U postgres -h db -d ddr_core_development
|
20
|
+
|
21
|
+
To run the test suite:
|
22
|
+
|
23
|
+
$ docker-compose run --rm -e RAILS_ENV=test app bundle exec rake spec
|
24
|
+
|
25
|
+
Stop the stack:
|
26
|
+
|
27
|
+
$ docker-compose down
|
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Ddr::Core'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
load 'rails/tasks/statistics.rake'
|
21
|
+
|
22
|
+
require 'bundler/gem_tasks'
|
23
|
+
|
24
|
+
# Wrap in 'rescue' clause based on recommendation at https://relishapp.com/rspec/rspec-core/docs/command-line/rake-task
|
25
|
+
begin
|
26
|
+
require 'rspec/core/rake_task'
|
27
|
+
RSpec::Core::RakeTask.new(:spec)
|
28
|
+
task default: :spec
|
29
|
+
rescue LoadError
|
30
|
+
end
|
File without changes
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "devise/omniauth_callbacks_controller"
|
2
|
+
|
3
|
+
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
4
|
+
|
5
|
+
def shibboleth
|
6
|
+
user = resource_class.from_omniauth(request.env["omniauth.auth"])
|
7
|
+
set_flash_message :notice, :success, kind: "Duke NetID"
|
8
|
+
sign_in_and_redirect user
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'devise'
|
2
|
+
|
3
|
+
class Users::SessionsController < Devise::SessionsController
|
4
|
+
|
5
|
+
def new
|
6
|
+
store_location_for(:user, request.referrer)
|
7
|
+
if Ddr::Auth.require_shib_user_authn
|
8
|
+
flash.discard(:alert)
|
9
|
+
redirect_to user_shibboleth_omniauth_authorize_path
|
10
|
+
else
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Captionable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
attribute :caption, Ddr::File.optional
|
7
|
+
end
|
8
|
+
|
9
|
+
def caption_type
|
10
|
+
caption&.media_type
|
11
|
+
end
|
12
|
+
|
13
|
+
# This method is used in dul-hydra 'ComponentsController' and ddr-public 'CaptionsController'
|
14
|
+
def caption_extension
|
15
|
+
if filename = caption&.original_filename
|
16
|
+
::File.extname(filename)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def caption_path
|
21
|
+
caption&.file&.disk_path
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Describable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
def self.term_names
|
6
|
+
term_names = []
|
7
|
+
vocabularies.each do |vocab|
|
8
|
+
Ddr::Vocab::Vocabulary.property_terms(vocab).each do |term|
|
9
|
+
term_name = Ddr::Vocab::Vocabulary.term_name(vocab, term)
|
10
|
+
unless term_name == :license
|
11
|
+
term_names << term_name
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
term_names
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.vocabularies
|
19
|
+
[RDF::Vocab::DC, Ddr::Vocab::DukeTerms].freeze
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.indexers
|
23
|
+
# Add term_name => [indexers] mapping to customize indexing
|
24
|
+
{}
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.default_indexers
|
28
|
+
[:stored_searchable]
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.indexers_for(term_name)
|
32
|
+
indexers.fetch(term_name, default_indexers)
|
33
|
+
end
|
34
|
+
|
35
|
+
included do
|
36
|
+
Ddr::Describable.term_names.each do |term_name|
|
37
|
+
attribute term_name, Valkyrie::Types::Set
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Used in dul-hydra view
|
42
|
+
def has_desc_metadata?
|
43
|
+
desc_metadata_terms(:present).present?
|
44
|
+
end
|
45
|
+
|
46
|
+
# Used in dul-hydra
|
47
|
+
######################
|
48
|
+
# Commenting out the :required argument since validation is not a model concern in the Valkyrie paradigm.
|
49
|
+
# This will break the `desc_metadata_form_fields` helper in dul-hydra and we'll have to fix it there eventually.
|
50
|
+
######################
|
51
|
+
def desc_metadata_terms *args
|
52
|
+
return Ddr::Describable.term_names if args.empty?
|
53
|
+
arg = args.pop
|
54
|
+
terms = case arg.to_sym
|
55
|
+
when :empty
|
56
|
+
desc_metadata_terms.select { |t| values(t).empty? }
|
57
|
+
when :present
|
58
|
+
desc_metadata_terms.select { |t| values(t).present? }
|
59
|
+
when :defined_attributes
|
60
|
+
desc_metadata_terms
|
61
|
+
# when :required
|
62
|
+
# desc_metadata_terms(:defined_attributes).select {|t| required? t}
|
63
|
+
when :dcterms
|
64
|
+
Ddr::Vocab::Vocabulary.term_names(RDF::Vocab::DC11) +
|
65
|
+
(Ddr::Vocab::Vocabulary.term_names(RDF::Vocab::DC) - Ddr::Vocab::Vocabulary.term_names(RDF::Vocab::DC11))
|
66
|
+
when :dcterms_elements11
|
67
|
+
Ddr::Vocab::Vocabulary.term_names(RDF::Vocab::DC11)
|
68
|
+
when :duke
|
69
|
+
Ddr::Vocab::Vocabulary.term_names(Ddr::Vocab::DukeTerms)
|
70
|
+
else
|
71
|
+
raise ArgumentError, "Invalid argument: #{arg.inspect}"
|
72
|
+
end
|
73
|
+
if args.empty?
|
74
|
+
terms
|
75
|
+
else
|
76
|
+
terms | desc_metadata_terms(*args)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Used in dul-hydra helper -- replace there with Ddr::Describable.vocabularies?
|
81
|
+
def desc_metadata_vocabs
|
82
|
+
Ddr::Describable.vocabularies
|
83
|
+
end
|
84
|
+
|
85
|
+
# Used here and in indexing spec test but can probably be replaced with just .set_value(term, values)
|
86
|
+
def set_desc_metadata_values term, values
|
87
|
+
set_value term, values
|
88
|
+
end
|
89
|
+
|
90
|
+
# Used in dul-hydra
|
91
|
+
# Update all descMetadata terms with values in hash
|
92
|
+
# Note that term not having key in hash will be set to nil!
|
93
|
+
def set_desc_metadata term_values_hash
|
94
|
+
desc_metadata_terms.each { |t| set_desc_metadata_values(t, term_values_hash[t]) }
|
95
|
+
end
|
96
|
+
|
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
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Ddr
|
2
|
+
module Governable
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
attribute :admin_policy_id, Valkyrie::Types::ID.optional
|
7
|
+
end
|
8
|
+
|
9
|
+
def admin_policy
|
10
|
+
if admin_policy_id.present?
|
11
|
+
Valkyrie.config.metadata_adapter.query_service.find_by(id: admin_policy_id)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def admin_policy=(admin_policy)
|
16
|
+
unless admin_policy.is_a? Ddr::Collection
|
17
|
+
raise ArgumentError,
|
18
|
+
I18n.t('ddr.core.errors.incorrect_resource_class',
|
19
|
+
subject: 'Admin Policy', resource_class: 'Ddr::Core::Collection')
|
20
|
+
end
|
21
|
+
self.admin_policy_id = admin_policy.id
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
module Ddr
|
2
|
+
module HasAdminMetadata
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
TERMS = { access_role: Valkyrie::Types::Set.of(Ddr::Auth::Roles::Role),
|
6
|
+
admin_set: Valkyrie::Types::Strict::String.optional,
|
7
|
+
affiliation: Valkyrie::Types::Set,
|
8
|
+
aleph_id: Valkyrie::Types::Strict::String.optional,
|
9
|
+
aspace_id: Valkyrie::Types::Strict::String.optional,
|
10
|
+
depositor: Valkyrie::Types::Strict::String.optional,
|
11
|
+
display_format: Valkyrie::Types::Strict::String.optional,
|
12
|
+
doi: Valkyrie::Types::Strict::String.optional,
|
13
|
+
ead_id: Valkyrie::Types::Strict::String.optional,
|
14
|
+
ingested_by: Valkyrie::Types::Strict::String.optional,
|
15
|
+
ingestion_date: Valkyrie::Types::DateTime.optional,
|
16
|
+
is_locked: Valkyrie::Types::Strict::Bool.optional,
|
17
|
+
license: Valkyrie::Types::Strict::String.optional,
|
18
|
+
local_id: Valkyrie::Types::Strict::String.optional,
|
19
|
+
nested_path: Valkyrie::Types::Strict::String.optional,
|
20
|
+
permanent_id: Valkyrie::Types::Strict::String.optional,
|
21
|
+
permanent_url: Valkyrie::Types::Strict::String.optional,
|
22
|
+
research_help_contact: Valkyrie::Types::Strict::String.optional,
|
23
|
+
rights_note: Valkyrie::Types::Set,
|
24
|
+
workflow_state: Valkyrie::Types::Strict::String.optional
|
25
|
+
}
|
26
|
+
|
27
|
+
def self.term_names
|
28
|
+
TERMS.keys
|
29
|
+
end
|
30
|
+
|
31
|
+
included do
|
32
|
+
Ddr::HasAdminMetadata::TERMS.each do |term, type|
|
33
|
+
attribute term, type
|
34
|
+
end
|
35
|
+
|
36
|
+
alias_method :roles, :access_role
|
37
|
+
alias_method :roles=, :access_role=
|
38
|
+
end
|
39
|
+
|
40
|
+
def locked?
|
41
|
+
!!is_locked || Ddr.repository_locked
|
42
|
+
end
|
43
|
+
|
44
|
+
def published?
|
45
|
+
workflow_state == Ddr::Workflow::PUBLISHED
|
46
|
+
end
|
47
|
+
|
48
|
+
def research_help
|
49
|
+
Ddr::Contact.call(research_help_contact) if research_help_contact
|
50
|
+
end
|
51
|
+
|
52
|
+
def unpublished?
|
53
|
+
workflow_state == Ddr::Workflow::UNPUBLISHED
|
54
|
+
end
|
55
|
+
|
56
|
+
##############
|
57
|
+
# Move to dul-hydra?
|
58
|
+
##############
|
59
|
+
# def lock
|
60
|
+
# self.is_locked = true
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# def unlock
|
64
|
+
# self.is_locked = false
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# def lock!
|
68
|
+
# lock
|
69
|
+
# save
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
# def unlock!
|
73
|
+
# unlock
|
74
|
+
# save
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# Same with publish! and unpublish!, which is currently delegated to Ddr::Managers::WorkflowManager
|
78
|
+
#
|
79
|
+
###############
|
80
|
+
|
81
|
+
###############
|
82
|
+
# attribute defined in has_content, single-valued, stored in adminMetadata datastream
|
83
|
+
###############
|
84
|
+
# property :original_filename,
|
85
|
+
# predicate: Ddr::Vocab::PREMIS.hasOriginalName do |index|
|
86
|
+
# index.as :stored_sortable
|
87
|
+
# end
|
88
|
+
#
|
89
|
+
|
90
|
+
# included do
|
91
|
+
#
|
92
|
+
# delegate :publish!, :unpublish!, :published?, :unpublished?,
|
93
|
+
# to: :workflow
|
94
|
+
# end
|
95
|
+
#
|
96
|
+
|
97
|
+
def resource_roles
|
98
|
+
roles.select(&:in_resource_scope?)
|
99
|
+
end
|
100
|
+
|
101
|
+
def policy_roles
|
102
|
+
roles.select(&:in_policy_scope?)
|
103
|
+
end
|
104
|
+
|
105
|
+
def inherited_roles
|
106
|
+
( has_admin_policy? && admin_policy.policy_roles ) || []
|
107
|
+
end
|
108
|
+
|
109
|
+
# def effective_roles(agents)
|
110
|
+
# ( resource_roles | policy_roles ).select { |r| agents.include?(r.agent) }
|
111
|
+
# end
|
112
|
+
|
113
|
+
# def workflow
|
114
|
+
# @workflow ||= Ddr::Managers::WorkflowManager.new(self)
|
115
|
+
# end
|
116
|
+
#
|
117
|
+
# def grant_roles_to_creator(creator)
|
118
|
+
# roles.grant type: Ddr::Auth::Roles::EDITOR,
|
119
|
+
# agent: creator,
|
120
|
+
# scope: Ddr::Auth::Roles::RESOURCE_SCOPE
|
121
|
+
# end
|
122
|
+
#
|
123
|
+
# def copy_resource_roles_from(other)
|
124
|
+
# roles.grant *(other.roles.in_resource_scope)
|
125
|
+
# end
|
126
|
+
#
|
127
|
+
|
128
|
+
def effective_permissions(agents)
|
129
|
+
Ddr::Auth::EffectivePermissions.call(self, agents)
|
130
|
+
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# def finding_aid
|
134
|
+
# if ead_id
|
135
|
+
# FindingAid.new(ead_id)
|
136
|
+
# end
|
137
|
+
# end
|
138
|
+
#
|
139
|
+
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
module Ddr
|
2
|
+
module HasContent
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
attribute :content, Ddr::File.optional
|
7
|
+
attribute :fits_file, Ddr::File.optional
|
8
|
+
|
9
|
+
### DDRevo ################################################
|
10
|
+
# Extracted text factored out to separate concern -- Ddr::HasExtractedText
|
11
|
+
### DDRevo ################################################
|
12
|
+
# has_file_datastream \
|
13
|
+
# name: Ddr::Datastreams::EXTRACTED_TEXT,
|
14
|
+
# type: Ddr::Datastreams::PlainTextDatastream,
|
15
|
+
# versionable: true,
|
16
|
+
# label: "Text extracted from the content file",
|
17
|
+
# control_group: "M"
|
18
|
+
#
|
19
|
+
|
20
|
+
delegate :original_filename, to: :content, allow_nil: true
|
21
|
+
|
22
|
+
#######DDRevo#########
|
23
|
+
# expect that the FileManagement module will go to staff app
|
24
|
+
#######DDRevo#########
|
25
|
+
# include FileManagement
|
26
|
+
#
|
27
|
+
#######DDRevo#########
|
28
|
+
# to staff app
|
29
|
+
#######DDRevo#########
|
30
|
+
# delegate :validate_checksum!, to: :content
|
31
|
+
end
|
32
|
+
|
33
|
+
#######DDRevo#########
|
34
|
+
# to staff app
|
35
|
+
#######DDRevo#########
|
36
|
+
# # Convenience method wrapping FileManagement#add_file
|
37
|
+
# def upload file, opts={}
|
38
|
+
# add_file(file, Ddr::Datastreams::CONTENT, opts)
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
#######DDRevo#########
|
42
|
+
# to staff app
|
43
|
+
#######DDRevo#########
|
44
|
+
# # Set content to file and save
|
45
|
+
# def upload! file, opts={}
|
46
|
+
# upload(file, opts)
|
47
|
+
# save
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
#######DDRevo#########
|
51
|
+
# DerivativesManager will go to staff app. Need to determine if there is a need for a '#derivatives' method on
|
52
|
+
# content-bearing objects and, if so, what it should return
|
53
|
+
#######DDRevo#########
|
54
|
+
# def derivatives
|
55
|
+
# @derivatives ||= Ddr::Managers::DerivativesManager.new(self)
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
def techmd
|
59
|
+
@techmd ||= Ddr::Managers::TechnicalMetadataManager.new(self)
|
60
|
+
end
|
61
|
+
|
62
|
+
def content_size
|
63
|
+
content&.file&.size
|
64
|
+
end
|
65
|
+
|
66
|
+
def content_human_size
|
67
|
+
ActiveSupport::NumberHelper.number_to_human_size(content_size) if content_size
|
68
|
+
end
|
69
|
+
|
70
|
+
def content_type
|
71
|
+
content&.media_type
|
72
|
+
end
|
73
|
+
|
74
|
+
def content_major_type
|
75
|
+
content_type&.split("/")&.first
|
76
|
+
end
|
77
|
+
|
78
|
+
def content_sub_type
|
79
|
+
content_type&.split("/")&.last
|
80
|
+
end
|
81
|
+
|
82
|
+
# def content_type= mime_type
|
83
|
+
# self.content.mimeType = mime_type
|
84
|
+
# end
|
85
|
+
#
|
86
|
+
def image?
|
87
|
+
content_major_type == "image"
|
88
|
+
end
|
89
|
+
|
90
|
+
def pdf?
|
91
|
+
content_type == "application/pdf"
|
92
|
+
end
|
93
|
+
|
94
|
+
# def virus_checks
|
95
|
+
# Ddr::Events::VirusCheckEvent.for_object(self)
|
96
|
+
# end
|
97
|
+
#
|
98
|
+
# def last_virus_check
|
99
|
+
# virus_checks.last
|
100
|
+
# end
|
101
|
+
#
|
102
|
+
# def last_virus_check_on
|
103
|
+
# last_virus_check && last_virus_check.event_date_time
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
# def last_virus_check_outcome
|
107
|
+
# last_virus_check && last_virus_check.outcome
|
108
|
+
# end
|
109
|
+
#
|
110
|
+
# def content_changed?
|
111
|
+
# content.external? ? content.dsLocation_changed? : content.content_changed?
|
112
|
+
# end
|
113
|
+
#
|
114
|
+
### DDRevo ###########################################
|
115
|
+
# Moved to Ddr::Resource where other 'has_<file>?' methods reside
|
116
|
+
### DDRevo ###########################################
|
117
|
+
# def has_extracted_text?
|
118
|
+
# extractedText.has_content?
|
119
|
+
# end
|
120
|
+
#
|
121
|
+
# def with_content_file(&block)
|
122
|
+
# WithContentFile.new(self, &block)
|
123
|
+
# end
|
124
|
+
#
|
125
|
+
# protected
|
126
|
+
#
|
127
|
+
# def default_content_type
|
128
|
+
# "application/octet-stream"
|
129
|
+
# end
|
130
|
+
|
131
|
+
end
|
132
|
+
end
|