hyrax 5.0.0 → 5.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (331) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +7 -176
  3. data/.dassie/.env +8 -3
  4. data/.dassie/Gemfile +13 -2
  5. data/.dassie/app/controllers/hyrax/generic_work_resources_controller.rb +17 -0
  6. data/.dassie/app/controllers/hyrax/generic_works_controller.rb +7 -1
  7. data/.dassie/app/forms/generic_work_resource_form.rb +20 -0
  8. data/.dassie/app/indexers/generic_work_resource_indexer.rb +16 -0
  9. data/.dassie/app/models/admin_set_resource.rb +9 -0
  10. data/.dassie/app/models/collection_resource.rb +2 -0
  11. data/.dassie/app/models/file_set.rb +2 -0
  12. data/.dassie/app/models/generic_work_resource.rb +10 -0
  13. data/.dassie/app/views/hyrax/generic_work_resources/_generic_work_resource.html.erb +2 -0
  14. data/.dassie/config/analytics.yml +6 -1
  15. data/.dassie/config/application.rb +24 -0
  16. data/.dassie/config/initializers/hyrax.rb +13 -3
  17. data/.dassie/config/initializers/wings.rb +109 -0
  18. data/.dassie/config/metadata/generic_work_resource.yaml +22 -0
  19. data/.dassie/config/valkyrie_index.yml +4 -10
  20. data/.dassie/db/migrate/20240506070809_valkyrie_id_to_string.rb +5 -0
  21. data/.dassie/db/schema.rb +2 -2
  22. data/.dassie/spec/indexers/generic_work_resource_indexer_spec.rb +13 -0
  23. data/.dassie/spec/models/generic_work_resource_spec.rb +12 -0
  24. data/.dassie/spec/views/generic_work_resources/_generic_work_resource.html.erb_spec.rb +7 -0
  25. data/.dockerignore +6 -4
  26. data/.github/release.yml +3 -0
  27. data/.github/workflows/lint-build-test.yml +130 -0
  28. data/.github/workflows/test-results.yml +40 -0
  29. data/.koppie/.env +7 -5
  30. data/.koppie/Gemfile +12 -1
  31. data/.koppie/config/analytics.yml +6 -1
  32. data/.koppie/config/environments/test.rb +2 -0
  33. data/.koppie/config/initializers/1_valkyrie.rb +6 -2
  34. data/.koppie/config/solr.yml +1 -1
  35. data/.regen +1 -1
  36. data/.rubocop.yml +5 -0
  37. data/Dockerfile +16 -36
  38. data/Gemfile +2 -0
  39. data/app/assets/javascripts/hydra-editor/field_manager.es6 +187 -0
  40. data/app/assets/javascripts/hyrax/analytics_events.js +48 -24
  41. data/app/assets/javascripts/hyrax/autocomplete/linked_data.es6 +3 -0
  42. data/app/assets/javascripts/hyrax/collapse.js +4 -4
  43. data/app/assets/javascripts/hyrax/editor/controlled_vocabulary.es6 +38 -5
  44. data/app/assets/javascripts/hyrax/file_manager/save_manager.es6 +2 -0
  45. data/app/assets/javascripts/hyrax/search.js +2 -3
  46. data/app/assets/javascripts/hyrax/select_work_type.es6 +3 -1
  47. data/app/assets/javascripts/hyrax/uploader.js +20 -18
  48. data/app/assets/javascripts/hyrax.js +1 -0
  49. data/app/assets/stylesheets/_bootstrap-default-overrides.scss +4 -0
  50. data/app/assets/stylesheets/hyrax/_card.scss +4 -0
  51. data/app/assets/stylesheets/hyrax/_catalog.scss +21 -0
  52. data/app/assets/stylesheets/hyrax/_collections.scss +1 -1
  53. data/app/assets/stylesheets/hyrax/_facets.scss +15 -3
  54. data/app/assets/stylesheets/hyrax/_featured.scss +4 -0
  55. data/app/assets/stylesheets/hyrax/_file_upload.scss +6 -0
  56. data/app/assets/stylesheets/hyrax/_form.scss +4 -0
  57. data/app/assets/stylesheets/hyrax/_forms.scss +2 -1
  58. data/app/assets/stylesheets/hyrax/_nestable.scss +9 -8
  59. data/app/assets/stylesheets/hyrax/_select_work_type.scss +12 -0
  60. data/app/assets/stylesheets/hyrax/_styles.scss +4 -0
  61. data/app/assets/stylesheets/hyrax/_work-show.scss +3 -0
  62. data/app/assets/stylesheets/hyrax/controlled_vocabulary.scss +2 -2
  63. data/app/controllers/concerns/hyrax/singular_subresource_controller.rb +7 -2
  64. data/app/controllers/concerns/hyrax/valkyrie_downloads_controller_behavior.rb +11 -2
  65. data/app/controllers/concerns/hyrax/works_controller_behavior.rb +9 -2
  66. data/app/controllers/hyrax/admin/analytics/collection_reports_controller.rb +2 -2
  67. data/app/controllers/hyrax/admin/analytics/work_reports_controller.rb +7 -8
  68. data/app/controllers/hyrax/dashboard/collections_controller.rb +2 -1
  69. data/app/controllers/hyrax/downloads_controller.rb +24 -3
  70. data/app/controllers/hyrax/file_sets_controller.rb +33 -7
  71. data/app/controllers/hyrax/my/works_controller.rb +20 -0
  72. data/app/controllers/hyrax/single_use_links_viewer_controller.rb +9 -2
  73. data/app/controllers/hyrax/stats_controller.rb +1 -1
  74. data/app/controllers/hyrax/uploads_controller.rb +28 -2
  75. data/app/forms/hyrax/forms/admin/appearance.rb +1 -1
  76. data/app/forms/hyrax/forms/admin/collection_type_form.rb +1 -7
  77. data/app/forms/hyrax/forms/pcdm_collection_form.rb +9 -0
  78. data/app/forms/hyrax/forms/work_embargo_form.rb +6 -0
  79. data/app/forms/hyrax/forms/work_lease_form.rb +6 -0
  80. data/app/indexers/concerns/hyrax/location_indexer.rb +2 -2
  81. data/app/indexers/hyrax/indexers/file_set_indexer.rb +4 -0
  82. data/app/indexers/hyrax/indexers/resource_indexer.rb +1 -0
  83. data/app/indexers/hyrax/valkyrie_indexer.rb +3 -5
  84. data/app/jobs/migrate_files_to_valkyrie_job.rb +109 -0
  85. data/app/jobs/migrate_resources_job.rb +34 -0
  86. data/app/jobs/valkyrie_create_derivatives_job.rb +2 -1
  87. data/app/models/admin_set.rb +1 -0
  88. data/app/models/collection.rb +13 -1
  89. data/app/models/concerns/hyrax/ar_resource.rb +104 -0
  90. data/app/models/concerns/hyrax/solr_document/ordered_members.rb +2 -1
  91. data/app/models/concerns/hyrax/solr_document_behavior.rb +13 -2
  92. data/app/models/concerns/hyrax/valkyrie_lazy_migration.rb +82 -0
  93. data/app/models/file_download_stat.rb +1 -1
  94. data/app/models/file_view_stat.rb +1 -1
  95. data/app/models/hyrax/collection_type.rb +12 -4
  96. data/app/models/hyrax/file_metadata.rb +19 -0
  97. data/app/models/hyrax/file_set.rb +25 -0
  98. data/app/models/hyrax/model_registry.rb +3 -4
  99. data/app/models/hyrax/resource.rb +5 -0
  100. data/app/models/hyrax/statistic.rb +12 -37
  101. data/app/presenters/hyrax/file_set_presenter.rb +2 -1
  102. data/app/presenters/hyrax/file_usage.rb +3 -3
  103. data/app/presenters/hyrax/iiif_manifest_presenter.rb +2 -1
  104. data/app/presenters/hyrax/member_presenter_factory.rb +7 -1
  105. data/app/presenters/hyrax/menu_presenter.rb +1 -1
  106. data/app/presenters/hyrax/pcdm_member_presenter_factory.rb +2 -2
  107. data/app/presenters/hyrax/stats_usage_presenter.rb +2 -1
  108. data/app/presenters/hyrax/work_show_presenter.rb +15 -19
  109. data/app/presenters/hyrax/work_usage.rb +5 -2
  110. data/app/search_builders/hyrax/expired_embargo_search_builder.rb +7 -1
  111. data/app/search_builders/hyrax/expired_lease_search_builder.rb +7 -1
  112. data/app/search_builders/hyrax/filter_by_type.rb +1 -3
  113. data/app/search_builders/hyrax/valkyrie_abstract_type_relation.rb +7 -2
  114. data/app/services/hyrax/access_control_list.rb +1 -1
  115. data/app/services/hyrax/admin_set_create_service.rb +16 -5
  116. data/app/services/hyrax/admin_set_service.rb +2 -1
  117. data/app/services/hyrax/analytics/ga4/base.rb +96 -0
  118. data/app/services/hyrax/analytics/ga4/events.rb +25 -0
  119. data/app/services/hyrax/analytics/ga4/events_daily.rb +36 -0
  120. data/app/services/hyrax/analytics/ga4/visits.rb +33 -0
  121. data/app/services/hyrax/analytics/ga4/visits_daily.rb +24 -0
  122. data/app/services/hyrax/analytics/ga4.rb +204 -0
  123. data/app/services/hyrax/analytics/google.rb +16 -2
  124. data/app/services/hyrax/analytics/matomo.rb +16 -3
  125. data/app/services/hyrax/analytics/results.rb +6 -0
  126. data/app/services/hyrax/custom_queries/find_access_control.rb +1 -1
  127. data/app/services/hyrax/custom_queries/find_by_date_range.rb +6 -23
  128. data/app/services/hyrax/custom_queries/find_collections_by_type.rb +2 -2
  129. data/app/services/hyrax/custom_queries/find_count_by.rb +3 -31
  130. data/app/services/hyrax/custom_queries/find_file_metadata.rb +2 -2
  131. data/app/services/hyrax/custom_queries/find_models_by_access.rb +5 -27
  132. data/app/services/hyrax/embargo_manager.rb +2 -1
  133. data/app/services/hyrax/file_set_file_service.rb +10 -1
  134. data/app/services/hyrax/listeners/file_listener.rb +39 -0
  135. data/app/services/hyrax/listeners/file_metadata_listener.rb +0 -30
  136. data/app/services/hyrax/lock_manager.rb +7 -7
  137. data/app/services/hyrax/lockable.rb +4 -3
  138. data/app/services/hyrax/simple_schema_loader.rb +1 -1
  139. data/app/services/hyrax/solr_service.rb +22 -8
  140. data/app/services/hyrax/statistics/query_service.rb +1 -1
  141. data/app/services/hyrax/statistics/works/over_time.rb +1 -1
  142. data/app/services/hyrax/thumbnail_path_service.rb +2 -0
  143. data/app/services/hyrax/user_stat_importer.rb +5 -5
  144. data/app/services/hyrax/valkyrie_upload.rb +14 -9
  145. data/app/services/hyrax/versioning_service.rb +10 -2
  146. data/app/services/hyrax/work_query_service.rb +2 -2
  147. data/app/services/migrate_resource_service.rb +55 -0
  148. data/app/views/_controls.html.erb +5 -5
  149. data/app/views/_masthead.html.erb +1 -1
  150. data/app/views/catalog/_search_form.html.erb +9 -16
  151. data/app/views/catalog/_thumbnail_list_collection.html.erb +1 -1
  152. data/app/views/catalog/_thumbnail_list_default.html.erb +2 -2
  153. data/app/views/hyrax/admin/analytics/collection_reports/index.html.erb +4 -4
  154. data/app/views/hyrax/admin/analytics/work_reports/index.html.erb +1 -1
  155. data/app/views/hyrax/admin/collection_types/_form.html.erb +4 -4
  156. data/app/views/hyrax/admin/collection_types/index.html.erb +1 -1
  157. data/app/views/hyrax/admin/features/index.html.erb +1 -1
  158. data/app/views/hyrax/base/_file_manager_actions.html.erb +1 -1
  159. data/app/views/hyrax/base/_file_manager_member.html.erb +7 -4
  160. data/app/views/hyrax/base/_file_manager_thumbnail.html.erb +1 -1
  161. data/app/views/hyrax/base/_form_files.html.erb +1 -1
  162. data/app/views/hyrax/base/_form_member_of_collections.html.erb +4 -0
  163. data/app/views/hyrax/base/_show_actions.html.erb +7 -8
  164. data/app/views/hyrax/base/_work_button_row.html.erb +1 -1
  165. data/app/views/hyrax/batch_select/_add_button.html.erb +1 -1
  166. data/app/views/hyrax/content_blocks/_form.html.erb +3 -3
  167. data/app/views/hyrax/dashboard/_sidebar.html.erb +1 -1
  168. data/app/views/hyrax/dashboard/_user_activity.html.erb +2 -2
  169. data/app/views/hyrax/dashboard/collections/_form.html.erb +4 -4
  170. data/app/views/hyrax/dashboard/collections/_form_share.html.erb +6 -4
  171. data/app/views/hyrax/dashboard/collections/_list_collections.html.erb +1 -1
  172. data/app/views/hyrax/dashboard/collections/_show_document_list_row.html.erb +1 -1
  173. data/app/views/hyrax/dashboard/show_admin.html.erb +18 -19
  174. data/app/views/hyrax/dashboard/sidebar/_activity.html.erb +1 -1
  175. data/app/views/hyrax/embargoes/_list_expired_active_embargoes.html.erb +7 -7
  176. data/app/views/hyrax/file_sets/_actions.html.erb +9 -1
  177. data/app/views/hyrax/file_sets/_permission_form.html.erb +4 -2
  178. data/app/views/hyrax/file_sets/_show_actions.html.erb +1 -1
  179. data/app/views/hyrax/homepage/_featured.html.erb +1 -1
  180. data/app/views/hyrax/homepage/_recent_document.html.erb +2 -2
  181. data/app/views/hyrax/leases/_list_expired_active_leases.html.erb +6 -6
  182. data/app/views/hyrax/my/collections/_list_collections.html.erb +1 -1
  183. data/app/views/hyrax/my/collections/_tabs.html.erb +1 -1
  184. data/app/views/hyrax/pages/_form.html.erb +8 -8
  185. data/app/views/hyrax/transfers/_received.html.erb +1 -1
  186. data/app/views/hyrax/uploads/_js_templates.html.erb +9 -9
  187. data/app/views/hyrax/uploads/_js_templates_branding.html.erb +3 -3
  188. data/app/views/hyrax/uploads/_js_templates_versioning.html.erb +1 -1
  189. data/app/views/hyrax/uploads/create.json.jbuilder +2 -2
  190. data/app/views/hyrax/users/_activity_log.html.erb +15 -9
  191. data/app/views/hyrax/users/_user_row.html.erb +6 -3
  192. data/app/views/hyrax/users/_vitals.html.erb +3 -2
  193. data/app/views/layouts/_head_tag_content.html.erb +2 -0
  194. data/app/views/shared/_appearance_styles.html.erb +5 -1
  195. data/app/views/shared/_ga4.html.erb +11 -0
  196. data/app/views/shared/_select_work_type_modal.html.erb +10 -1
  197. data/bin/db-migrate-seed.sh +3 -3
  198. data/bin/dev-entrypoint.sh +7 -2
  199. data/bin/{db-wait.sh → service-wait.sh} +1 -1
  200. data/bin/worker-entrypoint.sh +8 -0
  201. data/chart/hyrax/Chart.yaml +1 -1
  202. data/chart/hyrax/templates/deployment-worker.yaml +2 -2
  203. data/chart/hyrax/templates/deployment.yaml +12 -0
  204. data/chart/hyrax/values.yaml +10 -0
  205. data/config/locales/hyrax.en.yml +4 -2
  206. data/config/metadata/basic_metadata.yaml +20 -0
  207. data/config/metadata/hyrax_internal_metadata.yaml +1 -1
  208. data/docker-compose-dassie.yml +167 -0
  209. data/docker-compose-koppie.yml +21 -36
  210. data/docker-compose-sirenia.yml +50 -44
  211. data/docker-compose.yml +2 -183
  212. data/documentation/developing-your-hyrax-based-app.md +4 -4
  213. data/hyrax.gemspec +7 -12
  214. data/lib/freyja/custom_query_container.rb +5 -0
  215. data/lib/freyja/metadata_adapter.rb +32 -0
  216. data/lib/freyja/persister.rb +42 -0
  217. data/lib/freyja/query_service.rb +20 -0
  218. data/lib/freyja/resource_factory.rb +8 -0
  219. data/lib/freyja.rb +14 -0
  220. data/lib/frigg/custom_query_container.rb +5 -0
  221. data/lib/frigg/metadata_adapter.rb +22 -0
  222. data/lib/frigg/persister.rb +33 -0
  223. data/lib/frigg/query_service.rb +15 -0
  224. data/lib/frigg.rb +13 -0
  225. data/lib/generators/hyrax/install_generator.rb +5 -0
  226. data/lib/generators/hyrax/templates/config/analytics.yml +6 -1
  227. data/lib/generators/hyrax/templates/config/initializers/1_valkyrie.rb +6 -2
  228. data/lib/generators/hyrax/templates/config/valkyrie_index.yml +1 -1
  229. data/lib/goddess/custom_query_container.rb +71 -0
  230. data/lib/goddess/metadata.rb +13 -0
  231. data/lib/goddess/query.rb +176 -0
  232. data/lib/hyrax/configuration.rb +83 -0
  233. data/lib/hyrax/engine.rb +2 -0
  234. data/lib/hyrax/form_fields.rb +1 -3
  235. data/lib/hyrax/name.rb +5 -0
  236. data/lib/hyrax/publisher.rb +11 -0
  237. data/lib/hyrax/rubocop/custom_cops.rb +30 -0
  238. data/lib/hyrax/specs/capybara.rb +10 -6
  239. data/{spec → lib/hyrax/specs/shared_specs}/factories/admin_sets.rb +2 -0
  240. data/{spec → lib/hyrax/specs/shared_specs}/factories/hyrax_embargo.rb +4 -0
  241. data/{spec → lib/hyrax/specs/shared_specs}/factories/hyrax_lease.rb +4 -0
  242. data/{spec → lib/hyrax/specs/shared_specs}/factories/hyrax_work.rb +26 -1
  243. data/lib/hyrax/specs/shared_specs/hydra_works.rb +1 -1
  244. data/lib/hyrax/transactions/admin_set_destroy.rb +2 -1
  245. data/lib/hyrax/transactions/collection_destroy.rb +2 -1
  246. data/lib/hyrax/transactions/container.rb +9 -0
  247. data/lib/hyrax/transactions/steps/add_file_sets.rb +2 -1
  248. data/lib/hyrax/transactions/steps/delete_all_file_metadata.rb +4 -5
  249. data/lib/hyrax/transactions/steps/delete_permission_template.rb +30 -0
  250. data/lib/hyrax/transactions/steps/delete_resource.rb +1 -1
  251. data/lib/hyrax/transactions/steps/save_collection_logo.rb +2 -1
  252. data/lib/hyrax/valkyrie_can_can_adapter.rb +8 -1
  253. data/lib/hyrax/version.rb +1 -1
  254. data/lib/wings/active_fedora_converter.rb +13 -5
  255. data/lib/wings/converter_value_mapper.rb +1 -0
  256. data/lib/wings/services/custom_queries/find_collections_by_type.rb +2 -1
  257. data/lib/wings/services/custom_queries/find_file_metadata.rb +2 -2
  258. data/lib/wings/setup.rb +12 -3
  259. data/lib/wings/transformer_value_mapper.rb +5 -1
  260. data/lib/wings/valkyrie/persister.rb +3 -1
  261. data/template.rb +1 -1
  262. metadata +118 -94
  263. data/.koppie/scripts/db-migrate-seed.sh +0 -9
  264. data/.koppie/scripts/entrypoint.sh +0 -10
  265. data/spec/support/book_resource.rb +0 -36
  266. data/spec/support/can_can_overrides.rb +0 -43
  267. data/spec/support/clean_solr.rb +0 -7
  268. data/spec/support/controller_level_helpers.rb +0 -27
  269. data/spec/support/factory_helpers.rb +0 -94
  270. data/spec/support/fakes/fake_actor.rb +0 -22
  271. data/spec/support/fakes/fake_authority.rb +0 -14
  272. data/spec/support/fakes/fake_search_builder_scope.rb +0 -44
  273. data/spec/support/fakes/indexing_adapter.rb +0 -17
  274. data/spec/support/fakes/test_hydra_group_service.rb +0 -55
  275. data/spec/support/features/batch_edit_actions.rb +0 -37
  276. data/spec/support/features/session_helpers.rb +0 -15
  277. data/spec/support/features/workflow.rb +0 -10
  278. data/spec/support/features.rb +0 -11
  279. data/spec/support/form_with_validations.rb +0 -15
  280. data/spec/support/input_support.rb +0 -12
  281. data/spec/support/logging_formatter.rb +0 -67
  282. data/spec/support/matchers/api_responses.rb +0 -27
  283. data/spec/support/matchers/collection_type_property_matchers.rb +0 -30
  284. data/spec/support/matchers/embargo.rb +0 -9
  285. data/spec/support/matchers/lease.rb +0 -9
  286. data/spec/support/matchers/match_valkyrie_ids_with_af_ids.rb +0 -12
  287. data/spec/support/matchers/pcdm_matchers.rb +0 -34
  288. data/spec/support/matchers/permission.rb +0 -31
  289. data/spec/support/matchers/response_matchers.rb +0 -8
  290. data/spec/support/optional_example.rb +0 -17
  291. data/spec/support/rake.rb +0 -42
  292. data/spec/support/selectors.rb +0 -112
  293. data/spec/support/shared_examples_for_collection_presenter.rb +0 -44
  294. data/spec/support/simple_work.rb +0 -28
  295. data/spec/support/spec_statistic.rb +0 -24
  296. data/spec/support/speedup.rb +0 -7
  297. data/spec/support/statistic_helper.rb +0 -10
  298. data/spec/support/valkyrie_indexing.rb +0 -2
  299. data/spec/support/wings_models.rb +0 -9
  300. /data/{spec → lib/hyrax/specs/shared_specs}/factories/access_control.rb +0 -0
  301. /data/{spec → lib/hyrax/specs/shared_specs}/factories/admin_sets_lw.rb +0 -0
  302. /data/{spec → lib/hyrax/specs/shared_specs}/factories/administrative_sets.rb +0 -0
  303. /data/{spec → lib/hyrax/specs/shared_specs}/factories/api_items.rb +0 -0
  304. /data/{spec → lib/hyrax/specs/shared_specs}/factories/collection_branding_infos.rb +0 -0
  305. /data/{spec → lib/hyrax/specs/shared_specs}/factories/collection_type_participants.rb +0 -0
  306. /data/{spec → lib/hyrax/specs/shared_specs}/factories/collection_types.rb +0 -0
  307. /data/{spec → lib/hyrax/specs/shared_specs}/factories/collections.rb +0 -0
  308. /data/{spec → lib/hyrax/specs/shared_specs}/factories/collections_factory.rb +0 -0
  309. /data/{spec → lib/hyrax/specs/shared_specs}/factories/content_blocks.rb +0 -0
  310. /data/{spec → lib/hyrax/specs/shared_specs}/factories/counter_metrics.rb +0 -0
  311. /data/{spec → lib/hyrax/specs/shared_specs}/factories/featured_works.rb +0 -0
  312. /data/{spec → lib/hyrax/specs/shared_specs}/factories/file_sets.rb +0 -0
  313. /data/{spec → lib/hyrax/specs/shared_specs}/factories/generic_works.rb +0 -0
  314. /data/{spec → lib/hyrax/specs/shared_specs}/factories/hyrax_collection.rb +0 -0
  315. /data/{spec → lib/hyrax/specs/shared_specs}/factories/hyrax_default_admin_set.rb +0 -0
  316. /data/{spec → lib/hyrax/specs/shared_specs}/factories/hyrax_file_metadata.rb +0 -0
  317. /data/{spec → lib/hyrax/specs/shared_specs}/factories/hyrax_file_set.rb +0 -0
  318. /data/{spec → lib/hyrax/specs/shared_specs}/factories/hyrax_resource.rb +0 -0
  319. /data/{spec → lib/hyrax/specs/shared_specs}/factories/object_id.rb +0 -0
  320. /data/{spec → lib/hyrax/specs/shared_specs}/factories/operations.rb +0 -0
  321. /data/{spec → lib/hyrax/specs/shared_specs}/factories/permission.rb +0 -0
  322. /data/{spec → lib/hyrax/specs/shared_specs}/factories/permission_template_accesses.rb +0 -0
  323. /data/{spec → lib/hyrax/specs/shared_specs}/factories/permission_templates.rb +0 -0
  324. /data/{spec → lib/hyrax/specs/shared_specs}/factories/proxy_deposit_requests.rb +0 -0
  325. /data/{spec → lib/hyrax/specs/shared_specs}/factories/single_use_links.rb +0 -0
  326. /data/{spec → lib/hyrax/specs/shared_specs}/factories/sipity_entities.rb +0 -0
  327. /data/{spec → lib/hyrax/specs/shared_specs}/factories/uploaded_files.rb +0 -0
  328. /data/{spec → lib/hyrax/specs/shared_specs}/factories/users.rb +0 -0
  329. /data/{spec → lib/hyrax/specs/shared_specs}/factories/workflow_actions.rb +0 -0
  330. /data/{spec → lib/hyrax/specs/shared_specs}/factories/workflow_states.rb +0 -0
  331. /data/{spec → lib/hyrax/specs/shared_specs}/factories/workflows.rb +0 -0
@@ -118,6 +118,7 @@ module Hyrax
118
118
 
119
119
  # @!group Analytics
120
120
 
121
+ # This value determines whether to collect analytics or not
121
122
  attr_writer :analytics
122
123
  attr_reader :analytics
123
124
  def analytics?
@@ -125,6 +126,16 @@ module Hyrax
125
126
  ActiveModel::Type::Boolean.new.cast(ENV.fetch('HYRAX_ANALYTICS', false))
126
127
  end
127
128
 
129
+ # This value determines whether to show reports on the dashboard, work and collection report pages
130
+ # With Google: it's dependent on the GOOGLE_OAUTH_XXX values
131
+ # With Matomo: TODO
132
+ attr_writer :analytics_reporting
133
+ attr_reader :analytics_reporting
134
+ def analytics_reporting?
135
+ @analytics_reporting ||=
136
+ ActiveModel::Type::Boolean.new.cast(ENV.fetch('HYRAX_ANALYTICS_REPORTING', false))
137
+ end
138
+
128
139
  # Currently supports 'google' or 'matomo'
129
140
  # google is default for backward compatability
130
141
  attr_writer :analytics_provider
@@ -294,6 +305,14 @@ module Hyrax
294
305
  @fixity_service ||= Hyrax::Fixity::ActiveFedoraFixityService
295
306
  end
296
307
 
308
+ # This value determines whether to use load the Freyja adapter in dassie
309
+ attr_writer :valkyrie_transition
310
+ attr_reader :valkyrie_transition
311
+ def valkyrie_transition?
312
+ @valkyrie_transition ||=
313
+ ActiveModel::Type::Boolean.new.cast(ENV.fetch('VALKYRIE_TRANSITION', false))
314
+ end
315
+
297
316
  attr_writer :max_days_between_fixity_checks
298
317
  def max_days_between_fixity_checks
299
318
  @max_days_between_fixity_checks ||= 7
@@ -556,6 +575,22 @@ module Hyrax
556
575
  end
557
576
  attr_writer :disable_wings
558
577
 
578
+ ##
579
+ # @return [Boolean]
580
+ def disable_freyja
581
+ return @disable_freyja unless @disable_freyja.nil?
582
+ ActiveModel::Type::Boolean.new.cast(ENV.fetch('HYRAX_SKIP_FREYJA', false))
583
+ end
584
+ attr_writer :disable_freyja
585
+
586
+ ##
587
+ # @return [Boolean]
588
+ def disable_frigg
589
+ return @disable_frigg unless @disable_frigg.nil?
590
+ ActiveModel::Type::Boolean.new.cast(ENV.fetch('HYRAX_SKIP_FRIGG', false))
591
+ end
592
+ attr_writer :disable_frigg
593
+
559
594
  attr_writer :display_media_download_link
560
595
  # @return [Boolean]
561
596
  def display_media_download_link?
@@ -869,6 +904,21 @@ module Hyrax
869
904
  collection_model.safe_constantize
870
905
  end
871
906
 
907
+ ##
908
+ # @api private
909
+ #
910
+ # There are assumptions baked into {Wings} and tests regarding what the
911
+ # correct conceptual collection will be. This helps provide that connective
912
+ # tissue.
913
+ #
914
+ # It is definitely a hack to appease tests and the Double Combo/Goddess
915
+ # adapter migration.
916
+ def collection_class_for_wings
917
+ return collection_class if collection_class < Hyrax::Resource
918
+
919
+ Hyrax::PcdmCollection
920
+ end
921
+
872
922
  attr_writer :admin_set_model
873
923
  ##
874
924
  # @return [#constantize] a string representation of the admin set
@@ -883,6 +933,21 @@ module Hyrax
883
933
  admin_set_model.constantize
884
934
  end
885
935
 
936
+ ##
937
+ # @api private
938
+ #
939
+ # There are assumptions baked into {Wings} and tests regarding what the
940
+ # correct conceptual admin set will be. This helps provide that connective
941
+ # tissue.
942
+ #
943
+ # It is definitely a hack to appease tests and the Double Combo/Goddess
944
+ # adapter migration.
945
+ def admin_set_class_for_wings
946
+ return admin_set_class if admin_set_class < Hyrax::Resource
947
+
948
+ Hyrax::AdministrativeSet
949
+ end
950
+
886
951
  ##
887
952
  # @return [String] the default admin set id
888
953
  def default_admin_set_id
@@ -1089,6 +1154,24 @@ module Hyrax
1089
1154
  @visibility_map ||= Hyrax::VisibilityMap.instance
1090
1155
  end
1091
1156
 
1157
+ attr_writer :simple_schema_loader_config_search_paths
1158
+ # A configuration for modifying the SimpleSchemaLoader#config_search_paths
1159
+ # which will allow gems to add their own metadata yaml files and easily keep
1160
+ # them within the gem.
1161
+ #
1162
+ # @return [Array<Pathname>]
1163
+ # @see Hyrax::SimpleSchemaLoader#config_search_paths
1164
+ # @example
1165
+ # Hyrax.config do |config|
1166
+ # config.simple_schema_loader_config_search_paths.unshift(HykuKnapsack::Engine.root)
1167
+ # end
1168
+ #
1169
+ # Hyrax.config.simple_schema_loader_config_search_paths
1170
+ # => [#<Pathname:/app/samvera>, #<Pathname:/app/samvera/hyrax-webapp>, #<Pathname:/app/samvera/hyrax-webapp/gems/hyrax>]
1171
+ def simple_schema_loader_config_search_paths
1172
+ @simple_schema_loader_config_search_paths ||= [Rails.root, Hyrax::Engine.root]
1173
+ end
1174
+
1092
1175
  private
1093
1176
 
1094
1177
  # @param [Symbol, #to_s] model_name - symbol representing the model
data/lib/hyrax/engine.rb CHANGED
@@ -89,6 +89,8 @@ module Hyrax
89
89
 
90
90
  initializer 'requires' do
91
91
  require 'wings' unless Hyrax.config.disable_wings
92
+ require 'freyja' unless Hyrax.config.disable_freyja
93
+ require 'frigg' unless Hyrax.config.disable_frigg
92
94
  end
93
95
 
94
96
  initializer 'routing' do
@@ -46,12 +46,10 @@ module Hyrax
46
46
 
47
47
  def included(descendant)
48
48
  super
49
-
50
49
  form_field_definitions.each do |field_name, options|
51
- descendant.property field_name.to_sym, options.merge(display: true, default: [])
50
+ descendant.property field_name.to_sym, options.merge(display: options.fetch(:display, true), default: [])
52
51
  descendant.validates field_name.to_sym, presence: true if options.fetch(:required, false)
53
52
  end
54
-
55
53
  # Auto include any matching FormFieldBehaviors
56
54
  schema_name = name.to_s.camelcase
57
55
  behavior = "#{schema_name}FormFieldsBehavior".safe_constantize ||
data/lib/hyrax/name.rb CHANGED
@@ -17,5 +17,10 @@ module Hyrax
17
17
  @singular_route_key = ActiveSupport::Inflector.singularize(@route_key)
18
18
  @route_key += "_index" if @plural == @singular
19
19
  end
20
+
21
+ ##
22
+ # Expose the underlying klass which can be helpful when consider that we have the
23
+ # Hyrax::ValkyrieLazyMigration
24
+ attr_reader :klass
20
25
  end
21
26
  end
@@ -124,6 +124,16 @@ module Hyrax
124
124
 
125
125
  # @since 3.5.0
126
126
  # @macro a_registered_event
127
+ # @note this event SHOULD be published file is characteried by the
128
+ # characterization service. Normally, this should happen close to
129
+ # when the `file.metadata.updated` event (since characterization
130
+ # typically involves updating the metadata). Listeners that intend
131
+ # to track updates to file metadata should listen on that event
132
+ # topic.
133
+ # The event payload MUST include a `:file_set` ({Hyrax::FileSet}),
134
+ # a `:file_id` (the id of the {Valkyrie::StorageAdapter::File}),
135
+ # and MAY have a `path_hint` for a local path / cache for the
136
+ # file.
127
137
  register_event('file.characterized')
128
138
 
129
139
  # @since 3.3.0
@@ -208,6 +218,7 @@ module Hyrax
208
218
  @default_listeners ||=
209
219
  [Hyrax::Listeners::ACLIndexListener.new,
210
220
  Hyrax::Listeners::BatchNotificationListener.new,
221
+ Hyrax::Listeners::FileListener.new,
211
222
  Hyrax::Listeners::FileMetadataListener.new,
212
223
  Hyrax::Listeners::FileSetLifecycleListener.new,
213
224
  Hyrax::Listeners::FileSetLifecycleNotificationListener.new,
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubocop'
4
+
5
+ module Hyrax
6
+ module RuboCop
7
+ module CustomCops
8
+ # This custom cop checks for mixins of Hyrax::ArResource
9
+ class ArResource < ::RuboCop::Cop::Cop
10
+ MSG = 'Do not `include Hyrax::ArResource`.'
11
+
12
+ # checks for `include Hyrax::ArResource`
13
+ def_node_search :includes_hyrax_ar_resource?, <<-PATTERN
14
+ (send nil? {:include :extend} (const (const nil? :Hyrax) :ArResource))
15
+ PATTERN
16
+
17
+ # checks for `include ArResource`
18
+ def_node_search :includes_ar_resource?, <<-PATTERN
19
+ (send nil? {:include :extend} (const nil? :ArResource))
20
+ PATTERN
21
+
22
+ def on_send(send_node)
23
+ add_offense(send_node, message: MSG) if includes_hyrax_ar_resource?(send_node) || includes_ar_resource?(send_node)
24
+ end
25
+ end
26
+
27
+ # class AdditionalCustomCops < ::RuboCop::Cop::Cop; end
28
+ end
29
+ end
30
+ end
@@ -19,13 +19,13 @@ require 'selenium-webdriver'
19
19
  Capybara.save_path = ENV['CI'] ? "/tmp/test-results" : Rails.root.join('tmp', 'capybara')
20
20
 
21
21
  options = Selenium::WebDriver::Chrome::Options.new.tap do |opts|
22
- opts.add_argument("--headless") if ENV["CHROME_HEADLESS_MODE"]
22
+ opts.add_argument("--headless=new") if ENV["CHROME_HEADLESS_MODE"]
23
+ # opts.add_argument("--no-sandbox")
24
+ # opts.add_argument("--disable-dev-shm-usage")
23
25
  opts.add_argument("--disable-gpu") if Gem.win_platform?
24
- # Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary
25
- opts.add_argument("--disable-site-isolation-trials")
26
26
  opts.add_argument("--window-size=1440,1440")
27
- opts.add_argument("--enable-features=NetworkService,NetworkServiceInProcess")
28
- opts.add_argument("--disable-features=VizDisplayCompositor")
27
+ # opts.add_argument("--enable-features=NetworkService,NetworkServiceInProcess")
28
+ # opts.add_argument("--disable-features=VizDisplayCompositor")
29
29
  end
30
30
 
31
31
  Capybara.register_driver :selenium_chrome_headless_sandboxless do |app|
@@ -46,7 +46,8 @@ end
46
46
  Capybara.server_host = '0.0.0.0'
47
47
  Capybara.server_port = 3010
48
48
 
49
- ip = IPSocket.getaddress(Socket.gethostname)
49
+ # ip = IPSocket.getaddress(Socket.gethostname)
50
+ ip = `hostname -s`.strip
50
51
  Capybara.app_host = "http://#{ip}:#{Capybara.server_port}"
51
52
 
52
53
  Capybara.default_driver = :rack_test # This is a faster driver
@@ -87,5 +88,8 @@ end
87
88
  RSpec.configure do |config|
88
89
  config.after(:each, :js) do |example|
89
90
  save_timestamped_page_and_screenshot(Capybara.page, example.metadata) if example.exception
91
+ # Quitting forces the browser session to be reinitialized during the next :js spec.
92
+ # This is slower but more resilient to timeouts (in theory).
93
+ Capybara.page.driver.quit
90
94
  end
91
95
  end
@@ -11,6 +11,7 @@ FactoryBot.define do
11
11
  after(:create) do |admin_set, evaluator|
12
12
  if evaluator.with_permission_template
13
13
  attributes = { source_id: admin_set.id }
14
+ attributes = evaluator.permission_template_attributes.merge(attributes) if evaluator.permission_template_attributes.respond_to?(:merge)
14
15
  attributes = evaluator.with_permission_template.merge(attributes) if evaluator.with_permission_template.respond_to?(:merge)
15
16
  # There is a unique constraint on permission_templates.source_id; I don't want to
16
17
  # create a permission template if one already exists for this admin_set
@@ -21,6 +22,7 @@ FactoryBot.define do
21
22
  transient do
22
23
  # false, true, or Hash with keys for permission_template
23
24
  with_permission_template { false }
25
+ permission_template_attributes { {} }
24
26
  end
25
27
 
26
28
  factory :complete_admin_set do
@@ -5,6 +5,10 @@ FactoryBot.define do
5
5
  visibility_after_embargo { 'open' }
6
6
  visibility_during_embargo { 'authenticated' }
7
7
 
8
+ after(:build) do |embargo, evaluator|
9
+ embargo.embargo_release_date = evaluator.embargo_release_date.to_datetime
10
+ end
11
+
8
12
  to_create do |instance|
9
13
  saved_instance = Valkyrie.config.metadata_adapter.persister.save(resource: instance)
10
14
  instance.id = saved_instance.id
@@ -5,6 +5,10 @@ FactoryBot.define do
5
5
  visibility_after_lease { 'authenticated' }
6
6
  visibility_during_lease { 'open' }
7
7
 
8
+ after(:build) do |lease, evaluator|
9
+ lease.lease_expiration_date = evaluator.lease_expiration_date.to_datetime
10
+ end
11
+
8
12
  to_create do |instance|
9
13
  saved_instance = Valkyrie.config.metadata_adapter.persister.save(resource: instance)
10
14
  instance.id = saved_instance.id
@@ -66,6 +66,11 @@ FactoryBot.define do
66
66
  .assign_access_for(visibility: evaluator.visibility_setting)
67
67
  end
68
68
 
69
+ if evaluator.respond_to?(:admin_set) && evaluator.admin_set.present?
70
+ template = Hyrax::PermissionTemplate.find_by(source_id: evaluator.admin_set.id)
71
+ Hyrax::PermissionTemplateApplicator.apply(template).to(model: work) if template
72
+ end
73
+
69
74
  work.permission_manager.edit_groups = work.permission_manager.edit_groups.to_a + evaluator.edit_groups
70
75
  work.permission_manager.edit_users = work.permission_manager.edit_users.to_a + evaluator.edit_users
71
76
  work.permission_manager.read_users = work.permission_manager.read_users.to_a + evaluator.read_users
@@ -80,6 +85,19 @@ FactoryBot.define do
80
85
  .new(resource: work)
81
86
  .assign_access_for(visibility: evaluator.visibility_setting)
82
87
  end
88
+
89
+ if evaluator.respond_to?(:admin_set) && evaluator.admin_set.present?
90
+ # We're likely going to want to apply permissions
91
+ template = Hyrax::PermissionTemplate.find_by(source_id: evaluator.admin_set.id)
92
+ if template
93
+ Hyrax::PermissionTemplateApplicator.apply(template).to(model: work)
94
+ if template.active_workflow.present?
95
+ user = User.find_by(Hydra.config.user_key_field => work.depositor)
96
+ Hyrax::Workflow::WorkflowFactory.create(work, {}, user)
97
+ end
98
+ end
99
+ end
100
+
83
101
  work.permission_manager.edit_groups = work.permission_manager.edit_groups.to_a + evaluator.edit_groups
84
102
  work.permission_manager.edit_users = work.permission_manager.edit_users.to_a + evaluator.edit_users
85
103
  work.permission_manager.read_users = work.permission_manager.read_users.to_a + evaluator.read_users
@@ -89,7 +107,14 @@ FactoryBot.define do
89
107
  Hyrax::EmbargoManager.new(resource: work).apply
90
108
  Hyrax::LeaseManager.new(resource: work).apply
91
109
 
92
- work.permission_manager.acl.save
110
+ if evaluator.with_index
111
+ work.permission_manager.acl.save
112
+ else
113
+ # manually save acl change_set so it does not automatically index the work
114
+ change_set = work.permission_manager.acl.send(:change_set)
115
+ change_set.sync
116
+ Hyrax.persister.save(resource: change_set.resource)
117
+ end
93
118
 
94
119
  # This has to happen after permissions for permissions to propagate.
95
120
  if evaluator.uploaded_files.present?
@@ -374,7 +374,7 @@ RSpec.shared_examples 'a Hyrax::FileSet', valkyrie_adapter: :test_adapter do
374
374
  end
375
375
 
376
376
  context 'with simulated original file' do
377
- let(:file_metadata_double) { double("Fake Hyrax::FileMetadata", id: SecureRandom.uuid, file_identifier: SecureRandom.uuid, versions: [file_double]) }
377
+ let(:file_metadata_double) { double("Fake Hyrax::FileMetadata", id: SecureRandom.uuid, file_identifier: "versiondisk://#{Rails.root.join / 'tmp' / 'test_adapter_uploads'}/#{SecureRandom.uuid}", versions: [file_double]) }
378
378
  let(:file_double) { double("Fake Valkyrie::StorageAdapter::File", id: SecureRandom.uuid, version_id: SecureRandom.uuid)}
379
379
 
380
380
  before do
@@ -11,7 +11,8 @@ module Hyrax
11
11
  DEFAULT_STEPS = ['admin_set_resource.check_default',
12
12
  'admin_set_resource.check_empty',
13
13
  'admin_set_resource.delete',
14
- 'admin_set_resource.delete_acl'].freeze
14
+ 'admin_set_resource.delete_acl',
15
+ 'admin_set_resource.delete_permission_template'].freeze
15
16
 
16
17
  ##
17
18
  # @see Hyrax::Transactions::Transaction
@@ -11,7 +11,8 @@ module Hyrax
11
11
  # TODO: Add step that checks if collection is empty for collections of types that require it
12
12
  DEFAULT_STEPS = ['collection_resource.delete_acl',
13
13
  'collection_resource.remove_from_membership',
14
- 'collection_resource.delete'].freeze
14
+ 'collection_resource.delete',
15
+ 'collection_resource.delete_permission_template'].freeze.freeze
15
16
 
16
17
  ##
17
18
  # @see Hyrax::Transactions::Transaction
@@ -42,6 +42,7 @@ module Hyrax
42
42
  require 'hyrax/transactions/steps/delete_access_control'
43
43
  require 'hyrax/transactions/steps/delete_all_file_metadata'
44
44
  require 'hyrax/transactions/steps/delete_all_file_sets'
45
+ require 'hyrax/transactions/steps/delete_permission_template'
45
46
  require 'hyrax/transactions/steps/delete_resource'
46
47
  require 'hyrax/transactions/steps/ensure_admin_set'
47
48
  require 'hyrax/transactions/steps/file_metadata_delete'
@@ -202,6 +203,10 @@ module Hyrax
202
203
  ops.register 'save_acl' do
203
204
  Steps::SaveAccessControl.new
204
205
  end
206
+
207
+ ops.register 'delete_permission_template' do
208
+ Steps::DeletePermissionTemplate.new
209
+ end
205
210
  end
206
211
 
207
212
  namespace 'collection_resource' do |ops| # Hyrax::PcdmCollection resource
@@ -229,6 +234,10 @@ module Hyrax
229
234
  Steps::SaveAccessControl.new
230
235
  end
231
236
 
237
+ ops.register 'delete_permission_template' do
238
+ Steps::DeletePermissionTemplate.new
239
+ end
240
+
232
241
  ops.register 'save_collection_banner' do
233
242
  Steps::SaveCollectionBanner.new
234
243
  end
@@ -27,8 +27,9 @@ module Hyrax
27
27
  if @handler.new(work: obj).add(files: uploaded_files, file_set_params: file_set_params).attach
28
28
  file_sets = obj.member_ids.map do |member|
29
29
  Hyrax.query_service.find_by(id: member) if Hyrax.query_service.find_by(id: member).is_a? Hyrax::FileSet
30
- end
30
+ end.compact
31
31
 
32
+ # TODO: improve queries - Non performant to perform single queries. Perhapds queries ids then reject.
32
33
  Hyrax::LeaseManager.create_or_update_lease_on_members(file_sets, obj) if obj.lease
33
34
  Hyrax::EmbargoManager.create_or_update_embargo_on_members(file_sets, obj) if obj.embargo
34
35
  Success(obj)
@@ -14,8 +14,7 @@ module Hyrax
14
14
 
15
15
  ##
16
16
  # @params [#save] persister
17
- def initialize(property: :file_ids, query_service: Hyrax.query_service, persister: Hyrax.persister, publisher: Hyrax.publisher)
18
- @property = property
17
+ def initialize(query_service: Hyrax.query_service, persister: Hyrax.persister, publisher: Hyrax.publisher)
19
18
  @persister = persister
20
19
  @query_service = query_service
21
20
  @publisher = publisher
@@ -29,10 +28,10 @@ module Hyrax
29
28
  def call(resource)
30
29
  return Failure(:resource_not_persisted) unless resource.persisted?
31
30
 
32
- resource[@property].each do |file_id|
33
- return Failure[:failed_to_delete_file_metadata, file_id] unless
31
+ @query_service.custom_queries.find_files(file_set: resource).each do |file_metadata|
32
+ return Failure[:failed_to_delete_file_metadata, file_metadata.id] unless
34
33
  Hyrax::Transactions::Container['file_metadata.destroy']
35
- .call(@query_service.custom_queries.find_file_metadata_by(id: file_id))
34
+ .call(file_metadata)
36
35
  .success?
37
36
  rescue ::Ldp::Gone
38
37
  nil
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+ require 'dry/monads'
3
+
4
+ module Hyrax
5
+ module Transactions
6
+ module Steps
7
+ ##
8
+ # Deletes the Hyrax::PermissionTemplate for a resource.
9
+ # If no PermissionTemplate associated with that resource is found, succeeds.
10
+ #
11
+ # @see https://dry-rb.org/gems/dry-monads/1.0/result/
12
+ class DeletePermissionTemplate
13
+ include Dry::Monads[:result]
14
+
15
+ ##
16
+ # @param [Valkyrie::Resource] obj
17
+ #
18
+ # @return [Dry::Monads::Result]
19
+ def call(obj)
20
+ permission_template = Hyrax::PermissionTemplate.find_by(source_id: obj.id)
21
+ return Success(obj) if permission_template.nil?
22
+
23
+ permission_template.destroy || (return Failure[:failed_to_delete_permission_template, permission_template])
24
+
25
+ Success(obj)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -27,8 +27,8 @@ module Hyrax
27
27
  def call(resource, user: nil)
28
28
  return Failure(:resource_not_persisted) unless resource.persisted?
29
29
 
30
- @persister.delete(resource: resource)
31
30
  publish_changes(resource: resource, user: user)
31
+ @persister.delete(resource: resource)
32
32
 
33
33
  Success(resource)
34
34
  end
@@ -19,7 +19,8 @@ module Hyrax
19
19
  #
20
20
  # @return [Dry::Monads::Result] `Failure` if the work fails to save;
21
21
  # `Success(input)`, otherwise.
22
- def call(collection_resource, update_logo_file_ids: nil, alttext_values: nil, linkurl_values: nil)
22
+ def call(collection_resource, update_logo_file_ids: nil, alttext_values: nil, linkurl_values: nil, logo_unchanged_indicator: true)
23
+ return Success(collection_resource) if ActiveModel::Type::Boolean.new.cast(logo_unchanged_indicator)
23
24
  collection_id = collection_resource.id.to_s
24
25
  process_logo_input(collection_id: collection_id, update_logo_file_ids: update_logo_file_ids, alttext_values: alttext_values, linkurl_values: linkurl_values)
25
26
  Success(collection_resource)
@@ -19,10 +19,17 @@ module Hyrax
19
19
  #
20
20
  # @raise Hyrax::ObjectNotFoundError
21
21
  def self.find(_model_class, id)
22
- return Hyrax.query_service.find_by(id: id) unless Hyrax.config.enable_noids?
22
+ self.find_by(id:) ||
23
23
  Hyrax.query_service.find_by_alternate_identifier(alternate_identifier: id)
24
24
  rescue Valkyrie::Persistence::ObjectNotFoundError => err
25
25
  raise Hyrax::ObjectNotFoundError, err.message
26
26
  end
27
+
28
+ private
29
+
30
+ def self.find_by(id:)
31
+ Hyrax.query_service.find_by(id:)
32
+ rescue Valkyrie::Persistence::ObjectNotFoundError
33
+ end
27
34
  end
28
35
  end
data/lib/hyrax/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Hyrax
3
- VERSION = '5.0.0'
3
+ VERSION = '5.0.3'
4
4
  end
@@ -143,18 +143,26 @@ module Wings
143
143
  end
144
144
  # rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength
145
145
 
146
+ # rubocop:disable Metrics/AbcSize
146
147
  def parse_attributes(af_object)
147
148
  converted_attrs = normal_attributes
148
- members = Array.wrap(converted_attrs.delete(:members))
149
- files = converted_attrs.delete(:files)
150
- af_object.attributes = converted_attrs
149
+ af_object.attributes = converted_attrs.except(:members, :files, :file_name)
150
+ af_object.original_filename = converted_attrs[:file_name] if converted_attrs[:file_name]
151
151
  af_object.extracted_text = create_extrated_text(af_object) if resource.attributes[:extracted_text_id].present?
152
152
  perform_lease_conversion(af_object: af_object, resource: resource)
153
153
  perform_embargo_conversion(af_object: af_object, resource: resource)
154
- members.empty? ? af_object.try(:ordered_members)&.clear : af_object.try(:ordered_members=, members)
155
- af_object.try(:members)&.replace(members)
154
+
155
+ if converted_attrs.keys.include?(:members)
156
+ members = Array.wrap(converted_attrs.delete(:members))
157
+ members.empty? ? af_object.try(:ordered_members)&.clear : af_object.try(:ordered_members=, members)
158
+ af_object.try(:members)&.replace(members)
159
+ end
160
+
161
+ return unless converted_attrs.keys.include?(:files)
162
+ files = converted_attrs.delete(:files)
156
163
  af_object.files.build_or_set(files) if files
157
164
  end
165
+ # rubocop:enable Metrics/AbcSize
158
166
 
159
167
  def create_extrated_text(af_object)
160
168
  pcdm_et_file = af_object.extracted_text.presence || af_object.create_extracted_text
@@ -246,6 +246,7 @@ module Wings
246
246
  attr_reader :attributes
247
247
 
248
248
  def initialize(attributes)
249
+ attributes = attributes.merge(file_name: attributes[:original_filename]) if attributes[:original_filename]
249
250
  @attributes = attributes
250
251
  end
251
252
 
@@ -19,7 +19,8 @@ module Wings
19
19
  # @param global_id [GlobalID] global id for a Hyrax::CollectionType
20
20
  #
21
21
  # @return [Enumerable<PcdmCollection>]
22
- def find_collections_by_type(global_id:)
22
+ def find_collections_by_type(global_id:, **)
23
+ # TODO: Consider how to do this without the hard-coded Collection
23
24
  ::Collection.where(Hyrax.config.collection_type_index_field.to_sym => global_id.to_s).map(&:valkyrie_resource)
24
25
  end
25
26
  end
@@ -63,7 +63,7 @@ module Wings
63
63
  def find_file_metadata_by_alternate_identifier(alternate_identifier:, use_valkyrie: true)
64
64
  alternate_identifier = ::Valkyrie::ID.new(alternate_identifier).to_s
65
65
  object = Hydra::PCDM::File.find(alternate_identifier)
66
- raise Hyrax::ObjectNotFoundError if object.new_record?
66
+ raise Hyrax::ObjectNotFoundError if object.new_record? || object.empty?
67
67
 
68
68
  if use_valkyrie == false
69
69
  warn_about_deprecation
@@ -108,7 +108,7 @@ module Wings
108
108
  #
109
109
  def find_many_file_metadata_by_use(resource:, use:, use_valkyrie: true)
110
110
  pcdm_files = find_many_file_metadata_by_ids(ids: resource.file_ids, use_valkyrie: false)
111
- pcdm_files.select! { |pcdm_file| pcdm_file.metadata_node.type.include?(use) }
111
+ pcdm_files.select! { |pcdm_file| !pcdm_file.empty? && pcdm_file.metadata_node.type.include?(use) }
112
112
 
113
113
  if use_valkyrie == false
114
114
  warn_about_deprecation
data/lib/wings/setup.rb CHANGED
@@ -127,9 +127,18 @@ custom_queries.each do |query_handler|
127
127
  Valkyrie.config.metadata_adapter.query_service.custom_queries.register_query_handler(query_handler)
128
128
  end
129
129
 
130
- Wings::ModelRegistry.register(Hyrax::AccessControl, Hydra::AccessControl)
131
- Wings::ModelRegistry.register(Hyrax::AdministrativeSet, AdminSet)
132
- Wings::ModelRegistry.register(Hyrax::PcdmCollection, ::Collection)
130
+ Valkyrie.config.resource_class_resolver = lambda do |resource_klass_name|
131
+ return resource_klass_name.constantize unless defined?(Wings)
132
+ klass_name = resource_klass_name.gsub(/Resource$/, '')
133
+ # Second one should throw a name error because we do not know what you want if
134
+ # it isn't one of these two options
135
+ klass = klass_name.safe_constantize || resource_klass_name.constantize
136
+ Wings::ModelRegistry.reverse_lookup(klass) || klass
137
+ end
138
+
139
+ Wings::ModelRegistry.register(Hyrax::AccessControl, Hydra::AccessControl)
140
+ Wings::ModelRegistry.register(Hyrax.config.admin_set_class_for_wings, AdminSet)
141
+ Wings::ModelRegistry.register(Hyrax.config.collection_class_for_wings, ::Collection)
133
142
  Wings::ModelRegistry.register(Hyrax::FileSet, FileSet)
134
143
  Wings::ModelRegistry.register(Hyrax::Embargo, Hydra::AccessControls::Embargo)
135
144
  Wings::ModelRegistry.register(Hyrax::Lease, Hydra::AccessControls::Lease)
@@ -49,8 +49,12 @@ module Wings
49
49
  end
50
50
 
51
51
  ##
52
- # @return [RDF::Term]
52
+ # Valkyrie objects contain a URI string for location objects so we need
53
+ # to return just the string for mapping from Fedora
54
+ #
55
+ # @return [RDF::Term || String]
53
56
  def result
57
+ return value.id if value.is_a?(Hyrax::ControlledVocabularies::Location)
54
58
  value.to_term
55
59
  end
56
60
  end
@@ -24,7 +24,8 @@ module Wings
24
24
  # @param [Valkyrie::Resource] resource
25
25
  # @param [Boolean] perform_af_validation
26
26
  # @return [Valkyrie::Resource] the persisted/updated resource
27
- def save(resource:, perform_af_validation: false)
27
+ # rubocop:disable Lint/UnusedMethodArgument
28
+ def save(resource:, perform_af_validation: false, external_resource: false)
28
29
  af_object = resource_factory.from_resource(resource: resource)
29
30
 
30
31
  check_lock_tokens(af_object: af_object, resource: resource)
@@ -43,6 +44,7 @@ module Wings
43
44
 
44
45
  raise FailedSaveError.new(err.message, obj: af_object)
45
46
  end
47
+ # rubocop:enable Lint/UnusedMethodArgument
46
48
 
47
49
  # Persists a resource using ActiveFedora
48
50
  # @param [Valkyrie::Resource] resource