hyrax 3.0.0.pre.rc4 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (271) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +41 -8
  3. data/.dassie/Gemfile +10 -5
  4. data/.dassie/config/cable.yml +1 -1
  5. data/.dassie/config/environments/development.rb +2 -0
  6. data/.dassie/config/environments/production.rb +1 -1
  7. data/.dassie/config/initializers/hyrax.rb +5 -0
  8. data/.dassie/config/initializers/riiif.rb +22 -20
  9. data/.dassie/config/redis.yml +1 -0
  10. data/.dassie/config/role_map.yml +2 -0
  11. data/.dassie/db/seeds.rb +9 -1
  12. data/.dassie/package.json +3 -5
  13. data/.dockerignore +4 -0
  14. data/.env +1 -2
  15. data/.rubocop.yml +4 -0
  16. data/CONTAINERS.md +21 -1
  17. data/Dockerfile +46 -17
  18. data/Gemfile +21 -27
  19. data/app/actors/hyrax/actors/base_actor.rb +1 -1
  20. data/app/actors/hyrax/actors/create_with_remote_files_actor.rb +89 -41
  21. data/app/actors/hyrax/actors/create_with_remote_files_ordered_members_actor.rb +7 -42
  22. data/app/actors/hyrax/actors/file_actor.rb +4 -2
  23. data/app/actors/hyrax/actors/file_set_actor.rb +18 -11
  24. data/app/controllers/concerns/hyrax/collections_controller_behavior.rb +20 -8
  25. data/app/controllers/concerns/hyrax/embargoes_controller_behavior.rb +21 -9
  26. data/app/controllers/concerns/hyrax/leases_controller_behavior.rb +14 -5
  27. data/app/controllers/concerns/hyrax/works_controller_behavior.rb +38 -8
  28. data/app/controllers/hyrax/admin/permission_template_accesses_controller.rb +0 -4
  29. data/app/controllers/hyrax/admin/workflows_controller.rb +8 -2
  30. data/app/controllers/hyrax/dashboard/collection_members_controller.rb +13 -9
  31. data/app/controllers/hyrax/dashboard/collections_controller.rb +14 -14
  32. data/app/controllers/hyrax/file_sets_controller.rb +49 -13
  33. data/app/controllers/hyrax/permissions_controller.rb +3 -4
  34. data/app/controllers/hyrax/workflow_actions_controller.rb +3 -1
  35. data/app/forms/hyrax/forms/collection_form.rb +12 -6
  36. data/app/forms/hyrax/forms/dashboard/nest_collection_form.rb +24 -2
  37. data/app/forms/hyrax/forms/file_set_form.rb +46 -0
  38. data/app/forms/hyrax/forms/permission.rb +23 -0
  39. data/app/forms/hyrax/forms/permission_template_form.rb +8 -2
  40. data/app/forms/hyrax/forms/resource_form.rb +31 -13
  41. data/app/forms/hyrax/forms/work_form.rb +5 -2
  42. data/app/helpers/hyrax/batch_edits_helper.rb +3 -1
  43. data/app/helpers/hyrax/collections_helper.rb +88 -2
  44. data/app/helpers/hyrax/dashboard_helper_behavior.rb +16 -5
  45. data/app/helpers/hyrax/embargo_helper.rb +4 -0
  46. data/app/helpers/hyrax/file_set_helper.rb +25 -6
  47. data/app/helpers/hyrax/hyrax_helper_behavior.rb +8 -0
  48. data/app/helpers/hyrax/lease_helper.rb +4 -0
  49. data/app/helpers/hyrax/url_helper.rb +4 -1
  50. data/app/helpers/hyrax/work_form_helper.rb +53 -0
  51. data/app/indexers/hyrax/administrative_set_indexer.rb +18 -0
  52. data/app/indexers/hyrax/valkyrie_file_set_indexer.rb +118 -0
  53. data/app/indexers/hyrax/valkyrie_indexer.rb +10 -4
  54. data/app/indexers/hyrax/valkyrie_work_indexer.rb +3 -1
  55. data/app/inputs/controlled_vocabulary_input.rb +2 -5
  56. data/app/jobs/attach_files_to_work_job.rb +19 -10
  57. data/app/jobs/attach_files_to_work_with_ordered_members_job.rb +6 -5
  58. data/app/jobs/embargo_expiry_job.rb +7 -5
  59. data/app/jobs/file_set_attached_event_job.rb +6 -1
  60. data/app/jobs/ingest_local_file_job.rb +18 -2
  61. data/app/jobs/inherit_permissions_job.rb +9 -5
  62. data/app/jobs/lease_expiry_job.rb +6 -4
  63. data/app/models/admin_set.rb +6 -25
  64. data/app/models/collection_branding_info.rb +25 -9
  65. data/app/models/concerns/hyrax/ability.rb +14 -1
  66. data/app/models/concerns/hyrax/collection_behavior.rb +17 -44
  67. data/app/models/concerns/hyrax/embargoable.rb +24 -0
  68. data/app/models/concerns/hyrax/file_set/characterization.rb +18 -12
  69. data/app/models/concerns/hyrax/solr_document_behavior.rb +9 -46
  70. data/app/models/concerns/hyrax/suppressible.rb +5 -0
  71. data/app/models/concerns/hyrax/user.rb +9 -3
  72. data/app/models/concerns/hyrax/work_behavior.rb +1 -1
  73. data/app/models/hyrax/file_set.rb +7 -0
  74. data/app/models/hyrax/pcdm_collection.rb +1 -0
  75. data/app/models/hyrax/permission_template.rb +98 -12
  76. data/app/models/hyrax/virus_scanner.rb +27 -18
  77. data/app/models/hyrax/work.rb +2 -0
  78. data/app/models/job_io_wrapper.rb +1 -1
  79. data/app/models/sipity/agent.rb +1 -0
  80. data/app/models/sipity/entity.rb +30 -8
  81. data/app/models/sipity/workflow.rb +1 -0
  82. data/app/models/sipity.rb +42 -0
  83. data/app/presenters/hyrax/admin_set_options_presenter.rb +12 -8
  84. data/app/presenters/hyrax/admin_set_presenter.rb +5 -1
  85. data/app/presenters/hyrax/admin_set_selection_presenter.rb +116 -0
  86. data/app/presenters/hyrax/collection_presenter.rb +41 -20
  87. data/app/presenters/hyrax/file_set_presenter.rb +6 -1
  88. data/app/presenters/hyrax/file_usage.rb +3 -2
  89. data/app/presenters/hyrax/pcdm_member_presenter_factory.rb +119 -0
  90. data/app/presenters/hyrax/stats_usage_presenter.rb +2 -1
  91. data/app/presenters/hyrax/trophy_presenter.rb +33 -4
  92. data/app/presenters/hyrax/user_profile_presenter.rb +11 -1
  93. data/app/presenters/hyrax/version_list_presenter.rb +19 -0
  94. data/app/presenters/hyrax/version_presenter.rb +3 -2
  95. data/app/presenters/hyrax/work_show_presenter.rb +30 -5
  96. data/app/presenters/hyrax/work_usage.rb +5 -3
  97. data/app/renderers/hyrax/renderers/attribute_renderer.rb +10 -2
  98. data/app/search_builders/hyrax/admin_set_search_builder.rb +1 -1
  99. data/app/search_builders/hyrax/collection_member_search_builder.rb +6 -1
  100. data/app/search_builders/hyrax/my/collections_search_builder.rb +2 -2
  101. data/app/search_builders/hyrax/nested_collections_parent_search_builder.rb +1 -1
  102. data/app/search_builders/hyrax/single_collection_search_builder.rb +1 -1
  103. data/app/services/hyrax/access_control_list.rb +1 -1
  104. data/app/services/hyrax/adapters/nesting_index_adapter.rb +1 -1
  105. data/app/services/hyrax/admin_set_create_service.rb +3 -1
  106. data/app/services/hyrax/collections/collection_member_search_service.rb +72 -0
  107. data/app/services/hyrax/collections/collection_member_service.rb +112 -27
  108. data/app/services/hyrax/collections/migration_service.rb +4 -2
  109. data/app/services/hyrax/collections/nested_collection_persistence_service.rb +12 -13
  110. data/app/services/hyrax/collections/nested_collection_query_service.rb +2 -0
  111. data/app/services/hyrax/collections/permissions_create_service.rb +6 -4
  112. data/app/services/hyrax/contextual_path.rb +24 -1
  113. data/app/services/hyrax/custom_queries/find_file_metadata.rb +7 -5
  114. data/app/services/hyrax/custom_queries/navigators/parent_collections_navigator.rb +46 -0
  115. data/app/services/hyrax/edit_permissions_service.rb +74 -41
  116. data/app/services/hyrax/embargo_manager.rb +1 -1
  117. data/app/services/hyrax/find_objects_via_solr_service.rb +31 -0
  118. data/app/services/hyrax/graph_exporter.rb +1 -1
  119. data/app/services/hyrax/listeners/member_cleanup_listener.rb +26 -0
  120. data/app/services/hyrax/listeners/metadata_index_listener.rb +18 -1
  121. data/app/services/hyrax/listeners/object_lifecycle_listener.rb +1 -1
  122. data/app/services/hyrax/listeners/trophy_cleanup_listener.rb +17 -0
  123. data/app/services/hyrax/listeners.rb +2 -0
  124. data/app/services/hyrax/multiple_membership_checker.rb +53 -29
  125. data/app/services/hyrax/persist_derivatives.rb +3 -1
  126. data/app/services/hyrax/resource_status.rb +7 -0
  127. data/app/services/hyrax/search_service.rb +4 -2
  128. data/app/services/hyrax/solr_query_builder_service.rb +45 -8
  129. data/app/services/hyrax/solr_query_service.rb +224 -0
  130. data/app/services/hyrax/solr_service.rb +8 -1
  131. data/app/services/hyrax/statistics/depositors/summary.rb +2 -1
  132. data/app/services/hyrax/thumbnail_path_service.rb +1 -1
  133. data/app/services/hyrax/versioning_service.rb +1 -1
  134. data/app/services/hyrax/visibility_intention.rb +20 -2
  135. data/app/services/hyrax/visibility_propagator.rb +30 -1
  136. data/app/services/hyrax/work_uploads_handler.rb +22 -4
  137. data/app/services/hyrax/workflow/actionable_objects.rb +70 -0
  138. data/app/services/hyrax/workflow/object_in_workflow_decorator.rb +31 -0
  139. data/app/services/hyrax/workflow/status_list_service.rb +43 -13
  140. data/app/views/hyrax/admin/admin_sets/_show_document_list_row.html.erb +1 -1
  141. data/app/views/hyrax/base/_form_child_work_relationships.html.erb +1 -1
  142. data/app/views/hyrax/base/_form_relationships.html.erb +1 -2
  143. data/app/views/hyrax/base/_form_rendering.html.erb +1 -1
  144. data/app/views/hyrax/base/_form_representative.html.erb +1 -1
  145. data/app/views/hyrax/base/_form_share.html.erb +1 -5
  146. data/app/views/hyrax/base/_form_thumbnail.html.erb +1 -1
  147. data/app/views/hyrax/base/_form_visibility_error.html.erb +2 -0
  148. data/app/views/hyrax/base/_guts4form.html.erb +3 -3
  149. data/app/views/hyrax/base/_representative_media.html.erb +1 -1
  150. data/app/views/hyrax/base/_show_actions.html.erb +2 -2
  151. data/app/views/hyrax/base/_work_button_row.html.erb +1 -1
  152. data/app/views/hyrax/base/_workflow_actions.html.erb +1 -1
  153. data/app/views/hyrax/batch_edits/edit.html.erb +2 -2
  154. data/app/views/hyrax/batch_uploads/_form.html.erb +1 -1
  155. data/app/views/hyrax/collections/_list_collections.html.erb +1 -1
  156. data/app/views/hyrax/collections/_search_form.html.erb +1 -1
  157. data/app/views/hyrax/collections/show.html.erb +1 -1
  158. data/app/views/hyrax/dashboard/collections/_form.html.erb +3 -3
  159. data/app/views/hyrax/dashboard/collections/_form_branding.html.erb +1 -1
  160. data/app/views/hyrax/dashboard/collections/_list_collections.html.erb +1 -1
  161. data/app/views/hyrax/dashboard/collections/edit.html.erb +4 -2
  162. data/app/views/hyrax/dashboard/collections/new.html.erb +4 -2
  163. data/app/views/hyrax/dashboard/collections/show.html.erb +1 -1
  164. data/app/views/hyrax/file_sets/_actions.html.erb +10 -0
  165. data/app/views/hyrax/file_sets/edit.html.erb +1 -1
  166. data/app/views/hyrax/file_sets/media_display/_audio.html.erb +1 -1
  167. data/app/views/hyrax/file_sets/media_display/_default.html.erb +1 -1
  168. data/app/views/hyrax/file_sets/media_display/_image.html.erb +1 -1
  169. data/app/views/hyrax/file_sets/media_display/_office_document.html.erb +1 -1
  170. data/app/views/hyrax/file_sets/media_display/_pdf.html.erb +1 -1
  171. data/app/views/hyrax/file_sets/media_display/_video.html.erb +1 -1
  172. data/app/views/hyrax/file_sets/show.html.erb +1 -1
  173. data/app/views/hyrax/my/_admin_set_action_menu.html.erb +0 -11
  174. data/app/views/hyrax/my/_collection_action_menu.html.erb +1 -2
  175. data/app/views/hyrax/my/collections/_list_collections.html.erb +1 -1
  176. data/app/views/hyrax/my/collections/_modal_add_subcollection.html.erb +3 -5
  177. data/app/views/hyrax/stats/file.html.erb +1 -1
  178. data/app/views/hyrax/stats/work.html.erb +1 -1
  179. data/app/views/hyrax/uploads/_js_templates.html.erb +4 -4
  180. data/app/views/hyrax/uploads/_js_templates_versioning.html.erb +4 -4
  181. data/app/views/hyrax/users/_contributions.html.erb +1 -1
  182. data/app/views/hyrax/users/_profile_tabs.html.erb +2 -2
  183. data/app/views/hyrax/users/_search_form.html.erb +1 -1
  184. data/app/views/hyrax/users/_user.html.erb +1 -1
  185. data/app/views/hyrax/users/_user_info.html.erb +9 -9
  186. data/bin/db-migrate-seed.sh +6 -2
  187. data/bin/hyrax-entrypoint.sh +0 -14
  188. data/bin/solrcloud-assign-configset.sh +35 -0
  189. data/bin/solrcloud-upload-configset.sh +42 -0
  190. data/chart/hyrax/Chart.yaml +12 -8
  191. data/chart/hyrax/README.md +94 -11
  192. data/chart/hyrax/templates/NOTES.txt +1 -1
  193. data/chart/hyrax/templates/_helpers.tpl +98 -0
  194. data/chart/hyrax/templates/branding-pvc.yaml +14 -0
  195. data/chart/hyrax/templates/configmap-env.yaml +21 -11
  196. data/chart/hyrax/templates/cron-embargo.yaml +24 -0
  197. data/chart/hyrax/templates/cron-lease.yaml +24 -0
  198. data/chart/hyrax/templates/deployment-worker.yaml +129 -0
  199. data/chart/hyrax/templates/deployment.yaml +125 -4
  200. data/chart/hyrax/templates/derivatives-pvc.yaml +14 -0
  201. data/chart/hyrax/templates/ingress.yaml +13 -4
  202. data/chart/hyrax/templates/secrets.yaml +12 -2
  203. data/chart/hyrax/templates/uploads-pvc.yaml +14 -0
  204. data/chart/hyrax/values.yaml +186 -2
  205. data/config/brakeman.ignore +2 -2
  206. data/config/features.rb +47 -43
  207. data/config/initializers/listeners.rb +4 -0
  208. data/config/initializers/valkryrie_storage.rb +7 -0
  209. data/config/locales/hyrax.de.yml +1 -1
  210. data/config/locales/hyrax.en.yml +1 -1
  211. data/config/locales/hyrax.es.yml +1 -1
  212. data/config/locales/hyrax.fr.yml +1 -1
  213. data/config/locales/hyrax.it.yml +1 -1
  214. data/config/locales/hyrax.pt-BR.yml +1 -1
  215. data/config/locales/hyrax.zh.yml +1 -1
  216. data/docker-compose.yml +39 -8
  217. data/documentation/developing-your-hyrax-based-app.md +4 -4
  218. data/documentation/legacyREADME.md +3 -3
  219. data/lib/generators/hyrax/templates/config/initializers/hyrax.rb +5 -0
  220. data/lib/generators/hyrax/templates/config/initializers/riiif.rb +22 -20
  221. data/lib/hyrax/active_fedora_dummy_model.rb +62 -0
  222. data/lib/hyrax/configuration.rb +28 -0
  223. data/lib/hyrax/engine.rb +3 -1
  224. data/lib/hyrax/errors.rb +2 -0
  225. data/lib/hyrax/resource_name.rb +1 -0
  226. data/lib/hyrax/specs/capybara.rb +5 -3
  227. data/lib/hyrax/specs/shared_specs/valkyrie_storage_versions.rb +9 -0
  228. data/lib/hyrax/transactions/container.rb +32 -1
  229. data/lib/hyrax/transactions/file_set_destroy.rb +21 -0
  230. data/lib/hyrax/transactions/steps/add_file_sets.rb +3 -2
  231. data/lib/hyrax/transactions/steps/add_to_parent.rb +36 -0
  232. data/lib/hyrax/transactions/steps/delete_resource.rb +38 -0
  233. data/lib/hyrax/transactions/steps/destroy_work.rb +1 -0
  234. data/lib/hyrax/transactions/steps/remove_file_set_from_work.rb +47 -0
  235. data/lib/hyrax/transactions/work_create.rb +2 -1
  236. data/lib/hyrax/transactions/work_destroy.rb +20 -0
  237. data/lib/hyrax/valkyrie_can_can_adapter.rb +3 -0
  238. data/lib/hyrax/valkyrie_simple_path_generator.rb +20 -0
  239. data/lib/hyrax/version.rb +1 -1
  240. data/lib/hyrax.rb +9 -0
  241. data/lib/tasks/collection_type_global_id.rake +1 -1
  242. data/lib/tasks/embargo_lease.rake +27 -0
  243. data/lib/tasks/regenerate_derivatives.rake +12 -0
  244. data/lib/wings/active_fedora_converter/default_work.rb +19 -0
  245. data/lib/wings/attribute_transformer.rb +29 -19
  246. data/lib/wings/converter_value_mapper.rb +2 -2
  247. data/lib/wings/model_transformer.rb +21 -20
  248. data/lib/wings/orm_converter.rb +42 -23
  249. data/lib/wings/setup.rb +2 -0
  250. data/lib/wings/valkyrie/persister.rb +8 -5
  251. data/lib/wings/valkyrie/query_service.rb +96 -41
  252. data/lib/wings/valkyrie/storage.rb +56 -1
  253. data/lib/wings.rb +0 -21
  254. data/template.rb +1 -1
  255. metadata +41 -21
  256. data/chart/fcrepo/.gitignore +0 -2
  257. data/chart/fcrepo/.helmignore +0 -23
  258. data/chart/fcrepo/Chart.yaml +0 -11
  259. data/chart/fcrepo/README.md +0 -50
  260. data/chart/fcrepo/templates/NOTES.txt +0 -21
  261. data/chart/fcrepo/templates/_helpers.tpl +0 -68
  262. data/chart/fcrepo/templates/configmap-env.yaml +0 -19
  263. data/chart/fcrepo/templates/deployment.yaml +0 -109
  264. data/chart/fcrepo/templates/ingress.yaml +0 -41
  265. data/chart/fcrepo/templates/pvc.yaml +0 -20
  266. data/chart/fcrepo/templates/secret.yaml +0 -12
  267. data/chart/fcrepo/templates/service.yaml +0 -15
  268. data/chart/fcrepo/templates/serviceaccount.yaml +0 -12
  269. data/chart/fcrepo/templates/tests/test-connection.yaml +0 -15
  270. data/chart/fcrepo/values.yaml +0 -79
  271. data/chart/hyrax/templates/fcrepo-secret.yaml +0 -13
@@ -24,23 +24,35 @@ module Hyrax
24
24
  end
25
25
 
26
26
  # Updates a batch of embargos
27
+ # rubocop:disable Metrics/AbcSize
28
+ # rubocop:disable Metrics/MethodLength
29
+ # rubocop:disable Metrics/PerceivedComplexity
27
30
  def update
28
31
  filter_docs_with_edit_access!
29
32
  copy_visibility = []
30
33
  copy_visibility = params[:embargoes].values.map { |h| h[:copy_visibility] } if params[:embargoes]
31
- af_objects = Hyrax.custom_queries.find_many_by_alternate_ids(alternate_ids: batch, use_valkyrie: false)
32
- af_objects.each do |curation_concern|
33
- Hyrax::Actors::EmbargoActor.new(curation_concern).destroy
34
- # if the concern is a FileSet, set its visibility and visibility propagation
35
- if curation_concern.file_set?
36
- curation_concern.visibility = curation_concern.to_solr["visibility_after_embargo_ssim"]
37
- curation_concern.save!
38
- elsif copy_visibility.include?(curation_concern.id)
39
- Hyrax::VisibilityPropagator.for(source: curation_concern).propagate
34
+ resources = Hyrax.custom_queries.find_many_by_alternate_ids(alternate_ids: batch, use_valkyrie: Hyrax.config.use_valkyrie?)
35
+ resources.each do |resource|
36
+ if Hyrax.config.use_valkyrie?
37
+ EmbargoManager.new(resource: resource).release!
38
+ Hyrax::AccessControlList(resource).save
39
+ Hyrax::VisibilityPropagator.for(source: resource).propagate if copy_visibility.include?(resource.id)
40
+ else
41
+ Hyrax::Actors::EmbargoActor.new(resource).destroy
42
+ # if the concern is a FileSet, set its visibility and visibility propagation
43
+ if resource.file_set?
44
+ resource.visibility = resource.to_solr["visibility_after_embargo_ssim"]
45
+ resource.save!
46
+ elsif copy_visibility.include?(resource.id)
47
+ Hyrax::VisibilityPropagator.for(source: resource).propagate
48
+ end
40
49
  end
41
50
  end
42
51
  redirect_to embargoes_path, notice: t('.embargo_deactivated')
43
52
  end
53
+ # rubocop:enable Metrics/AbcSize
54
+ # rubocop:enable Metrics/MethodLength
55
+ # rubocop:enable Metrics/PerceivedComplexity
44
56
 
45
57
  # This allows us to use the unauthorized template in curation_concerns/base
46
58
  def self.local_prefixes
@@ -23,18 +23,27 @@ module Hyrax
23
23
  end
24
24
  end
25
25
 
26
+ # rubocop:disable Metrics/AbcSize
27
+ # rubocop:disable Metrics/MethodLength
26
28
  def update
27
29
  filter_docs_with_edit_access!
28
30
  copy_visibility = []
29
31
  copy_visibility = params[:leases].values.map { |h| h[:copy_visibility] } if params[:leases]
30
- af_objects = Hyrax.custom_queries.find_many_by_alternate_ids(alternate_ids: batch, use_valkyrie: false)
31
- af_objects.each do |curation_concern|
32
- Hyrax::Actors::LeaseActor.new(curation_concern).destroy
33
- Hyrax::VisibilityPropagator.for(source: curation_concern).propagate if
34
- copy_visibility.include?(curation_concern.id)
32
+ resources = Hyrax.custom_queries.find_many_by_alternate_ids(alternate_ids: batch, use_valkyrie: Hyrax.config.use_valkyrie?)
33
+ resources.each do |resource|
34
+ if Hyrax.config.use_valkyrie?
35
+ LeaseManager.new(resource: resource).release!
36
+ Hyrax::AccessControlList(resource).save
37
+ else
38
+ Hyrax::Actors::LeaseActor.new(resource).destroy
39
+ end
40
+ Hyrax::VisibilityPropagator.for(source: resource).propagate if
41
+ copy_visibility.include?(resource.id)
35
42
  end
36
43
  redirect_to leases_path
37
44
  end
45
+ # rubocop:enable Metrics/AbcSize
46
+ # rubocop:enable Metrics/MethodLength
38
47
 
39
48
  # This allows us to use the unauthorized template in curation_concerns/base
40
49
  def self.local_prefixes
@@ -47,6 +47,7 @@ module Hyrax
47
47
  end
48
48
 
49
49
  def new
50
+ @admin_set_options = available_admin_sets
50
51
  # TODO: move these lines to the work form builder in Hyrax
51
52
  curation_concern.depositor = current_user.user_key
52
53
  curation_concern.admin_set_id = admin_set_id_for_new
@@ -95,6 +96,7 @@ module Hyrax
95
96
  # rubocop:enable Metrics/AbcSize
96
97
 
97
98
  def edit
99
+ @admin_set_options = available_admin_sets
98
100
  build_form
99
101
  end
100
102
 
@@ -113,10 +115,21 @@ module Hyrax
113
115
  end
114
116
 
115
117
  def destroy
116
- title = curation_concern.to_s
117
- env = Actors::Environment.new(curation_concern, current_ability, {})
118
- return unless actor.destroy(env)
119
- Hyrax.config.callback.run(:after_destroy, curation_concern.id, current_user, warn: false)
118
+ case curation_concern
119
+ when ActiveFedora::Base
120
+ title = curation_concern.to_s
121
+ env = Actors::Environment.new(curation_concern, current_ability, {})
122
+ return unless actor.destroy(env)
123
+ Hyrax.config.callback.run(:after_destroy, curation_concern.id, current_user, warn: false)
124
+ else
125
+ transactions['work_resource.destroy']
126
+ .with_step_args('work_resource.delete' => { user: current_user })
127
+ .call(curation_concern)
128
+ .value!
129
+
130
+ title = Array(curation_concern.title).first
131
+ end
132
+
120
133
  after_destroy_response(title)
121
134
  end
122
135
 
@@ -192,7 +205,8 @@ module Hyrax
192
205
  @curation_concern =
193
206
  form.validate(params[hash_key_for_curation_concern]) &&
194
207
  transactions['change_set.create_work']
195
- .with_step_args('work_resource.add_file_sets' => { uploaded_files: uploaded_files },
208
+ .with_step_args('work_resource.add_to_parent' => { parent_id: params[:parent_id], user: current_user },
209
+ 'work_resource.add_file_sets' => { uploaded_files: uploaded_files, file_set_params: params[hash_key_for_curation_concern][:file_set] },
196
210
  'change_set.set_user_as_depositor' => { user: current_user })
197
211
  .call(form).value!
198
212
  end
@@ -208,7 +222,7 @@ module Hyrax
208
222
  @curation_concern =
209
223
  form.validate(params[hash_key_for_curation_concern]) &&
210
224
  transactions['change_set.update_work']
211
- .with_step_args('work_resource.add_file_sets' => { uploaded_files: uploaded_files })
225
+ .with_step_args('work_resource.add_file_sets' => { uploaded_files: uploaded_files, file_set_params: params[hash_key_for_curation_concern][:file_set] })
212
226
  .call(form).value!
213
227
  end
214
228
  end
@@ -244,7 +258,7 @@ module Hyrax
244
258
 
245
259
  # @deprecated
246
260
  def curation_concern_from_search_results
247
- Deprecation.warn("'##{__method__}' will be removed in Hyrax 4.0. " /
261
+ Deprecation.warn("'##{__method__}' will be removed in Hyrax 4.0. " \
248
262
  "Instead, use '#search_result_document'.")
249
263
  search_params = params.deep_dup
250
264
  search_params.delete :page
@@ -380,7 +394,7 @@ module Hyrax
380
394
 
381
395
  def after_destroy_response(title)
382
396
  respond_to do |wants|
383
- wants.html { redirect_to my_works_path, notice: "Deleted #{title}" }
397
+ wants.html { redirect_to hyrax.my_works_path, notice: "Deleted #{title}" }
384
398
  wants.json { render_json_response(response_type: :deleted, message: "Deleted #{curation_concern.id}") }
385
399
  end
386
400
  end
@@ -425,5 +439,21 @@ module Hyrax
425
439
  def uploaded_files
426
440
  UploadedFile.find(params.fetch(:uploaded_files, []))
427
441
  end
442
+
443
+ def available_admin_sets
444
+ admin_set_results = Hyrax::AdminSetService.new(self).search_results(:deposit)
445
+ # get all the templates at once, reducing query load
446
+ templates = PermissionTemplate.where(id: admin_set_results.map(&:id)).to_a
447
+
448
+ admin_sets = admin_set_results.map do |admin_set_doc|
449
+ template = templates.find { |temp| temp.source_id == admin_set_doc.id.to_s }
450
+ sharing = can?(:manage, template) || !!template&.active_workflow&.allows_access_grant?
451
+
452
+ AdminSetSelectionPresenter::OptionsEntry
453
+ .new(admin_set: admin_set_doc, permission_template: template, permit_sharing: sharing)
454
+ end
455
+
456
+ AdminSetSelectionPresenter.new(admin_sets: admin_sets)
457
+ end
428
458
  end
429
459
  end
@@ -30,10 +30,6 @@ module Hyrax
30
30
  false
31
31
  end
32
32
 
33
- def update_access(manage_changed:)
34
- permission_template_form.update_access(manage_changed: manage_changed)
35
- end
36
-
37
33
  def after_destroy_success
38
34
  if source.admin_set?
39
35
  redirect_to hyrax.edit_admin_admin_set_path(source_id,
@@ -15,8 +15,9 @@ module Hyrax
15
15
  add_breadcrumb t(:'hyrax.dashboard.breadcrumbs.admin'), hyrax.dashboard_path
16
16
  add_breadcrumb t(:'hyrax.admin.sidebar.tasks'), '#'
17
17
  add_breadcrumb t(:'hyrax.admin.sidebar.workflow_review'), request.path
18
- @status_list = Hyrax::Workflow::StatusListService.new(self, "-workflow_state_name_ssim:#{deposited_workflow_state_name}")
19
- @published_list = Hyrax::Workflow::StatusListService.new(self, "workflow_state_name_ssim:#{deposited_workflow_state_name}")
18
+
19
+ @status_list = actionable_objects.reject(&:published?)
20
+ @published_list = actionable_objects.select(&:published?)
20
21
  end
21
22
 
22
23
  private
@@ -24,5 +25,10 @@ module Hyrax
24
25
  def ensure_authorized!
25
26
  authorize! :review, :submissions
26
27
  end
28
+
29
+ def actionable_objects
30
+ @actionable_objects ||=
31
+ Hyrax::Workflow::ActionableObjects.new(user: current_user)
32
+ end
27
33
  end
28
34
  end
@@ -21,21 +21,25 @@ module Hyrax
21
21
  end
22
22
  end
23
23
 
24
- def update_members
24
+ def update_members # rubocop:disable Metrics/MethodLength
25
25
  err_msg = validate
26
26
  after_update_error(err_msg) if err_msg.present?
27
27
  return if err_msg.present?
28
28
 
29
29
  collection.reindex_extent = Hyrax::Adapters::NestingIndexAdapter::LIMITED_REINDEX
30
- members = collection.add_member_objects batch_ids
31
- messages = members.collect { |member| member.errors.full_messages }.flatten
32
- if messages.size == members.size
33
- after_update_error(messages.uniq.join(', '))
34
- elsif messages.present?
35
- flash[:error] = messages.uniq.join(', ')
36
- after_update
37
- else
30
+ begin
31
+ Hyrax::Collections::CollectionMemberService.add_members_by_ids(collection_id: collection.id,
32
+ new_member_ids: batch_ids,
33
+ user: current_user)
38
34
  after_update
35
+ rescue Hyrax::SingleMembershipError => err
36
+ messages = JSON.parse(err.message)
37
+ if messages.size == batch_ids.size
38
+ after_update_error(messages.uniq.join(', '))
39
+ elsif messages.present?
40
+ flash[:error] = messages.uniq.join(', ')
41
+ after_update
42
+ end
39
43
  end
40
44
  end
41
45
 
@@ -41,7 +41,7 @@ module Hyrax
41
41
  # The search builder to find the collection
42
42
  self.single_item_search_builder_class = SingleCollectionSearchBuilder
43
43
  # The search builder to find the collections' members
44
- self.membership_service_class = Collections::CollectionMemberService
44
+ self.membership_service_class = Collections::CollectionMemberSearchService
45
45
 
46
46
  load_and_authorize_resource except: [:index, :create], instance_name: :collection
47
47
 
@@ -69,10 +69,8 @@ module Hyrax
69
69
  end
70
70
 
71
71
  def show
72
- if @collection.collection_type.brandable?
73
- banner_info = CollectionBrandingInfo.where(collection_id: @collection.id.to_s).where(role: "banner")
74
- @banner_file = "/" + banner_info.first.local_path.split("/")[-4..-1].join("/") unless banner_info.empty?
75
- end
72
+ # @todo: remove this unused assignment in 4.0.0
73
+ @banner_file = presenter.banner_file if @collection.collection_type.brandable?
76
74
 
77
75
  presenter
78
76
  query_collection_members
@@ -114,10 +112,10 @@ module Hyrax
114
112
  @collection.collection_type_gid = params[:collection_type_gid].presence || default_collection_type.to_global_id
115
113
  @collection.attributes = collection_params.except(:members, :parent_id, :collection_type_gid)
116
114
  @collection.apply_depositor_metadata(current_user.user_key)
117
- add_members_to_collection unless batch.empty?
118
115
  @collection.visibility = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE unless @collection.discoverable?
119
116
  if @collection.save
120
117
  after_create
118
+ add_members_to_collection unless batch.empty?
121
119
  else
122
120
  after_create_error
123
121
  end
@@ -204,8 +202,10 @@ module Hyrax
204
202
  end
205
203
 
206
204
  def link_parent_collection(parent_id)
207
- parent = Hyrax.query_service.find_by_alternate_identifier(alternate_identifier: parent_id, use_valkyrie: false)
208
- Hyrax::Collections::NestedCollectionPersistenceService.persist_nested_collection_for(parent: parent, child: @collection)
205
+ child = collection.respond_to?(:valkyrie_resource) ? collection.valkyrie_resource : collection
206
+ Hyrax::Collections::CollectionMemberService.add_member(collection_id: parent_id,
207
+ new_member: child,
208
+ user: current_user)
209
209
  end
210
210
 
211
211
  def uploaded_files(uploaded_file_ids)
@@ -381,15 +381,15 @@ module Hyrax
381
381
 
382
382
  def add_members_to_collection(collection = nil)
383
383
  collection ||= @collection
384
- collection.add_member_objects batch
384
+ Hyrax::Collections::CollectionMemberService.add_members_by_ids(collection_id: collection.id,
385
+ new_member_ids: batch,
386
+ user: current_user)
385
387
  end
386
388
 
387
389
  def remove_members_from_collection
388
- batch.each do |pid|
389
- work = Hyrax.query_service.find_by_alternate_identifier(alternate_identifier: pid, use_valkyrie: false)
390
- work.member_of_collections.delete @collection
391
- work.save!
392
- end
390
+ Hyrax::Collections::CollectionMemberService.remove_members_by_ids(collection_id: @collection.id,
391
+ member_ids: batch,
392
+ user: current_user)
393
393
  end
394
394
 
395
395
  def move_members_between_collections
@@ -44,8 +44,7 @@ module Hyrax
44
44
 
45
45
  # GET /concern/parent/:parent_id/file_sets/:id
46
46
  def show
47
- presenter
48
- guard_for_workflow_restriction_on!(parent: presenter.parent)
47
+ guard_for_workflow_restriction_on!(parent: parent(file_set: presenter))
49
48
  respond_to do |wants|
50
49
  wants.html
51
50
  wants.json
@@ -55,16 +54,17 @@ module Hyrax
55
54
 
56
55
  # DELETE /concern/file_sets/:id
57
56
  def destroy
58
- parent = curation_concern.parent
59
57
  guard_for_workflow_restriction_on!(parent: parent)
60
- actor.destroy
61
- redirect_to [main_app, parent], notice: view_context.t('hyrax.file_sets.asset_deleted_flash.message')
58
+
59
+ delete(file_set: curation_concern)
60
+ redirect_to [main_app, parent],
61
+ notice: view_context.t('hyrax.file_sets.asset_deleted_flash.message')
62
62
  end
63
63
 
64
64
  # PATCH /concern/file_sets/:id
65
65
  def update
66
- parent = curation_concern.parent
67
66
  guard_for_workflow_restriction_on!(parent: parent)
67
+
68
68
  if attempt_update
69
69
  after_update_response
70
70
  else
@@ -86,10 +86,47 @@ module Hyrax
86
86
 
87
87
  private
88
88
 
89
- # this is provided so that implementing application can override this behavior and map params to different attributes
89
+ ##
90
+ # @api public
91
+ def delete(file_set:)
92
+ case file_set
93
+ when Valkyrie::Resource
94
+ transactions['file_set.destroy']
95
+ .with_step_args('file_set.remove_from_work' => { user: current_user },
96
+ 'file_set.delete' => { user: current_user })
97
+ .call(curation_concern)
98
+ .value!
99
+ else
100
+ actor.destroy
101
+ end
102
+ end
103
+
104
+ ##
105
+ # @api public
106
+ #
107
+ # @note this is provided so that implementing application can override this
108
+ # behavior and map params to different attributes
90
109
  def update_metadata
91
- file_attributes = form_class.model_attributes(attributes)
92
- actor.update_metadata(file_attributes)
110
+ case file_set
111
+ when Hyrax::Resource
112
+ change_set = Hyrax::Forms::ResourceForm.for(file_set)
113
+
114
+ change_set.validate(attributes) &&
115
+ transactions['change_set.apply'].call(change_set).value_or { false }
116
+ else
117
+ file_attributes = form_class.model_attributes(attributes)
118
+ actor.update_metadata(file_attributes)
119
+ end
120
+ end
121
+
122
+ def parent(file_set: curation_concern)
123
+ @parent ||=
124
+ case file_set
125
+ when Hyrax::Resource
126
+ Hyrax.query_service.find_parents(resource: file_set).first
127
+ else
128
+ file_set.parent
129
+ end
93
130
  end
94
131
 
95
132
  def attempt_update
@@ -152,10 +189,9 @@ module Hyrax
152
189
  end
153
190
 
154
191
  def initialize_edit_form
155
- @parent = @file_set.in_objects.first
156
- guard_for_workflow_restriction_on!(parent: @parent)
157
- original = @file_set.original_file
158
- @version_list = Hyrax::VersionListPresenter.new(original ? original.versions.all : [])
192
+ guard_for_workflow_restriction_on!(parent: parent)
193
+
194
+ @version_list = Hyrax::VersionListPresenter.for(file_set: @file_set)
159
195
  @groups = current_user.groups
160
196
  end
161
197
 
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
  module Hyrax
3
3
  class PermissionsController < ApplicationController
4
+ load_resource class: ActiveFedora::Base, instance_name: :curation_concern
5
+
6
+ attr_reader :curation_concern
4
7
  helper_method :curation_concern
5
8
 
6
9
  def confirm
@@ -28,9 +31,5 @@ module Hyrax
28
31
  InheritPermissionsJob.perform_later(curation_concern)
29
32
  redirect_to [main_app, curation_concern], notice: I18n.t("hyrax.upload.change_access_flash_message")
30
33
  end
31
-
32
- def curation_concern
33
- @curation_concern ||= Hyrax.query_service.find_by_alternate_identifier(alternate_identifier: params[:id], use_valkyrie: false)
34
- end
35
34
  end
36
35
  end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
  module Hyrax
3
3
  class WorkflowActionsController < ApplicationController
4
+ DEFAULT_FORM_CLASS = Hyrax::Forms::WorkflowActionForm
5
+
4
6
  before_action :authenticate_user!
5
7
 
6
8
  def update
@@ -21,7 +23,7 @@ module Hyrax
21
23
  end
22
24
 
23
25
  def workflow_action_form
24
- @workflow_action_form ||= Hyrax::Forms::WorkflowActionForm.new(
26
+ @workflow_action_form ||= DEFAULT_FORM_CLASS.new(
25
27
  current_ability: current_ability,
26
28
  work: curation_concern,
27
29
  attributes: workflow_action_params