curation_concerns 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -9
  3. data/.rspec +1 -1
  4. data/.rubocop.yml +185 -0
  5. data/.travis.yml +0 -10
  6. data/CONTRIBUTING.md +117 -0
  7. data/Gemfile +5 -2
  8. data/README.md +18 -11
  9. data/Rakefile +23 -11
  10. data/VERSION +1 -1
  11. data/app/assets/images/audio.png +0 -0
  12. data/app/assets/images/loading.gif +0 -0
  13. data/app/assets/images/progressbar.gif +0 -0
  14. data/app/assets/javascripts/curation_concerns/application.js +2 -8
  15. data/app/assets/javascripts/curation_concerns/curation_concerns.js +1 -15
  16. data/app/assets/javascripts/curation_concerns/facet_mine.js +4 -10
  17. data/app/assets/javascripts/curation_concerns/fileupload.js +6 -0
  18. data/app/assets/javascripts/curation_concerns/uploader.js +183 -0
  19. data/app/assets/stylesheets/curation_concerns/_curation_concerns.scss +3 -0
  20. data/app/assets/stylesheets/curation_concerns/_positioning.scss +6 -0
  21. data/app/assets/stylesheets/curation_concerns/fileupload/jquery.fileupload-ui.scss +86 -0
  22. data/app/assets/stylesheets/curation_concerns/fileupload/thumbnail-scaling.css +3 -0
  23. data/app/assets/stylesheets/curation_concerns/fileupload.scss +48 -0
  24. data/app/assets/stylesheets/curation_concerns/modules/attributes.scss +10 -0
  25. data/app/assets/stylesheets/curation_concerns/modules/embargoes.scss +1 -1
  26. data/app/assets/stylesheets/curation_concerns/modules/forms.scss +0 -10
  27. data/app/assets/stylesheets/curation_concerns/modules/search_results.scss +7 -8
  28. data/app/controllers/concerns/curation_concerns/api.rb +77 -0
  29. data/app/controllers/concerns/curation_concerns/application_controller_behavior.rb +30 -12
  30. data/app/controllers/concerns/curation_concerns/catalog_controller.rb +9 -276
  31. data/app/controllers/concerns/curation_concerns/collections_controller_behavior.rb +51 -40
  32. data/app/controllers/concerns/curation_concerns/curation_concern_controller.rb +60 -30
  33. data/app/controllers/concerns/curation_concerns/download_behavior.rb +51 -37
  34. data/app/controllers/concerns/curation_concerns/embargoes_controller_behavior.rb +29 -29
  35. data/app/controllers/concerns/curation_concerns/file_sets_controller_behavior.rb +198 -0
  36. data/app/controllers/concerns/curation_concerns/leases_controller_behavior.rb +27 -20
  37. data/app/controllers/concerns/curation_concerns/manages_embargoes.rb +2 -7
  38. data/app/controllers/concerns/curation_concerns/parent_container.rb +20 -4
  39. data/app/controllers/concerns/curation_concerns/single_use_links_controller_behavior.rb +48 -0
  40. data/app/controllers/concerns/curation_concerns/single_use_links_viewer_controller_behavior.rb +75 -0
  41. data/app/controllers/concerns/curation_concerns/themed_layout_controller.rb +0 -1
  42. data/app/controllers/concerns/curation_concerns/upload_sets_controller_behavior.rb +38 -0
  43. data/app/controllers/concerns/curation_concerns/welcome_controller_behavior.rb +8 -0
  44. data/app/controllers/concerns/curation_concerns/without_namespace.rb +2 -1
  45. data/app/controllers/curation_concerns/classify_concerns_controller.rb +9 -9
  46. data/app/controllers/curation_concerns/file_sets_controller.rb +5 -0
  47. data/app/controllers/curation_concerns/permissions_controller.rb +2 -3
  48. data/app/controllers/curation_concerns/single_use_links_controller.rb +5 -0
  49. data/app/controllers/curation_concerns/single_use_links_viewer_controller.rb +21 -0
  50. data/app/controllers/downloads_controller.rb +0 -1
  51. data/app/controllers/embargoes_controller.rb +0 -2
  52. data/app/controllers/leases_controller.rb +0 -2
  53. data/app/controllers/registrations_controller.rb +1 -2
  54. data/app/controllers/upload_sets_controller.rb +3 -0
  55. data/app/controllers/welcome_controller.rb +3 -0
  56. data/app/forms/curation_concerns/forms/collection_edit_form.rb +18 -2
  57. data/app/forms/curation_concerns/forms/file_set_edit_form.rb +15 -0
  58. data/app/forms/curation_concerns/forms/work_form.rb +57 -0
  59. data/app/helpers/curation_concerns/ability_helper.rb +24 -24
  60. data/app/helpers/curation_concerns/catalog_helper.rb +9 -8
  61. data/app/helpers/curation_concerns/collections_helper.rb +9 -12
  62. data/app/helpers/curation_concerns/embargo_helper.rb +0 -2
  63. data/app/helpers/curation_concerns/file_set_helper.rb +31 -0
  64. data/app/helpers/curation_concerns/lease_helper.rb +0 -3
  65. data/app/helpers/curation_concerns/main_app_helpers.rb +1 -3
  66. data/app/helpers/curation_concerns/render_constraints_helper.rb +5 -5
  67. data/app/helpers/curation_concerns/search_paths_helper.rb +5 -7
  68. data/app/helpers/curation_concerns/title_helper.rb +3 -7
  69. data/app/helpers/curation_concerns/url_helper.rb +4 -6
  70. data/app/inputs/multifile_input.rb +8 -0
  71. data/app/jobs/visibility_copy_job.rb +22 -0
  72. data/app/presenters/curation_concerns/collection_presenter.rb +14 -32
  73. data/app/presenters/curation_concerns/embargo_presenter.rb +26 -0
  74. data/app/presenters/curation_concerns/file_set_presenter.rb +34 -0
  75. data/app/presenters/curation_concerns/lease_presenter.rb +30 -0
  76. data/app/presenters/curation_concerns/model_proxy.rb +27 -0
  77. data/app/presenters/curation_concerns/permission_badge.rb +61 -0
  78. data/app/presenters/curation_concerns/presenter_factory.rb +45 -0
  79. data/app/presenters/curation_concerns/presents_attributes.rb +25 -0
  80. data/app/presenters/curation_concerns/version_list_presenter.rb +18 -0
  81. data/app/presenters/curation_concerns/version_presenter.rb +27 -0
  82. data/app/presenters/curation_concerns/work_show_presenter.rb +33 -0
  83. data/app/renderers/curation_concerns/attribute_renderer.rb +75 -0
  84. data/app/search_builders/curation_concerns/deactivated_embargo_search_builder.rb +10 -0
  85. data/app/search_builders/curation_concerns/deactivated_lease_search_builder.rb +10 -0
  86. data/app/search_builders/curation_concerns/embargo_search_builder.rb +23 -0
  87. data/app/search_builders/curation_concerns/expired_embargo_search_builder.rb +11 -0
  88. data/app/search_builders/curation_concerns/expired_lease_search_builder.rb +11 -0
  89. data/app/search_builders/curation_concerns/lease_search_builder.rb +23 -0
  90. data/app/search_builders/curation_concerns/search_builder.rb +10 -16
  91. data/app/services/curation_concerns/curation_concern.rb +0 -5
  92. data/app/services/curation_concerns/embargo_service.rb +26 -4
  93. data/app/services/curation_concerns/lease_service.rb +14 -5
  94. data/app/services/curation_concerns/parent_service.rb +19 -0
  95. data/app/services/curation_concerns/restriction_service.rb +24 -0
  96. data/app/services/rights_service.rb +14 -0
  97. data/app/views/catalog/_action_menu_partials/_collection.html.erb +1 -1
  98. data/app/views/catalog/_action_menu_partials/_default.html.erb +5 -3
  99. data/app/views/catalog/_document_list.html.erb +1 -1
  100. data/app/views/catalog/index.html.erb +1 -35
  101. data/app/views/collections/_edit_descriptions.html.erb +3 -4
  102. data/app/views/collections/_form.html.erb +1 -1
  103. data/app/views/collections/_form_permission.html.erb +1 -1
  104. data/app/views/collections/_search_form.html.erb +10 -0
  105. data/app/views/collections/_show_actions.html.erb +3 -3
  106. data/app/views/collections/_sort_and_per_page.html.erb +2 -2
  107. data/app/views/collections/show.html.erb +6 -6
  108. data/app/views/curation_concerns/base/_attribute_rows.html.erb +7 -0
  109. data/app/views/curation_concerns/base/_attributes.html.erb +6 -13
  110. data/app/views/curation_concerns/base/_form.html.erb +4 -5
  111. data/app/views/curation_concerns/base/_form_descriptive_fields.erb +2 -4
  112. data/app/views/curation_concerns/base/_form_files_and_links.html.erb +3 -5
  113. data/app/views/curation_concerns/base/_form_permission.html.erb +13 -26
  114. data/app/views/curation_concerns/base/_form_permission_note.html.erb +15 -0
  115. data/app/views/curation_concerns/base/_form_permission_under_embargo.html.erb +2 -2
  116. data/app/views/curation_concerns/base/_form_permission_under_lease.html.erb +2 -2
  117. data/app/views/curation_concerns/base/_form_representative_image.html.erb +16 -4
  118. data/app/views/curation_concerns/base/_form_rights.html.erb +17 -0
  119. data/app/views/curation_concerns/base/_form_supplementary_fields.html.erb +4 -9
  120. data/app/views/curation_concerns/base/_related_files.html.erb +4 -4
  121. data/app/views/curation_concerns/base/_representative_media.html.erb +2 -4
  122. data/app/views/curation_concerns/base/_versioning.html.erb +23 -0
  123. data/app/views/curation_concerns/base/show.html.erb +13 -10
  124. data/app/views/curation_concerns/base/show.json.jbuilder +1 -0
  125. data/app/views/curation_concerns/base/versions.html.erb +6 -0
  126. data/app/views/curation_concerns/file_sets/_actions.html.erb +16 -0
  127. data/app/views/curation_concerns/file_sets/_file_set.html.erb +12 -0
  128. data/app/views/curation_concerns/{generic_files → file_sets}/_form.html.erb +7 -7
  129. data/app/views/curation_concerns/file_sets/_multiple_upload.html.erb +3 -0
  130. data/app/views/curation_concerns/{generic_files → file_sets}/edit.html.erb +0 -0
  131. data/app/views/curation_concerns/file_sets/jq_upload.json.jbuilder +8 -0
  132. data/app/views/curation_concerns/file_sets/media_display/_audio.html.erb +6 -0
  133. data/app/views/curation_concerns/file_sets/media_display/_default.html.erb +4 -0
  134. data/app/views/curation_concerns/file_sets/media_display/_image.html.erb +8 -0
  135. data/app/views/curation_concerns/file_sets/media_display/_office_document.html.erb +7 -0
  136. data/app/views/curation_concerns/file_sets/media_display/_pdf.html.erb +7 -0
  137. data/app/views/curation_concerns/file_sets/media_display/_video.html.erb +6 -0
  138. data/app/views/curation_concerns/file_sets/show.html.erb +15 -0
  139. data/app/views/curation_concerns/file_sets/show.json.jbuilder +1 -0
  140. data/app/views/curation_concerns/file_sets/upload/_alerts.html.erb +19 -0
  141. data/app/views/curation_concerns/file_sets/upload/_form.html.erb +6 -0
  142. data/app/views/curation_concerns/file_sets/upload/_form_fields.html.erb +45 -0
  143. data/app/views/curation_concerns/file_sets/upload/_script_templates.html.erb +61 -0
  144. data/app/views/curation_concerns/single_use_links/new_download.html.erb +5 -0
  145. data/app/views/curation_concerns/single_use_links/new_show.html.erb +5 -0
  146. data/app/views/curation_concerns/single_use_links_viewer/show.html.erb +10 -0
  147. data/app/views/error/single_use_error.html.erb +19 -0
  148. data/app/views/layouts/error.html.erb +33 -0
  149. data/app/views/leases/_list_expired_active_leases.html.erb +6 -1
  150. data/app/views/records/_rights_modal.html.erb +1 -0
  151. data/app/views/records/edit_fields/_default.html.erb +5 -0
  152. data/app/views/records/show_fields/_default.html.erb +6 -0
  153. data/app/views/shared/_add_content.html.erb +2 -14
  154. data/app/views/shared/_add_works.html.erb +14 -0
  155. data/app/views/shared/_my_actions.html.erb +9 -1
  156. data/app/views/shared/_site_actions.html.erb +1 -1
  157. data/app/views/shared/_site_search.html.erb +7 -7
  158. data/app/views/upload_sets/_edit.js.erb +15 -0
  159. data/app/views/upload_sets/_metadata.html.erb +50 -0
  160. data/app/views/upload_sets/_more_metadata.html.erb +7 -0
  161. data/app/views/upload_sets/edit.html.erb +26 -0
  162. data/app/views/{catalog/_home_text.html.erb → welcome/index.html.erb} +1 -0
  163. data/config/initializers/simple_form.rb +14 -0
  164. data/config/jetty.yml +5 -0
  165. data/config/locales/curation_concerns.en.yml +25 -4
  166. data/config/routes.rb +5 -0
  167. data/curation_concerns.gemspec +4 -6
  168. data/lib/curation_concerns/callbacks/registry.rb +48 -0
  169. data/lib/curation_concerns/callbacks.rb +26 -0
  170. data/lib/curation_concerns/controller_resource.rb +4 -4
  171. data/lib/curation_concerns/engine.rb +4 -2
  172. data/lib/curation_concerns/rails/routes.rb +23 -19
  173. data/lib/curation_concerns/single_use_error.rb +3 -0
  174. data/lib/curation_concerns/spec_support.rb +0 -2
  175. data/lib/curation_concerns/version.rb +1 -1
  176. data/lib/curation_concerns.rb +1 -2
  177. data/lib/generators/curation_concerns/install_generator.rb +34 -30
  178. data/lib/generators/curation_concerns/templates/catalog_controller.rb +236 -0
  179. data/lib/generators/curation_concerns/templates/config/authorities/rights.yml +19 -0
  180. data/lib/generators/curation_concerns/templates/{curation_concerns.css.scss → curation_concerns.scss} +0 -0
  181. data/lib/generators/curation_concerns/work/templates/actor_spec.rb.erb +1 -1
  182. data/lib/generators/curation_concerns/work/templates/controller_spec.rb.erb +1 -1
  183. data/lib/generators/curation_concerns/work/templates/form.rb.erb +8 -0
  184. data/lib/generators/curation_concerns/work/templates/form_spec.rb.erb +10 -0
  185. data/lib/generators/curation_concerns/work/templates/model.rb.erb +2 -2
  186. data/lib/generators/curation_concerns/work/templates/model_spec.rb.erb +1 -1
  187. data/lib/generators/curation_concerns/work/work_generator.rb +31 -26
  188. data/spec/abilities/collection_abilities_spec.rb +13 -13
  189. data/spec/abilities/embargo_and_lease_ability_spec.rb +23 -0
  190. data/spec/abilities/file_set_abilities_spec.rb +67 -0
  191. data/spec/abilities/generic_work_abilities_spec.rb +12 -12
  192. data/spec/actors/curation_concerns/embargo_actor_spec.rb +38 -0
  193. data/spec/actors/curation_concerns/file_set_actor_spec.rb +180 -0
  194. data/spec/actors/curation_concerns/lease_actor_spec.rb +39 -0
  195. data/spec/actors/curation_concerns/manages_embargoes_actor_spec.rb +44 -38
  196. data/spec/actors/curation_concerns/work_actor_spec.rb +121 -63
  197. data/spec/controllers/catalog_controller_spec.rb +30 -32
  198. data/spec/controllers/curation_concerns/classify_concerns_controller_spec.rb +2 -3
  199. data/spec/controllers/curation_concerns/collections_controller_spec.rb +93 -76
  200. data/spec/controllers/curation_concerns/file_sets_controller_json_spec.rb +106 -0
  201. data/spec/controllers/curation_concerns/file_sets_controller_spec.rb +237 -0
  202. data/spec/controllers/curation_concerns/generic_works_controller_json_spec.rb +85 -0
  203. data/spec/controllers/curation_concerns/generic_works_controller_spec.rb +84 -72
  204. data/spec/controllers/curation_concerns/permissions_controller_spec.rb +8 -11
  205. data/spec/controllers/curation_concerns/single_use_links_controller_spec.rb +79 -0
  206. data/spec/controllers/curation_concerns/single_use_links_viewer_controller_spec.rb +74 -0
  207. data/spec/controllers/downloads_controller_spec.rb +49 -24
  208. data/spec/controllers/embargoes_controller_spec.rb +42 -51
  209. data/spec/controllers/leases_controller_spec.rb +53 -42
  210. data/spec/controllers/upload_sets_controller_spec.rb +76 -0
  211. data/spec/controllers/welcome_controller_spec.rb +12 -0
  212. data/spec/factories/collections.rb +5 -1
  213. data/spec/factories/{generic_files.rb → file_sets.rb} +6 -6
  214. data/spec/factories/generic_works.rb +5 -6
  215. data/spec/factories/users.rb +2 -4
  216. data/spec/features/add_file_spec.rb +11 -12
  217. data/spec/features/catalog_search_spec.rb +43 -0
  218. data/spec/features/collection_spec.rb +61 -46
  219. data/spec/features/create_work_spec.rb +26 -19
  220. data/spec/features/embargo_spec.rb +13 -12
  221. data/spec/features/lease_spec.rb +15 -16
  222. data/spec/features/update_file_spec.rb +11 -13
  223. data/spec/features/work_generator_spec.rb +34 -26
  224. data/spec/{helpers/curation_concerns/.keep → fixtures/empty_file.txt} +0 -0
  225. data/spec/fixtures/test.pdf +0 -0
  226. data/spec/forms/collection_edit_form_spec.rb +53 -9
  227. data/spec/forms/file_set_edit_form_spec.rb +53 -0
  228. data/spec/forms/work_form_spec.rb +54 -0
  229. data/spec/helpers/catalog_helper_spec.rb +9 -10
  230. data/spec/helpers/configuration_helper_spec.rb +1 -2
  231. data/spec/helpers/curation_concerns/collections_helper_spec.rb +8 -9
  232. data/spec/helpers/curation_concerns/file_set_helper_spec.rb +61 -0
  233. data/spec/helpers/render_constraints_helper_spec.rb +4 -4
  234. data/spec/helpers/url_helper_spec.rb +8 -7
  235. data/spec/indexers/collection_indexer_spec.rb +14 -0
  236. data/spec/indexers/file_set_indexing_service_spec.rb +69 -0
  237. data/spec/indexers/generic_work_indexing_service_spec.rb +22 -0
  238. data/spec/inputs/multifile_input_spec.rb +32 -0
  239. data/spec/jobs/active_fedora_id_based_job_spec.rb +10 -8
  240. data/spec/jobs/audit_job_spec.rb +28 -20
  241. data/spec/jobs/characterize_job_spec.rb +10 -15
  242. data/spec/jobs/create_derivatives_job_spec.rb +11 -9
  243. data/spec/jobs/import_url_job_spec.rb +14 -21
  244. data/spec/jobs/ingest_file_job_spec.rb +45 -0
  245. data/spec/jobs/ingest_local_file_job_spec.rb +13 -15
  246. data/spec/jobs/upload_set_update_job_spec.rb +30 -0
  247. data/spec/jobs/visibility_copy_job_spec.rb +61 -0
  248. data/spec/lib/curation_concerns/callbacks/registry_spec.rb +54 -0
  249. data/spec/lib/curation_concerns/callbacks_spec.rb +27 -0
  250. data/spec/lib/curation_concerns/messages_spec.rb +29 -30
  251. data/spec/lib/curation_concerns/readable_permissions_spec.rb +18 -20
  252. data/spec/lib/curation_concerns/writable_permissions_spec.rb +2 -4
  253. data/spec/matchers/metadata_field_matchers.rb +1 -1
  254. data/spec/matchers/response_matchers.rb +2 -2
  255. data/spec/matchers.rb +3 -2
  256. data/spec/models/checksum_audit_log_spec.rb +37 -32
  257. data/spec/models/curation_concerns/collection_behavior_spec.rb +50 -37
  258. data/spec/models/curation_concerns/file_set/derivatives_spec.rb +84 -0
  259. data/spec/models/curation_concerns/work_behavior_spec.rb +53 -0
  260. data/spec/models/file_set_spec.rb +601 -0
  261. data/spec/models/generic_work_spec.rb +15 -14
  262. data/spec/models/single_use_link_spec.rb +69 -0
  263. data/spec/models/solr_document_spec.rb +67 -0
  264. data/spec/models/upload_set_spec.rb +39 -0
  265. data/spec/models/user_spec.rb +7 -8
  266. data/spec/presenters/curation_concerns/collection_presenter_spec.rb +8 -24
  267. data/spec/presenters/curation_concerns/file_set_presenter_spec.rb +59 -0
  268. data/spec/presenters/curation_concerns/permission_badge_spec.rb +29 -0
  269. data/spec/presenters/curation_concerns/presenter_factory_spec.rb +29 -0
  270. data/spec/presenters/curation_concerns/version_list_presenter_spec.rb +32 -0
  271. data/spec/presenters/curation_concerns/version_presenter_spec.rb +51 -0
  272. data/spec/presenters/curation_concerns/work_show_presenter_spec.rb +35 -0
  273. data/spec/presenters/embargo_presenter_spec.rb +48 -0
  274. data/spec/presenters/lease_presenter_spec.rb +48 -0
  275. data/spec/renderers/curation_concerns/attribute_renderer_spec.rb +14 -0
  276. data/spec/routing/curation_concerns/routes_spec.rb +38 -12
  277. data/spec/routing/route_spec.rb +38 -39
  278. data/spec/search_builders/curation_concerns/embargo_search_builder_spec.rb +17 -0
  279. data/spec/search_builders/curation_concerns/lease_search_builder_spec.rb +17 -0
  280. data/spec/search_builders/curation_concerns/search_builder_spec.rb +60 -0
  281. data/spec/services/derivative_path_spec.rb +16 -0
  282. data/spec/services/embargo_service_spec.rb +15 -14
  283. data/spec/services/file_set_audit_service_spec.rb +71 -0
  284. data/spec/services/lease_service_spec.rb +13 -13
  285. data/spec/services/lock_manager_spec.rb +12 -0
  286. data/spec/services/parent_service_spec.rb +13 -0
  287. data/spec/services/persist_derivatives_spec.rb +24 -0
  288. data/spec/services/persist_directly_contained_output_file_service_spec.rb +14 -0
  289. data/spec/services/repository_audit_service_spec.rb +8 -7
  290. data/spec/services/rights_service_spec.rb +17 -0
  291. data/spec/services/thumbnail_path_service_spec.rb +43 -0
  292. data/spec/services/versioning_service_spec.rb +8 -9
  293. data/spec/spec_helper.rb +21 -13
  294. data/spec/support/curation_concerns/factory_helpers.rb +1 -0
  295. data/spec/support/features/fixture_file_upload.rb +3 -1
  296. data/spec/support/features/session_helpers.rb +3 -4
  297. data/spec/support/features.rb +1 -4
  298. data/spec/support/input_support.rb +11 -0
  299. data/spec/support/matchers/api_responses.rb +22 -0
  300. data/spec/support/shared/shared_examples_has_dc_metadata.rb +0 -2
  301. data/spec/support/shared/shared_examples_is_embargoable.rb +1 -3
  302. data/spec/support/shared/shared_examples_with_access_rights.rb +13 -16
  303. data/spec/tasks/rake_spec.rb +9 -11
  304. data/spec/test_app_templates/Gemfile.extra +4 -1
  305. data/spec/test_app_templates/lib/generators/test_app_generator.rb +3 -35
  306. data/spec/views/catalog/index.html.erb_spec.rb +7 -10
  307. data/spec/views/curation_concerns/base/_attributes.html.erb_spec.rb +9 -6
  308. data/spec/views/curation_concerns/base/_form_permission.html.erb_spec.rb +13 -0
  309. data/spec/views/curation_concerns/base/show.html.erb_spec.rb +35 -15
  310. data/spec/views/curation_concerns/base/show.json.jbuilder_spec.rb +21 -0
  311. data/spec/views/curation_concerns/file_sets/_file_set.html.erb_spec.rb +37 -0
  312. data/spec/views/curation_concerns/file_sets/show.json.jbuilder_spec.rb +21 -0
  313. data/spec/views/curation_concerns/permissions/confirm.html.erb_spec.rb +6 -6
  314. data/spec/views/error/single_use_error.html.erb_spec.rb +8 -0
  315. data/spec/views/layouts/error.html.erb_spec.rb +8 -0
  316. data/spec/views/shared/_add_content.html.erb_spec.rb +33 -20
  317. data/spec/views/shared/_my_actions.html.erb_spec.rb +18 -6
  318. data/spec/views/single_use_links/new_download.html.erb_spec.rb +29 -0
  319. data/spec/views/single_use_links_viewer/show.html.erb_spec.rb +32 -0
  320. data/tasks/jetty.rake +1 -1
  321. data/vendor/assets/javascrips/fileupload/jquery.fileupload-process.js +175 -0
  322. data/vendor/assets/javascrips/fileupload/jquery.fileupload-ui.js +710 -0
  323. data/vendor/assets/javascrips/fileupload/jquery.fileupload-validate.js +122 -0
  324. data/vendor/assets/javascrips/fileupload/jquery.fileupload.js +1477 -0
  325. data/vendor/assets/javascrips/fileupload/locale.js +27 -0
  326. data/vendor/assets/javascrips/fileupload/tmpl.js +87 -0
  327. metadata +242 -213
  328. data/app/assets/javascripts/curation_concerns/help_modal.js +0 -36
  329. data/app/assets/javascripts/curation_concerns/link_groups.js.coffee +0 -123
  330. data/app/assets/javascripts/curation_concerns/link_users.js.coffee +0 -126
  331. data/app/assets/javascripts/curation_concerns/proxy_rights.js.coffee +0 -95
  332. data/app/assets/javascripts/curation_concerns/proxy_submission.js +0 -23
  333. data/app/assets/javascripts/curation_concerns/select_works.js.coffee +0 -20
  334. data/app/controllers/catalog_controller.rb +0 -3
  335. data/app/controllers/concerns/curation_concerns/generic_files_controller_behavior.rb +0 -149
  336. data/app/controllers/curation_concerns/generic_files_controller.rb +0 -13
  337. data/app/datastreams/curation_concerns/generic_work_rdf_properties.rb +0 -57
  338. data/app/datastreams/generic_work_metadata.rb +0 -3
  339. data/app/forms/curation_concerns/forms/generic_file_edit_form.rb +0 -15
  340. data/app/forms/curation_concerns/forms/generic_work_edit_form.rb +0 -9
  341. data/app/helpers/curation_concerns/attribute_helper.rb +0 -67
  342. data/app/helpers/curation_concerns/generic_file_helper.rb +0 -19
  343. data/app/helpers/curation_concerns/thumbnail_helper.rb +0 -11
  344. data/app/presenters/curation_concerns/generic_file_presenter.rb +0 -14
  345. data/app/presenters/curation_concerns/generic_work_presenter.rb +0 -13
  346. data/app/views/catalog/_index_default.html.erb +0 -17
  347. data/app/views/collections/_form_representative_image.html.erb +0 -13
  348. data/app/views/collections/_identifier_and_action.html.erb +0 -15
  349. data/app/views/curation_concerns/base/_form_content_license.html.erb +0 -16
  350. data/app/views/curation_concerns/base/_form_editors.html.erb +0 -15
  351. data/app/views/curation_concerns/generic_files/_actions.html.erb +0 -16
  352. data/app/views/curation_concerns/generic_files/_generic_file.html.erb +0 -12
  353. data/app/views/curation_concerns/generic_files/_media_display.html.erb +0 -19
  354. data/app/views/curation_concerns/generic_files/jq_upload.json.jbuilder +0 -8
  355. data/app/views/curation_concerns/generic_files/show.html.erb +0 -15
  356. data/app/workers/visibility_copy_worker.rb +0 -30
  357. data/curation_concerns-models/.gitignore +0 -17
  358. data/curation_concerns-models/Gemfile +0 -4
  359. data/curation_concerns-models/LICENSE.md +0 -177
  360. data/curation_concerns-models/README.md +0 -42
  361. data/curation_concerns-models/Rakefile +0 -1
  362. data/curation_concerns-models/app/actors/concerns/curation_concerns/manages_embargoes_actor.rb +0 -99
  363. data/curation_concerns-models/app/actors/curation_concerns/base_actor.rb +0 -90
  364. data/curation_concerns-models/app/actors/curation_concerns/generic_file_actor.rb +0 -150
  365. data/curation_concerns-models/app/actors/curation_concerns/work_actor_behavior.rb +0 -88
  366. data/curation_concerns-models/app/jobs/active_fedora_id_based_job.rb +0 -22
  367. data/curation_concerns-models/app/jobs/active_fedora_pid_based_job.rb +0 -6
  368. data/curation_concerns-models/app/jobs/audit_job.rb +0 -58
  369. data/curation_concerns-models/app/jobs/characterize_job.rb +0 -11
  370. data/curation_concerns-models/app/jobs/copy_permissions_job.rb +0 -24
  371. data/curation_concerns-models/app/jobs/create_derivatives_job.rb +0 -15
  372. data/curation_concerns-models/app/jobs/import_url_job.rb +0 -56
  373. data/curation_concerns-models/app/jobs/ingest_local_file_job.rb +0 -48
  374. data/curation_concerns-models/app/jobs/resolrize_job.rb +0 -9
  375. data/curation_concerns-models/app/models/checksum_audit_log.rb +0 -21
  376. data/curation_concerns-models/app/models/concerns/curation_concerns/ability.rb +0 -34
  377. data/curation_concerns-models/app/models/concerns/curation_concerns/basic_metadata.rb +0 -87
  378. data/curation_concerns-models/app/models/concerns/curation_concerns/collection_behavior.rb +0 -47
  379. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/belongs_to_works.rb +0 -53
  380. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/characterization.rb +0 -89
  381. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/content.rb +0 -8
  382. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/export.rb +0 -343
  383. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/full_text_indexing.rb +0 -12
  384. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/indexing.rb +0 -14
  385. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/versions.rb +0 -16
  386. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file.rb +0 -5
  387. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file_behavior.rb +0 -44
  388. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_work_behavior.rb +0 -38
  389. data/curation_concerns-models/app/models/concerns/curation_concerns/has_representative.rb +0 -14
  390. data/curation_concerns-models/app/models/concerns/curation_concerns/human_readable_type.rb +0 -23
  391. data/curation_concerns-models/app/models/concerns/curation_concerns/permissions/readable.rb +0 -19
  392. data/curation_concerns-models/app/models/concerns/curation_concerns/permissions/writable.rb +0 -75
  393. data/curation_concerns-models/app/models/concerns/curation_concerns/permissions.rb +0 -7
  394. data/curation_concerns-models/app/models/concerns/curation_concerns/serializers.rb +0 -15
  395. data/curation_concerns-models/app/models/concerns/curation_concerns/solr_document_behavior.rb +0 -135
  396. data/curation_concerns-models/app/models/concerns/curation_concerns/user.rb +0 -65
  397. data/curation_concerns-models/app/models/concerns/curation_concerns/with_basic_metadata.rb +0 -98
  398. data/curation_concerns-models/app/models/concerns/curation_concerns/with_generic_files.rb +0 -29
  399. data/curation_concerns-models/app/models/curation_concerns/classify_concern.rb +0 -47
  400. data/curation_concerns-models/app/models/curation_concerns/quick_classification_query.rb +0 -31
  401. data/curation_concerns-models/app/models/datastreams/fits_datastream.rb +0 -148
  402. data/curation_concerns-models/app/models/version_committer.rb +0 -2
  403. data/curation_concerns-models/app/services/curation_concerns/characterization_service.rb +0 -71
  404. data/curation_concerns-models/app/services/curation_concerns/full_text_extraction_service.rb +0 -38
  405. data/curation_concerns-models/app/services/curation_concerns/generic_file_audit_service.rb +0 -85
  406. data/curation_concerns-models/app/services/curation_concerns/generic_file_indexing_service.rb +0 -14
  407. data/curation_concerns-models/app/services/curation_concerns/generic_work_indexing_service.rb +0 -16
  408. data/curation_concerns-models/app/services/curation_concerns/noid.rb +0 -23
  409. data/curation_concerns-models/app/services/curation_concerns/repository_audit_service.rb +0 -9
  410. data/curation_concerns-models/app/services/curation_concerns/versioning_service.rb +0 -27
  411. data/curation_concerns-models/config/locales/curation_concerns.en.yml +0 -6
  412. data/curation_concerns-models/curation_concerns-models.gemspec +0 -34
  413. data/curation_concerns-models/lib/curation_concerns/messages.rb +0 -66
  414. data/curation_concerns-models/lib/curation_concerns/models/engine.rb +0 -61
  415. data/curation_concerns-models/lib/curation_concerns/models/resque.rb +0 -36
  416. data/curation_concerns-models/lib/curation_concerns/models/utils.rb +0 -22
  417. data/curation_concerns-models/lib/curation_concerns/models/version.rb +0 -5
  418. data/curation_concerns-models/lib/curation_concerns/models.rb +0 -32
  419. data/curation_concerns-models/lib/generators/curation_concerns/models/abstract_migration_generator.rb +0 -30
  420. data/curation_concerns-models/lib/generators/curation_concerns/models/clamav_generator.rb +0 -19
  421. data/curation_concerns-models/lib/generators/curation_concerns/models/fulltext_generator.rb +0 -28
  422. data/curation_concerns-models/lib/generators/curation_concerns/models/install_generator.rb +0 -70
  423. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/app/models/collection.rb +0 -4
  424. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/app/models/generic_file.rb +0 -4
  425. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/clamav.rb +0 -1
  426. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/curation_concerns.rb +0 -123
  427. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/mime_types.rb +0 -6
  428. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/redis.yml +0 -9
  429. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/redis_config.rb +0 -32
  430. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/resque-pool.yml +0 -1
  431. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/resque_admin.rb +0 -10
  432. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/resque_config.rb +0 -5
  433. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/migrations/create_checksum_audit_logs.rb +0 -19
  434. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/migrations/create_version_committers.rb +0 -15
  435. data/curation_concerns-models/lib/tasks/curation_concerns-models_tasks.rake +0 -75
  436. data/curation_concerns-models/lib/tasks/migrate.rake +0 -13
  437. data/curation_concerns-models/lib/tasks/resque.rake +0 -13
  438. data/curation_concerns-models/lib/tasks/solr_reindex.rake +0 -8
  439. data/lib/curation_concerns/configuration.rb +0 -74
  440. data/lib/generators/curation_concerns/templates/curation_concerns_config.rb +0 -2
  441. data/solr_conf/conf/solrconfig.xml +0 -223
  442. data/spec/abilities/generic_file_abilities_spec.rb +0 -62
  443. data/spec/actors/curation_concerns/generic_file_actor_spec.rb +0 -116
  444. data/spec/controllers/curation_concerns/generic_files_controller_spec.rb +0 -251
  445. data/spec/forms/generic_file_edit_form_spec.rb +0 -33
  446. data/spec/helpers/thumbnail_helper_spec.rb +0 -21
  447. data/spec/jobs/copy_permissions_job_spec.rb +0 -49
  448. data/spec/jobs/curation_concerns_resque_queue_spec.rb +0 -49
  449. data/spec/models/curation_concerns/generic_file/derivatives_spec.rb +0 -88
  450. data/spec/models/curation_concerns/generic_work_behavior_spec.rb +0 -35
  451. data/spec/models/fits_datastream_spec.rb +0 -127
  452. data/spec/models/generic_file_spec.rb +0 -619
  453. data/spec/presenters/curation_concerns/generic_file_presenter_spec.rb +0 -16
  454. data/spec/services/characterization_service_spec.rb +0 -30
  455. data/spec/services/full_text_extraction_service_spec.rb +0 -5
  456. data/spec/services/generic_file_audit_service_spec.rb +0 -71
  457. data/spec/services/generic_file_indexing_service_spec.rb +0 -57
  458. data/spec/services/generic_work_indexing_service_spec.rb +0 -18
  459. data/spec/workers/visibility_copy_worker_spec.rb +0 -70
  460. data/vendor/assets/javascripts/handlebars.js +0 -2278
  461. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.autocomplete.js +0 -602
  462. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.core.js +0 -356
  463. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect-highlight.js +0 -50
  464. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect.js +0 -1276
  465. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.menu.js +0 -610
  466. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.position.js +0 -498
  467. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.widget.js +0 -528
  468. data/vendor/assets/javascripts/jquery.tokeninput.js +0 -1061
  469. data/vendor/assets/stylesheets/jquery-ui-lightness.css +0 -474
  470. data/vendor/assets/stylesheets/token-input-facebook.css +0 -122
  471. data/vendor/assets/stylesheets/token-input-mac.css +0 -204
  472. data/vendor/assets/stylesheets/token-input.css +0 -127
@@ -10,51 +10,65 @@ module CurationConcerns
10
10
  end
11
11
  end
12
12
 
13
-
14
- # Customize the :download ability in your Ability class, or override this method
15
- def authorize_download!
16
- # authorize! :download, file # can't use this because Hydra::Ability#download_permissions assumes that files are in Basic Container (and thus include the asset's uri)
17
- authorize! :read, asset
13
+ # Render the 404 page if the file doesn't exist.
14
+ # Otherwise renders the file.
15
+ def show
16
+ case file
17
+ when ActiveFedora::File
18
+ # For original files that are stored in fedora
19
+ super
20
+ when String
21
+ # For derivatives stored on the local file system
22
+ response.headers['Accept-Ranges'] = 'bytes'
23
+ response.headers['Content-Length'] = File.size(file).to_s
24
+ send_file file, type: mime_type_for(file), disposition: 'inline'
25
+ else
26
+ render_404
27
+ end
18
28
  end
19
29
 
20
- # Overrides Hydra::Controller::DownloadBehavior#load_file, which is hard-coded to assume files are in BasicContainer (PCDM Objects use direct containment)
21
- # Override this method to change which file is shown.
22
- # Loads the file specified by the HTTP parameter `:file_id`.
23
- # If this object does not have a file by that name, return the default file
24
- # as returned by {#default_file}
25
- # @return [ActiveFedora::File] the file
26
- def load_file
27
- file_reference = params[:file]
28
- # f = asset.attached_files[file_path] if file_path # can't use this because attached_files assumes basic containment
29
- f = asset.send(file_reference) if valid_file_reference?(file_reference)
30
- f ||= default_file
31
- raise "Unable to find a file for #{asset}" if f.nil?
32
- f
33
- end
30
+ protected
34
31
 
35
- def default_file
36
- if asset.class.respond_to?(:default_file_path)
37
- default_file_reference = asset.class.default_file_path
38
- else
39
- default_file_reference = DownloadsController.default_content_path
32
+ # Customize the :download ability in your Ability class, or override this method
33
+ def authorize_download!
34
+ # authorize! :download, file # can't use this because Hydra::Ability#download_permissions assumes that files are in Basic Container (and thus include the asset's uri)
35
+ authorize! :read, asset
40
36
  end
41
- if valid_file_reference?(default_file_reference)
42
- return asset.send(default_file_reference)
43
- else
44
- return nil
37
+
38
+ # Overrides Hydra::Controller::DownloadBehavior#load_file, which is hard-coded to assume files are in BasicContainer.
39
+ # Override this method to change which file is shown.
40
+ # Loads the file specified by the HTTP parameter `:file`.
41
+ # If this object does not have a file by that name, return the default file
42
+ # as returned by {#default_file}
43
+ # @return [ActiveFedora::File, String, NilClass] Returns the file from the repository or a path to a file on the local file system, if it exists.
44
+ def load_file
45
+ file_reference = params[:file]
46
+ return default_file unless file_reference
47
+
48
+ file_path = CurationConcerns::DerivativePath.derivative_path_for_reference(asset, file_reference)
49
+ File.exist?(file_path) ? file_path : nil
50
+ end
51
+
52
+ def default_file
53
+ if asset.class.respond_to?(:default_file_path)
54
+ default_file_reference = asset.class.default_file_path
55
+ else
56
+ default_file_reference = DownloadsController.default_content_path
57
+ end
58
+ association = dereference_file(default_file_reference)
59
+ association.reader if association
45
60
  end
46
- end
47
61
 
48
62
  private
49
63
 
50
- def valid_file_reference?(file_reference)
51
- return false if file_reference.nil?
52
- # the second part of this is covering the fact that directly_contains_one isn't implemented yet, so :original_file, :thumbnail,:extracted_text are not singular associations (yet)
53
- singular_associations.include?(file_reference.to_sym) || [:original_file, :thumbnail,:extracted_text].include?(file_reference.to_sym)
54
- end
64
+ def mime_type_for(file)
65
+ MIME::Types.type_for(File.extname(file)).first.content_type
66
+ end
55
67
 
56
- def singular_associations
57
- asset.association_cache.select {|key,assoc| assoc.kind_of?(ActiveFedora::Associations::SingularAssociation)}.keys
58
- end
68
+ def dereference_file(file_reference)
69
+ return false if file_reference.nil?
70
+ association = asset.association(file_reference.to_sym)
71
+ association if association && association.is_a?(ActiveFedora::Associations::SingularAssociation)
72
+ end
59
73
  end
60
74
  end
@@ -1,44 +1,44 @@
1
1
  module CurationConcerns
2
2
  module EmbargoesControllerBehavior
3
3
  extend ActiveSupport::Concern
4
+ include CurationConcerns::ManagesEmbargoes
5
+ include Hydra::Collections::AcceptsBatches
4
6
 
5
7
  included do
6
- skip_before_filter :normalize_identifier, only: :update
8
+ skip_before_action :normalize_identifier, only: :update
9
+ end
10
+
11
+ def index
12
+ authorize! :index, Hydra::AccessControls::Embargo
13
+ end
7
14
 
8
- def destroy
9
- update_files = !curation_concern.under_embargo? # embargo expired
10
- remove_embargo(curation_concern)
11
- flash[:notice] = curation_concern.embargo_history.last
12
- if update_files
13
- redirect_to confirm_curation_concerns_permission_path(curation_concern)
14
- else
15
- redirect_to edit_embargo_path(curation_concern)
16
- end
15
+ # Removes a single embargo
16
+ def destroy
17
+ EmbargoActor.new(curation_concern).destroy
18
+ flash[:notice] = curation_concern.embargo_history.last
19
+ if curation_concern.work? && curation_concern.file_sets.present?
20
+ redirect_to confirm_curation_concerns_permission_path(curation_concern)
21
+ else
22
+ redirect_to edit_embargo_path(curation_concern)
17
23
  end
24
+ end
18
25
 
19
- def update
20
- filter_docs_with_edit_access!
21
- copy_visibility = params[:embargoes].values.map { |h| h[:copy_visibility] }
22
- batch.each do |id|
23
- ActiveFedora::Base.find(id).tap do |curation_concern|
24
- remove_embargo(curation_concern)
25
- curation_concern.copy_visibility_to_files if copy_visibility.include?(id)
26
- end
27
- end
28
- redirect_to embargoes_path
26
+ # Updates a batch of embargos
27
+ def update
28
+ filter_docs_with_edit_access!
29
+ copy_visibility = params[:embargoes].values.map { |h| h[:copy_visibility] }
30
+ ActiveFedora::Base.find(batch).each do |curation_concern|
31
+ EmbargoActor.new(curation_concern).destroy
32
+ curation_concern.copy_visibility_to_files if copy_visibility.include?(curation_concern.id)
29
33
  end
34
+ redirect_to embargoes_path
30
35
  end
31
36
 
32
37
  protected
33
38
 
34
- def _prefixes
35
- # This allows us to use the unauthorized template in curation_concerns/base
36
- @_prefixes ||= super + ['curation_concerns/base']
37
- end
38
- def remove_embargo(work)
39
- work.embargo_visibility! # If the embargo has lapsed, update the current visibility.
40
- work.deactivate_embargo!
41
- work.save
42
- end
39
+ def _prefixes
40
+ # This allows us to use the unauthorized template in curation_concerns/base
41
+ @_prefixes ||= super + ['curation_concerns/base']
42
+ end
43
43
  end
44
44
  end
@@ -0,0 +1,198 @@
1
+ module CurationConcerns
2
+ module FileSetsControllerBehavior
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ include CurationConcerns::ThemedLayoutController
7
+ with_themed_layout '1_column'
8
+ load_and_authorize_resource class: ::FileSet, except: :show
9
+ helper_method :curation_concern
10
+ include CurationConcerns::ParentContainer
11
+ include Blacklight::Base
12
+ include Hydra::Controller::SearchBuilder
13
+ copy_blacklight_config_from(::CatalogController)
14
+ end
15
+
16
+ def curation_concern
17
+ @file_set
18
+ end
19
+
20
+ # routed to /files/new
21
+ def new
22
+ end
23
+
24
+ # routed to /files/:id/edit
25
+ def edit
26
+ @groups = current_user.groups
27
+ end
28
+
29
+ # routed to /files (POST)
30
+ def create
31
+ create_from_upload(params)
32
+ end
33
+
34
+ def create_from_upload(params)
35
+ # check error condition No files
36
+ return render_json_response(response_type: :bad_request, options: { message: 'Error! No file to save' }) unless params.key?(:file_set) && params.fetch(:file_set).key?(:files)
37
+
38
+ file = params[:file_set][:files].detect { |f| f.respond_to?(:original_filename) }
39
+ if !file
40
+ render_json_response(response_type: :bad_request, options: { message: 'Error! No file for upload', description: 'unknown file' })
41
+ elsif empty_file?(file)
42
+ render_json_response(response_type: :unprocessable_entity, options: { errors: { files: "#{file.original_filename} has no content! (Zero length file)" }, description: t('curation_concerns.api.unprocessable_entity.empty_file') })
43
+ else
44
+ process_file(file)
45
+ end
46
+ rescue RSolr::Error::Http => error
47
+ logger.error "FileSetController::create rescued #{error.class}\n\t#{error}\n #{error.backtrace.join("\n")}\n\n"
48
+ render_json_response(response_type: :internal_error, options: { message: 'Error occurred while creating generic file.' })
49
+ ensure
50
+ # remove the tempfile (only if it is a temp file)
51
+ file.tempfile.delete if file.respond_to?(:tempfile)
52
+ end
53
+
54
+ # routed to /files/:id
55
+ def show
56
+ respond_to do |wants|
57
+ wants.html do
58
+ _, document_list = search_results(params, [:add_access_controls_to_solr_params, :find_one, :only_file_sets])
59
+ curation_concern = document_list.first
60
+ raise CanCan::AccessDenied unless curation_concern
61
+ @presenter = show_presenter.new(curation_concern, current_ability)
62
+ end
63
+ wants.json do
64
+ # load and authorize @curation_concern manually because it's skipped for html
65
+ @file_set = curation_concern_type.load_instance_from_solr(params[:id]) unless curation_concern
66
+ authorize! :show, @file_set
67
+ render :show, status: :ok
68
+ end
69
+ additional_response_formats(wants)
70
+ end
71
+ end
72
+
73
+ # Gives the class of the show presenter. Override this if you want
74
+ # to use a different presenter.
75
+ def show_presenter
76
+ CurationConcerns::FileSetPresenter
77
+ end
78
+
79
+ def destroy
80
+ actor.destroy
81
+ redirect_to [main_app, :curation_concerns, @file_set.in_works.first], notice: 'The file has been deleted.'
82
+ end
83
+
84
+ # routed to /files/:id (PUT)
85
+ def update
86
+ success = if wants_to_revert?
87
+ actor.revert_content(params[:revision])
88
+ elsif params.key?(:file_set)
89
+ if params[:file_set].key?(:files)
90
+ actor.update_content(params[:file_set][:files].first)
91
+ else
92
+ update_metadata
93
+ end
94
+ end
95
+ if success
96
+ respond_to do |wants|
97
+ wants.html do
98
+ redirect_to [main_app, :curation_concerns, @file_set], notice:
99
+ "The file #{view_context.link_to(@file_set, [main_app, :curation_concerns, @file_set])} has been updated."
100
+ end
101
+ wants.json { render :show, status: :ok, location: polymorphic_path([main_app, :curation_concerns, @file_set]) }
102
+ end
103
+ else
104
+ respond_to do |wants|
105
+ wants.html { render 'edit', status: :unprocessable_entity }
106
+ wants.json { render_json_response(response_type: :unprocessable_entity, options: { errors: @file_set.errors }) }
107
+ end
108
+ end
109
+ rescue RSolr::Error::Http => error
110
+ flash[:error] = error.message
111
+ logger.error "FileSetsController::update rescued #{error.class}\n\t#{error.message}\n #{error.backtrace.join("\n")}\n\n"
112
+ render action: 'edit'
113
+ end
114
+
115
+ def versions
116
+ @version_list = version_list
117
+ end
118
+
119
+ # this is provided so that implementing application can override this behavior and map params to different attributes
120
+ def update_metadata
121
+ file_attributes = CurationConcerns::Forms::FileSetEditForm.model_attributes(attributes)
122
+ actor.update_metadata(file_attributes)
123
+ end
124
+
125
+ protected
126
+
127
+ # Override this method to add additional response
128
+ # formats to your local app
129
+ def additional_response_formats(_)
130
+ # nop
131
+ end
132
+
133
+ def file_set_params
134
+ params.require(:file_set).permit(
135
+ :visibility_during_embargo, :embargo_release_date, :visibility_after_embargo, :visibility_during_lease, :lease_expiration_date, :visibility_after_lease, :visibility, title: [])
136
+ end
137
+
138
+ def version_list
139
+ CurationConcerns::VersionListPresenter.new(@file_set.original_file.versions.all)
140
+ end
141
+
142
+ def wants_to_revert?
143
+ params.key?(:revision) && params[:revision] != @file_set.latest_content_version.label
144
+ end
145
+
146
+ def actor
147
+ @actor ||= ::CurationConcerns::FileSetActor.new(@file_set, current_user)
148
+ end
149
+
150
+ def attributes
151
+ # params.fetch(:file_set, {}).dup # use a copy of the hash so that original params stays untouched when interpret_visibility modifies things
152
+ params.fetch(:file_set, {}).except(:files).permit!.dup # use a copy of the hash so that original params stays untouched when interpret_visibility modifies things
153
+ end
154
+
155
+ def _prefixes
156
+ # This allows us to use the unauthorized and form_permission template in curation_concerns/base
157
+ @_prefixes ||= super + ['curation_concerns/base']
158
+ end
159
+
160
+ def empty_file?(file)
161
+ (file.respond_to?(:tempfile) && file.tempfile.size == 0) || (file.respond_to?(:size) && file.size == 0)
162
+ end
163
+
164
+ def process_file(file)
165
+ update_metadata_from_upload_screen
166
+ parent = ActiveFedora::Base.find(parent_id)
167
+ actor.create_metadata(params[:upload_set_id], parent, params[:file_set])
168
+ if actor.create_content(file)
169
+ respond_to do |format|
170
+ format.html do
171
+ if request.xhr?
172
+ render 'jq_upload', formats: 'json', content_type: 'text/html'
173
+ else
174
+ redirect_to [main_app, :curation_concerns, @file_set.in_works.first]
175
+ end
176
+ end
177
+ format.json do
178
+ render 'jq_upload', status: :created, location: polymorphic_path([main_app, :curation_concerns, curation_concern])
179
+ end
180
+ end
181
+ else
182
+ msg = @file_set.errors.full_messages.join(', ')
183
+ flash[:error] = msg
184
+ json_error "Error creating generic file: #{msg}"
185
+ end
186
+ end
187
+
188
+ # this is provided so that implementing application can override this behavior and map params to different attributes
189
+ def update_metadata_from_upload_screen
190
+ # Relative path is set by the jquery uploader when uploading a directory
191
+ @file_set.relative_path = params[:relative_path] if params[:relative_path]
192
+ end
193
+
194
+ def curation_concern_type
195
+ ::FileSet
196
+ end
197
+ end
198
+ end
@@ -1,36 +1,43 @@
1
1
  module CurationConcerns
2
2
  module LeasesControllerBehavior
3
3
  extend ActiveSupport::Concern
4
+ include CurationConcerns::ManagesEmbargoes
5
+ include Hydra::Collections::AcceptsBatches
4
6
 
5
7
  included do
6
- skip_before_filter :normalize_identifier, only: :update
8
+ skip_before_action :normalize_identifier, only: :update
9
+ end
10
+
11
+ def index
12
+ authorize! :index, Hydra::AccessControls::Lease
13
+ end
7
14
 
8
- def destroy
9
- curation_concern.lease_visibility! # If the lease has lapsed, update the current visibility.
10
- curation_concern.deactivate_lease!
11
- saved = curation_concern.save
12
- CurationConcerns.queue.push(VisibilityCopyWorker.new(curation_concern.id)) if saved
13
- flash[:notice] = curation_concern.lease_history.last
15
+ # Removes a single lease
16
+ def destroy
17
+ LeaseActor.new(curation_concern).destroy
18
+ flash[:notice] = curation_concern.lease_history.last
19
+ if curation_concern.work? && curation_concern.file_sets.present?
20
+ redirect_to confirm_curation_concerns_permission_path(curation_concern)
21
+ else
14
22
  redirect_to edit_lease_path(curation_concern)
15
23
  end
24
+ end
16
25
 
17
- def update
18
- filter_docs_with_edit_access!
19
- batch.each do |id|
20
- ActiveFedora::Base.find(id).tap do |curation_concern|
21
- curation_concern.deactivate_lease!
22
- curation_concern.save
23
- end
24
- end
25
- redirect_to leases_path
26
+ def update
27
+ filter_docs_with_edit_access!
28
+ copy_visibility = params[:leases].values.map { |h| h[:copy_visibility] }
29
+ ActiveFedora::Base.find(batch).each do |curation_concern|
30
+ LeaseActor.new(curation_concern).destroy
31
+ curation_concern.copy_visibility_to_files if copy_visibility.include?(curation_concern.id)
26
32
  end
33
+ redirect_to leases_path
27
34
  end
28
35
 
29
36
  protected
30
37
 
31
- def _prefixes
32
- # This allows us to use the unauthorized template in curation_concerns/base
33
- @_prefixes ||= super + ['curation_concerns/base']
34
- end
38
+ def _prefixes
39
+ # This allows us to use the unauthorized template in curation_concerns/base
40
+ @_prefixes ||= super + ['curation_concerns/base']
41
+ end
35
42
  end
36
43
  end
@@ -9,15 +9,10 @@ module CurationConcerns
9
9
  attr_accessor :curation_concern
10
10
  helper_method :curation_concern
11
11
  load_and_authorize_resource class: ActiveFedora::Base, instance_name: :curation_concern
12
-
13
- def deny_access(exception)
14
- redirect_to root_path, alert: exception.message
15
- end
16
12
  end
17
13
 
18
-
19
- def index
20
- authorize! :discover, :embargo
14
+ def deny_access(exception)
15
+ redirect_to root_path, alert: exception.message
21
16
  end
22
17
 
23
18
  def edit
@@ -6,18 +6,35 @@ module CurationConcerns::ParentContainer
6
6
  # before_filter :authorize_edit_parent_rights!, except: [:show] # Not sure we actually want this enforced any more (was originally in worthwhile), especially since GenericFiles and GenericWorks (which are PCDM::Objects)can belong to multiple parents
7
7
  end
8
8
 
9
+ # TODO: this is slow, refactor to return a Presenter (fetch from solr)
9
10
  def parent
10
- @parent ||= new_or_create? ? ActiveFedora::Base.find(parent_id) : curation_concern.parent_objects.first # parent_objects method is inherited from Hydra::PCDM::ObjectBehavior
11
+ @parent ||= new_or_create? ? find_parent_by_id : lookup_parent_from_child
12
+ end
13
+
14
+ def find_parent_by_id
15
+ ActiveFedora::Base.find(parent_id)
16
+ end
17
+
18
+ def lookup_parent_from_child
19
+ if curation_concern
20
+ # in_objects method is inherited from Hydra::PCDM::ObjectBehavior
21
+ curation_concern.in_objects.first
22
+ elsif @presenter
23
+
24
+ CurationConcerns::ParentService.parent_for(@presenter.id)
25
+ else
26
+ raise "no child"
27
+ end
11
28
  end
12
29
 
13
30
  def parent_id
14
- @parent_id ||= new_or_create? ? params[:parent_id] : curation_concern.generic_works.parent_objects.first.id
31
+ @parent_id ||= new_or_create? ? params[:parent_id] : curation_concern.generic_works.in_objects.first.id
15
32
  end
16
33
 
17
34
  protected
18
35
 
19
36
  def new_or_create?
20
- ['create', 'new'].include? action_name
37
+ %w(create new).include? action_name
21
38
  end
22
39
 
23
40
  def namespaced_parent_id
@@ -29,5 +46,4 @@ module CurationConcerns::ParentContainer
29
46
  def authorize_edit_parent_rights!
30
47
  authorize! :edit, parent_id
31
48
  end
32
-
33
49
  end
@@ -0,0 +1,48 @@
1
+ module CurationConcerns
2
+ module SingleUseLinksControllerBehavior
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ before_action :authenticate_user!
6
+ before_action :authorize_user!
7
+ # Catch permission errors
8
+ rescue_from Hydra::AccessDenied, CanCan::AccessDenied do |exception|
9
+ if current_user && current_user.persisted?
10
+ redirect_to main_app.root_url, alert: "You do not have sufficient privileges to create links to this document"
11
+ else
12
+ session["user_return_to"] = request.url
13
+ redirect_to new_user_session_url, alert: exception.message
14
+ end
15
+ end
16
+ end
17
+
18
+ def new_download
19
+ @su = SingleUseLink.create itemId: params[:id], path: main_app.download_path(id: asset)
20
+ @link = curation_concerns.download_single_use_link_path(@su.downloadKey)
21
+
22
+ respond_to do |format|
23
+ format.html
24
+ format.js { render js: @link }
25
+ end
26
+ end
27
+
28
+ def new_show
29
+ @su = SingleUseLink.create itemId: params[:id], path: polymorphic_path([main_app, :curation_concerns, asset])
30
+ @link = curation_concerns.show_single_use_link_path(@su.downloadKey)
31
+
32
+ respond_to do |format|
33
+ format.html
34
+ format.js { render js: @link }
35
+ end
36
+ end
37
+
38
+ protected
39
+
40
+ def authorize_user!
41
+ authorize! :edit, asset
42
+ end
43
+
44
+ def asset
45
+ @asset ||= ActiveFedora::Base.load_instance_from_solr(params[:id])
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,75 @@
1
+ module CurationConcerns
2
+ module SingleUseLinksViewerControllerBehavior
3
+ extend ActiveSupport::Concern
4
+ include CurationConcerns::DownloadBehavior
5
+ include Blacklight::Base
6
+ include Hydra::Controller::SearchBuilder
7
+
8
+ included do
9
+ include ActionDispatch::Routing::PolymorphicRoutes
10
+
11
+ skip_before_action :authorize_download!, only: :show
12
+ rescue_from CurationConcerns::SingleUseError, with: :render_single_use_error
13
+ rescue_from CanCan::AccessDenied, with: :render_single_use_error
14
+ rescue_from ActiveRecord::RecordNotFound, with: :render_single_use_error
15
+ class_attribute :presenter_class
16
+ self.presenter_class = CurationConcerns::FileSetPresenter
17
+ copy_blacklight_config_from(::CatalogController)
18
+ end
19
+
20
+ def download
21
+ raise not_found_exception unless single_use_link.path == main_app.download_path(id: @asset)
22
+ send_content
23
+ end
24
+
25
+ def show
26
+ _, document_list = search_results({ id: single_use_link.itemId }, [:find_one])
27
+ curation_concern = document_list.first
28
+
29
+ # Authorize using SingleUseLinksViewerController::Ability
30
+ authorize! :read, curation_concern
31
+
32
+ raise not_found_exception unless single_use_link.path == polymorphic_path([main_app, :curation_concerns, curation_concern])
33
+
34
+ # show the file
35
+ @presenter = presenter_class.new(curation_concern, current_ability)
36
+
37
+ # create a dowload link that is single use for the user since we do not just want to show metadata we want to access it too
38
+ @su = single_use_link.create_for_path main_app.download_path(curation_concern.id)
39
+ @download_link = curation_concerns.download_single_use_link_path(@su.downloadKey)
40
+ end
41
+
42
+ protected
43
+
44
+ # This is called in a before filter. It causes @asset to be set.
45
+ def authorize_download!
46
+ authorize! :read, asset
47
+ end
48
+
49
+ def single_use_link
50
+ @single_use_link ||= SingleUseLink.find_by_downloadKey!(params[:id])
51
+ end
52
+
53
+ def not_found_exception
54
+ CurationConcerns::SingleUseError.new('Single-Use Link Not Found')
55
+ end
56
+
57
+ def asset
58
+ @asset ||= ActiveFedora::Base.find(single_use_link.itemId)
59
+ end
60
+
61
+ def current_ability
62
+ @current_ability ||= SingleUseLinksViewerController::Ability.new current_user, single_use_link
63
+ end
64
+
65
+ def render_single_use_error(exception)
66
+ logger.error("Rendering PAGE due to exception: #{exception.inspect} - #{exception.backtrace if exception.respond_to? :backtrace}")
67
+ render template: '/error/single_use_error', layout: "error", formats: [:html], status: 404
68
+ end
69
+
70
+ def _prefixes
71
+ # This allows us to use the attributes templates in curation_concerns/base
72
+ @_prefixes ||= super + ['curation_concerns/base']
73
+ end
74
+ end
75
+ end
@@ -27,5 +27,4 @@ module CurationConcerns::ThemedLayoutController
27
27
  def show_site_search?
28
28
  true
29
29
  end
30
-
31
30
  end
@@ -0,0 +1,38 @@
1
+ module CurationConcerns
2
+ module UploadSetsControllerBehavior
3
+ extend ActiveSupport::Concern
4
+ include Hydra::Controller::ControllerBehavior
5
+
6
+ included do
7
+ include CurationConcerns::ThemedLayoutController
8
+ with_themed_layout '1_column'
9
+
10
+ class_attribute :edit_form_class
11
+ self.edit_form_class = CurationConcerns::Forms::FileSetEditForm
12
+ end
13
+
14
+ def edit
15
+ @upload_set = UploadSet.find_or_create(params[:id])
16
+ @form = edit_form
17
+ end
18
+
19
+ def update
20
+ authenticate_user!
21
+ @upload_set = UploadSet.find_or_create(params[:id])
22
+ @upload_set.status = ["processing"]
23
+ @upload_set.save
24
+ file_attributes = edit_form_class.model_attributes(params[:file_set])
25
+ UploadSetUpdateJob.perform_later(current_user.user_key, params[:id], params[:title], file_attributes, params[:visibility])
26
+ flash[:notice] = 'Your files are being processed by ' + t('curation_concerns.product_name') + ' in the background. The metadata and access controls you specified are being applied. Files will be marked <span class="label label-danger" title="Private">Private</span> until this process is complete (shouldn\'t take too long, hang in there!). You may need to refresh your dashboard to see these updates.'
27
+
28
+ redirect_to main_app.curation_concerns_generic_works_path
29
+ end
30
+
31
+ protected
32
+
33
+ def edit_form
34
+ file_set = ::FileSet.new(creator: [current_user.user_key], title: @upload_set.file_sets.map(&:label))
35
+ edit_form_class.new(file_set)
36
+ end
37
+ end
38
+ end