hyrax 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.circleci/config.yml +5 -5
- data/.dassie/Gemfile +1 -1
- data/.dassie/app/controllers/catalog_controller.rb +6 -0
- data/Dockerfile +2 -3
- data/app/actors/hyrax/actors/base_actor.rb +1 -1
- data/app/actors/hyrax/actors/collections_membership_actor.rb +3 -3
- data/app/actors/hyrax/actors/file_set_actor.rb +2 -0
- data/app/assets/stylesheets/hyrax/_styles.scss +5 -0
- data/app/controllers/concerns/hyrax/collections_controller_behavior.rb +13 -5
- data/app/controllers/concerns/hyrax/controller.rb +13 -2
- data/app/controllers/hyrax/admin/admin_sets_controller.rb +2 -19
- data/app/controllers/hyrax/admin/permission_template_accesses_controller.rb +5 -2
- data/app/controllers/hyrax/collections_controller.rb +3 -1
- data/app/controllers/hyrax/dashboard/collection_members_controller.rb +12 -9
- data/app/controllers/hyrax/dashboard/collections_controller.rb +92 -28
- data/app/controllers/hyrax/dashboard/nest_collections_controller.rb +75 -39
- data/app/controllers/hyrax/my_controller.rb +4 -4
- data/app/controllers/hyrax/workflow_actions_controller.rb +8 -5
- data/app/forms/hyrax/forms/administrative_set_form.rb +62 -0
- data/app/forms/hyrax/forms/collection_form.rb +2 -2
- data/app/forms/hyrax/forms/dashboard/nest_collection_form.rb +14 -4
- data/app/forms/hyrax/forms/pcdm_collection_form.rb +64 -0
- data/app/forms/hyrax/forms/resource_form.rb +15 -10
- data/app/forms/hyrax/forms/workflow_action_form.rb +4 -0
- data/app/helpers/hyrax/hyrax_helper_behavior.rb +9 -0
- data/app/indexers/hyrax/administrative_set_indexer.rb +6 -6
- data/app/indexers/hyrax/pcdm_collection_indexer.rb +2 -0
- data/app/models/admin_set.rb +16 -5
- data/app/models/concerns/hyrax/ability/admin_set_ability.rb +31 -7
- data/app/models/concerns/hyrax/ability/collection_ability.rb +35 -20
- data/app/models/concerns/hyrax/ability/collection_type_ability.rb +1 -1
- data/app/models/concerns/hyrax/ability.rb +2 -2
- data/app/models/concerns/hyrax/solr_document_behavior.rb +2 -2
- data/app/models/hyrax/administrative_set.rb +7 -1
- data/app/models/hyrax/permission.rb +1 -1
- data/app/models/hyrax/permission_template.rb +19 -5
- data/app/models/hyrax/work.rb +1 -0
- data/app/models/hyrax/workflow_action_info.rb +16 -0
- data/app/models/sipity/comment.rb +17 -0
- data/app/models/sipity.rb +11 -2
- data/app/presenters/hyrax/admin_set_presenter.rb +8 -3
- data/app/presenters/hyrax/collection_presenter.rb +3 -3
- data/app/presenters/hyrax/work_show_presenter.rb +2 -1
- data/app/search_builders/hyrax/abstract_type_relation.rb +4 -2
- data/app/search_builders/hyrax/dashboard/collections_search_builder.rb +1 -1
- data/app/search_builders/hyrax/exposed_models_relation.rb +1 -1
- data/app/search_builders/hyrax/filter_by_type.rb +1 -2
- data/app/search_builders/hyrax/my/collections_search_builder.rb +1 -1
- data/app/services/hyrax/admin_set_create_service.rb +136 -54
- data/app/services/hyrax/collection_types/permissions_service.rb +1 -1
- data/app/services/hyrax/collections/collection_member_service.rb +12 -2
- data/app/services/hyrax/collections/permissions_create_service.rb +81 -79
- data/app/services/hyrax/collections/permissions_service.rb +1 -1
- data/app/services/hyrax/curation_concern.rb +24 -2
- data/app/services/hyrax/default_middleware_stack.rb +11 -0
- data/app/services/hyrax/ensure_well_formed_admin_set_service.rb +3 -3
- data/app/services/hyrax/listeners/active_fedora_acl_index_listener.rb +1 -0
- data/app/services/hyrax/listeners/metadata_index_listener.rb +25 -9
- data/app/services/hyrax/permission_manager.rb +4 -4
- data/app/services/hyrax/solr_service.rb +1 -1
- data/app/services/hyrax/statistics/collections/over_time.rb +2 -1
- data/app/services/hyrax/workflow/abstract_notification.rb +2 -2
- data/app/services/hyrax/workflow/action_taken_service.rb +16 -4
- data/app/services/hyrax/workflow/activate_object.rb +5 -4
- data/app/services/hyrax/workflow/changes_required_notification.rb +5 -4
- data/app/services/hyrax/workflow/deactivate_object.rb +7 -5
- data/app/services/hyrax/workflow/deposited_notification.rb +8 -4
- data/app/services/hyrax/workflow/grant_edit_to_depositor.rb +7 -3
- data/app/services/hyrax/workflow/grant_read_to_depositor.rb +10 -3
- data/app/services/hyrax/workflow/revoke_edit_from_depositor.rb +8 -2
- data/app/services/hyrax/workflow/workflow_action_service.rb +4 -1
- data/app/views/hyrax/admin/admin_sets/_form.html.erb +1 -1
- data/app/views/hyrax/dashboard/collections/_collection_title.html.erb +1 -1
- data/app/views/hyrax/dashboard/collections/_form.html.erb +1 -1
- data/app/views/hyrax/dashboard/collections/_sort_and_per_page.html.erb +1 -1
- data/app/views/hyrax/homepage/index.html.erb +1 -1
- data/app/views/hyrax/my/collections/_modal_collection_types_to_create.html.erb +1 -1
- data/app/views/layouts/hyrax/dashboard.html.erb +1 -0
- data/app/views/layouts/hyrax.html.erb +1 -0
- data/app/views/shared/_read_only.html.erb +5 -0
- data/chart/hyrax/Chart.yaml +2 -2
- data/chart/hyrax/templates/deployment.yaml +6 -0
- data/config/features.rb +3 -0
- data/config/initializers/1_healthz.rb +1 -0
- data/config/initializers/listeners.rb +2 -1
- data/config/locales/hyrax.en.yml +1 -0
- data/db/seeds.rb +1 -1
- data/documentation/developing-your-hyrax-based-app.md +1 -1
- data/documentation/legacyREADME.md +1 -1
- data/hyrax.gemspec +1 -1
- data/lib/generators/hyrax/templates/catalog_controller.rb +3 -1
- data/lib/generators/hyrax/templates/config/initializers/hyrax.rb +10 -0
- data/lib/generators/hyrax/work/templates/feature_spec.rb.erb +1 -1
- data/lib/generators/hyrax/work_resource/templates/indexer_spec.rb.erb +1 -0
- data/lib/hyrax/collection_name.rb +6 -2
- data/lib/hyrax/configuration.rb +28 -0
- data/lib/hyrax/form_fields.rb +1 -0
- data/lib/hyrax/publisher.rb +12 -0
- data/lib/hyrax/resource_sync/change_list_writer.rb +2 -2
- data/lib/hyrax/resource_sync/resource_list_writer.rb +2 -2
- data/lib/hyrax/specs/shared_specs/hydra_works.rb +2 -0
- data/lib/hyrax/specs/shared_specs/indexers.rb +6 -0
- data/lib/hyrax/transactions/collection_create.rb +25 -0
- data/lib/hyrax/transactions/collection_update.rb +20 -0
- data/lib/hyrax/transactions/container.rb +26 -0
- data/lib/hyrax/transactions/steps/add_to_collections.rb +13 -1
- data/lib/hyrax/transactions/steps/apply_collection_type_permissions.rb +29 -0
- data/lib/hyrax/transactions/steps/save.rb +18 -6
- data/lib/hyrax/transactions/steps/set_collection_type_gid.rb +35 -0
- data/lib/hyrax/version.rb +1 -1
- data/lib/tasks/default_admin_set.rake +12 -11
- data/template.rb +1 -1
- metadata +16 -9
|
@@ -2,38 +2,53 @@
|
|
|
2
2
|
module Hyrax
|
|
3
3
|
module Ability
|
|
4
4
|
module CollectionAbility
|
|
5
|
-
def collection_abilities # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
5
|
+
def collection_abilities # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
6
|
+
models = [Hyrax::PcdmCollection, Hyrax.config.collection_class].uniq
|
|
6
7
|
if admin?
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
models.each do |collection_model|
|
|
9
|
+
can :manage, collection_model
|
|
10
|
+
can :manage_any, collection_model
|
|
11
|
+
can :create_any, collection_model
|
|
12
|
+
can :view_admin_show_any, collection_model
|
|
13
|
+
end
|
|
11
14
|
else
|
|
12
|
-
can :manage_any,
|
|
13
|
-
|
|
14
|
-
can :view_admin_show_any, ::Collection if Hyrax::Collections::PermissionsService.can_view_admin_show_for_any_collection?(ability: self)
|
|
15
|
+
models.each { |collection_model| can :manage_any, collection_model } if
|
|
16
|
+
Hyrax::Collections::PermissionsService.can_manage_any_collection?(ability: self)
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
models.each { |collection_model| can :create_any, collection_model } if
|
|
19
|
+
Hyrax::CollectionTypes::PermissionsService.can_create_any_collection_type?(ability: self)
|
|
20
|
+
|
|
21
|
+
models.each { |collection_model| can :view_admin_show_any, collection_model } if
|
|
22
|
+
Hyrax::Collections::PermissionsService.can_view_admin_show_for_any_collection?(ability: self)
|
|
23
|
+
|
|
24
|
+
models.each do |collection_model|
|
|
25
|
+
can [:edit, :update, :destroy], collection_model do |collection|
|
|
26
|
+
test_edit(collection.id)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
can :deposit, collection_model do |collection|
|
|
30
|
+
Hyrax::Collections::PermissionsService.can_deposit_in_collection?(ability: self, collection_id: collection.id)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
can :view_admin_show, collection_model do |collection| # admin show page
|
|
34
|
+
Hyrax::Collections::PermissionsService.can_view_admin_show_for_collection?(ability: self, collection_id: collection.id)
|
|
35
|
+
end
|
|
19
36
|
|
|
20
|
-
|
|
21
|
-
|
|
37
|
+
can :read, collection_model do |collection| # public show page
|
|
38
|
+
test_read(collection.id)
|
|
39
|
+
end
|
|
22
40
|
end
|
|
41
|
+
|
|
23
42
|
can :deposit, ::SolrDocument do |solr_doc|
|
|
24
43
|
Hyrax::Collections::PermissionsService.can_deposit_in_collection?(ability: self, collection_id: solr_doc.id) # checks collections and admin_sets
|
|
25
44
|
end
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
Hyrax::Collections::PermissionsService.can_view_admin_show_for_collection?(ability: self, collection_id: collection.id)
|
|
45
|
+
can :deposit, String do |collection_id|
|
|
46
|
+
Hyrax::Collections::PermissionsService.can_deposit_in_collection?(ability: self, collection_id: collection_id)
|
|
29
47
|
end
|
|
48
|
+
|
|
30
49
|
can :view_admin_show, ::SolrDocument do |solr_doc| # admin show page
|
|
31
50
|
Hyrax::Collections::PermissionsService.can_view_admin_show_for_collection?(ability: self, collection_id: solr_doc.id) # checks collections and admin_sets
|
|
32
51
|
end
|
|
33
|
-
|
|
34
|
-
can :read, ::Collection do |collection| # public show page # for test by solr_doc, see solr_document_ability.rb
|
|
35
|
-
test_read(collection.id)
|
|
36
|
-
end
|
|
37
52
|
end
|
|
38
53
|
end
|
|
39
54
|
end
|
|
@@ -8,7 +8,7 @@ module Hyrax
|
|
|
8
8
|
can :create_collection_type, CollectionType
|
|
9
9
|
else
|
|
10
10
|
can :create_collection_of_type, CollectionType do |collection_type|
|
|
11
|
-
Hyrax::CollectionTypes::PermissionsService.can_create_collection_of_type?(
|
|
11
|
+
Hyrax::CollectionTypes::PermissionsService.can_create_collection_of_type?(ability: self, collection_type: collection_type)
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
14
|
end
|
|
@@ -103,7 +103,7 @@ module Hyrax
|
|
|
103
103
|
test_download(id)
|
|
104
104
|
end
|
|
105
105
|
|
|
106
|
-
can :download, SolrDocument do |obj|
|
|
106
|
+
can :download, ::SolrDocument do |obj|
|
|
107
107
|
cache.put(obj.id, obj)
|
|
108
108
|
test_download(obj.id)
|
|
109
109
|
end
|
|
@@ -397,7 +397,7 @@ module Hyrax
|
|
|
397
397
|
end
|
|
398
398
|
|
|
399
399
|
def curation_concerns_models
|
|
400
|
-
[::FileSet,
|
|
400
|
+
[::FileSet, Hyrax.config.collection_class] + Hyrax.config.curation_concerns
|
|
401
401
|
end
|
|
402
402
|
|
|
403
403
|
def can_review_submissions?
|
|
@@ -53,7 +53,7 @@ module Hyrax
|
|
|
53
53
|
##
|
|
54
54
|
# @return [Boolean]
|
|
55
55
|
def collection?
|
|
56
|
-
hydra_model ==
|
|
56
|
+
hydra_model == Hyrax.config.collection_class
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
##
|
|
@@ -76,7 +76,7 @@ module Hyrax
|
|
|
76
76
|
|
|
77
77
|
# Method to return the model
|
|
78
78
|
def hydra_model(classifier: ActiveFedora.model_mapper)
|
|
79
|
-
|
|
79
|
+
first('has_model_ssim')&.safe_constantize ||
|
|
80
80
|
classifier.classifier(self).best_model
|
|
81
81
|
end
|
|
82
82
|
|
|
@@ -4,9 +4,15 @@ module Hyrax
|
|
|
4
4
|
##
|
|
5
5
|
# Valkyrie model for Admin Set domain objects.
|
|
6
6
|
class AdministrativeSet < Hyrax::Resource
|
|
7
|
+
include Hyrax::Schema(:core_metadata)
|
|
8
|
+
|
|
7
9
|
attribute :alternative_title, Valkyrie::Types::Set.of(Valkyrie::Types::String)
|
|
8
10
|
attribute :creator, Valkyrie::Types::Set.of(Valkyrie::Types::String)
|
|
9
11
|
attribute :description, Valkyrie::Types::Set.of(Valkyrie::Types::String)
|
|
10
|
-
|
|
12
|
+
|
|
13
|
+
def collection_type_gid
|
|
14
|
+
# allow AdministrativeSet to behave more like a regular PcdmCollection
|
|
15
|
+
Hyrax::CollectionType.find_or_create_admin_set_type.to_global_id
|
|
16
|
+
end
|
|
11
17
|
end
|
|
12
18
|
end
|
|
@@ -216,6 +216,8 @@ module Hyrax
|
|
|
216
216
|
end
|
|
217
217
|
|
|
218
218
|
##
|
|
219
|
+
# @param interpret_visibility [Boolean] whether to retain the existing
|
|
220
|
+
# visibility when applying permission template ACLs
|
|
219
221
|
# @return [Boolean]
|
|
220
222
|
def reset_access_controls(interpret_visibility: false)
|
|
221
223
|
reset_access_controls_for(collection: source_model,
|
|
@@ -223,8 +225,11 @@ module Hyrax
|
|
|
223
225
|
end
|
|
224
226
|
|
|
225
227
|
##
|
|
228
|
+
# @param collection [::Collection, Hyrax::Resource]
|
|
229
|
+
# @param interpret_visibility [Boolean] whether to retain the existing
|
|
230
|
+
# visibility when applying permission template ACLs
|
|
226
231
|
# @return [Boolean]
|
|
227
|
-
def reset_access_controls_for(collection:, interpret_visibility: false)
|
|
232
|
+
def reset_access_controls_for(collection:, interpret_visibility: false) # rubocop:disable Metrics/MethodLength
|
|
228
233
|
interpreted_read_groups = read_groups
|
|
229
234
|
|
|
230
235
|
if interpret_visibility
|
|
@@ -233,10 +238,19 @@ module Hyrax
|
|
|
233
238
|
interpreted_read_groups += visibilities.additions_for(visibility: collection.visibility)
|
|
234
239
|
end
|
|
235
240
|
|
|
236
|
-
collection
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
241
|
+
case collection
|
|
242
|
+
when Valkyrie::Resource
|
|
243
|
+
collection.permission_manager.edit_groups = edit_groups
|
|
244
|
+
collection.permission_manager.edit_users = edit_users
|
|
245
|
+
collection.permission_manager.read_groups = interpreted_read_groups
|
|
246
|
+
collection.permission_manager.read_users = read_users
|
|
247
|
+
collection.permission_manager.acl.save
|
|
248
|
+
else
|
|
249
|
+
collection.update!(edit_users: edit_users,
|
|
250
|
+
edit_groups: edit_groups,
|
|
251
|
+
read_users: read_users,
|
|
252
|
+
read_groups: interpreted_read_groups.uniq)
|
|
253
|
+
end
|
|
240
254
|
end
|
|
241
255
|
|
|
242
256
|
private
|
data/app/models/hyrax/work.rb
CHANGED
|
@@ -14,6 +14,7 @@ module Hyrax
|
|
|
14
14
|
attribute :on_behalf_of, Valkyrie::Types::String
|
|
15
15
|
attribute :proxy_depositor, Valkyrie::Types::String
|
|
16
16
|
attribute :state, Valkyrie::Types::URI.default(Hyrax::ResourceStatus::ACTIVE)
|
|
17
|
+
attribute :rendering_ids, Valkyrie::Types::Array.of(Valkyrie::Types::ID).meta(ordered: true)
|
|
17
18
|
attribute :representative_id, Valkyrie::Types::ID
|
|
18
19
|
attribute :thumbnail_id, Valkyrie::Types::ID
|
|
19
20
|
|
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module Hyrax
|
|
3
|
+
##
|
|
3
4
|
# A simple data object for holding a user, work and their workflow proxies
|
|
5
|
+
#
|
|
6
|
+
# this is a glorified Struct that resolves +Sipity::Enitity(work)+
|
|
7
|
+
# and +Sipity::Agent(user)+ for the input given, then provides readers
|
|
8
|
+
# for its instance variables.
|
|
9
|
+
#
|
|
10
|
+
# @example
|
|
11
|
+
# info = WorkflowActionInfo.new(my_work, current_user)
|
|
12
|
+
#
|
|
13
|
+
# info.agent # => #<Sipity::Agent...>
|
|
14
|
+
# info.entity # => #<Sipity::Entity...>
|
|
15
|
+
# info.work == my_work # => true
|
|
16
|
+
# info.user == current_user # => true
|
|
4
17
|
class WorkflowActionInfo
|
|
18
|
+
##
|
|
19
|
+
# @param work [Object]
|
|
20
|
+
# @param user [::User]
|
|
5
21
|
def initialize(work, user)
|
|
6
22
|
@work = work
|
|
7
23
|
@user = user
|
|
@@ -11,4 +11,21 @@ module Sipity
|
|
|
11
11
|
agent.proxy_for.to_s
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
# A comment without a database record; always returns an empty string
|
|
17
|
+
class NullComment
|
|
18
|
+
attr_reader :agent, :entity
|
|
19
|
+
|
|
20
|
+
def initialize(agent:, entity:)
|
|
21
|
+
@agent = agent
|
|
22
|
+
@entity = entity
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
##
|
|
26
|
+
# @return [String]
|
|
27
|
+
def comment
|
|
28
|
+
''
|
|
29
|
+
end
|
|
30
|
+
end
|
|
14
31
|
end
|
data/app/models/sipity.rb
CHANGED
|
@@ -56,28 +56,37 @@ module Sipity
|
|
|
56
56
|
#
|
|
57
57
|
# @return [Sipity::Entity]
|
|
58
58
|
# rubocop:disable Naming/MethodName, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
|
59
|
-
def Entity(input, &block)
|
|
59
|
+
def Entity(input, &block) # rubocop:disable Metrics/AbcSize
|
|
60
|
+
Rails.logger.debug("Trying to make an Entity for #{input.inspect}")
|
|
61
|
+
|
|
60
62
|
result = case input
|
|
61
63
|
when Sipity::Entity
|
|
62
64
|
input
|
|
63
65
|
when URI::GID, GlobalID
|
|
66
|
+
Rails.logger.debug("Entity() got a GID, searching by proxy")
|
|
64
67
|
Entity.find_by(proxy_for_global_id: input.to_s)
|
|
65
68
|
when SolrDocument
|
|
69
|
+
Rails.logger.debug("Entity() got a SolrDocument, retrying on #{input.to_model}")
|
|
66
70
|
Entity(input.to_model)
|
|
67
71
|
when Draper::Decorator
|
|
72
|
+
Rails.logger.debug("Entity() got a Decorator, retrying on #{input.model}")
|
|
68
73
|
Entity(input.model)
|
|
69
74
|
when Sipity::Comment
|
|
75
|
+
Rails.logger.debug("Entity() got a Comment, retrying on #{input.entity}")
|
|
70
76
|
Entity(input.entity)
|
|
71
77
|
when Valkyrie::Resource
|
|
78
|
+
Rails.logger.debug("Entity() got a Resource, retrying on #{Hyrax::GlobalID(input)}")
|
|
72
79
|
Entity(Hyrax::GlobalID(input))
|
|
73
80
|
else
|
|
81
|
+
Rails.logger.debug("Entity() got something else, testing #to_global_id")
|
|
74
82
|
Entity(input.to_global_id) if input.respond_to?(:to_global_id)
|
|
75
83
|
end
|
|
76
84
|
|
|
85
|
+
Rails.logger.debug("Entity(): attempting conversion on #{result}")
|
|
77
86
|
handle_conversion(input, result, :to_sipity_entity, &block)
|
|
78
87
|
rescue URI::GID::MissingModelIdError
|
|
79
88
|
Entity(nil)
|
|
80
|
-
end
|
|
89
|
+
end # rubocop:enable Metrics/AbcSize
|
|
81
90
|
module_function :Entity
|
|
82
91
|
# rubocop:enable Naming/MethodName, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
|
83
92
|
|
|
@@ -21,13 +21,12 @@ module Hyrax
|
|
|
21
21
|
|
|
22
22
|
# AdminSet cannot be deleted if default set or non-empty
|
|
23
23
|
def disable_delete?
|
|
24
|
-
|
|
24
|
+
default_set? || any_items?
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
# Message to display if deletion is disabled
|
|
28
28
|
def disabled_message
|
|
29
|
-
return I18n.t('hyrax.admin.admin_sets.delete.error_default_set') if
|
|
30
|
-
|
|
29
|
+
return I18n.t('hyrax.admin.admin_sets.delete.error_default_set') if default_set?
|
|
31
30
|
I18n.t('hyrax.admin.admin_sets.delete.error_not_empty') if any_items?
|
|
32
31
|
end
|
|
33
32
|
|
|
@@ -63,5 +62,11 @@ module Hyrax
|
|
|
63
62
|
return false unless current_ability.can?(:edit, solr_document)
|
|
64
63
|
!disable_delete?
|
|
65
64
|
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
def default_set?
|
|
69
|
+
Hyrax::AdminSetCreateService.default_admin_set?(id: id)
|
|
70
|
+
end
|
|
66
71
|
end
|
|
67
72
|
end
|
|
@@ -116,13 +116,13 @@ module Hyrax
|
|
|
116
116
|
|
|
117
117
|
# The total number of parents that this collection belongs to, visible or not.
|
|
118
118
|
def total_parent_collections
|
|
119
|
-
parent_collections.
|
|
119
|
+
parent_collections.blank? ? 0 : parent_collections.response['numFound']
|
|
120
120
|
end
|
|
121
121
|
|
|
122
122
|
# The number of parent collections shown on the current page. This will differ from total_parent_collections
|
|
123
123
|
# due to pagination.
|
|
124
124
|
def parent_collection_count
|
|
125
|
-
parent_collections.
|
|
125
|
+
parent_collections.blank? ? 0 : parent_collections.documents.size
|
|
126
126
|
end
|
|
127
127
|
|
|
128
128
|
def user_can_nest_collection?
|
|
@@ -182,7 +182,7 @@ module Hyrax
|
|
|
182
182
|
"deprecated. Use available_parent_collections_data " \
|
|
183
183
|
"helper instead.")
|
|
184
184
|
return @available_parents if @available_parents.present?
|
|
185
|
-
collection =
|
|
185
|
+
collection = Hyrax.config.collection_class.find(id)
|
|
186
186
|
colls = Hyrax::Collections::NestedCollectionQueryService.available_parent_collections(child: collection, scope: scope, limit_to_id: nil)
|
|
187
187
|
@available_parents = colls.map do |col|
|
|
188
188
|
{ "id" => col.id, "title_first" => col.title.first }
|
|
@@ -248,7 +248,8 @@ module Hyrax
|
|
|
248
248
|
# @return [Boolean] a flag indicating whether to display collection deposit
|
|
249
249
|
# options.
|
|
250
250
|
def show_deposit_for?(collections:)
|
|
251
|
-
collections.present? ||
|
|
251
|
+
collections.present? ||
|
|
252
|
+
current_ability.can?(:create_any, Hyrax.config.collection_class)
|
|
252
253
|
end
|
|
253
254
|
|
|
254
255
|
##
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module Hyrax
|
|
3
3
|
class AbstractTypeRelation < ActiveFedora::Relation
|
|
4
|
-
def initialize(
|
|
4
|
+
def initialize(allowable_types: nil, **opts)
|
|
5
|
+
@allowable_types = allowable_types
|
|
5
6
|
super(DummyModel, opts)
|
|
6
7
|
end
|
|
7
8
|
|
|
8
9
|
def allowable_types
|
|
9
|
-
|
|
10
|
+
@allowable_types ||
|
|
11
|
+
raise(NotImplementedException, "Implement allowable_types in a subclass")
|
|
10
12
|
end
|
|
11
13
|
|
|
12
14
|
def equivalent_class?(klass)
|
|
@@ -9,7 +9,7 @@ module Hyrax
|
|
|
9
9
|
|
|
10
10
|
# This overrides the models in FilterByType
|
|
11
11
|
def models
|
|
12
|
-
[::AdminSet, ::Collection]
|
|
12
|
+
[::AdminSet, ::Collection, Hyrax.config.collection_model.safe_constantize].uniq.compact
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
# adds a filter to exclude collections and admin sets created by the
|
|
@@ -3,7 +3,7 @@ module Hyrax
|
|
|
3
3
|
# A relation that scopes to all user visible models (e.g. works + collections + file sets)
|
|
4
4
|
class ExposedModelsRelation < AbstractTypeRelation
|
|
5
5
|
def allowable_types
|
|
6
|
-
Hyrax.config.curation_concerns + [::Collection, ::FileSet]
|
|
6
|
+
(Hyrax.config.curation_concerns + [Hyrax.config.collection_class, ::Collection, ::FileSet]).uniq
|
|
7
7
|
end
|
|
8
8
|
end
|
|
9
9
|
end
|
|
@@ -21,6 +21,6 @@ class Hyrax::My::CollectionsSearchBuilder < ::Hyrax::CollectionSearchBuilder
|
|
|
21
21
|
# This overrides the models in FilterByType
|
|
22
22
|
# @return [Array<Class>] a list of classes to include
|
|
23
23
|
def models
|
|
24
|
-
[::AdminSet, ::
|
|
24
|
+
[::AdminSet, Hyrax::AdministrativeSet, Hyrax.config.collection_model.safe_constantize].compact
|
|
25
25
|
end
|
|
26
26
|
end
|
|
@@ -1,46 +1,99 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module Hyrax
|
|
3
|
-
# Responsible for creating
|
|
3
|
+
# Responsible for creating a Hyrax::AdministrativeSet and its corresponding data.
|
|
4
4
|
#
|
|
5
5
|
# * An associated permission template
|
|
6
6
|
# * Available workflows
|
|
7
7
|
# * An active workflow
|
|
8
8
|
#
|
|
9
|
-
# @see
|
|
9
|
+
# @see Hyrax::AdministrativeSet
|
|
10
10
|
# @see Hyrax::PermissionTemplate
|
|
11
11
|
# @see Sipity::Workflow
|
|
12
|
-
class AdminSetCreateService
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
12
|
+
class AdminSetCreateService # rubocop:disable Metrics/ClassLength
|
|
13
|
+
DEFAULT_ID = 'admin_set/default'
|
|
14
|
+
DEFAULT_TITLE = ['Default Admin Set'].freeze
|
|
15
|
+
|
|
16
|
+
class_attribute :permissions_create_service
|
|
17
|
+
self.permissions_create_service = Hyrax::Collections::PermissionsCreateService
|
|
18
|
+
|
|
19
|
+
class << self
|
|
20
|
+
# @api public
|
|
21
|
+
# Creates the default Hyrax::AdministrativeSet and corresponding data
|
|
22
|
+
# @param admin_set_id [String] The default admin set ID
|
|
23
|
+
# @param title [Array<String>] The title of the default admin set
|
|
24
|
+
# @return [TrueClass]
|
|
25
|
+
# @see Hyrax::AdministrativeSet
|
|
26
|
+
# @deprecated
|
|
27
|
+
# TODO: When this deprecated method is removed, update private method
|
|
28
|
+
# .create_default_admin_set! to remove the parameters.
|
|
29
|
+
def create_default_admin_set(admin_set_id: DEFAULT_ID, title: DEFAULT_TITLE)
|
|
30
|
+
Deprecation.warn("'##{__method__}' will be removed in Hyrax 4.0. " \
|
|
31
|
+
"Instead, use 'Hyrax::AdminSetCreateService.find_or_create_default_admin_set'.")
|
|
32
|
+
create_default_admin_set!(admin_set_id: admin_set_id, title: title).present?
|
|
33
|
+
rescue RuntimeError => _err
|
|
34
|
+
false
|
|
28
35
|
end
|
|
29
|
-
end
|
|
30
36
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
# @api public
|
|
38
|
+
# Finds the default AdministrativeSet if it exists; otherwise, creates it and corresponding data
|
|
39
|
+
# @return [Hyrax::AdministrativeSet] The default admin set.
|
|
40
|
+
# @see Hyrax::AdministrativeSet
|
|
41
|
+
# @raise [RuntimeError] if admin set cannot be persisted
|
|
42
|
+
def find_or_create_default_admin_set
|
|
43
|
+
Hyrax.query_service.find_by(id: DEFAULT_ID)
|
|
44
|
+
rescue Valkyrie::Persistence::ObjectNotFoundError
|
|
45
|
+
create_default_admin_set!
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @api public
|
|
49
|
+
# Is the admin_set the default Hyrax::AdministrativeSet
|
|
50
|
+
# @param id [#to_s] the id of the admin set to check
|
|
51
|
+
def default_admin_set?(id:)
|
|
52
|
+
id.to_s == DEFAULT_ID
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# @api public
|
|
56
|
+
# Creates a non-default Hyrax::AdministrativeSet and corresponding data
|
|
57
|
+
# @param admin_set [Hyrax::AdministrativeSet | AdminSet] the admin set to operate on
|
|
58
|
+
# @param creating_user [User] the user who created the admin set
|
|
59
|
+
# @return [TrueClass, FalseClass] true if it was successful
|
|
60
|
+
# @see Hyrax::AdministrativeSet
|
|
61
|
+
# @raise [RuntimeError] if you attempt to create a default admin set via this mechanism
|
|
62
|
+
# @deprecated
|
|
63
|
+
def call(admin_set:, creating_user:, **kwargs)
|
|
64
|
+
Deprecation.warn("'##{__method__}' will be removed in Hyrax 4.0. " \
|
|
65
|
+
"Warning: This method may hide runtime errors. " \
|
|
66
|
+
"Instead, use 'Hyrax::AdminSetCreateService.call!'. ")
|
|
67
|
+
call!(admin_set: admin_set, creating_user: creating_user, **kwargs).present?
|
|
68
|
+
rescue RuntimeError => err
|
|
69
|
+
raise err if default_admin_set?(id: admin_set.id)
|
|
70
|
+
false
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# @api public
|
|
74
|
+
# Creates a non-default Hyrax::AdministrativeSet and corresponding data
|
|
75
|
+
# @param admin_set [Hyrax::AdministrativeSet] the admin set to operate on
|
|
76
|
+
# @param creating_user [User] the user who created the admin set
|
|
77
|
+
# @return [Hyrax::AdministrativeSet] The fully created admin set.
|
|
78
|
+
# @see Hyrax::AdministrativeSet
|
|
79
|
+
# @raise [RuntimeError] if you attempt to create a default admin set via this mechanism
|
|
80
|
+
# @raise [RuntimeError] if admin set cannot be persisted
|
|
81
|
+
def call!(admin_set:, creating_user:, **kwargs)
|
|
82
|
+
raise "Use .find_or_create_default_admin_set to create a default admin set" if default_admin_set?(id: admin_set.id)
|
|
83
|
+
new(admin_set: admin_set, creating_user: creating_user, **kwargs).create!
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
# TODO: Parameters admin_set_id and title are defined to support .create_default_admin_set
|
|
89
|
+
# which is deprecated. When it is removed, the parameters will no longer be required.
|
|
90
|
+
def create_default_admin_set!(admin_set_id: DEFAULT_ID, title: DEFAULT_TITLE)
|
|
91
|
+
admin_set = Hyrax::AdministrativeSet.new(id: admin_set_id, title: Array.wrap(title))
|
|
92
|
+
new(admin_set: admin_set, creating_user: nil).create!
|
|
93
|
+
end
|
|
41
94
|
end
|
|
42
95
|
|
|
43
|
-
# @param admin_set [AdminSet] the admin set to operate on
|
|
96
|
+
# @param admin_set [Hyrax::AdministrativeSet | AdminSet] the admin set to operate on
|
|
44
97
|
# @param creating_user [User] the user who created the admin set (if any).
|
|
45
98
|
# @param workflow_importer [#call] imports the workflow
|
|
46
99
|
def initialize(admin_set:, creating_user:, workflow_importer: default_workflow_importer)
|
|
@@ -53,40 +106,69 @@ module Hyrax
|
|
|
53
106
|
|
|
54
107
|
# Creates an admin set, setting the creator and the default access controls.
|
|
55
108
|
# @return [TrueClass, FalseClass] true if it was successful
|
|
109
|
+
# @deprecated
|
|
56
110
|
def create
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
111
|
+
Deprecation.warn("'##{__method__}' will be removed in Hyrax 4.0. " \
|
|
112
|
+
"Warning: This method may hide runtime errors. " \
|
|
113
|
+
"Instead, use 'Hyrax::AdminSetCreateService.create!'. ")
|
|
114
|
+
create!.persisted?
|
|
115
|
+
rescue RuntimeError => _err
|
|
116
|
+
false
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Creates an admin set, setting the creator and the default access controls.
|
|
120
|
+
# @return [Hyrax::AdministrativeSet] The fully created admin set.
|
|
121
|
+
# @raise [RuntimeError] if admin set cannot be persisted
|
|
122
|
+
def create!
|
|
123
|
+
admin_set.respond_to?(:valkyrie_resource) ? active_fedora_create! : valkyrie_create!
|
|
67
124
|
end
|
|
68
125
|
|
|
69
126
|
private
|
|
70
127
|
|
|
71
|
-
def
|
|
72
|
-
|
|
73
|
-
{ agent_type: 'group', agent_id: admin_group_name, access: Hyrax::PermissionTemplateAccess::MANAGE }
|
|
74
|
-
].tap do |attribute_list|
|
|
75
|
-
# Grant manage access to the creating_user if it exists. Should exist for all but default Admin Set
|
|
76
|
-
attribute_list << { agent_type: 'user', agent_id: creating_user.user_key, access: Hyrax::PermissionTemplateAccess::MANAGE } if creating_user
|
|
77
|
-
end
|
|
128
|
+
def default_admin_set?(id:)
|
|
129
|
+
self.class.default_admin_set?(id: id)
|
|
78
130
|
end
|
|
79
131
|
|
|
80
132
|
def admin_group_name
|
|
81
133
|
::Ability.admin_group_name
|
|
82
134
|
end
|
|
83
135
|
|
|
84
|
-
|
|
85
|
-
# @return [
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
136
|
+
# Creates an admin set, setting the creator and the default access controls.
|
|
137
|
+
# @return [Hyrax::AdministrativeSet] The fully created admin set.
|
|
138
|
+
# @raise [RuntimeError] if admin set cannot be persisted
|
|
139
|
+
def valkyrie_create!
|
|
140
|
+
admin_set.creator = [creating_user.user_key] if creating_user
|
|
141
|
+
updated_admin_set = Hyrax.persister.save(resource: admin_set).tap do |result|
|
|
142
|
+
if result
|
|
143
|
+
ActiveRecord::Base.transaction do
|
|
144
|
+
permission_template = permissions_create_service.create_default(collection: result,
|
|
145
|
+
creating_user: creating_user)
|
|
146
|
+
workflow = create_workflows_for(permission_template: permission_template)
|
|
147
|
+
create_default_access_for(permission_template: permission_template, workflow: workflow) if default_admin_set?(id: admin_set.id)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
Hyrax.publisher.publish('collection.metadata.updated', collection: updated_admin_set, user: creating_user)
|
|
152
|
+
updated_admin_set
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Creates an admin set, setting the creator and the default access controls.
|
|
156
|
+
# @return [Hyrax::AdministrativeSet] The fully created admin set.
|
|
157
|
+
# @raise [RuntimeError] if admin set cannot be persisted
|
|
158
|
+
def active_fedora_create!
|
|
159
|
+
admin_set.creator = [creating_user.user_key] if creating_user
|
|
160
|
+
admin_set.save.tap do |result|
|
|
161
|
+
if result
|
|
162
|
+
ActiveRecord::Base.transaction do
|
|
163
|
+
permission_template = permissions_create_service.create_default(collection: admin_set,
|
|
164
|
+
creating_user: creating_user)
|
|
165
|
+
workflow = create_workflows_for(permission_template: permission_template)
|
|
166
|
+
create_default_access_for(permission_template: permission_template, workflow: workflow) if default_admin_set?(id: admin_set.id)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
raise 'Admin set failed to persist.' unless admin_set.persisted?
|
|
171
|
+
admin_set.valkyrie_resource
|
|
90
172
|
end
|
|
91
173
|
|
|
92
174
|
def create_workflows_for(permission_template:)
|
|
@@ -121,7 +203,7 @@ module Hyrax
|
|
|
121
203
|
end
|
|
122
204
|
end
|
|
123
205
|
|
|
124
|
-
#
|
|
206
|
+
# Give registered users deposit access to default admin set
|
|
125
207
|
def create_default_access_for(permission_template:, workflow:)
|
|
126
208
|
permission_template.access_grants.create(agent_type: 'group', agent_id: ::Ability.registered_group_name, access: Hyrax::PermissionTemplateAccess::DEPOSIT)
|
|
127
209
|
deposit = Sipity::Role[Hyrax::RoleRegistry::DEPOSITING]
|