hyrax 3.4.1 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +26 -17
  3. data/.dassie/.env +1 -1
  4. data/.dassie/Gemfile +1 -1
  5. data/.dassie/app/forms/collection_resource_form.rb +8 -0
  6. data/.dassie/app/indexers/collection_resource_indexer.rb +8 -0
  7. data/.dassie/app/models/collection_resource.rb +35 -0
  8. data/.dassie/config/initializers/file_services.rb +4 -0
  9. data/.dassie/config/initializers/hyrax.rb +2 -1
  10. data/.dassie/config/metadata/collection_resource.yaml +23 -0
  11. data/.dassie/db/seeds.rb +2 -0
  12. data/.dassie/spec/forms/collection_resource_form_spec.rb +13 -0
  13. data/.dassie/spec/indexers/collection_resource_indexer_spec.rb +14 -0
  14. data/.dassie/spec/models/collection_resource_spec.rb +13 -0
  15. data/.regen +1 -1
  16. data/.rubocop.yml +1 -1
  17. data/.rubocop_fixme.yml +19 -2
  18. data/CONTAINERS.md +18 -13
  19. data/Dockerfile +2 -2
  20. data/app/actors/hyrax/actors/collections_membership_actor.rb +1 -1
  21. data/app/actors/hyrax/actors/embargo_actor.rb +11 -4
  22. data/app/actors/hyrax/actors/lease_actor.rb +11 -4
  23. data/app/assets/javascripts/hyrax/app.js.erb +1 -1
  24. data/app/assets/javascripts/hyrax/collections_v2.es6 +13 -0
  25. data/app/assets/javascripts/hyrax/permissions/control.es6 +8 -1
  26. data/app/controllers/concerns/hyrax/collections_controller_behavior.rb +1 -3
  27. data/app/controllers/concerns/hyrax/embargoes_controller_behavior.rb +11 -2
  28. data/app/controllers/concerns/hyrax/leases_controller_behavior.rb +11 -2
  29. data/app/controllers/concerns/hyrax/manages_embargoes.rb +13 -1
  30. data/app/controllers/hyrax/dashboard/collections_controller.rb +159 -76
  31. data/app/controllers/hyrax/downloads_controller.rb +16 -1
  32. data/app/controllers/hyrax/file_sets_controller.rb +10 -1
  33. data/app/controllers/hyrax/permissions_controller.rb +1 -1
  34. data/app/controllers/hyrax/single_use_links_viewer_controller.rb +1 -1
  35. data/app/controllers/hyrax/transfers_controller.rb +0 -2
  36. data/app/controllers/hyrax/workflow_actions_controller.rb +3 -2
  37. data/app/forms/hyrax/forms/collection_form.rb +1 -1
  38. data/app/forms/hyrax/forms/dashboard/nest_collection_form.rb +2 -0
  39. data/app/forms/hyrax/forms/embargo.rb +13 -0
  40. data/app/forms/hyrax/forms/file_set_edit_form.rb +1 -1
  41. data/app/forms/hyrax/forms/file_set_form.rb +8 -35
  42. data/app/forms/hyrax/forms/lease.rb +13 -0
  43. data/app/forms/hyrax/forms/pcdm_collection_form.rb +29 -2
  44. data/app/forms/hyrax/forms/pcdm_object_form.rb +46 -0
  45. data/app/forms/hyrax/forms/resource_form.rb +39 -21
  46. data/app/forms/hyrax/forms/widgets/admin_set_visibility.rb +1 -1
  47. data/app/forms/hyrax/forms/work_embargo_form.rb +35 -0
  48. data/app/forms/hyrax/forms/work_lease_form.rb +35 -0
  49. data/app/helpers/hyrax/embargo_helper.rb +11 -0
  50. data/app/helpers/hyrax/lease_helper.rb +11 -0
  51. data/app/indexers/hyrax/pcdm_collection_indexer.rb +1 -1
  52. data/app/indexers/hyrax/valkyrie_file_set_indexer.rb +2 -8
  53. data/app/jobs/characterize_job.rb +5 -1
  54. data/app/jobs/content_event_job.rb +1 -1
  55. data/app/jobs/import_url_job.rb +4 -6
  56. data/app/jobs/valkyrie_ingest_job.rb +15 -77
  57. data/app/models/admin_set.rb +8 -0
  58. data/app/models/concerns/hyrax/collection_behavior.rb +3 -2
  59. data/app/models/concerns/hyrax/collection_nesting.rb +10 -1
  60. data/app/models/concerns/hyrax/file_set_behavior.rb +1 -0
  61. data/app/models/concerns/hyrax/user.rb +11 -0
  62. data/app/models/concerns/hyrax/work_behavior.rb +3 -2
  63. data/app/models/featured_work_list.rb +0 -1
  64. data/app/models/hyrax/embargo.rb +1 -1
  65. data/app/models/hyrax/file_metadata.rb +32 -2
  66. data/app/models/hyrax/file_set.rb +4 -6
  67. data/app/models/hyrax/group.rb +19 -0
  68. data/app/models/hyrax/lease.rb +1 -1
  69. data/app/models/hyrax/pcdm_collection.rb +0 -1
  70. data/app/models/job_io_wrapper.rb +1 -1
  71. data/app/models/proxy_deposit_request.rb +1 -1
  72. data/app/presenters/hyrax/member_presenter_factory.rb +2 -4
  73. data/app/presenters/hyrax/permission_badge.rb +3 -2
  74. data/app/presenters/hyrax/version_list_presenter.rb +6 -1
  75. data/app/presenters/hyrax/work_show_presenter.rb +3 -3
  76. data/app/search_builders/hyrax/dashboard/nested_collections_search_builder.rb +13 -5
  77. data/app/services/hyrax/access_control_list.rb +7 -6
  78. data/app/services/hyrax/adapters/nesting_index_adapter.rb +3 -3
  79. data/app/services/hyrax/characterization/valkyrie_characterization_service.rb +3 -5
  80. data/app/services/hyrax/collections/collection_member_service.rb +3 -5
  81. data/app/services/hyrax/collections/nested_collection_query_service.rb +1 -1
  82. data/app/services/hyrax/edit_permissions_service.rb +21 -3
  83. data/app/services/hyrax/embargo_manager.rb +9 -0
  84. data/app/services/hyrax/file_set_file_service.rb +55 -0
  85. data/app/services/hyrax/lease_manager.rb +9 -0
  86. data/app/services/hyrax/listeners/file_metadata_listener.rb +11 -0
  87. data/app/services/hyrax/listeners/member_cleanup_listener.rb +14 -18
  88. data/app/services/hyrax/multiple_membership_checker.rb +2 -0
  89. data/app/services/hyrax/user_stat_importer.rb +2 -0
  90. data/app/services/hyrax/valkyrie_persist_derivatives.rb +50 -0
  91. data/app/services/hyrax/valkyrie_upload.rb +94 -0
  92. data/app/services/hyrax/versioning_service.rb +77 -9
  93. data/app/services/hyrax/visibility_propagator.rb +5 -5
  94. data/app/services/hyrax/work_resource_query_service.rb +45 -0
  95. data/app/services/hyrax/workflow/workflow_importer.rb +7 -9
  96. data/app/services/hyrax/workflow/workflow_schema.rb +3 -5
  97. data/app/strategies/hyrax/strategies/yaml_strategy.rb +4 -6
  98. data/app/uploaders/hyrax/uploaded_file_uploader.rb +4 -4
  99. data/app/validators/hyrax/collection_membership_validator.rb +16 -15
  100. data/app/views/catalog/_index_header_list_default.html.erb +8 -1
  101. data/app/views/catalog/_thumbnail_list_default.html.erb +8 -3
  102. data/app/views/collections/edit_fields/_based_near.html.erb +7 -7
  103. data/app/views/hyrax/base/_form_progress.html.erb +1 -1
  104. data/app/views/hyrax/base/_form_visibility_component.html.erb +5 -1
  105. data/app/views/hyrax/dashboard/collections/_form.html.erb +3 -2
  106. data/app/views/hyrax/dashboard/collections/_form_branding.html.erb +1 -0
  107. data/app/views/hyrax/dashboard/sidebar/_activity.html.erb +1 -1
  108. data/app/views/hyrax/embargoes/edit.html.erb +3 -3
  109. data/app/views/hyrax/file_sets/_permission.html.erb +1 -1
  110. data/app/views/hyrax/file_sets/_permission_form.html.erb +1 -6
  111. data/app/views/hyrax/file_sets/edit.html.erb +2 -2
  112. data/app/views/hyrax/leases/edit.html.erb +3 -3
  113. data/app/views/hyrax/my/works/_tabs.html.erb +6 -1
  114. data/app/views/hyrax/transfers/new.html.erb +1 -1
  115. data/chart/hyrax/Chart.yaml +10 -6
  116. data/chart/hyrax/templates/_helpers.tpl +4 -0
  117. data/chart/hyrax/templates/cron-embargo.yaml +5 -0
  118. data/chart/hyrax/templates/cron-lease.yaml +5 -0
  119. data/chart/hyrax/templates/deployment-worker.yaml +11 -0
  120. data/chart/hyrax/templates/ingress.yaml +7 -6
  121. data/chart/hyrax/values.yaml +152 -0
  122. data/config/features.rb +48 -50
  123. data/config/initializers/{valkryrie_storage.rb → storage_adapter_initializer.rb} +5 -0
  124. data/config/locales/hyrax.de.yml +14 -13
  125. data/config/locales/hyrax.en.yml +3 -0
  126. data/config/locales/hyrax.es.yml +1 -0
  127. data/config/locales/hyrax.fr.yml +2 -1
  128. data/config/locales/hyrax.it.yml +1 -0
  129. data/config/locales/hyrax.pt-BR.yml +1 -0
  130. data/config/locales/hyrax.zh.yml +1 -0
  131. data/config/metadata/file_set_metadata.yaml +130 -0
  132. data/docker-compose.yml +1 -0
  133. data/documentation/developing-your-hyrax-based-app.md +2 -2
  134. data/documentation/legacyREADME.md +3 -3
  135. data/hyrax.gemspec +7 -3
  136. data/lib/generators/hyrax/collection_resource/USAGE +20 -0
  137. data/lib/generators/hyrax/collection_resource/collection_resource_generator.rb +133 -0
  138. data/lib/generators/hyrax/collection_resource/templates/collection.rb.erb +34 -0
  139. data/lib/generators/hyrax/collection_resource/templates/collection_form.rb.erb +7 -0
  140. data/lib/generators/hyrax/collection_resource/templates/collection_form_spec.rb.erb +13 -0
  141. data/lib/generators/hyrax/collection_resource/templates/collection_indexer.rb.erb +7 -0
  142. data/lib/generators/hyrax/collection_resource/templates/collection_indexer_spec.rb.erb +13 -0
  143. data/lib/generators/hyrax/collection_resource/templates/collection_metadata.yaml +22 -0
  144. data/lib/generators/hyrax/collection_resource/templates/collection_spec.rb.erb +12 -0
  145. data/lib/generators/hyrax/install_generator.rb +9 -0
  146. data/lib/generators/hyrax/templates/config/locales/hyrax.de.yml +1 -1
  147. data/lib/generators/hyrax/templates/config/locales/hyrax.en.yml +1 -1
  148. data/lib/generators/hyrax/templates/config/locales/hyrax.es.yml +1 -1
  149. data/lib/generators/hyrax/templates/config/locales/hyrax.fr.yml +1 -1
  150. data/lib/generators/hyrax/templates/config/locales/hyrax.it.yml +1 -1
  151. data/lib/generators/hyrax/templates/config/locales/hyrax.zh.yml +1 -1
  152. data/lib/hyrax/active_fedora_dummy_model.rb +13 -0
  153. data/lib/hyrax/configuration.rb +21 -2
  154. data/lib/hyrax/errors.rb +2 -0
  155. data/lib/hyrax/publisher.rb +4 -0
  156. data/lib/hyrax/specs/shared_specs/factories/strategies/valkyrie_resource.rb +6 -0
  157. data/lib/hyrax/specs/shared_specs/hydra_works.rb +0 -1
  158. data/lib/hyrax/specs/shared_specs/indexers.rb +5 -0
  159. data/lib/hyrax/transactions/collection_update.rb +2 -0
  160. data/lib/hyrax/transactions/container.rb +10 -0
  161. data/lib/hyrax/transactions/steps/save_collection_banner.rb +59 -0
  162. data/lib/hyrax/transactions/steps/save_collection_logo.rb +109 -0
  163. data/lib/hyrax/version.rb +1 -1
  164. data/lib/wings/active_fedora_converter/file_metadata_node.rb +48 -0
  165. data/lib/wings/active_fedora_converter/instance_builder.rb +68 -0
  166. data/lib/wings/active_fedora_converter.rb +3 -3
  167. data/lib/wings/services/custom_queries/find_file_metadata.rb +19 -8
  168. data/lib/wings/valkyrie/query_service.rb +4 -6
  169. data/lib/wings/valkyrie/storage.rb +6 -2
  170. data/template.rb +1 -1
  171. metadata +99 -13
  172. data/app/views/catalog/_index_header_list_hyrax_pcdm_collection.html.erb +0 -4
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+ module Hyrax
3
+ module Transactions
4
+ module Steps
5
+ ##
6
+ # Adds logo info via `ChangeSet`.
7
+ #
8
+ # During the update collection process this step is called to update the file(s)
9
+ # to be used as logo(s) for the collection.
10
+ #
11
+ class SaveCollectionLogo
12
+ include Dry::Transaction::Operation
13
+
14
+ ##
15
+ # @param [Hyrax::ChangeSet] change_set
16
+ # @param [Array<#Integer>] update_logo_file_ids
17
+ # @param [Array<String>] alttext_values
18
+ # @param [Array<String>] linkurl_values
19
+ #
20
+ # @return [Dry::Monads::Result] `Failure` if the work fails to save;
21
+ # `Success(input)`, otherwise.
22
+ def call(collection_resource, update_logo_file_ids: nil, alttext_values: nil, linkurl_values: nil)
23
+ collection_id = collection_resource.id.to_s
24
+ process_logo_input(collection_id: collection_id, update_logo_file_ids: update_logo_file_ids, alttext_values: alttext_values, linkurl_values: linkurl_values)
25
+ Success(collection_resource)
26
+ end
27
+
28
+ private
29
+
30
+ def process_logo_input(collection_id:, update_logo_file_ids:, alttext_values:, linkurl_values:)
31
+ uploaded_file_ids = update_logo_file_ids
32
+ public_files = []
33
+
34
+ if uploaded_file_ids.nil?
35
+ # all logo files were removed, so delete all files previously uploaded
36
+ remove_redundant_files(collection_id: collection_id, public_files: public_files)
37
+ return
38
+ end
39
+
40
+ public_files = process_logo_records(collection_id: collection_id, uploaded_file_ids: uploaded_file_ids, alttext_values: alttext_values, linkurl_values: linkurl_values)
41
+ remove_redundant_files(collection_id: collection_id, public_files: public_files)
42
+ end
43
+
44
+ def process_logo_records(collection_id:, uploaded_file_ids:, alttext_values:, linkurl_values:)
45
+ public_files = []
46
+ uploaded_file_ids.each_with_index do |ufi, i|
47
+ # If the user has chosen a new logo, the ufi will be an integer
48
+ # If the logo was previously chosen, the ufi will be a path
49
+ # If it is a path, update the rec, else create a new rec
50
+ if !ufi.match(/\D/).nil?
51
+ update_logo_info(collection_id: collection_id, uploaded_file_id: ufi, alttext: alttext_values[i], linkurl: verify_linkurl(linkurl_values[i]))
52
+ public_files << ufi
53
+ else # brand new one, insert in the database
54
+ logo_info = create_logo_info(collection_id: collection_id, uploaded_file_id: ufi, alttext: alttext_values[i], linkurl: verify_linkurl(linkurl_values[i]))
55
+ public_files << logo_info.local_path
56
+ end
57
+ end
58
+ public_files
59
+ end
60
+
61
+ def update_logo_info(collection_id:, uploaded_file_id:, alttext:, linkurl:)
62
+ logo_info = CollectionBrandingInfo.where(collection_id: collection_id).where(role: "logo").where(local_path: uploaded_file_id.to_s).first
63
+ logo_info.alt_text = alttext
64
+ logo_info.target_url = linkurl
65
+ logo_info.local_path = uploaded_file_id
66
+ logo_info.save(uploaded_file_id, false)
67
+ end
68
+
69
+ def create_logo_info(collection_id:, uploaded_file_id:, alttext:, linkurl:)
70
+ file = uploaded_files(uploaded_file_id)
71
+ logo_info = CollectionBrandingInfo.new(
72
+ collection_id: collection_id,
73
+ filename: File.split(file.file_url).last,
74
+ role: "logo",
75
+ alt_txt: alttext,
76
+ target_url: linkurl
77
+ )
78
+ logo_info.save file.file_url
79
+ logo_info
80
+ end
81
+
82
+ def uploaded_files(uploaded_file_ids)
83
+ return [] if uploaded_file_ids.empty?
84
+ UploadedFile.find(uploaded_file_ids)
85
+ end
86
+
87
+ def remove_redundant_files(collection_id:, public_files:)
88
+ # remove any public ones that were not included in the selection.
89
+ logos_info = CollectionBrandingInfo.where(collection_id: collection_id).where(role: "logo")
90
+ logos_info.each do |logo_info|
91
+ logo_info.delete(logo_info.local_path) unless public_files.include? logo_info.local_path
92
+ logo_info.destroy unless public_files.include? logo_info.local_path
93
+ end
94
+ end
95
+
96
+ # Only accept HTTP|HTTPS urls;
97
+ # @return <String> the url
98
+ def verify_linkurl(linkurl)
99
+ url = Loofah.scrub_fragment(linkurl, :prune).to_s
100
+ url if valid_url?(url)
101
+ end
102
+
103
+ def valid_url?(url)
104
+ (url =~ URI.regexp(['http', 'https']))
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
data/lib/hyrax/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Hyrax
3
- VERSION = '3.4.1'
3
+ VERSION = '3.5.0'
4
4
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wings
4
+ class ActiveFedoraConverter
5
+ def self.FileMetadataNode(resource_class) # rubocop:disable Naming/MethodName
6
+ class_cache[resource_class] ||= Class.new(FileMetadataNode) do
7
+ self.valkyrie_class = resource_class
8
+
9
+ # skip reserved attributes, we assume we don't need to translate valkyrie internals
10
+ schema = resource_class.schema.reject do |key|
11
+ resource_class.reserved_attributes.include?(key.name) ||
12
+ key.name == :size
13
+ end
14
+
15
+ Wings::ActiveFedoraConverter.apply_properties(self, schema)
16
+ end
17
+ end
18
+ end
19
+
20
+ class FileMetadataNode < ActiveFedora::Base
21
+ property :file_set_id, predicate: ::RDF::URI.intern("http://hyrax.samvera.org/ns/wings#file_set_id")
22
+ property :file_identifier, predicate: ::RDF::URI.intern("http://hyrax.samvera.org/ns/wings#file_identifier")
23
+
24
+ class_attribute :valkyrie_class
25
+
26
+ class << self
27
+ def model_name(*)
28
+ Hyrax::Name.new(valkyrie_class)
29
+ end
30
+
31
+ def to_rdf_representation
32
+ "Wings(#{valkyrie_class})"
33
+ end
34
+ alias inspect to_rdf_representation
35
+ alias to_s inspect
36
+ end
37
+
38
+ def indexing_service
39
+ Hyrax::ValkyrieIndexer.for(resource: valkyrie_resource)
40
+ end
41
+
42
+ def to_solr
43
+ super.tap do |doc|
44
+ doc[:file_identifier_ssim] = file_identifier
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wings
4
+ class ActiveFedoraConverter
5
+ ##
6
+ # Constructs an instance for the given converter. +converter+ must provide
7
+ # an +id+, +resource+, and +active_fedora_class+.
8
+ #
9
+ # This interface allows handling for special cases based on the target
10
+ # class, instance data for +resource+, or the id format. This originated as
11
+ # an extraction of some such special handling from the converter code.
12
+ class InstanceBuilder
13
+ ##
14
+ # @!attribute [r] converter
15
+ # @return [#active_fedora_class, #id, #resource]
16
+ # @!attribute [r] resource
17
+ # @return [Valkyrie::Resource]
18
+ attr_reader :converter, :resource
19
+
20
+ ##
21
+ # @param [#active_fedora_class, #id, #resource]
22
+ def initialize(converter)
23
+ @converter = converter
24
+ @resource = converter.resource
25
+ end
26
+
27
+ ##
28
+ # @return [ActiveFedora::Common]
29
+ def build
30
+ if builds_file_metadata? && !builds_metadata_for_active_fedora_file?
31
+ # convert to a generic/generated FileMetadataNode class with
32
+ # properties matching the source class
33
+ Wings::ActiveFedoraConverter::FileMetadataNode(resource.class)
34
+ .new(file_identifier: Array(resource.file_identifier)
35
+ .map(&:to_s))
36
+ elsif converter.id.present?
37
+ converter.active_fedora_class.find(converter.id)
38
+ else
39
+ converter.active_fedora_class.new
40
+ end
41
+ rescue ActiveFedora::ObjectNotFoundError
42
+ converter.active_fedora_class.new
43
+ end
44
+
45
+ ##
46
+ # @return [Boolean]
47
+ def builds_file_metadata?
48
+ resource.try(:file_identifier).present?
49
+ end
50
+
51
+ ##
52
+ # @return [Boolean]
53
+ def builds_metadata_for_active_fedora_file?
54
+ return false unless builds_file_metadata?
55
+
56
+ adapter_for_file = begin
57
+ ::Valkyrie::StorageAdapter.adapter_for(id: resource.file_identifier)
58
+ rescue ::Valkyrie::StorageAdapter::AdapterNotFoundError => err
59
+ Hyrax.logger.warn "Processing a FileMetadata (id: #{converter.id}) referencing " \
60
+ "a file #{resource.file_identifier}; could not find a " \
61
+ "storage adapter to handle that file.\n\t#{err.message}"
62
+ end
63
+
64
+ adapter_for_file.is_a?(::Valkyrie::Storage::Fedora)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'wings/converter_value_mapper'
4
4
  require 'wings/active_fedora_converter/default_work'
5
+ require 'wings/active_fedora_converter/file_metadata_node'
6
+ require 'wings/active_fedora_converter/instance_builder'
5
7
  require 'wings/active_fedora_converter/nested_resource'
6
8
 
7
9
  module Wings
@@ -100,9 +102,7 @@ module Wings
100
102
  private
101
103
 
102
104
  def instance
103
- id.present? ? active_fedora_class.find(id) : active_fedora_class.new
104
- rescue ActiveFedora::ObjectNotFoundError
105
- active_fedora_class.new
105
+ InstanceBuilder.new(self).build
106
106
  end
107
107
 
108
108
  def attributes_class
@@ -33,7 +33,20 @@ module Wings
33
33
  #
34
34
  # @raise [Hyrax::ObjectNotFoundError]
35
35
  def find_file_metadata_by(id:, use_valkyrie: true)
36
- find_file_metadata_by_alternate_identifier(alternate_identifier: id, use_valkyrie: use_valkyrie)
36
+ fcrepo_flag =
37
+ begin
38
+ ::Valkyrie::StorageAdapter.adapter_for(id: id).is_a?(::Valkyrie::Storage::Fedora)
39
+ rescue ::Valkyrie::StorageAdapter::AdapterNotFoundError
40
+ true # assume fcrepo if we can't find an adapter
41
+ end
42
+
43
+ if fcrepo_flag
44
+ find_file_metadata_by_alternate_identifier(alternate_identifier: id, use_valkyrie: use_valkyrie)
45
+ else
46
+ result = ActiveFedora::Base.where(file_identifier_ssim: id.to_s).first ||
47
+ raise(Hyrax::ObjectNotFoundError)
48
+ result.valkyrie_resource
49
+ end
37
50
  end
38
51
 
39
52
  # Find a Hyrax::FileMetadata using an alternate ID, and map it to a
@@ -48,8 +61,8 @@ module Wings
48
61
  #
49
62
  # @raise [Hyrax::ObjectNotFoundError]
50
63
  def find_file_metadata_by_alternate_identifier(alternate_identifier:, use_valkyrie: true)
51
- alternate_identifier = ::Valkyrie::ID.new(alternate_identifier)
52
- object = Hydra::PCDM::File.find(alternate_identifier.to_s)
64
+ alternate_identifier = ::Valkyrie::ID.new(alternate_identifier).to_s
65
+ object = Hydra::PCDM::File.find(alternate_identifier)
53
66
  raise Hyrax::ObjectNotFoundError if object.new_record?
54
67
 
55
68
  if use_valkyrie == false
@@ -73,11 +86,9 @@ module Wings
73
86
  # if there are no ids or none of the ids map to Hyrax::FileMetadata
74
87
  def find_many_file_metadata_by_ids(ids:, use_valkyrie: true)
75
88
  ids.each_with_object([]) do |alt_id, results|
76
- begin
77
- results << find_file_metadata_by_alternate_identifier(alternate_identifier: alt_id, use_valkyrie: use_valkyrie)
78
- rescue Hyrax::ObjectNotFoundError
79
- next
80
- end
89
+ results << find_file_metadata_by_alternate_identifier(alternate_identifier: alt_id, use_valkyrie: use_valkyrie)
90
+ rescue Hyrax::ObjectNotFoundError
91
+ next
81
92
  end
82
93
  end
83
94
 
@@ -86,12 +86,10 @@ module Wings
86
86
  return enum_for(:find_many_by_ids, ids: ids) unless block_given?
87
87
 
88
88
  ids.map(&:to_s).uniq.each do |id|
89
- begin
90
- af_object = ActiveFedora::Base.find(id)
91
- yield resource_factory.to_resource(object: af_object)
92
- rescue ::ActiveFedora::ObjectNotFoundError, Ldp::Gone
93
- next
94
- end
89
+ af_object = ActiveFedora::Base.find(id)
90
+ yield resource_factory.to_resource(object: af_object)
91
+ rescue ::ActiveFedora::ObjectNotFoundError, Ldp::Gone
92
+ next
95
93
  end
96
94
  end
97
95
 
@@ -73,7 +73,7 @@ module Wings
73
73
  version_graph.query([uri, RDF::Vocab::Fcrepo4.created, :created])
74
74
  .first_object
75
75
  .object
76
- Version.new(cast_to_valkyrie_id(uri.to_s), timestamp, self)
76
+ Version.new(id: cast_to_valkyrie_id(uri.to_s), created: timestamp, adapter: self)
77
77
  end.sort
78
78
  end
79
79
 
@@ -86,7 +86,7 @@ module Wings
86
86
  # this implementation uses an orderable {#version_token}. in practice
87
87
  # the token is the fcrepo created date for the version, as extracted from
88
88
  # the versions graph.
89
- Version = Struct.new(:id, :version_token, :adapter) do
89
+ Version = Struct.new("Version", :id, :created, :adapter, keyword_init: true) do
90
90
  include Comparable
91
91
 
92
92
  ##
@@ -95,6 +95,10 @@ module Wings
95
95
  adapter.find_by(id: id)
96
96
  end
97
97
 
98
+ def version_token
99
+ created
100
+ end
101
+
98
102
  def <=>(other)
99
103
  raise ArgumentError unless other.respond_to?(:version_token)
100
104
  version_token <=> other.version_token
data/template.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  # Hack for https://github.com/rails/rails/issues/35153
3
3
  gsub_file 'Gemfile', /^gem ["']sqlite3["']$/, 'gem "sqlite3", "~> 1.3.0"'
4
- gem 'hyrax', '3.4.1'
4
+ gem 'hyrax', '3.5.0'
5
5
  run 'bundle install'
6
6
  generate 'hyrax:install', '-f'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyrax
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.1
4
+ version: 3.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2022-03-30 00:00:00.000000000 Z
17
+ date: 2022-12-09 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: rails
@@ -224,6 +224,20 @@ dependencies:
224
224
  - - "~>"
225
225
  - !ruby/object:Gem::Version
226
226
  version: '1.0'
227
+ - !ruby/object:Gem::Dependency
228
+ name: dry-monads
229
+ requirement: !ruby/object:Gem::Requirement
230
+ requirements:
231
+ - - "<"
232
+ - !ruby/object:Gem::Version
233
+ version: '1.5'
234
+ type: :runtime
235
+ prerelease: false
236
+ version_requirements: !ruby/object:Gem::Requirement
237
+ requirements:
238
+ - - "<"
239
+ - !ruby/object:Gem::Version
240
+ version: '1.5'
227
241
  - !ruby/object:Gem::Dependency
228
242
  name: dry-transaction
229
243
  requirement: !ruby/object:Gem::Requirement
@@ -424,6 +438,20 @@ dependencies:
424
438
  - - "~>"
425
439
  - !ruby/object:Gem::Version
426
440
  version: '6.0'
441
+ - !ruby/object:Gem::Dependency
442
+ name: json-ld
443
+ requirement: !ruby/object:Gem::Requirement
444
+ requirements:
445
+ - - "<"
446
+ - !ruby/object:Gem::Version
447
+ version: '3.2'
448
+ type: :runtime
449
+ prerelease: false
450
+ version_requirements: !ruby/object:Gem::Requirement
451
+ requirements:
452
+ - - "<"
453
+ - !ruby/object:Gem::Version
454
+ version: '3.2'
427
455
  - !ruby/object:Gem::Dependency
428
456
  name: json-schema
429
457
  requirement: !ruby/object:Gem::Requirement
@@ -584,6 +612,20 @@ dependencies:
584
612
  - - ">="
585
613
  - !ruby/object:Gem::Version
586
614
  version: 0.1.2
615
+ - !ruby/object:Gem::Dependency
616
+ name: psych
617
+ requirement: !ruby/object:Gem::Requirement
618
+ requirements:
619
+ - - "~>"
620
+ - !ruby/object:Gem::Version
621
+ version: '3.3'
622
+ type: :runtime
623
+ prerelease: false
624
+ version_requirements: !ruby/object:Gem::Requirement
625
+ requirements:
626
+ - - "~>"
627
+ - !ruby/object:Gem::Version
628
+ version: '3.3'
587
629
  - !ruby/object:Gem::Dependency
588
630
  name: qa
589
631
  requirement: !ruby/object:Gem::Requirement
@@ -646,6 +688,20 @@ dependencies:
646
688
  - - "~>"
647
689
  - !ruby/object:Gem::Version
648
690
  version: '3.0'
691
+ - !ruby/object:Gem::Dependency
692
+ name: redis
693
+ requirement: !ruby/object:Gem::Requirement
694
+ requirements:
695
+ - - "~>"
696
+ - !ruby/object:Gem::Version
697
+ version: '4.0'
698
+ type: :runtime
699
+ prerelease: false
700
+ version_requirements: !ruby/object:Gem::Requirement
701
+ requirements:
702
+ - - "~>"
703
+ - !ruby/object:Gem::Version
704
+ version: '4.0'
649
705
  - !ruby/object:Gem::Dependency
650
706
  name: redis-namespace
651
707
  requirement: !ruby/object:Gem::Requirement
@@ -768,16 +824,16 @@ dependencies:
768
824
  name: tinymce-rails
769
825
  requirement: !ruby/object:Gem::Requirement
770
826
  requirements:
771
- - - ">="
827
+ - - "~>"
772
828
  - !ruby/object:Gem::Version
773
- version: '0'
829
+ version: '5.10'
774
830
  type: :runtime
775
831
  prerelease: false
776
832
  version_requirements: !ruby/object:Gem::Requirement
777
833
  requirements:
778
- - - ">="
834
+ - - "~>"
779
835
  - !ruby/object:Gem::Version
780
- version: '0'
836
+ version: '5.10'
781
837
  - !ruby/object:Gem::Dependency
782
838
  name: valkyrie
783
839
  requirement: !ruby/object:Gem::Requirement
@@ -1102,20 +1158,20 @@ dependencies:
1102
1158
  requirements:
1103
1159
  - - "~>"
1104
1160
  - !ruby/object:Gem::Version
1105
- version: '3.0'
1161
+ version: '5.0'
1106
1162
  - - ">="
1107
1163
  - !ruby/object:Gem::Version
1108
- version: 3.0.2
1164
+ version: 5.0.2
1109
1165
  type: :development
1110
1166
  prerelease: false
1111
1167
  version_requirements: !ruby/object:Gem::Requirement
1112
1168
  requirements:
1113
1169
  - - "~>"
1114
1170
  - !ruby/object:Gem::Version
1115
- version: '3.0'
1171
+ version: '5.0'
1116
1172
  - - ">="
1117
1173
  - !ruby/object:Gem::Version
1118
- version: 3.0.2
1174
+ version: 5.0.2
1119
1175
  - !ruby/object:Gem::Dependency
1120
1176
  name: shoulda-callback-matchers
1121
1177
  requirement: !ruby/object:Gem::Requirement
@@ -1234,11 +1290,13 @@ files:
1234
1290
  - ".dassie/app/controllers/hyrax/generic_works_controller.rb"
1235
1291
  - ".dassie/app/controllers/hyrax/monographs_controller.rb"
1236
1292
  - ".dassie/app/controllers/hyrax/namespaced_works/nested_works_controller.rb"
1293
+ - ".dassie/app/forms/collection_resource_form.rb"
1237
1294
  - ".dassie/app/forms/hyrax/generic_work_form.rb"
1238
1295
  - ".dassie/app/forms/hyrax/namespaced_works/nested_work_form.rb"
1239
1296
  - ".dassie/app/forms/monograph_form.rb"
1240
1297
  - ".dassie/app/helpers/application_helper.rb"
1241
1298
  - ".dassie/app/helpers/hyrax_helper.rb"
1299
+ - ".dassie/app/indexers/collection_resource_indexer.rb"
1242
1300
  - ".dassie/app/indexers/generic_work_indexer.rb"
1243
1301
  - ".dassie/app/indexers/monograph_indexer.rb"
1244
1302
  - ".dassie/app/indexers/namespaced_works/nested_work_indexer.rb"
@@ -1247,6 +1305,7 @@ files:
1247
1305
  - ".dassie/app/models/ability.rb"
1248
1306
  - ".dassie/app/models/application_record.rb"
1249
1307
  - ".dassie/app/models/collection.rb"
1308
+ - ".dassie/app/models/collection_resource.rb"
1250
1309
  - ".dassie/app/models/concerns/.keep"
1251
1310
  - ".dassie/app/models/file_set.rb"
1252
1311
  - ".dassie/app/models/generic_work.rb"
@@ -1296,6 +1355,7 @@ files:
1296
1355
  - ".dassie/config/initializers/clamav.rb"
1297
1356
  - ".dassie/config/initializers/cookies_serializer.rb"
1298
1357
  - ".dassie/config/initializers/devise.rb"
1358
+ - ".dassie/config/initializers/file_services.rb"
1299
1359
  - ".dassie/config/initializers/filter_parameter_logging.rb"
1300
1360
  - ".dassie/config/initializers/hydra_config.rb"
1301
1361
  - ".dassie/config/initializers/hyrax.rb"
@@ -1330,6 +1390,7 @@ files:
1330
1390
  - ".dassie/config/locales/namespaced_works/nested_work.it.yml"
1331
1391
  - ".dassie/config/locales/namespaced_works/nested_work.pt-BR.yml"
1332
1392
  - ".dassie/config/locales/namespaced_works/nested_work.zh.yml"
1393
+ - ".dassie/config/metadata/collection_resource.yaml"
1333
1394
  - ".dassie/config/metadata/monograph.yaml"
1334
1395
  - ".dassie/config/metadata/sample_metadata.yaml"
1335
1396
  - ".dassie/config/puma.rb"
@@ -1445,6 +1506,9 @@ files:
1445
1506
  - ".dassie/solr/conf/xslt/example_rss.xsl"
1446
1507
  - ".dassie/solr/conf/xslt/luke.xsl"
1447
1508
  - ".dassie/solr/sample_solr_documents.yml"
1509
+ - ".dassie/spec/forms/collection_resource_form_spec.rb"
1510
+ - ".dassie/spec/indexers/collection_resource_indexer_spec.rb"
1511
+ - ".dassie/spec/models/collection_resource_spec.rb"
1448
1512
  - ".dassie/storage/.keep"
1449
1513
  - ".dassie/tmp/pids/.keep"
1450
1514
  - ".dassie/values.stage.yaml"
@@ -1761,17 +1825,22 @@ files:
1761
1825
  - app/forms/hyrax/forms/batch_upload_form.rb
1762
1826
  - app/forms/hyrax/forms/collection_form.rb
1763
1827
  - app/forms/hyrax/forms/dashboard/nest_collection_form.rb
1828
+ - app/forms/hyrax/forms/embargo.rb
1764
1829
  - app/forms/hyrax/forms/failed_submission_form_wrapper.rb
1765
1830
  - app/forms/hyrax/forms/file_manager_form.rb
1766
1831
  - app/forms/hyrax/forms/file_set_edit_form.rb
1767
1832
  - app/forms/hyrax/forms/file_set_form.rb
1833
+ - app/forms/hyrax/forms/lease.rb
1768
1834
  - app/forms/hyrax/forms/pcdm_collection_form.rb
1835
+ - app/forms/hyrax/forms/pcdm_object_form.rb
1769
1836
  - app/forms/hyrax/forms/permission.rb
1770
1837
  - app/forms/hyrax/forms/permission_template_form.rb
1771
1838
  - app/forms/hyrax/forms/resource_form.rb
1772
1839
  - app/forms/hyrax/forms/widgets/admin_set_embargo_period.rb
1773
1840
  - app/forms/hyrax/forms/widgets/admin_set_visibility.rb
1841
+ - app/forms/hyrax/forms/work_embargo_form.rb
1774
1842
  - app/forms/hyrax/forms/work_form.rb
1843
+ - app/forms/hyrax/forms/work_lease_form.rb
1775
1844
  - app/forms/hyrax/forms/workflow_action_form.rb
1776
1845
  - app/forms/hyrax/forms/workflow_responsibility_form.rb
1777
1846
  - app/helpers/hyrax/ability_helper.rb
@@ -2150,6 +2219,7 @@ files:
2150
2219
  - app/services/hyrax/ensure_well_formed_admin_set_service.rb
2151
2220
  - app/services/hyrax/file_set_csv_service.rb
2152
2221
  - app/services/hyrax/file_set_derivatives_service.rb
2222
+ - app/services/hyrax/file_set_file_service.rb
2153
2223
  - app/services/hyrax/file_set_fixity_check_service.rb
2154
2224
  - app/services/hyrax/file_set_type_service.rb
2155
2225
  - app/services/hyrax/file_set_visibility_propagator.rb
@@ -2227,6 +2297,8 @@ files:
2227
2297
  - app/services/hyrax/time_service.rb
2228
2298
  - app/services/hyrax/tolerant_select_service.rb
2229
2299
  - app/services/hyrax/user_stat_importer.rb
2300
+ - app/services/hyrax/valkyrie_persist_derivatives.rb
2301
+ - app/services/hyrax/valkyrie_upload.rb
2230
2302
  - app/services/hyrax/versioning_service.rb
2231
2303
  - app/services/hyrax/virus_checker_service.rb
2232
2304
  - app/services/hyrax/visibility_intention.rb
@@ -2237,6 +2309,7 @@ files:
2237
2309
  - app/services/hyrax/visibility_writer.rb
2238
2310
  - app/services/hyrax/work_form_service.rb
2239
2311
  - app/services/hyrax/work_query_service.rb
2312
+ - app/services/hyrax/work_resource_query_service.rb
2240
2313
  - app/services/hyrax/work_thumbnail_path_service.rb
2241
2314
  - app/services/hyrax/work_uploads_handler.rb
2242
2315
  - app/services/hyrax/workflow/abstract_notification.rb
@@ -2303,7 +2376,6 @@ files:
2303
2376
  - app/views/catalog/_index_gallery_collection_wrapper.html.erb
2304
2377
  - app/views/catalog/_index_header_list_collection.html.erb
2305
2378
  - app/views/catalog/_index_header_list_default.html.erb
2306
- - app/views/catalog/_index_header_list_hyrax_pcdm_collection.html.erb
2307
2379
  - app/views/catalog/_index_list_default.html.erb
2308
2380
  - app/views/catalog/_search_form.html.erb
2309
2381
  - app/views/catalog/_thumbnail_list_collection.html.erb
@@ -2748,7 +2820,7 @@ files:
2748
2820
  - config/initializers/listeners.rb
2749
2821
  - config/initializers/nesting_indexer_initializer.rb
2750
2822
  - config/initializers/simple_form.rb
2751
- - config/initializers/valkryrie_storage.rb
2823
+ - config/initializers/storage_adapter_initializer.rb
2752
2824
  - config/initializers/valkyrie_id_equality.rb
2753
2825
  - config/locales/hyrax.de.yml
2754
2826
  - config/locales/hyrax.en.yml
@@ -2766,6 +2838,7 @@ files:
2766
2838
  - config/locales/simple_form.zh.yml
2767
2839
  - config/metadata/basic_metadata.yaml
2768
2840
  - config/metadata/core_metadata.yaml
2841
+ - config/metadata/file_set_metadata.yaml
2769
2842
  - config/routes.rb
2770
2843
  - config/schema_org.yml
2771
2844
  - db/seeds.rb
@@ -2778,6 +2851,15 @@ files:
2778
2851
  - lib/generators/hyrax/assets_generator.rb
2779
2852
  - lib/generators/hyrax/clamav_generator.rb
2780
2853
  - lib/generators/hyrax/collection_generator.rb
2854
+ - lib/generators/hyrax/collection_resource/USAGE
2855
+ - lib/generators/hyrax/collection_resource/collection_resource_generator.rb
2856
+ - lib/generators/hyrax/collection_resource/templates/collection.rb.erb
2857
+ - lib/generators/hyrax/collection_resource/templates/collection_form.rb.erb
2858
+ - lib/generators/hyrax/collection_resource/templates/collection_form_spec.rb.erb
2859
+ - lib/generators/hyrax/collection_resource/templates/collection_indexer.rb.erb
2860
+ - lib/generators/hyrax/collection_resource/templates/collection_indexer_spec.rb.erb
2861
+ - lib/generators/hyrax/collection_resource/templates/collection_metadata.yaml
2862
+ - lib/generators/hyrax/collection_resource/templates/collection_spec.rb.erb
2781
2863
  - lib/generators/hyrax/config_generator.rb
2782
2864
  - lib/generators/hyrax/health_check_generator.rb
2783
2865
  - lib/generators/hyrax/install_generator.rb
@@ -2996,6 +3078,8 @@ files:
2996
3078
  - lib/hyrax/transactions/steps/remove_file_set_from_work.rb
2997
3079
  - lib/hyrax/transactions/steps/save.rb
2998
3080
  - lib/hyrax/transactions/steps/save_access_control.rb
3081
+ - lib/hyrax/transactions/steps/save_collection_banner.rb
3082
+ - lib/hyrax/transactions/steps/save_collection_logo.rb
2999
3083
  - lib/hyrax/transactions/steps/save_work.rb
3000
3084
  - lib/hyrax/transactions/steps/set_collection_type_gid.rb
3001
3085
  - lib/hyrax/transactions/steps/set_default_admin_set.rb
@@ -3036,6 +3120,8 @@ files:
3036
3120
  - lib/wings/active_fedora_classifier.rb
3037
3121
  - lib/wings/active_fedora_converter.rb
3038
3122
  - lib/wings/active_fedora_converter/default_work.rb
3123
+ - lib/wings/active_fedora_converter/file_metadata_node.rb
3124
+ - lib/wings/active_fedora_converter/instance_builder.rb
3039
3125
  - lib/wings/active_fedora_converter/nested_resource.rb
3040
3126
  - lib/wings/attribute_transformer.rb
3041
3127
  - lib/wings/converter_value_mapper.rb
@@ -3098,7 +3184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
3098
3184
  - !ruby/object:Gem::Version
3099
3185
  version: '0'
3100
3186
  requirements: []
3101
- rubygems_version: 3.3.6
3187
+ rubygems_version: 3.3.22
3102
3188
  signing_key:
3103
3189
  specification_version: 4
3104
3190
  summary: Hyrax is a front-end based on the robust Samvera framework, providing a user
@@ -1,4 +0,0 @@
1
- <div class="search-results-title-row">
2
- <h3 class="search-result-title"><%= link_to document.title_or_label, [hyrax, document] %></h3>
3
- <%= Hyrax::CollectionPresenter.new(document, current_ability).collection_type_badge %>
4
- </div>