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
|
@@ -159,7 +159,7 @@ module Hyrax
|
|
|
159
159
|
# If calling from Abilities, pass the ability. If you try to get the ability from the user, you end up in an infinit loop.
|
|
160
160
|
def self.access_to_collection_type?(collection_type:, access:, user: nil, ability: nil) # rubocop:disable Metrics/CyclomaticComplexity
|
|
161
161
|
return false unless user.present? || ability.present?
|
|
162
|
-
return false unless
|
|
162
|
+
return false unless collection_type
|
|
163
163
|
return true if ([user_id(user, ability)] & agent_ids_for(collection_type: collection_type, agent_type: 'user', access: access)).present?
|
|
164
164
|
return true if (user_groups(user, ability) & agent_ids_for(collection_type: collection_type, agent_type: 'group', access: access)).present?
|
|
165
165
|
false
|
|
@@ -110,7 +110,7 @@ module Hyrax
|
|
|
110
110
|
raise Hyrax::SingleMembershipError, message if message.present?
|
|
111
111
|
new_member.member_of_collection_ids << collection_id # only populate this direction
|
|
112
112
|
new_member = Hyrax.persister.save(resource: new_member)
|
|
113
|
-
|
|
113
|
+
publish_metadata_updated(new_member, user)
|
|
114
114
|
new_member
|
|
115
115
|
end
|
|
116
116
|
|
|
@@ -148,9 +148,19 @@ module Hyrax
|
|
|
148
148
|
return member unless member?(collection_id: collection_id, member: member)
|
|
149
149
|
member.member_of_collection_ids.delete(collection_id)
|
|
150
150
|
member = Hyrax.persister.save(resource: member)
|
|
151
|
-
|
|
151
|
+
publish_metadata_updated(member, user)
|
|
152
152
|
member
|
|
153
153
|
end
|
|
154
|
+
|
|
155
|
+
private
|
|
156
|
+
|
|
157
|
+
def publish_metadata_updated(member, user)
|
|
158
|
+
if member.collection?
|
|
159
|
+
Hyrax.publisher.publish('collection.metadata.updated', collection: member, user: user)
|
|
160
|
+
else
|
|
161
|
+
Hyrax.publisher.publish('object.metadata.updated', object: member, user: user)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
154
164
|
end
|
|
155
165
|
end
|
|
156
166
|
end
|
|
@@ -2,94 +2,96 @@
|
|
|
2
2
|
module Hyrax
|
|
3
3
|
module Collections
|
|
4
4
|
class PermissionsCreateService
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
5
|
+
class << self
|
|
6
|
+
# @api public
|
|
7
|
+
#
|
|
8
|
+
# Set the default permissions for a (newly created) collection
|
|
9
|
+
#
|
|
10
|
+
# @param collection [#collection_type_gid || Hyrax::AdministrativeSet] the collection or admin set the new permissions will act on
|
|
11
|
+
# @param creating_user [User] the user that created the collection
|
|
12
|
+
# @param grants [Array<Hash>] additional grants to apply to the new collection
|
|
13
|
+
# @return [Hyrax::PermissionTemplate]
|
|
14
|
+
def create_default(collection:, creating_user:, grants: [])
|
|
15
|
+
collection_type = Hyrax::CollectionType.find_by_gid!(collection.collection_type_gid)
|
|
16
|
+
access_grants = access_grants_attributes(collection_type: collection_type, creating_user: creating_user, grants: grants)
|
|
17
|
+
template = Hyrax::PermissionTemplate.create!(source_id: collection.id.to_s,
|
|
18
|
+
access_grants_attributes: access_grants.uniq)
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
# @api public
|
|
23
|
-
#
|
|
24
|
-
# Add access grants to a collection
|
|
25
|
-
#
|
|
26
|
-
# @param collection_id [String] id of a collection
|
|
27
|
-
# @param grants [Array<Hash>] array of grants to add to the collection
|
|
28
|
-
# @example grants
|
|
29
|
-
# [ { agent_type: Hyrax::PermissionTemplateAccess::GROUP,
|
|
30
|
-
# agent_id: 'my_group_name',
|
|
31
|
-
# access: Hyrax::PermissionTemplateAccess::DEPOSIT } ]
|
|
32
|
-
# @see Hyrax::PermissionTemplateAccess for valid values for agent_type and access
|
|
33
|
-
def self.add_access(collection_id:, grants:)
|
|
34
|
-
collection = ::Collection.find(collection_id)
|
|
35
|
-
template = Hyrax::PermissionTemplate.find_by!(source_id: collection_id)
|
|
36
|
-
grants.each do |grant|
|
|
37
|
-
Hyrax::PermissionTemplateAccess.find_or_create_by(permission_template_id: template.id,
|
|
38
|
-
agent_type: grant[:agent_type],
|
|
39
|
-
agent_id: grant[:agent_id],
|
|
40
|
-
access: grant[:access])
|
|
20
|
+
template.reset_access_controls_for(collection: collection, interpret_visibility: true)
|
|
21
|
+
template
|
|
41
22
|
end
|
|
42
23
|
|
|
43
|
-
|
|
44
|
-
|
|
24
|
+
# @api public
|
|
25
|
+
#
|
|
26
|
+
# Add access grants to a collection
|
|
27
|
+
#
|
|
28
|
+
# @param collection_id [String] id of a collection
|
|
29
|
+
# @param grants [Array<Hash>] array of grants to add to the collection
|
|
30
|
+
# @example grants
|
|
31
|
+
# [ { agent_type: Hyrax::PermissionTemplateAccess::GROUP,
|
|
32
|
+
# agent_id: 'my_group_name',
|
|
33
|
+
# access: Hyrax::PermissionTemplateAccess::DEPOSIT } ]
|
|
34
|
+
# @see Hyrax::PermissionTemplateAccess for valid values for agent_type and access
|
|
35
|
+
def add_access(collection_id:, grants:)
|
|
36
|
+
collection = Hyrax.query_service.find_by(id: collection_id)
|
|
37
|
+
template = Hyrax::PermissionTemplate.find_by!(source_id: collection_id.to_s)
|
|
38
|
+
grants.each do |grant|
|
|
39
|
+
Hyrax::PermissionTemplateAccess.find_or_create_by(permission_template_id: template.id.to_s,
|
|
40
|
+
agent_type: grant[:agent_type],
|
|
41
|
+
agent_id: grant[:agent_id],
|
|
42
|
+
access: grant[:access])
|
|
43
|
+
end
|
|
45
44
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
# Gather the default permissions needed for a new collection
|
|
49
|
-
#
|
|
50
|
-
# @param collection_type [CollectionType] the collection type of the new collection
|
|
51
|
-
# @param creating_user [User] the user that created the collection
|
|
52
|
-
# @param grants [Array<Hash>] additional grants to apply to the new collection
|
|
53
|
-
# @return [Hash] a hash containing permission attributes
|
|
54
|
-
def self.access_grants_attributes(collection_type:, creating_user:, grants:)
|
|
55
|
-
[
|
|
56
|
-
{ agent_type: 'group', agent_id: admin_group_name, access: Hyrax::PermissionTemplateAccess::MANAGE }
|
|
57
|
-
].tap do |attribute_list|
|
|
58
|
-
# Grant manage access to the creating_user if it exists
|
|
59
|
-
attribute_list << { agent_type: 'user', agent_id: creating_user.user_key, access: Hyrax::PermissionTemplateAccess::MANAGE } if creating_user
|
|
60
|
-
end + managers_of_collection_type(collection_type: collection_type) + grants
|
|
61
|
-
end
|
|
62
|
-
private_class_method :access_grants_attributes
|
|
45
|
+
template.reset_access_controls_for(collection: collection, interpret_visibility: true)
|
|
46
|
+
end
|
|
63
47
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
# @api private
|
|
51
|
+
#
|
|
52
|
+
# Gather the default permissions needed for a new collection
|
|
53
|
+
#
|
|
54
|
+
# @param collection_type [CollectionType] the collection type of the new collection
|
|
55
|
+
# @param creating_user [User] the user that created the collection
|
|
56
|
+
# @param grants [Array<Hash>] additional grants to apply to the new collection
|
|
57
|
+
# @return [Array<Hash>] a hash containing permission attributes
|
|
58
|
+
def access_grants_attributes(collection_type:, creating_user:, grants:)
|
|
59
|
+
[
|
|
60
|
+
{ agent_type: 'group', agent_id: admin_group_name, access: Hyrax::PermissionTemplateAccess::MANAGE }
|
|
61
|
+
].tap do |attribute_list|
|
|
62
|
+
# Grant manage access to the creating_user if it exists
|
|
63
|
+
attribute_list << { agent_type: 'user', agent_id: creating_user.user_key, access: Hyrax::PermissionTemplateAccess::MANAGE } if creating_user
|
|
64
|
+
end + managers_of_collection_type(collection_type: collection_type) + grants
|
|
75
65
|
end
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
66
|
+
|
|
67
|
+
# @api private
|
|
68
|
+
#
|
|
69
|
+
# Retrieve the users or groups with manage permissions for a collection type
|
|
70
|
+
#
|
|
71
|
+
# @param collection_type [CollectionType] the collection type of the new collection
|
|
72
|
+
# @return [Array<Hash>] a hash containing permission attributes
|
|
73
|
+
def managers_of_collection_type(collection_type:)
|
|
74
|
+
attribute_list = []
|
|
75
|
+
user_managers = Hyrax::CollectionTypes::PermissionsService.user_edit_grants_for_collection_of_type(collection_type: collection_type)
|
|
76
|
+
user_managers.each do |user|
|
|
77
|
+
attribute_list << { agent_type: 'user', agent_id: user, access: Hyrax::PermissionTemplateAccess::MANAGE }
|
|
78
|
+
end
|
|
79
|
+
group_managers = Hyrax::CollectionTypes::PermissionsService.group_edit_grants_for_collection_of_type(collection_type: collection_type)
|
|
80
|
+
group_managers.each do |group|
|
|
81
|
+
attribute_list << { agent_type: 'group', agent_id: group, access: Hyrax::PermissionTemplateAccess::MANAGE }
|
|
82
|
+
end
|
|
83
|
+
attribute_list
|
|
79
84
|
end
|
|
80
|
-
attribute_list
|
|
81
|
-
end
|
|
82
|
-
private_class_method :managers_of_collection_type
|
|
83
85
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
# @api private
|
|
87
|
+
#
|
|
88
|
+
# The value of the admin group name
|
|
89
|
+
#
|
|
90
|
+
# @return [String] a string representation of the admin group name
|
|
91
|
+
def admin_group_name
|
|
92
|
+
::Ability.admin_group_name
|
|
93
|
+
end
|
|
91
94
|
end
|
|
92
|
-
private_class_method :admin_group_name
|
|
93
95
|
end
|
|
94
96
|
end
|
|
95
97
|
end
|
|
@@ -243,7 +243,7 @@ module Hyrax
|
|
|
243
243
|
# @note Several checks get the user's groups from the user's ability. The same values can be retrieved directly from a passed in ability.
|
|
244
244
|
def self.access_to_collection?(collection_id:, access:, ability:, exclude_groups: [])
|
|
245
245
|
return false unless collection_id
|
|
246
|
-
template = Hyrax::PermissionTemplate.find_by!(source_id: collection_id)
|
|
246
|
+
template = Hyrax::PermissionTemplate.find_by!(source_id: collection_id.to_s)
|
|
247
247
|
return true if ([ability.current_user.user_key] & template.agent_ids_for(agent_type: 'user', access: access)).present?
|
|
248
248
|
return true if (ability.user_groups & (template.agent_ids_for(agent_type: 'group', access: access) - exclude_groups)).present?
|
|
249
249
|
false
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module Hyrax
|
|
3
3
|
class CurationConcern
|
|
4
|
+
##
|
|
4
5
|
# The actor middleware stack can be customized like so:
|
|
5
6
|
# # Adding a new middleware
|
|
6
7
|
# Hyrax::CurationConcern.actor_factory.use MyCustomActor
|
|
@@ -16,14 +17,35 @@ module Hyrax
|
|
|
16
17
|
#
|
|
17
18
|
# You can customize the actor stack, so long as you do so before the actor
|
|
18
19
|
# is used. Once it is used, it becomes immutable.
|
|
20
|
+
#
|
|
19
21
|
# @return [ActionDispatch::MiddlewareStack]
|
|
22
|
+
# @see Hyrax::DefaultMiddlewareStack
|
|
20
23
|
def self.actor_factory
|
|
21
24
|
@actor_factory ||= Hyrax::DefaultMiddlewareStack.build_stack
|
|
22
25
|
end
|
|
23
26
|
|
|
24
|
-
|
|
25
|
-
#
|
|
27
|
+
##
|
|
28
|
+
# Provides the Hyrax "Actor Stack" used during creation of Works when
|
|
29
|
+
# +ActiveFedora+ models are used by the application
|
|
30
|
+
#
|
|
31
|
+
# The "Actor Stack" consists of a series of objects ("Actors"), which
|
|
32
|
+
# implement +#create+, +#update+ and +#destroy+. Each actor's methods
|
|
33
|
+
# promise to call the same methods on the next actor in the series, and may
|
|
34
|
+
# do some work before (on the way down the stack) and/or after (on the
|
|
35
|
+
# way up) calling to the next actor.
|
|
36
|
+
#
|
|
37
|
+
# The normal convention is to call an actor inheriting
|
|
38
|
+
# {Hyrax::Actors::BaseActor} at or near the bottom of the stack, to handle
|
|
39
|
+
# the create, update , or destroy action.
|
|
40
|
+
#
|
|
41
|
+
# @note this stack, and the Actor classes it calls, is not used when
|
|
42
|
+
# +Valkyrie+ models are defined by the application. in that context,
|
|
43
|
+
# this behavior is replaced by `Hyrax::Transactions::Container`.
|
|
44
|
+
#
|
|
26
45
|
# @return [#create, #update] an actor that can create and update the work
|
|
46
|
+
#
|
|
47
|
+
# @see Hyrax::DefaultMiddlewareStack
|
|
48
|
+
# @see https://samvera.github.io/actor_stack.html
|
|
27
49
|
def self.actor
|
|
28
50
|
@work_middleware_stack ||= actor_factory.build(Actors::Terminator.new)
|
|
29
51
|
end
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module Hyrax
|
|
3
|
+
##
|
|
4
|
+
# Defines the Hyrax "Actor Stack", used in creation of works when using
|
|
5
|
+
# +ActiveFedora+.
|
|
6
|
+
#
|
|
7
|
+
# @note this stack, and the Actor classes it calls, is not used when
|
|
8
|
+
# +Valkyrie+ models are defined by the application. in that context,
|
|
9
|
+
# this behavior is replaced by `Hyrax::Transactions::Container`.
|
|
10
|
+
#
|
|
11
|
+
# @see Hyrax::CurationConcern.actor
|
|
12
|
+
# @see Hyrax::WorksControllerBehavior#create
|
|
13
|
+
# @see Hyrax::WorksControllerBehavior#update
|
|
3
14
|
class DefaultMiddlewareStack
|
|
4
15
|
# rubocop:disable Metrics/MethodLength
|
|
5
16
|
def self.build_stack
|
|
@@ -14,12 +14,12 @@ module Hyrax
|
|
|
14
14
|
#
|
|
15
15
|
# @param admin_set_id [String, nil]
|
|
16
16
|
#
|
|
17
|
-
# @return [
|
|
17
|
+
# @return [#to_s] an admin_set_id; if you provide a "present"
|
|
18
18
|
# admin_set_id, this service will return that.
|
|
19
19
|
#
|
|
20
|
-
# @see
|
|
20
|
+
# @see Hyrax::AdminSetCreateService.find_or_create_default_admin_set
|
|
21
21
|
def self.call(admin_set_id: nil)
|
|
22
|
-
admin_set_id = admin_set_id.presence ||
|
|
22
|
+
admin_set_id = admin_set_id.presence&.to_s || Hyrax::AdminSetCreateService.find_or_create_default_admin_set.id.to_s
|
|
23
23
|
Hyrax::PermissionTemplate.find_or_create_by!(source_id: admin_set_id)
|
|
24
24
|
admin_set_id
|
|
25
25
|
end
|
|
@@ -13,6 +13,7 @@ module Hyrax
|
|
|
13
13
|
#
|
|
14
14
|
# @param event [Dry::Event]
|
|
15
15
|
def on_object_acl_updated(event)
|
|
16
|
+
return if Hyrax.config.disable_wings
|
|
16
17
|
return unless event[:result] == :success # do nothing on failure
|
|
17
18
|
|
|
18
19
|
if Hyrax.metadata_adapter.is_a?(Wings::Valkyrie::MetadataAdapter)
|
|
@@ -15,10 +15,17 @@ module Hyrax
|
|
|
15
15
|
# Re-index the resource.
|
|
16
16
|
#
|
|
17
17
|
# @param event [Dry::Event]
|
|
18
|
-
def
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
def on_collection_metadata_updated(event)
|
|
19
|
+
return unless resource? event[:collection]
|
|
20
|
+
Hyrax.index_adapter.save(resource: event[:collection])
|
|
21
|
+
end
|
|
21
22
|
|
|
23
|
+
##
|
|
24
|
+
# Re-index the resource.
|
|
25
|
+
#
|
|
26
|
+
# @param event [Dry::Event]
|
|
27
|
+
def on_object_metadata_updated(event)
|
|
28
|
+
return unless resource? event[:object]
|
|
22
29
|
Hyrax.index_adapter.save(resource: event[:object])
|
|
23
30
|
end
|
|
24
31
|
|
|
@@ -27,17 +34,26 @@ module Hyrax
|
|
|
27
34
|
#
|
|
28
35
|
# @param event [Dry::Event]
|
|
29
36
|
def on_object_deleted(event)
|
|
30
|
-
|
|
31
|
-
event.payload[:object].is_a?(Valkyrie::Resource)
|
|
32
|
-
|
|
37
|
+
return unless resource?(event.payload[:object])
|
|
33
38
|
Hyrax.index_adapter.delete(resource: event[:object])
|
|
34
39
|
end
|
|
35
40
|
|
|
36
41
|
private
|
|
37
42
|
|
|
38
|
-
def
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
def resource?(resource)
|
|
44
|
+
return true if resource.is_a? Valkyrie::Resource
|
|
45
|
+
log_non_resource(resource)
|
|
46
|
+
false
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def log_non_resource(resource)
|
|
50
|
+
generic_type = resource_generic_type(resource)
|
|
51
|
+
Hyrax.logger.info("Skipping #{generic_type} reindex because the " \
|
|
52
|
+
"#{generic_type} #{resource} was not a Valkyrie::Resource.")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def resource_generic_type(resource)
|
|
56
|
+
resource.try(:collection?) ? 'collection' : 'object'
|
|
41
57
|
end
|
|
42
58
|
end
|
|
43
59
|
end
|
|
@@ -143,7 +143,7 @@ module Hyrax
|
|
|
143
143
|
def groups_for(mode:)
|
|
144
144
|
Enumerator.new do |yielder|
|
|
145
145
|
acl.permissions.each do |permission|
|
|
146
|
-
next unless permission.mode == mode
|
|
146
|
+
next unless permission.mode.to_sym == mode
|
|
147
147
|
next unless permission.agent.starts_with?(Hyrax::Group.name_prefix)
|
|
148
148
|
yielder << permission.agent.gsub(Hyrax::Group.name_prefix, '')
|
|
149
149
|
end
|
|
@@ -154,7 +154,7 @@ module Hyrax
|
|
|
154
154
|
groups = groups.map(&:to_s)
|
|
155
155
|
|
|
156
156
|
acl.permissions.each do |permission|
|
|
157
|
-
next unless permission.mode == mode
|
|
157
|
+
next unless permission.mode.to_sym == mode
|
|
158
158
|
next unless permission.agent.starts_with?(Hyrax::Group.name_prefix)
|
|
159
159
|
|
|
160
160
|
group_name = permission.agent.gsub(Hyrax::Group.name_prefix, '')
|
|
@@ -175,7 +175,7 @@ module Hyrax
|
|
|
175
175
|
end
|
|
176
176
|
|
|
177
177
|
acl.permissions.each do |permission|
|
|
178
|
-
next unless permission.mode == mode
|
|
178
|
+
next unless permission.mode.to_sym == mode
|
|
179
179
|
next if permission.agent.starts_with?(Hyrax::Group.name_prefix)
|
|
180
180
|
next if users.include? permission.agent
|
|
181
181
|
|
|
@@ -189,7 +189,7 @@ module Hyrax
|
|
|
189
189
|
def users_for(mode:)
|
|
190
190
|
Enumerator.new do |yielder|
|
|
191
191
|
acl.permissions.each do |permission|
|
|
192
|
-
next unless permission.mode == mode
|
|
192
|
+
next unless permission.mode.to_sym == mode
|
|
193
193
|
next if permission.agent.starts_with?(Hyrax::Group.name_prefix)
|
|
194
194
|
yielder << permission.agent
|
|
195
195
|
end
|
|
@@ -39,9 +39,9 @@ module Hyrax
|
|
|
39
39
|
# @option recipients [Array<Hyrax::User>] :to a list of users to which to send the notification
|
|
40
40
|
# @option recipients [Array<Hyrax::User>] :cc a list of users to which to copy on the notification
|
|
41
41
|
def initialize(entity, comment, user, recipients)
|
|
42
|
-
@work_id = entity.
|
|
42
|
+
@work_id = entity.proxy_for.id
|
|
43
43
|
@title = entity.proxy_for.title.first
|
|
44
|
-
@comment = comment
|
|
44
|
+
@comment = comment&.comment.to_s
|
|
45
45
|
# Convert to hash with indifferent access to allow both string and symbol keys
|
|
46
46
|
@recipients = recipients.with_indifferent_access
|
|
47
47
|
@user = user
|
|
@@ -14,7 +14,14 @@ module Hyrax
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def initialize(target:, action:, comment:, user:)
|
|
17
|
-
@target =
|
|
17
|
+
@target =
|
|
18
|
+
case target
|
|
19
|
+
when Valkyrie::Resource
|
|
20
|
+
Hyrax::ChangeSet.for(target)
|
|
21
|
+
else
|
|
22
|
+
target
|
|
23
|
+
end
|
|
24
|
+
|
|
18
25
|
@action = action
|
|
19
26
|
@comment = comment
|
|
20
27
|
@user = user
|
|
@@ -70,10 +77,15 @@ module Hyrax
|
|
|
70
77
|
# @api private
|
|
71
78
|
def save_target
|
|
72
79
|
case target
|
|
73
|
-
when
|
|
74
|
-
target.
|
|
80
|
+
when Valkyrie::ChangeSet
|
|
81
|
+
return target.model unless target.changed?
|
|
82
|
+
|
|
83
|
+
Hyrax::Transactions::Container['change_set.apply']
|
|
84
|
+
.with_step_args('change_set.save' => { user: user })
|
|
85
|
+
.call(target)
|
|
86
|
+
.value!
|
|
75
87
|
else
|
|
76
|
-
|
|
88
|
+
target.save
|
|
77
89
|
end
|
|
78
90
|
end
|
|
79
91
|
end
|
|
@@ -3,14 +3,15 @@ module Hyrax
|
|
|
3
3
|
module Workflow
|
|
4
4
|
module ActivateObject
|
|
5
5
|
##
|
|
6
|
-
# This is a built in function for workflow, setting the
|
|
7
|
-
# of the target to the Fedora
|
|
6
|
+
# This is a built in function for workflow, setting the +#state+
|
|
7
|
+
# of the target to the Fedora +active+ status URI
|
|
8
8
|
#
|
|
9
|
-
# @param target [#state] an instance of a model
|
|
9
|
+
# @param target [#state] an instance of a model with a +#state+ property;
|
|
10
|
+
# e.g. a {Hyrax::Work}
|
|
10
11
|
#
|
|
11
12
|
# @return [RDF::Vocabulary::Term] the Fedora Resource Status 'active' term
|
|
12
13
|
def self.call(target:, **)
|
|
13
|
-
target.state =
|
|
14
|
+
target.state = Hyrax::ResourceStatus::ACTIVE
|
|
14
15
|
end
|
|
15
16
|
end
|
|
16
17
|
end
|
|
@@ -9,14 +9,15 @@ module Hyrax
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
def message
|
|
12
|
-
I18n.t('hyrax.notifications.workflow.changes_required.message',
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
I18n.t('hyrax.notifications.workflow.changes_required.message',
|
|
13
|
+
title: title,
|
|
14
|
+
link: (link_to work_id, document_path),
|
|
15
|
+
comment: comment)
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
def users_to_notify
|
|
18
19
|
user_key = document.depositor
|
|
19
|
-
super << ::User.
|
|
20
|
+
super << ::User.find_by_user_key(user_key)
|
|
20
21
|
end
|
|
21
22
|
end
|
|
22
23
|
end
|
|
@@ -2,15 +2,17 @@
|
|
|
2
2
|
module Hyrax
|
|
3
3
|
module Workflow
|
|
4
4
|
##
|
|
5
|
-
# This is a built in function for workflow, setting the
|
|
6
|
-
# of the target to the Fedora
|
|
5
|
+
# This is a built in function for workflow, setting the +#state+
|
|
6
|
+
# of the target to the Fedora +inactive+ status URI
|
|
7
7
|
#
|
|
8
|
-
# @param target [#state] an instance of a model
|
|
8
|
+
# @param target [#state] an instance of a model with a +#state+ property;
|
|
9
|
+
# e.g. a {Hyrax::Work}
|
|
9
10
|
#
|
|
10
|
-
# @return [RDF::
|
|
11
|
+
# @return [RDF::URI] the Fedora Resource Status 'inactive' term
|
|
12
|
+
# @see Hyrax::ResourceStatus
|
|
11
13
|
module DeactivateObject
|
|
12
14
|
def self.call(target:, **)
|
|
13
|
-
target.state =
|
|
15
|
+
target.state = Hyrax::ResourceStatus::INACTIVE
|
|
14
16
|
end
|
|
15
17
|
end
|
|
16
18
|
end
|
|
@@ -9,13 +9,17 @@ module Hyrax
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
def message
|
|
12
|
-
I18n.t('hyrax.notifications.workflow.deposited.message',
|
|
13
|
-
|
|
12
|
+
I18n.t('hyrax.notifications.workflow.deposited.message',
|
|
13
|
+
title: title,
|
|
14
|
+
link: (link_to work_id, document_path),
|
|
15
|
+
user: user.user_key,
|
|
16
|
+
comment: comment)
|
|
14
17
|
end
|
|
15
18
|
|
|
16
19
|
def users_to_notify
|
|
17
|
-
user_key =
|
|
18
|
-
|
|
20
|
+
user_key = @entity.proxy_for.depositor
|
|
21
|
+
|
|
22
|
+
super << ::User.find_by_user_key(user_key)
|
|
19
23
|
end
|
|
20
24
|
end
|
|
21
25
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module Hyrax
|
|
3
3
|
module Workflow
|
|
4
|
+
##
|
|
4
5
|
# This is a built in function for workflow, so that a workflow action can be created that
|
|
5
6
|
# grants the creator the ability to alter it.
|
|
6
7
|
module GrantEditToDepositor
|
|
@@ -8,11 +9,14 @@ module Hyrax
|
|
|
8
9
|
# @return void
|
|
9
10
|
def self.call(target:, **)
|
|
10
11
|
return true unless target.try(:depositor)
|
|
11
|
-
|
|
12
|
-
target.try(:
|
|
12
|
+
|
|
13
|
+
model = target.try(:model) || target # get the model if target is a ChangeSet
|
|
14
|
+
model.edit_users = model.edit_users.to_a + Array.wrap(target.depositor) # += works in Ruby 2.6+
|
|
15
|
+
model.try(:permission_manager)&.acl&.save
|
|
16
|
+
|
|
13
17
|
# If there are a lot of members, granting access to each could take a
|
|
14
18
|
# long time. Do this work in the background.
|
|
15
|
-
GrantEditToMembersJob.perform_later(
|
|
19
|
+
GrantEditToMembersJob.perform_later(model, target.depositor)
|
|
16
20
|
end
|
|
17
21
|
end
|
|
18
22
|
end
|
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module Hyrax
|
|
3
3
|
module Workflow
|
|
4
|
+
##
|
|
4
5
|
# This is a built in function for workflow, so that a workflow action can be created that
|
|
5
6
|
# grants the creator the ability to view their work.
|
|
6
7
|
module GrantReadToDepositor
|
|
7
|
-
# @param [#read_users=, #read_users] target
|
|
8
|
+
# @param [#read_users=, #read_users] target to which we are adding read_users
|
|
9
|
+
# for the depositor
|
|
8
10
|
# @return void
|
|
9
11
|
def self.call(target:, **)
|
|
10
|
-
|
|
12
|
+
return true unless target.try(:depositor)
|
|
13
|
+
|
|
14
|
+
model = target.try(:model) || target # get the model if target is a ChangeSet
|
|
15
|
+
model.read_users = model.read_users.to_a + Array.wrap(target.depositor) # += works in Ruby 2.6+
|
|
16
|
+
model.try(:permission_manager)&.acl&.save
|
|
17
|
+
|
|
11
18
|
# If there are a lot of members, granting access to each could take a
|
|
12
19
|
# long time. Do this work in the background.
|
|
13
|
-
GrantReadToMembersJob.perform_later(
|
|
20
|
+
GrantReadToMembersJob.perform_later(model, target.depositor)
|
|
14
21
|
end
|
|
15
22
|
end
|
|
16
23
|
end
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module Hyrax
|
|
3
3
|
module Workflow
|
|
4
|
+
##
|
|
4
5
|
# This is a built in function for workflow, so that a workflow action can be created that
|
|
5
6
|
# removes the creators the ability to alter it.
|
|
6
7
|
module RevokeEditFromDepositor
|
|
7
8
|
def self.call(target:, **)
|
|
8
|
-
|
|
9
|
+
return true unless target.try(:depositor)
|
|
10
|
+
|
|
11
|
+
model = target.try(:model) || target # get the model if target is a ChangeSet
|
|
12
|
+
model.edit_users = model.edit_users.to_a - Array.wrap(target.depositor)
|
|
13
|
+
model.try(:permission_manager)&.acl&.save
|
|
14
|
+
|
|
9
15
|
# If there are a lot of members, revoking access from each could take a
|
|
10
16
|
# long time. Do this work in the background.
|
|
11
|
-
RevokeEditFromMembersJob.perform_later(
|
|
17
|
+
RevokeEditFromMembersJob.perform_later(model, target.depositor)
|
|
12
18
|
end
|
|
13
19
|
end
|
|
14
20
|
end
|