hyrax 3.1.0 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|