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
@@ -58,7 +58,7 @@ module Hyrax
58
58
  @admin_set_options = available_admin_sets
59
59
  # TODO: move these lines to the work form builder in Hyrax
60
60
  curation_concern.depositor = current_user.user_key
61
- curation_concern.admin_set_id = admin_set_id_for_new
61
+ curation_concern.admin_set_id = params[:admin_set_id] || admin_set_id_for_new
62
62
  build_form
63
63
  end
64
64
 
@@ -263,6 +263,8 @@ module Hyrax
263
263
 
264
264
  def contextual_path(presenter, parent_presenter)
265
265
  ::Hyrax::ContextualPath.new(presenter, parent_presenter).show
266
+ rescue NoMethodError
267
+ ''
266
268
  end
267
269
 
268
270
  ##
@@ -385,7 +387,12 @@ module Hyrax
385
387
 
386
388
  def format_error_messages(errors)
387
389
  # the error may already be a string
388
- errors.respond_to?(:messages) ? errors.messages.values.flatten.join("\n") : errors
390
+ return errors unless errors.respond_to?(:messages)
391
+
392
+ errors.messages.map do |field, messages|
393
+ field_name = field.to_s.humanize
394
+ messages.map { |message| "#{field_name} #{message.sub(/^./, &:downcase)}" }
395
+ end.flatten.join("\n")
389
396
  end
390
397
 
391
398
  def after_create_error(errors, original_input_params_for_form = nil)
@@ -5,7 +5,7 @@ module Hyrax
5
5
  class CollectionReportsController < AnalyticsController
6
6
  include Hyrax::BreadcrumbsForCollectionAnalytics
7
7
  def index
8
- return unless Hyrax.config.analytics?
8
+ return unless Hyrax.config.analytics_reporting?
9
9
 
10
10
  @pageviews = Hyrax::Analytics.daily_events('collection-page-view')
11
11
  @work_page_views = Hyrax::Analytics.daily_events('work-in-collection-view')
@@ -21,7 +21,7 @@ module Hyrax
21
21
  end
22
22
 
23
23
  def show
24
- return unless Hyrax.config.analytics?
24
+ return unless Hyrax.config.analytics_reporting?
25
25
  @document = ::SolrDocument.find(params[:id])
26
26
  @pageviews = Hyrax::Analytics.daily_events_for_id(@document.id, 'collection-page-view')
27
27
  @work_page_views = Hyrax::Analytics.daily_events_for_id(@document.id, 'work-in-collection-view')
@@ -4,9 +4,10 @@ module Hyrax
4
4
  module Analytics
5
5
  class WorkReportsController < AnalyticsController
6
6
  include Hyrax::BreadcrumbsForWorksAnalytics
7
+ before_action :authenticate_user!
7
8
 
8
9
  def index
9
- return unless Hyrax.config.analytics?
10
+ return unless Hyrax.config.analytics_reporting?
10
11
 
11
12
  @accessible_works ||= accessible_works
12
13
  @accessible_file_sets ||= accessible_file_sets
@@ -14,10 +15,7 @@ module Hyrax
14
15
  @top_works = paginate(top_works_list, rows: 10)
15
16
  @top_file_set_downloads = paginate(top_files_list, rows: 10)
16
17
 
17
- if current_user.ability.admin?
18
- @pageviews = Hyrax::Analytics.daily_events('work-view')
19
- @downloads = Hyrax::Analytics.daily_events('file-set-download')
20
- end
18
+ @pageviews = Hyrax::Analytics.daily_events('work-view'), @downloads = Hyrax::Analytics.daily_events('file-set-download') if current_user.ability.admin?
21
19
 
22
20
  respond_to do |format|
23
21
  format.html
@@ -39,7 +37,7 @@ module Hyrax
39
37
  private
40
38
 
41
39
  def accessible_works
42
- models = Hyrax.config.curation_concerns.map { |m| "\"#{m}\"" }
40
+ models = Hyrax::ModelRegistry.work_rdf_representations.map { |m| "\"#{m}\"" }
43
41
  if current_user.ability.admin?
44
42
  Hyrax::SolrService.query("has_model_ssim:(#{models.join(' OR ')})",
45
43
  fl: 'title_tesim, id, member_of_collections',
@@ -54,15 +52,16 @@ module Hyrax
54
52
  end
55
53
 
56
54
  def accessible_file_sets
55
+ file_set_model_clause = "has_model_ssim:\"#{Hyrax::ModelRegistry.file_set_rdf_representations.join('" OR "')}\""
57
56
  if current_user.ability.admin?
58
57
  Hyrax::SolrService.query(
59
- "has_model_ssim:FileSet",
58
+ file_set_model_clause,
60
59
  fl: 'title_tesim, id',
61
60
  rows: 50_000
62
61
  )
63
62
  else
64
63
  Hyrax::SolrService.query(
65
- "edit_access_person_ssim:#{current_user} AND has_model_ssim:FileSet",
64
+ "edit_access_person_ssim:#{current_user} AND #{file_set_model_clause}",
66
65
  fl: 'title_tesim, id',
67
66
  rows: 50_000
68
67
  )
@@ -231,7 +231,8 @@ module Hyrax
231
231
  banner_unchanged_indicator: params["banner_unchanged"] },
232
232
  'collection_resource.save_collection_logo' => { update_logo_file_ids: params["logo_files"],
233
233
  alttext_values: params["alttext"],
234
- linkurl_values: params["linkurl"] }
234
+ linkurl_values: params["linkurl"],
235
+ logo_unchanged_indicator: false }
235
236
  )
236
237
  .call(form)
237
238
  @collection = result.value_or { return after_update_errors(result.failure.first) }
@@ -11,15 +11,38 @@ module Hyrax
11
11
  :original_file
12
12
  end
13
13
 
14
+ # We want to alias the show method for a later use with #show_active_fedora;
15
+ # because we're adding quite a bit of logic and need a good alias. Why the
16
+ # alias? Because we were using `super' for the show method and that just
17
+ # doesn't quite work with all of the antics we're performing.
18
+ alias hydra_show_active_fedora_file show
19
+
14
20
  # Render the 404 page if the file doesn't exist.
15
21
  # Otherwise renders the file.
16
22
  def show
23
+ # We will use the thumbnail from our file system first, if one exists
24
+ # Otherwise we will fallback to Valkyrie, then the default implementations
25
+ use = params.fetch(:file, :original_file).to_sym
26
+ if use == :thumbnail
27
+ thumbnail = Hyrax::DerivativePath.derivative_path_for_reference(params[:id], 'thumbnail')
28
+ if thumbnail.present? && File.exist?(thumbnail)
29
+ @file = thumbnail
30
+ return send_local_content
31
+ end
32
+ end
33
+
17
34
  return show_valkyrie if Hyrax.config.use_valkyrie?
18
35
 
36
+ show_active_fedora
37
+ end
38
+
39
+ private
40
+
41
+ def show_active_fedora
19
42
  case file
20
43
  when ActiveFedora::File
21
44
  # For original files that are stored in fedora
22
- super
45
+ hydra_show_active_fedora_file
23
46
  when String
24
47
  # For derivatives stored on the local file system
25
48
  send_local_content
@@ -28,8 +51,6 @@ module Hyrax
28
51
  end
29
52
  end
30
53
 
31
- private
32
-
33
54
  # Override the Hydra::Controller::DownloadBehavior#content_options so that
34
55
  # we have an attachement rather than 'inline'
35
56
  def content_options
@@ -8,7 +8,7 @@ module Hyrax
8
8
  include Hyrax::Breadcrumbs
9
9
 
10
10
  before_action :authenticate_user!, except: [:show, :citation, :stats]
11
- load_and_authorize_resource class: ::FileSet, except: :show
11
+ load_and_authorize_resource class: Hyrax.config.file_set_class
12
12
  before_action :build_breadcrumbs, only: [:show, :edit, :stats]
13
13
  before_action do
14
14
  blacklight_config.track_search_session = false
@@ -94,7 +94,7 @@ module Hyrax
94
94
  # @api public
95
95
  def delete(file_set:)
96
96
  case file_set
97
- when Valkyrie::Resource
97
+ when Hyrax::Resource
98
98
  transactions['file_set.destroy']
99
99
  .with_step_args('file_set.remove_from_work' => { user: current_user },
100
100
  'file_set.delete' => { user: current_user })
@@ -123,20 +123,46 @@ module Hyrax
123
123
  def valkyrie_update_metadata
124
124
  change_set = Hyrax::Forms::ResourceForm.for(resource: file_set)
125
125
 
126
+ attributes = coerce_valkyrie_params
127
+
128
+ # TODO: We are not performing any error checks. So that's something to
129
+ # correct.
126
130
  result =
127
131
  change_set.validate(attributes) &&
128
132
  transactions['change_set.update_file_set']
129
133
  .with_step_args(
130
- 'file_set.save_acl' => { permissions_params: change_set.input_params["permissions"] }
131
- )
134
+ 'file_set.save_acl' => { permissions_params: change_set.input_params["permissions"] }
135
+ )
132
136
  .call(change_set).value_or { false }
133
137
  @file_set = result if result
134
138
  end
135
139
 
140
+ def coerce_valkyrie_params
141
+ attrs = attributes
142
+ # The HTML form might not submit the required data structure for reform;
143
+ # namely instead of a hash with positional arguments for nested attributes
144
+ # of a collection, it is an array. So we conditionally coerce that Array
145
+ # to a Hash.
146
+
147
+ # TODO: Do we need to concern ourself with embargo_attributes and
148
+ # lease_attributes? My suspicion is that since these are singular (for
149
+ # now), we don't. But it's a quick add.
150
+ [:permissions].each do |name|
151
+ next unless attrs["#{name}_attributes"].is_a?(Array)
152
+ new_perm_attrs = {}
153
+ attrs["#{name}_attributes"].each_with_index do |el, i|
154
+ new_perm_attrs[i] = el
155
+ end
156
+
157
+ attrs["#{name}_attributes"] = new_perm_attrs
158
+ end
159
+ attrs
160
+ end
161
+
136
162
  def parent(file_set: curation_concern)
137
163
  @parent ||=
138
164
  case file_set
139
- when Hyrax::FileSet
165
+ when Hyrax::Resource
140
166
  # TODO: Add Hyrax::FileSet#parent method
141
167
  Hyrax.query_service.find_parents(resource: file_set).first
142
168
  else
@@ -145,7 +171,7 @@ module Hyrax
145
171
  end
146
172
 
147
173
  def attempt_update
148
- return attempt_update_valkyrie if ::FileSet < Hyrax::Resource
174
+ return attempt_update_valkyrie if curation_concern.is_a?(Hyrax::Resource)
149
175
  if wants_to_revert?
150
176
  actor.revert_content(params[:revision])
151
177
  elsif params.key?(:file_set)
@@ -292,7 +318,7 @@ module Hyrax
292
318
  end
293
319
 
294
320
  def file_metadata
295
- @file_metadata ||= Hyrax.query_service.custom_queries.find_file_metadata_by(id: curation_concern.original_file_id)
321
+ @file_metadata ||= Hyrax.config.file_set_file_service.primary_file_for(file_set: file_set)
296
322
  end
297
323
 
298
324
  # Override this method to add additional response formats to your local app
@@ -24,6 +24,7 @@ module Hyrax
24
24
  add_breadcrumb t(:'hyrax.admin.sidebar.works'), hyrax.my_works_path
25
25
  managed_works_count
26
26
  @create_work_presenter = create_work_presenter_class.new(current_user)
27
+ @admin_sets_for_select = admin_sets_for_select
27
28
  super
28
29
  end
29
30
 
@@ -47,6 +48,25 @@ module Hyrax
47
48
  def managed_works_count
48
49
  @managed_works_count = Hyrax::Works::ManagedWorksService.managed_works_count(scope: self)
49
50
  end
51
+
52
+ def admin_sets_for_select
53
+ source_ids = Hyrax::Collections::PermissionsService.source_ids_for_deposit(ability: current_ability, source_type: 'admin_set')
54
+
55
+ admin_sets_list = Hyrax.query_service.find_many_by_ids(ids: source_ids).map do |source|
56
+ [source.title.first, source.id]
57
+ end
58
+
59
+ # Sorts the default admin set to be first, then the rest by title.
60
+ admin_sets_list.sort do |a, b|
61
+ if Hyrax::AdminSetCreateService.default_admin_set?(id: a[1])
62
+ -1
63
+ elsif Hyrax::AdminSetCreateService.default_admin_set?(id: b[1])
64
+ 1
65
+ else
66
+ a[0] <=> b[0]
67
+ end
68
+ end
69
+ end
50
70
  end
51
71
  end
52
72
  end
@@ -84,7 +84,13 @@ module Hyrax
84
84
  end
85
85
 
86
86
  def current_ability
87
- @current_ability ||= SingleUseLinksViewerController::Ability.new current_user, single_use_link
87
+ link_instance = nil
88
+ begin
89
+ link_instance = single_use_link
90
+ rescue ActiveRecord::RecordNotFound
91
+ Rails.logger.debug("Single user link was not found while getting current ability")
92
+ end
93
+ @current_ability ||= SingleUseLinksViewerController::Ability.new current_user, link_instance
88
94
  end
89
95
 
90
96
  def render_single_use_error(exception)
@@ -102,9 +108,10 @@ module Hyrax
102
108
  include CanCan::Ability
103
109
 
104
110
  attr_reader :single_use_link
111
+ attr_reader :current_user
105
112
 
106
113
  def initialize(user, single_use_link)
107
- @user = user || ::User.new
114
+ @current_user = user || ::User.new
108
115
  return unless single_use_link
109
116
 
110
117
  @single_use_link = single_use_link
@@ -27,7 +27,7 @@ module Hyrax
27
27
  when 'file'
28
28
  add_breadcrumb I18n.t("hyrax.file_set.browse_view"), main_app.hyrax_file_set_path(params["id"])
29
29
  when 'work'
30
- add_breadcrumb @work.to_s, main_app.polymorphic_path(@work)
30
+ add_breadcrumb @work.title.first, main_app.polymorphic_path(@work)
31
31
  end
32
32
  end
33
33
  end
@@ -4,8 +4,12 @@ module Hyrax
4
4
  load_and_authorize_resource class: Hyrax::UploadedFile
5
5
 
6
6
  def create
7
- @upload.attributes = { file: params[:files].first,
8
- user: current_user }
7
+ if params[:id].blank?
8
+ @upload.attributes = { file: params[:files].first,
9
+ user: current_user }
10
+ else
11
+ upload_with_chunking
12
+ end
9
13
  @upload.save!
10
14
  end
11
15
 
@@ -13,5 +17,27 @@ module Hyrax
13
17
  @upload.destroy
14
18
  head :no_content
15
19
  end
20
+
21
+ private
22
+
23
+ def upload_with_chunking
24
+ @upload = Hyrax::UploadedFile.find(params[:id])
25
+ unpersisted_upload = Hyrax::UploadedFile.new(file: params[:files].first, user: current_user)
26
+
27
+ # Check if CONTENT-RANGE header is present
28
+ content_range = request.headers['CONTENT-RANGE']
29
+ return @upload.file = unpersisted_upload.file if content_range.nil?
30
+
31
+ # deal with chunks
32
+ current_size = @upload.file.size
33
+ begin_of_chunk = content_range[/\ (.*?)-/, 1].to_i # "bytes 100-999999/1973660678" will return '100'
34
+
35
+ # Add the following chunk to the incomplete upload
36
+ if @upload.file.present? && begin_of_chunk == current_size
37
+ File.open(@upload.file.path, "ab") { |f| f.write(params[:files].first.read) }
38
+ else
39
+ @upload.file = unpersisted_upload.file
40
+ end
41
+ end
16
42
  end
17
43
  end
@@ -47,7 +47,7 @@ module Hyrax
47
47
 
48
48
  # The color links
49
49
  def link_color
50
- block_for('link_color', '#2e74b2')
50
+ block_for('link_color', '#104C75')
51
51
  end
52
52
 
53
53
  # The color for links in the footer
@@ -10,7 +10,7 @@ module Hyrax
10
10
  delegate :title, :description, :brandable, :discoverable, :nestable, :sharable, :share_applies_to_new_works,
11
11
  :require_membership, :allow_multiple_membership, :assigns_workflow,
12
12
  :assigns_visibility, :id, :collection_type_participants, :persisted?,
13
- :admin_set?, :user_collection?, :badge_color, to: :collection_type
13
+ :admin_set?, :user_collection?, :badge_color, :collections?, to: :collection_type
14
14
 
15
15
  ##
16
16
  # @return [Boolean]
@@ -23,12 +23,6 @@ module Hyrax
23
23
  def share_options_disabled?
24
24
  all_settings_disabled? || !sharable
25
25
  end
26
-
27
- ##
28
- # @return [Boolean]
29
- def collections?
30
- collection_type.collections.any?
31
- end
32
26
  end
33
27
  end
34
28
  end
@@ -81,6 +81,15 @@ module Hyrax
81
81
  secondary_terms.any?
82
82
  end
83
83
 
84
+ ##
85
+ # This feature is not supported in Valkyrie collections and should be removed as part of #5764
86
+ # However, the depreciated method is still needed for some specs
87
+ # @return [] always empty.
88
+ def select_files
89
+ Deprecation.warn "`Hyrax::PcdmCollection` does not currently support thumbnail_id. Collection thumbnails need to be redesigned as part of issue #5764"
90
+ []
91
+ end
92
+
84
93
  private
85
94
 
86
95
  def _form_field_definitions
@@ -31,6 +31,12 @@ module Hyrax
31
31
  def model_name
32
32
  model.to_model.model_name
33
33
  end
34
+
35
+ ##
36
+ # @return [String]
37
+ def to_s
38
+ [*model.title].join(' ')
39
+ end
34
40
  end
35
41
  end
36
42
  end
@@ -31,6 +31,12 @@ module Hyrax
31
31
  def model_name
32
32
  model.to_model.model_name
33
33
  end
34
+
35
+ ##
36
+ # @return [String]
37
+ def to_s
38
+ [*model.title].join(' ')
39
+ end
34
40
  end
35
41
  end
36
42
  end
@@ -6,7 +6,7 @@ module Hyrax
6
6
  module LocationIndexer
7
7
  def to_solr
8
8
  super.tap do |index_document|
9
- index_document[:based_near_label_tesim] = based_near_label_lookup(resource.based_near) if resource.respond_to? :based_near
9
+ index_document[:based_near_label_tesim] = index_document[:based_near_label_sim] = based_near_label_lookup(resource.based_near) if resource.respond_to? :based_near
10
10
  end
11
11
  end
12
12
 
@@ -14,7 +14,7 @@ module Hyrax
14
14
 
15
15
  def based_near_label_lookup(locations)
16
16
  locations.map do |loc|
17
- location_service.full_label(loc)
17
+ location_service.full_label(loc) if loc.present?
18
18
  end
19
19
  end
20
20
 
@@ -101,6 +101,10 @@ module Hyrax
101
101
 
102
102
  # attributes set by fits for video
103
103
  solr_doc['aspect_ratio_tesim'] = file_metadata.aspect_ratio if file_metadata.aspect_ratio.present?
104
+
105
+ # support for derivatives download
106
+ derivatives = resource.extensions_and_mime_types
107
+ solr_doc['extensions_and_mime_types_ssm'] = derivatives.to_json if derivatives.present?
104
108
  end
105
109
  end
106
110
 
@@ -47,6 +47,7 @@ module Hyrax
47
47
  "system_modified_dtsi": resource.updated_at,
48
48
  "has_model_ssim": resource.to_rdf_representation,
49
49
  "human_readable_type_tesim": resource.human_readable_type,
50
+ "human_readable_type_sim": resource.human_readable_type,
50
51
  "alternate_ids_sim": resource.alternate_ids.map(&:to_s)
51
52
  }.with_indifferent_access
52
53
  end
@@ -9,11 +9,9 @@ module Hyrax
9
9
  super
10
10
  end
11
11
 
12
- class << self
13
- def for(*args, **kwargs)
14
- Deprecation.warn "`Hyrax::ValkyrieIndexer.for` is deprecated. Use `Hyrax::Indexers::ResourceIndexer.for` instead."
15
- Hyrax::Indexers::ResourceIndexer.for(*args, **kwargs)
16
- end
12
+ def self.for(*args, **kwargs)
13
+ Deprecation.warn "`Hyrax::ValkyrieIndexer.for` is deprecated. Use `Hyrax::Indexers::ResourceIndexer.for` instead."
14
+ Hyrax::Indexers::ResourceIndexer.for(*args, **kwargs)
17
15
  end
18
16
  end
19
17
  end
@@ -0,0 +1,109 @@
1
+ ##
2
+ # Responsible for conditionally enqueuing the file and thumbnail migration
3
+ # logic of an ActiveFedora object.
4
+ class MigrateFilesToValkyrieJob < Hyrax::ApplicationJob
5
+ ##
6
+ #
7
+ # @param resource [Hyrax::FileSet]
8
+ def perform(resource)
9
+ migrate_derivatives!(resource:)
10
+ # need to reload file_set to get the derivative ids
11
+ resource = Hyrax.query_service.find_by(id: resource.id)
12
+ migrate_files!(resource: resource)
13
+ end
14
+
15
+ def attribute_mapping
16
+ return @attribute_mapping if @attribute_mapping
17
+ @attribute_mapping = %w[
18
+ aspect_ratio bit_depth bit_rate byte_order capture_device channels character_count character_set
19
+ checksum color_map color_space compression creator data_format duration exif_version file_title
20
+ fits_version format_label frame_rate gps_timestamp graphics_count height image_producer language
21
+ latitude line_count longitude markup_basis markup_language offset orientation page_count
22
+ paragraph_count profile_name profile_version recorded_size sample_rate scanning_software
23
+ table_count well_formed width word_count ].inject({}) { |j, i| j[i] = i; j}
24
+ @attribute_mapping['recorded_size'] = 'file_size'
25
+ @attribute_mapping['channels'] = 'alpha_channels'
26
+ @attribute_mapping['checksum'] = 'original_checksum'
27
+ @attribute_mapping
28
+ end
29
+
30
+ private
31
+
32
+ def migrate_derivatives!(resource:)
33
+ # @todo should we trigger a job if the member is a child work?
34
+ paths = Hyrax::DerivativePath.derivatives_for_reference(resource)
35
+ paths.each do |path|
36
+ container = container_for(path)
37
+ mime_type = Marcel::MimeType.for(extension: File.extname(path))
38
+ directives = { url: path, container: container, mime_type: mime_type }
39
+ File.open(path, 'rb') do |content|
40
+ Hyrax::ValkyriePersistDerivatives.call(content, directives)
41
+ end
42
+ end
43
+ end
44
+
45
+ ##
46
+ # Move the ActiveFedora files out of ActiveFedora's domain and into the
47
+ # configured {Hyrax.storage_adapter}'s domain.
48
+ def migrate_files!(resource:)
49
+ return unless resource.respond_to?(:file_ids)
50
+
51
+ files = Hyrax.custom_queries.find_many_file_metadata_by_ids(ids: resource.file_ids)
52
+ files.each do |file|
53
+ # If it doesn't start with fedora, we've likely already migrated it.
54
+ next unless /^fedora:/.match?(file.file_identifier.to_s)
55
+ resource.file_ids.delete(file.id)
56
+
57
+ Tempfile.create do |tempfile|
58
+ tempfile.binmode
59
+ tempfile.write(URI.open(file.file_identifier.to_s.gsub("fedora:", "http:")).read)
60
+ tempfile.rewind
61
+
62
+ # valkyrie_file = Hyrax.storage_adapter.upload(resource: resource, file: tempfile, original_filename: file.original_filename)
63
+ valkyrie_file = Hyrax::ValkyrieUpload.file(
64
+ filename: resource.label,
65
+ file_set: resource,
66
+ io: tempfile,
67
+ use: file.pcdm_use.select {|use| Hyrax::FileMetadata::Use.use_list.include?(use)},
68
+ user: User.find_or_initialize_by(User.user_key_field => resource.depositor),
69
+ mime_type: file.mime_type,
70
+ skip_derivatives: true
71
+ )
72
+ valkyrie_file = copy_attributes(valkyrie_file:, original_file: file)
73
+ Hyrax.persister.save(resource: valkyrie_file)
74
+ end
75
+ end
76
+ # reindex the file set after migrating files to include characterization info
77
+ Hyrax.index_adapter.save(resource: resource)
78
+ end
79
+
80
+ def copy_attributes(valkyrie_file:, original_file:)
81
+ attribute_mapping.each do |k, v|
82
+ valkyrie_file.set_value(k, original_file.send(v))
83
+ end
84
+ # Special case as this property isn't in the characterization proxy
85
+ valkyrie_file.set_value('alternate_ids', original_file.alternate_ids)
86
+ valkyrie_file
87
+ end
88
+
89
+ ##
90
+ # Map from the file name used for the derivative to a valid option for
91
+ # container that ValkyriePersistDerivatives can convert into a
92
+ # Hyrax::Metadata::Use
93
+ #
94
+ # @param filename [String] the name of the derivative file: i.e. 'x-thumbnail.jpg'
95
+ # @return [String]
96
+ def container_for(filename)
97
+ # we want the portion between the '-' and the '.'
98
+ file_blob = File.basename(filename, '.*').split('-').last
99
+
100
+ case file_blob
101
+ when 'thumbnail'
102
+ 'thumbnail_image'
103
+ when 'txt', 'json', 'xml'
104
+ 'extracted_text'
105
+ else
106
+ 'service_file'
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # migrates models from AF to valkyrie
4
+ class MigrateResourcesJob < ApplicationJob
5
+ attr_writer :errors
6
+ # input [Array>>String] Array of ActiveFedora model names to migrate to valkyrie objects
7
+ # defaults to AdminSet & Collection models if empty
8
+ def perform(ids: [], models: ['AdminSet', 'Collection'])
9
+ if ids.blank?
10
+ models.each do |model|
11
+ model.constantize.find_each do |item|
12
+ migrate(item.id)
13
+ end
14
+ end
15
+ else
16
+ ids.each do |id|
17
+ migrate(id)
18
+ end
19
+ end
20
+ raise errors.inspect if errors.present?
21
+ end
22
+
23
+ def errors
24
+ @errors ||= []
25
+ end
26
+
27
+ def migrate(id)
28
+ resource = Hyrax.query_service.find_by(id: id)
29
+ return unless resource.wings? # this resource has already been converted
30
+ result = MigrateResourceService.new(resource: resource).call
31
+ errors << result unless result.success?
32
+ result
33
+ end
34
+ end
@@ -16,8 +16,9 @@ class ValkyrieCreateDerivativesJob < Hyrax::ApplicationJob
16
16
 
17
17
  def reindex_parent(file_set_id)
18
18
  file_set = Hyrax.query_service.find_by(id: file_set_id)
19
+ return unless file_set
19
20
  parent = Hyrax.custom_queries.find_parent_work(resource: file_set)
20
- return unless parent.thumbnail_id == file_set.id
21
+ return unless parent&.thumbnail_id == file_set.id
21
22
  Hyrax.logger.debug { "Reindexing #{parent.id} due to creation of thumbnail derivatives." }
22
23
  Hyrax.index_adapter.save(resource: parent)
23
24
  end
@@ -17,6 +17,7 @@
17
17
  # @see Hyrax::DefaultAdminSetActor
18
18
  # @see Hyrax::ApplyPermissionTemplateActor
19
19
  class AdminSet < ActiveFedora::Base
20
+ include Hydra::PCDM::CollectionBehavior
20
21
  include Hydra::AccessControls::Permissions
21
22
  include Hyrax::Noid
22
23
  include Hyrax::HumanReadableType