ddr-core 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +12 -0
  3. data/README.md +27 -0
  4. data/Rakefile +30 -0
  5. data/app/assets/config/ddr_core_manifest.js +0 -0
  6. data/app/controllers/users/omniauth_callbacks_controller.rb +11 -0
  7. data/app/controllers/users/sessions_controller.rb +15 -0
  8. data/app/models/concerns/ddr/captionable.rb +25 -0
  9. data/app/models/concerns/ddr/describable.rb +108 -0
  10. data/app/models/concerns/ddr/governable.rb +25 -0
  11. data/app/models/concerns/ddr/has_admin_metadata.rb +141 -0
  12. data/app/models/concerns/ddr/has_attachments.rb +10 -0
  13. data/app/models/concerns/ddr/has_children.rb +10 -0
  14. data/app/models/concerns/ddr/has_content.rb +132 -0
  15. data/app/models/concerns/ddr/has_extracted_text.rb +10 -0
  16. data/app/models/concerns/ddr/has_intermediate_file.rb +25 -0
  17. data/app/models/concerns/ddr/has_multires_image.rb +14 -0
  18. data/app/models/concerns/ddr/has_parent.rb +18 -0
  19. data/app/models/concerns/ddr/has_struct_metadata.rb +21 -0
  20. data/app/models/concerns/ddr/has_thumbnail.rb +33 -0
  21. data/app/models/concerns/ddr/solr_document_behavior.rb +429 -0
  22. data/app/models/concerns/ddr/streamable.rb +25 -0
  23. data/app/models/ddr/admin_set.rb +28 -0
  24. data/app/models/ddr/attachment.rb +14 -0
  25. data/app/models/ddr/collection.rb +28 -0
  26. data/app/models/ddr/component.rb +31 -0
  27. data/app/models/ddr/contact.rb +23 -0
  28. data/app/models/ddr/digest.rb +8 -0
  29. data/app/models/ddr/file.rb +40 -0
  30. data/app/models/ddr/item.rb +36 -0
  31. data/app/models/ddr/language.rb +31 -0
  32. data/app/models/ddr/media_type.rb +22 -0
  33. data/app/models/ddr/resource.rb +94 -0
  34. data/app/models/ddr/rights_statement.rb +25 -0
  35. data/app/models/ddr/target.rb +17 -0
  36. data/config/initializers/devise.rb +262 -0
  37. data/config/locales/ddr-core.en.yml +85 -0
  38. data/config/routes.rb +3 -0
  39. data/db/migrate/20141104181418_create_users.rb +34 -0
  40. data/db/migrate/20141107124012_add_columns_to_user.rb +46 -0
  41. data/lib/ddr-core.rb +1 -0
  42. data/lib/ddr/auth.rb +80 -0
  43. data/lib/ddr/auth/ability.rb +18 -0
  44. data/lib/ddr/auth/ability_definitions.rb +26 -0
  45. data/lib/ddr/auth/ability_definitions/admin_set_ability_definitions.rb +9 -0
  46. data/lib/ddr/auth/ability_definitions/alias_ability_definitions.rb +23 -0
  47. data/lib/ddr/auth/ability_definitions/attachment_ability_definitions.rb +13 -0
  48. data/lib/ddr/auth/ability_definitions/collection_ability_definitions.rb +28 -0
  49. data/lib/ddr/auth/ability_definitions/component_ability_definitions.rb +13 -0
  50. data/lib/ddr/auth/ability_definitions/item_ability_definitions.rb +13 -0
  51. data/lib/ddr/auth/ability_definitions/lock_ability_definitions.rb +13 -0
  52. data/lib/ddr/auth/ability_definitions/publication_ability_definitions.rb +16 -0
  53. data/lib/ddr/auth/ability_definitions/role_based_ability_definitions.rb +39 -0
  54. data/lib/ddr/auth/ability_definitions/superuser_ability_definitions.rb +9 -0
  55. data/lib/ddr/auth/ability_factory.rb +10 -0
  56. data/lib/ddr/auth/abstract_ability.rb +48 -0
  57. data/lib/ddr/auth/affiliation.rb +14 -0
  58. data/lib/ddr/auth/affiliation_groups.rb +20 -0
  59. data/lib/ddr/auth/anonymous_ability.rb +7 -0
  60. data/lib/ddr/auth/auth_context.rb +109 -0
  61. data/lib/ddr/auth/auth_context_factory.rb +13 -0
  62. data/lib/ddr/auth/detached_auth_context.rb +19 -0
  63. data/lib/ddr/auth/dynamic_groups.rb +13 -0
  64. data/lib/ddr/auth/effective_permissions.rb +12 -0
  65. data/lib/ddr/auth/effective_roles.rb +9 -0
  66. data/lib/ddr/auth/failure_app.rb +16 -0
  67. data/lib/ddr/auth/group.rb +40 -0
  68. data/lib/ddr/auth/grouper_gateway.rb +70 -0
  69. data/lib/ddr/auth/groups.rb +32 -0
  70. data/lib/ddr/auth/ldap_gateway.rb +74 -0
  71. data/lib/ddr/auth/permissions.rb +18 -0
  72. data/lib/ddr/auth/remote_groups.rb +14 -0
  73. data/lib/ddr/auth/role_based_access_controls_enforcement.rb +56 -0
  74. data/lib/ddr/auth/roles.rb +28 -0
  75. data/lib/ddr/auth/roles/role.rb +121 -0
  76. data/lib/ddr/auth/roles/role_type.rb +23 -0
  77. data/lib/ddr/auth/roles/role_types.rb +52 -0
  78. data/lib/ddr/auth/superuser_ability.rb +7 -0
  79. data/lib/ddr/auth/test_helpers.rb +22 -0
  80. data/lib/ddr/auth/user.rb +54 -0
  81. data/lib/ddr/auth/web_auth_context.rb +29 -0
  82. data/lib/ddr/core.rb +110 -0
  83. data/lib/ddr/core/engine.rb +8 -0
  84. data/lib/ddr/core/version.rb +5 -0
  85. data/lib/ddr/error.rb +16 -0
  86. data/lib/ddr/files.rb +13 -0
  87. data/lib/ddr/fits.rb +189 -0
  88. data/lib/ddr/index.rb +29 -0
  89. data/lib/ddr/index/abstract_query_result.rb +22 -0
  90. data/lib/ddr/index/connection.rb +38 -0
  91. data/lib/ddr/index/csv_query_result.rb +84 -0
  92. data/lib/ddr/index/document_builder.rb +9 -0
  93. data/lib/ddr/index/field.rb +35 -0
  94. data/lib/ddr/index/field_attribute.rb +22 -0
  95. data/lib/ddr/index/fields.rb +154 -0
  96. data/lib/ddr/index/filter.rb +139 -0
  97. data/lib/ddr/index/query.rb +82 -0
  98. data/lib/ddr/index/query_builder.rb +185 -0
  99. data/lib/ddr/index/query_clause.rb +112 -0
  100. data/lib/ddr/index/query_params.rb +40 -0
  101. data/lib/ddr/index/query_result.rb +102 -0
  102. data/lib/ddr/index/response.rb +30 -0
  103. data/lib/ddr/index/sort_order.rb +28 -0
  104. data/lib/ddr/index/unique_key_field.rb +12 -0
  105. data/lib/ddr/managers.rb +9 -0
  106. data/lib/ddr/managers/manager.rb +13 -0
  107. data/lib/ddr/managers/technical_metadata_manager.rb +141 -0
  108. data/lib/ddr/structure.rb +188 -0
  109. data/lib/ddr/structures/agent.rb +49 -0
  110. data/lib/ddr/structures/component_type_term.rb +29 -0
  111. data/lib/ddr/structures/div.rb +64 -0
  112. data/lib/ddr/structures/f_locat.rb +54 -0
  113. data/lib/ddr/structures/file.rb +52 -0
  114. data/lib/ddr/structures/file_grp.rb +35 -0
  115. data/lib/ddr/structures/file_sec.rb +22 -0
  116. data/lib/ddr/structures/fptr.rb +31 -0
  117. data/lib/ddr/structures/mets_hdr.rb +37 -0
  118. data/lib/ddr/structures/mptr.rb +49 -0
  119. data/lib/ddr/structures/struct_map.rb +40 -0
  120. data/lib/ddr/utils.rb +185 -0
  121. data/lib/ddr/vocab.rb +22 -0
  122. data/lib/ddr/vocab/asset.rb +51 -0
  123. data/lib/ddr/vocab/contact.rb +9 -0
  124. data/lib/ddr/vocab/display.rb +9 -0
  125. data/lib/ddr/vocab/duke_terms.rb +13 -0
  126. data/lib/ddr/vocab/rdf_vocabulary_parser.rb +43 -0
  127. data/lib/ddr/vocab/roles.rb +25 -0
  128. data/lib/ddr/vocab/sources/duketerms.rdf +870 -0
  129. data/lib/ddr/vocab/vocabulary.rb +37 -0
  130. data/lib/ddr/workflow.rb +8 -0
  131. data/lib/tasks/ddr/core_tasks.rake +4 -0
  132. metadata +428 -0
@@ -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
@@ -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.
@@ -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
@@ -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,10 @@
1
+ module Ddr
2
+ module HasAttachments
3
+ extend ActiveSupport::Concern
4
+
5
+ def attachments
6
+ Ddr.query_service.find_inverse_references_by(resource: self, property: 'attached_to_id')
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Ddr
2
+ module HasChildren
3
+ extend ActiveSupport::Concern
4
+
5
+ def children
6
+ Ddr.query_service.find_inverse_references_by(resource: self, property: 'parent_id')
7
+ end
8
+
9
+ end
10
+ 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