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
|
@@ -31,7 +31,8 @@ module Hyrax
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def create_sipity_comment
|
|
34
|
-
return
|
|
34
|
+
return Sipity::NullComment.new(entity: subject.entity, agent: subject.agent) if
|
|
35
|
+
comment_text.blank?
|
|
35
36
|
Sipity::Comment.create!(entity: subject.entity, agent: subject.agent, comment: comment_text)
|
|
36
37
|
end
|
|
37
38
|
|
|
@@ -44,7 +45,9 @@ module Hyrax
|
|
|
44
45
|
)
|
|
45
46
|
end
|
|
46
47
|
|
|
48
|
+
##
|
|
47
49
|
# Run any configured custom methods
|
|
50
|
+
#
|
|
48
51
|
def handle_additional_sipity_workflow_action_processing(comment:)
|
|
49
52
|
Hyrax::Workflow::ActionTakenService.handle_action_taken(
|
|
50
53
|
target: subject.work,
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
<% if f.object.persisted? && f.object.member_ids.present? %>
|
|
27
27
|
<%# we're loading these values dynamically to speed page load %>
|
|
28
28
|
<%= f.input :thumbnail_id,
|
|
29
|
-
input_html: { data: { text: f.object
|
|
29
|
+
input_html: { data: { text: thumbnail_label_for(object: f.object) } } %>
|
|
30
30
|
<% end %>
|
|
31
31
|
|
|
32
32
|
</div>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<section class="collection-title-row-wrapper"
|
|
4
4
|
data-source="my"
|
|
5
5
|
data-id="<%= id %>"
|
|
6
|
-
data-colls-hash="<%=
|
|
6
|
+
data-colls-hash="<%= available_parent_collections_data(collection: presenter) %>"
|
|
7
7
|
data-post-url="<%= hyrax.dashboard_create_nest_collection_within_path(id) %>"
|
|
8
8
|
data-post-delete-url="<%= hyrax.dashboard_collection_path(id) %>">
|
|
9
9
|
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<% if f.object.persisted? %>
|
|
38
38
|
<%# we're loading these values dynamically to speed page load %>
|
|
39
39
|
<%= f.input :thumbnail_id,
|
|
40
|
-
|
|
40
|
+
input_html: { data: { text: thumbnail_label_for(object: f.object) } } %>
|
|
41
41
|
<% end %>
|
|
42
42
|
</div>
|
|
43
43
|
<% if f.object.display_additional_fields? %>
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
<button class="btn btn-info"><span class="glyphicon glyphicon-refresh"></span> <%= t('helpers.action.refresh') %></button>
|
|
24
24
|
</fieldset>
|
|
25
25
|
<div class="col-sm-3">
|
|
26
|
-
<%= render 'view_type_group' %>
|
|
26
|
+
<%= render 'hyrax/collections/view_type_group' %>
|
|
27
27
|
</div>
|
|
28
28
|
</div>
|
|
29
29
|
<% end %>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<% provide :page_title, application_name %>
|
|
2
2
|
|
|
3
|
-
<% if @presenter.display_share_button? %>
|
|
3
|
+
<% if @presenter.display_share_button? && !Flipflop.read_only? %>
|
|
4
4
|
<div class="home-share-work text-center">
|
|
5
5
|
<% if signed_in? %>
|
|
6
6
|
<% if @presenter.create_many_work_types? %>
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<% @collection_type_list_presenter.each do |row_presenter| %>
|
|
13
13
|
<div class="radio radio-button-list">
|
|
14
14
|
<label>
|
|
15
|
-
<input type="radio" name="collection_type"
|
|
15
|
+
<input type="radio" name="collection_type" value="<%= row_presenter.title.gsub(/\s+/, '') %>"
|
|
16
16
|
<% if row_presenter.admin_set? %>
|
|
17
17
|
data-path="<%= new_admin_admin_set_path %>"
|
|
18
18
|
<% else %>
|
data/chart/hyrax/Chart.yaml
CHANGED
|
@@ -21,6 +21,9 @@ spec:
|
|
|
21
21
|
{{- include "hyrax.selectorLabels" . | nindent 8 }}
|
|
22
22
|
spec:
|
|
23
23
|
initContainers:
|
|
24
|
+
{{- if .Values.solrPreSetupInitContainer }}
|
|
25
|
+
{{- toYaml .Values.solrPreSetupInitContainer | nindent 8 }}
|
|
26
|
+
{{- end }}
|
|
24
27
|
{{- if .Values.loadSolrConfigSet }}
|
|
25
28
|
- name: load-solr-config
|
|
26
29
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
|
@@ -43,6 +46,9 @@ spec:
|
|
|
43
46
|
solrcloud-upload-configset.sh /app/samvera/hyrax-webapp/solr/conf &&
|
|
44
47
|
solrcloud-assign-configset.sh
|
|
45
48
|
{{- end }}
|
|
49
|
+
{{- if .Values.dbPreSetupInitContainer }}
|
|
50
|
+
{{- toYaml .Values.dbPreSetupInitContainer | nindent 8 }}
|
|
51
|
+
{{- end }}
|
|
46
52
|
{{- if not .Values.skipDbMigrateSeed }}
|
|
47
53
|
- name: db-setup
|
|
48
54
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
data/config/features.rb
CHANGED
|
@@ -44,6 +44,9 @@ Flipflop.configure do
|
|
|
44
44
|
feature :cache_work_iiif_manifest,
|
|
45
45
|
default: false,
|
|
46
46
|
description: "Use Rails.cache to cache the JSON document for IIIF manifests"
|
|
47
|
+
feature :read_only,
|
|
48
|
+
default: false,
|
|
49
|
+
description: "Put the system into read-only mode. Deposits, edits, approvals and anything that makes a change to the data will be disabled."
|
|
47
50
|
rescue Flipflop::StrategyError, Flipflop::FeatureError => err
|
|
48
51
|
Rails.logger.warn "Ignoring #{err}: #{err.message}"
|
|
49
52
|
end
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
Hyrax.publisher.subscribe(Hyrax::Listeners::AclIndexListener.new)
|
|
4
|
-
Hyrax.publisher.subscribe(Hyrax::Listeners::ActiveFedoraAclIndexListener.new)
|
|
4
|
+
Hyrax.publisher.subscribe(Hyrax::Listeners::ActiveFedoraAclIndexListener.new) unless
|
|
5
|
+
Hyrax.config.disable_wings
|
|
5
6
|
Hyrax.publisher.subscribe(Hyrax::Listeners::MemberCleanupListener.new)
|
|
6
7
|
Hyrax.publisher.subscribe(Hyrax::Listeners::MetadataIndexListener.new)
|
|
7
8
|
Hyrax.publisher.subscribe(Hyrax::Listeners::BatchNotificationListener.new)
|
data/config/locales/hyrax.en.yml
CHANGED
|
@@ -1305,6 +1305,7 @@ en:
|
|
|
1305
1305
|
owner:
|
|
1306
1306
|
edit: Edit access
|
|
1307
1307
|
read: View/Download
|
|
1308
|
+
read_only: The repository is in read-only mode for maintenance. No submissions or edits can be made at this time.
|
|
1308
1309
|
search:
|
|
1309
1310
|
button:
|
|
1310
1311
|
html: <span class="glyphicon glyphicon-search" aria-hidden="true"></span> Go
|
data/db/seeds.rb
CHANGED
|
@@ -10,7 +10,7 @@ errors = Hyrax::Workflow::WorkflowImporter.load_errors
|
|
|
10
10
|
abort("Failed to process all workflows:\n #{errors.join('\n ')}") unless errors.empty?
|
|
11
11
|
|
|
12
12
|
puts "\n== Creating default admin set"
|
|
13
|
-
admin_set_id =
|
|
13
|
+
admin_set_id = Hyrax::AdminSetCreateService.find_or_create_default_admin_set.id.to_s
|
|
14
14
|
|
|
15
15
|
# I have found that when I come back to a development
|
|
16
16
|
# environment, that I may have an AdminSet in Fedora, but it is
|
|
@@ -125,7 +125,7 @@ NOTE: The steps need to be done in order to create a new Hyrax based app.
|
|
|
125
125
|
Generate a new Rails application using the template.
|
|
126
126
|
|
|
127
127
|
```
|
|
128
|
-
rails _5.2.6_ new my_app -m https://raw.githubusercontent.com/samvera/hyrax/v3.
|
|
128
|
+
rails _5.2.6_ new my_app -m https://raw.githubusercontent.com/samvera/hyrax/v3.2.0/template.rb
|
|
129
129
|
```
|
|
130
130
|
|
|
131
131
|
Generating a new Rails application using Hyrax's template above takes cares of a number of steps for you, including:
|
|
@@ -50,7 +50,7 @@ The Samvera community is here to help. Please see our [support guide](./.github/
|
|
|
50
50
|
# Getting started
|
|
51
51
|
|
|
52
52
|
This document contains instructions specific to setting up an app with __Hyrax
|
|
53
|
-
v3.
|
|
53
|
+
v3.2.0__. If you are looking for instructions on installing a different
|
|
54
54
|
version, be sure to select the appropriate branch or tag from the drop-down
|
|
55
55
|
menu above.
|
|
56
56
|
|
data/hyrax.gemspec
CHANGED
|
@@ -82,7 +82,7 @@ SUMMARY
|
|
|
82
82
|
spec.add_dependency 'select2-rails', '~> 3.5'
|
|
83
83
|
spec.add_dependency 'signet'
|
|
84
84
|
spec.add_dependency 'tinymce-rails'
|
|
85
|
-
spec.add_dependency 'valkyrie', '>= 2.1.1'
|
|
85
|
+
spec.add_dependency 'valkyrie', '~> 2', '>= 2.1.1'
|
|
86
86
|
|
|
87
87
|
spec.add_development_dependency "capybara", '~> 3.29'
|
|
88
88
|
spec.add_development_dependency 'capybara-screenshot', '~> 1.0'
|
|
@@ -5,6 +5,8 @@ class CatalogController < ApplicationController
|
|
|
5
5
|
|
|
6
6
|
# This filter applies the hydra access controls
|
|
7
7
|
before_action :enforce_show_permissions, only: :show
|
|
8
|
+
# Allow all search options when in read-only mode
|
|
9
|
+
skip_before_action :check_read_only
|
|
8
10
|
|
|
9
11
|
def self.uploaded_field
|
|
10
12
|
"system_create_dtsi"
|
|
@@ -22,7 +24,7 @@ class CatalogController < ApplicationController
|
|
|
22
24
|
config.view.slideshow.partials = [:index]
|
|
23
25
|
|
|
24
26
|
# Because too many times on Samvera tech people raise a problem regarding a failed query to SOLR.
|
|
25
|
-
# Often, it's because they
|
|
27
|
+
# Often, it's because they inadvertently exceeded the character limit of a GET request.
|
|
26
28
|
config.http_method = :post
|
|
27
29
|
|
|
28
30
|
## Default parameters to send to solr for all search-like requests. See also SolrHelper#solr_search_params
|
|
@@ -238,6 +238,16 @@ Hyrax.config do |config|
|
|
|
238
238
|
# "#{ActiveFedora.fedora.host}#{ActiveFedora.fedora.base_path}/#{Noid::Rails.treeify(id)}"
|
|
239
239
|
# end
|
|
240
240
|
|
|
241
|
+
# Identify the model class name that will be used for Collections in your app
|
|
242
|
+
# (i.e. ::Collection for ActiveFedora, Hyrax::PcdmCollection for Valkyrie)
|
|
243
|
+
# config.collection_model = '::Collection'
|
|
244
|
+
# config.collection_model = 'Hyrax::PcdmCollection'
|
|
245
|
+
|
|
246
|
+
# Identify the model class name that will be used for Admin Sets in your app
|
|
247
|
+
# (i.e. AdminSet for ActiveFedora, Hyrax::AdministrativeSet for Valkyrie)
|
|
248
|
+
# config.admin_set_model = 'AdminSet'
|
|
249
|
+
# config.admin_set_model = 'Hyrax::AdministrativeSet'
|
|
250
|
+
|
|
241
251
|
# When your application is ready to use the valkyrie index instead of the one
|
|
242
252
|
# maintained by active fedora, you will need to set this to true. You will
|
|
243
253
|
# also need to update your Blacklight configuration.
|
|
@@ -12,7 +12,7 @@ RSpec.feature 'Create a <%= class_name %>', js: false do
|
|
|
12
12
|
let(:user) do
|
|
13
13
|
User.new(user_attributes) { |u| u.save(validate: false) }
|
|
14
14
|
end
|
|
15
|
-
let(:admin_set_id) {
|
|
15
|
+
let(:admin_set_id) { Hyrax::AdminSetCreateService.find_or_create_default_admin_set.id.to_s }
|
|
16
16
|
let(:permission_template) { Hyrax::PermissionTemplate.find_or_create_by!(source_id: admin_set_id) }
|
|
17
17
|
let(:workflow) { Sipity::Workflow.create!(active: true, name: 'test-workflow', permission_template: permission_template) }
|
|
18
18
|
|
|
@@ -8,8 +8,12 @@ module Hyrax
|
|
|
8
8
|
def initialize(klass, namespace = nil, name = nil)
|
|
9
9
|
super
|
|
10
10
|
|
|
11
|
-
@
|
|
12
|
-
@
|
|
11
|
+
@human = 'Collection'
|
|
12
|
+
@i18n_key = :collection
|
|
13
|
+
@param_key = 'collection'
|
|
14
|
+
@plural = 'collections'
|
|
15
|
+
@route_key = 'collections'
|
|
16
|
+
@singular_route_key = 'collection'
|
|
13
17
|
end
|
|
14
18
|
end
|
|
15
19
|
end
|
data/lib/hyrax/configuration.rb
CHANGED
|
@@ -666,6 +666,34 @@ module Hyrax
|
|
|
666
666
|
@collection_type_index_field ||= 'collection_type_gid_ssim'
|
|
667
667
|
end
|
|
668
668
|
|
|
669
|
+
attr_writer :collection_model
|
|
670
|
+
##
|
|
671
|
+
# @return [#constantize] a string representation of the collection
|
|
672
|
+
# model
|
|
673
|
+
def collection_model
|
|
674
|
+
@collection_model ||= '::Collection'
|
|
675
|
+
end
|
|
676
|
+
|
|
677
|
+
##
|
|
678
|
+
# @return [Class] the configured collection model class
|
|
679
|
+
def collection_class
|
|
680
|
+
collection_model.constantize
|
|
681
|
+
end
|
|
682
|
+
|
|
683
|
+
attr_writer :admin_set_model
|
|
684
|
+
##
|
|
685
|
+
# @return [#constantize] a string representation of the admin set
|
|
686
|
+
# model
|
|
687
|
+
def admin_set_model
|
|
688
|
+
@admin_set_model ||= 'AdminSet'
|
|
689
|
+
end
|
|
690
|
+
|
|
691
|
+
##
|
|
692
|
+
# @return [Class] the configured admin set model class
|
|
693
|
+
def admin_set_class
|
|
694
|
+
admin_set_model.constantize
|
|
695
|
+
end
|
|
696
|
+
|
|
669
697
|
attr_writer :id_field
|
|
670
698
|
def id_field
|
|
671
699
|
@id_field || index_field_mapper.id_field
|
data/lib/hyrax/form_fields.rb
CHANGED
|
@@ -49,6 +49,7 @@ module Hyrax
|
|
|
49
49
|
|
|
50
50
|
form_field_definitions.each do |field_name, options|
|
|
51
51
|
descendant.property field_name.to_sym, options.merge(display: true, default: [])
|
|
52
|
+
descendant.validates field_name.to_sym, presence: true if options.fetch(:required, false)
|
|
52
53
|
end
|
|
53
54
|
end
|
|
54
55
|
end
|
data/lib/hyrax/publisher.rb
CHANGED
|
@@ -94,6 +94,18 @@ module Hyrax
|
|
|
94
94
|
# @macro a_registered_event
|
|
95
95
|
register_event('batch.created')
|
|
96
96
|
|
|
97
|
+
# @since 3.0.0
|
|
98
|
+
# @macro a_registered_event
|
|
99
|
+
register_event('collection.metadata.updated')
|
|
100
|
+
|
|
101
|
+
# @since 3.0.0
|
|
102
|
+
# @macro a_registered_event
|
|
103
|
+
register_event('collection.membership.updated')
|
|
104
|
+
|
|
105
|
+
# @since 3.3.0
|
|
106
|
+
# @macro a_registered_event
|
|
107
|
+
register_event('file.downloaded')
|
|
108
|
+
|
|
97
109
|
# @since 3.0.0
|
|
98
110
|
# @macro a_registered_event
|
|
99
111
|
register_event('file.set.audited')
|
|
@@ -61,8 +61,8 @@ module Hyrax
|
|
|
61
61
|
|
|
62
62
|
def build_resources(xml, doc_set)
|
|
63
63
|
doc_set.each do |doc|
|
|
64
|
-
model = doc.fetch('has_model_ssim', []).first.
|
|
65
|
-
if model ==
|
|
64
|
+
model = doc.fetch('has_model_ssim', []).first.safe_constantize
|
|
65
|
+
if model.try(:collection?) || model == Hyrax.config.collection_class
|
|
66
66
|
build_resource(xml, doc, model, hyrax_routes)
|
|
67
67
|
else
|
|
68
68
|
build_resource(xml, doc, model, main_app_routes)
|
|
@@ -32,8 +32,8 @@ module Hyrax
|
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
def build_collections(xml)
|
|
36
|
-
|
|
35
|
+
def build_collections(xml, searcher: AbstractTypeRelation.new(allowable_types: [::Collection, Hyrax.config.collection_class]))
|
|
36
|
+
searcher.search_in_batches(public_access) do |doc_set|
|
|
37
37
|
build_resources(xml, doc_set, hyrax_routes)
|
|
38
38
|
end
|
|
39
39
|
end
|
|
@@ -152,6 +152,8 @@ end
|
|
|
152
152
|
RSpec.shared_examples 'a Hyrax::AdministrativeSet' do
|
|
153
153
|
subject(:admin_set) { described_class.new }
|
|
154
154
|
|
|
155
|
+
it_behaves_like 'a model with core metadata'
|
|
156
|
+
|
|
155
157
|
it 'has an #alternative_title' do
|
|
156
158
|
expect { admin_set.alternative_title = ['Moomin'] }
|
|
157
159
|
.to change { admin_set.alternative_title }
|
|
@@ -188,5 +188,11 @@ RSpec.shared_examples 'a Collection indexer' do
|
|
|
188
188
|
expect(indexer.to_solr)
|
|
189
189
|
.to include(thumbnail_path_ss: include('assets/collection', '.png'))
|
|
190
190
|
end
|
|
191
|
+
|
|
192
|
+
it 'indexes depositor' do
|
|
193
|
+
expect(indexer.to_solr)
|
|
194
|
+
.to include(depositor_ssim: [resource.depositor],
|
|
195
|
+
depositor_tesim: [resource.depositor])
|
|
196
|
+
end
|
|
191
197
|
end
|
|
192
198
|
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'hyrax/transactions/transaction'
|
|
3
|
+
|
|
4
|
+
module Hyrax
|
|
5
|
+
module Transactions
|
|
6
|
+
##
|
|
7
|
+
# Creates a Collection from a ChangeSet
|
|
8
|
+
#
|
|
9
|
+
# @since 3.2.0
|
|
10
|
+
class CollectionCreate < Transaction
|
|
11
|
+
DEFAULT_STEPS = ['change_set.set_user_as_depositor',
|
|
12
|
+
'change_set.set_collection_type_gid',
|
|
13
|
+
'change_set.add_to_collections',
|
|
14
|
+
'change_set.apply',
|
|
15
|
+
'collection_resource.apply_collection_type_permissions',
|
|
16
|
+
'collection_resource.save_acl'].freeze
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
# @see Hyrax::Transactions::Transaction
|
|
20
|
+
def initialize(container: Container, steps: DEFAULT_STEPS)
|
|
21
|
+
super
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'hyrax/transactions/transaction'
|
|
3
|
+
|
|
4
|
+
module Hyrax
|
|
5
|
+
module Transactions
|
|
6
|
+
##
|
|
7
|
+
# Creates a Collection from a ChangeSet
|
|
8
|
+
#
|
|
9
|
+
# @since 3.2.0
|
|
10
|
+
class CollectionUpdate < Transaction
|
|
11
|
+
DEFAULT_STEPS = ['change_set.apply'].freeze
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# @see Hyrax::Transactions::Transaction
|
|
15
|
+
def initialize(container: Container, steps: DEFAULT_STEPS)
|
|
16
|
+
super
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -19,6 +19,8 @@ module Hyrax
|
|
|
19
19
|
# @see https://dry-rb.org/gems/dry-container/
|
|
20
20
|
class Container # rubocop:disable Metrics/ClassLength
|
|
21
21
|
require 'hyrax/transactions/apply_change_set'
|
|
22
|
+
require 'hyrax/transactions/collection_create'
|
|
23
|
+
require 'hyrax/transactions/collection_update'
|
|
22
24
|
require 'hyrax/transactions/create_work'
|
|
23
25
|
require 'hyrax/transactions/destroy_work'
|
|
24
26
|
require 'hyrax/transactions/file_set_destroy'
|
|
@@ -29,11 +31,13 @@ module Hyrax
|
|
|
29
31
|
require 'hyrax/transactions/steps/add_to_collections'
|
|
30
32
|
require 'hyrax/transactions/steps/add_to_parent'
|
|
31
33
|
require 'hyrax/transactions/steps/apply_collection_permission_template'
|
|
34
|
+
require 'hyrax/transactions/steps/apply_collection_type_permissions'
|
|
32
35
|
require 'hyrax/transactions/steps/apply_permission_template'
|
|
33
36
|
require 'hyrax/transactions/steps/apply_visibility'
|
|
34
37
|
require 'hyrax/transactions/steps/delete_resource'
|
|
35
38
|
require 'hyrax/transactions/steps/destroy_work'
|
|
36
39
|
require 'hyrax/transactions/steps/ensure_admin_set'
|
|
40
|
+
require 'hyrax/transactions/steps/set_collection_type_gid'
|
|
37
41
|
require 'hyrax/transactions/steps/ensure_permission_template'
|
|
38
42
|
require 'hyrax/transactions/steps/remove_file_set_from_work'
|
|
39
43
|
require 'hyrax/transactions/steps/save'
|
|
@@ -58,6 +62,14 @@ module Hyrax
|
|
|
58
62
|
ApplyChangeSet.new
|
|
59
63
|
end
|
|
60
64
|
|
|
65
|
+
ops.register 'create_collection' do
|
|
66
|
+
CollectionCreate.new
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
ops.register 'update_collection' do
|
|
70
|
+
CollectionUpdate.new
|
|
71
|
+
end
|
|
72
|
+
|
|
61
73
|
ops.register 'create_work' do
|
|
62
74
|
WorkCreate.new
|
|
63
75
|
end
|
|
@@ -70,6 +82,10 @@ module Hyrax
|
|
|
70
82
|
Steps::Save.new
|
|
71
83
|
end
|
|
72
84
|
|
|
85
|
+
ops.register 'set_collection_type_gid' do
|
|
86
|
+
Steps::SetCollectionTypeGid.new
|
|
87
|
+
end
|
|
88
|
+
|
|
73
89
|
ops.register 'set_default_admin_set' do
|
|
74
90
|
Steps::SetDefaultAdminSet.new
|
|
75
91
|
end
|
|
@@ -109,6 +125,16 @@ module Hyrax
|
|
|
109
125
|
end
|
|
110
126
|
end
|
|
111
127
|
|
|
128
|
+
namespace 'collection_resource' do |ops| # valkyrie collection
|
|
129
|
+
ops.register 'apply_collection_type_permissions' do
|
|
130
|
+
Steps::ApplyCollectionTypePermissions.new
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
ops.register 'save_acl' do
|
|
134
|
+
Steps::SaveAccessControl.new
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
112
138
|
namespace 'work_resource' do |ops| # valkyrie works
|
|
113
139
|
ops.register 'add_file_sets' do
|
|
114
140
|
Steps::AddFileSets.new
|
|
@@ -26,10 +26,22 @@ module Hyrax
|
|
|
26
26
|
#
|
|
27
27
|
# @return [Dry::Monads::Result]
|
|
28
28
|
def call(change_set, collection_ids: [])
|
|
29
|
-
change_set
|
|
29
|
+
multi_membership_messages = check_multi_membership(change_set, collection_ids)
|
|
30
|
+
return Failure(multi_membership_messages) if multi_membership_messages.present?
|
|
30
31
|
|
|
32
|
+
change_set.member_of_collection_ids += collection_ids
|
|
31
33
|
Success(change_set)
|
|
32
34
|
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def check_multi_membership(change_set, collection_ids)
|
|
39
|
+
return if change_set.is_a? Hyrax::Forms::PcdmCollectionForm
|
|
40
|
+
|
|
41
|
+
Hyrax::MultipleMembershipChecker
|
|
42
|
+
.new(item: change_set)
|
|
43
|
+
.check(collection_ids: [collection_ids], include_current_members: true)
|
|
44
|
+
end
|
|
33
45
|
end
|
|
34
46
|
end
|
|
35
47
|
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module Hyrax
|
|
3
|
+
module Transactions
|
|
4
|
+
module Steps
|
|
5
|
+
##
|
|
6
|
+
# A `dry-transcation` step that applies permission templates from a
|
|
7
|
+
# collection type on a given collection.
|
|
8
|
+
#
|
|
9
|
+
# @since 3.2.0
|
|
10
|
+
class ApplyCollectionTypePermissions
|
|
11
|
+
include Dry::Monads[:result]
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# @param [Hyrax::PcdmCollection] collection with a collection type gid
|
|
15
|
+
# @param user [User] the user that created the collection
|
|
16
|
+
#
|
|
17
|
+
# @return [Dry::Monads::Result]
|
|
18
|
+
def call(collection, user: nil)
|
|
19
|
+
Hyrax::Collections::PermissionsCreateService.create_default(collection: collection,
|
|
20
|
+
creating_user: user)
|
|
21
|
+
Success(collection)
|
|
22
|
+
rescue URI::InvalidURIError => err
|
|
23
|
+
# will be raised if the collection_type_gid is invalid or doesn't exist
|
|
24
|
+
Failure(err)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -29,8 +29,12 @@ module Hyrax
|
|
|
29
29
|
# applied and the resource is saved;
|
|
30
30
|
# `Failure([#to_s, change_set.resource])`, otherwise.
|
|
31
31
|
def call(change_set, user: nil)
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
begin
|
|
33
|
+
unsaved = change_set.sync
|
|
34
|
+
saved = @persister.save(resource: unsaved)
|
|
35
|
+
rescue StandardError => err
|
|
36
|
+
return Failure(["Failed save on #{change_set}\n\t#{err.message}", change_set.resource])
|
|
37
|
+
end
|
|
34
38
|
|
|
35
39
|
# if we have a permission manager, it's acting as a local cache of another resource.
|
|
36
40
|
# we want to resync changes that we had in progress so we can persist them later.
|
|
@@ -38,12 +42,20 @@ module Hyrax
|
|
|
38
42
|
unsaved.respond_to?(:permission_manager)
|
|
39
43
|
|
|
40
44
|
user ||= ::User.find_by_user_key(saved.depositor)
|
|
41
|
-
Hyrax.publisher.publish('object.deposited', object: saved, user: user) if unsaved.new_record
|
|
42
|
-
Hyrax.publisher.publish('object.metadata.updated', object: saved, user: user)
|
|
43
45
|
|
|
46
|
+
publish_changes(resource: saved, user: user, new: unsaved.new_record)
|
|
44
47
|
Success(saved)
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def publish_changes(resource:, user:, new: false)
|
|
53
|
+
if resource.collection?
|
|
54
|
+
Hyrax.publisher.publish('collection.metadata.updated', collection: resource, user: user)
|
|
55
|
+
else
|
|
56
|
+
Hyrax.publisher.publish('object.deposited', object: resource, user: user) if new
|
|
57
|
+
Hyrax.publisher.publish('object.metadata.updated', object: resource, user: user)
|
|
58
|
+
end
|
|
47
59
|
end
|
|
48
60
|
end
|
|
49
61
|
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module Hyrax
|
|
3
|
+
module Transactions
|
|
4
|
+
module Steps
|
|
5
|
+
##
|
|
6
|
+
# A step that sets the `#collection_type_gid` in the change set.
|
|
7
|
+
#
|
|
8
|
+
# @since 3.2.0
|
|
9
|
+
class SetCollectionTypeGid
|
|
10
|
+
include Dry::Monads[:result]
|
|
11
|
+
|
|
12
|
+
##
|
|
13
|
+
# @param [Hyrax::ChangeSet] change_set
|
|
14
|
+
# @param collection_type_gid [URI::GID] global id for the collection type
|
|
15
|
+
# @return [Dry::Monads::Result] `Failure` if there is no `collection_type_gid` or
|
|
16
|
+
# it can't be set to the default for the input; `Success(input)`, otherwise.
|
|
17
|
+
def call(change_set, collection_type_gid: default_collection_type_gid)
|
|
18
|
+
return Failure[:no_collection_type_gid, collection] unless
|
|
19
|
+
change_set.respond_to?(:collection_type_gid=)
|
|
20
|
+
return Success(change_set) if
|
|
21
|
+
change_set.collection_type_gid.present?
|
|
22
|
+
|
|
23
|
+
change_set.collection_type_gid = collection_type_gid
|
|
24
|
+
Success(change_set)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def default_collection_type_gid
|
|
30
|
+
Hyrax::CollectionType.find_or_create_default_collection_type.to_global_id
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|