curation_concerns 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (424) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +18 -0
  5. data/Gemfile +31 -0
  6. data/LICENSE.txt +15 -0
  7. data/README.md +46 -0
  8. data/RELEASING.md +2 -0
  9. data/Rakefile +26 -0
  10. data/VERSION +1 -0
  11. data/app/assets/images/default.png +0 -0
  12. data/app/assets/images/nope.png +0 -0
  13. data/app/assets/javascripts/.gitkeep +0 -0
  14. data/app/assets/javascripts/curation_concerns/.gitkeep +0 -0
  15. data/app/assets/javascripts/curation_concerns/application.js +18 -0
  16. data/app/assets/javascripts/curation_concerns/browse_everything_implement.js +7 -0
  17. data/app/assets/javascripts/curation_concerns/curation_concerns.js +28 -0
  18. data/app/assets/javascripts/curation_concerns/embargoes.js +17 -0
  19. data/app/assets/javascripts/curation_concerns/facet_mine.js +22 -0
  20. data/app/assets/javascripts/curation_concerns/help_modal.js +36 -0
  21. data/app/assets/javascripts/curation_concerns/link_groups.js.coffee +123 -0
  22. data/app/assets/javascripts/curation_concerns/link_users.js.coffee +126 -0
  23. data/app/assets/javascripts/curation_concerns/proxy_rights.js.coffee +95 -0
  24. data/app/assets/javascripts/curation_concerns/proxy_submission.js +23 -0
  25. data/app/assets/javascripts/curation_concerns/select_works.js.coffee +20 -0
  26. data/app/assets/javascripts/modernizr.js +3 -0
  27. data/app/assets/stylesheets/curation_concerns/_curation_concerns.scss +9 -0
  28. data/app/assets/stylesheets/curation_concerns/_global-variables.scss +5 -0
  29. data/app/assets/stylesheets/curation_concerns/_modules.scss +13 -0
  30. data/app/assets/stylesheets/curation_concerns/_positioning.scss +138 -0
  31. data/app/assets/stylesheets/curation_concerns/_theme.scss +46 -0
  32. data/app/assets/stylesheets/curation_concerns/_typography.scss +137 -0
  33. data/app/assets/stylesheets/curation_concerns/_variables_bootstrap.scss +7 -0
  34. data/app/assets/stylesheets/curation_concerns/downloads.scss +3 -0
  35. data/app/assets/stylesheets/curation_concerns/help_requests.scss +3 -0
  36. data/app/assets/stylesheets/curation_concerns/modules/accessibility.scss +50 -0
  37. data/app/assets/stylesheets/curation_concerns/modules/accordion.scss +33 -0
  38. data/app/assets/stylesheets/curation_concerns/modules/attributes.scss +31 -0
  39. data/app/assets/stylesheets/curation_concerns/modules/classify_work.scss +100 -0
  40. data/app/assets/stylesheets/curation_concerns/modules/embargoes.scss +15 -0
  41. data/app/assets/stylesheets/curation_concerns/modules/emphatic_action_area.scss +14 -0
  42. data/app/assets/stylesheets/curation_concerns/modules/forms.scss +116 -0
  43. data/app/assets/stylesheets/curation_concerns/modules/multi_value_fields.scss +52 -0
  44. data/app/assets/stylesheets/curation_concerns/modules/pagination.scss +4 -0
  45. data/app/assets/stylesheets/curation_concerns/modules/search_results.scss +55 -0
  46. data/app/assets/stylesheets/curation_concerns/modules/site_actions.scss +53 -0
  47. data/app/assets/stylesheets/curation_concerns/modules/site_search.scss +46 -0
  48. data/app/controllers/catalog_controller.rb +3 -0
  49. data/app/controllers/collections_controller.rb +3 -0
  50. data/app/controllers/concerns/curation_concerns/application_controller_behavior.rb +28 -0
  51. data/app/controllers/concerns/curation_concerns/catalog_controller.rb +321 -0
  52. data/app/controllers/concerns/curation_concerns/collections_controller_behavior.rb +76 -0
  53. data/app/controllers/concerns/curation_concerns/curation_concern_controller.rb +125 -0
  54. data/app/controllers/concerns/curation_concerns/download_behavior.rb +60 -0
  55. data/app/controllers/concerns/curation_concerns/embargoes_controller_behavior.rb +44 -0
  56. data/app/controllers/concerns/curation_concerns/generic_files_controller_behavior.rb +149 -0
  57. data/app/controllers/concerns/curation_concerns/leases_controller_behavior.rb +36 -0
  58. data/app/controllers/concerns/curation_concerns/manages_embargoes.rb +26 -0
  59. data/app/controllers/concerns/curation_concerns/parent_container.rb +33 -0
  60. data/app/controllers/concerns/curation_concerns/themed_layout_controller.rb +31 -0
  61. data/app/controllers/concerns/curation_concerns/without_namespace.rb +15 -0
  62. data/app/controllers/curation_concerns/application_controller.rb +7 -0
  63. data/app/controllers/curation_concerns/classify_concerns_controller.rb +35 -0
  64. data/app/controllers/curation_concerns/generic_files_controller.rb +13 -0
  65. data/app/controllers/curation_concerns/permissions_controller.rb +19 -0
  66. data/app/controllers/downloads_controller.rb +4 -0
  67. data/app/controllers/embargoes_controller.rb +5 -0
  68. data/app/controllers/leases_controller.rb +5 -0
  69. data/app/controllers/registrations_controller.rb +20 -0
  70. data/app/controllers/sessions_controller.rb +4 -0
  71. data/app/datastreams/curation_concerns/generic_work_rdf_properties.rb +57 -0
  72. data/app/datastreams/generic_work_metadata.rb +3 -0
  73. data/app/forms/curation_concerns/forms/collection_edit_form.rb +17 -0
  74. data/app/forms/curation_concerns/forms/generic_file_edit_form.rb +15 -0
  75. data/app/forms/curation_concerns/forms/generic_work_edit_form.rb +9 -0
  76. data/app/helpers/curation_concerns/ability_helper.rb +46 -0
  77. data/app/helpers/curation_concerns/attribute_helper.rb +67 -0
  78. data/app/helpers/curation_concerns/catalog_helper.rb +38 -0
  79. data/app/helpers/curation_concerns/collections_helper.rb +63 -0
  80. data/app/helpers/curation_concerns/embargo_helper.rb +17 -0
  81. data/app/helpers/curation_concerns/generic_file_helper.rb +19 -0
  82. data/app/helpers/curation_concerns/lease_helper.rb +18 -0
  83. data/app/helpers/curation_concerns/main_app_helpers.rb +13 -0
  84. data/app/helpers/curation_concerns/render_constraints_helper.rb +42 -0
  85. data/app/helpers/curation_concerns/search_paths_helper.rb +13 -0
  86. data/app/helpers/curation_concerns/thumbnail_helper.rb +11 -0
  87. data/app/helpers/curation_concerns/title_helper.rb +23 -0
  88. data/app/helpers/curation_concerns/url_helper.rb +29 -0
  89. data/app/presenters/curation_concerns/collection_presenter.rb +40 -0
  90. data/app/presenters/curation_concerns/generic_file_presenter.rb +14 -0
  91. data/app/presenters/curation_concerns/generic_work_presenter.rb +13 -0
  92. data/app/search_builders/curation_concerns/search_builder.rb +49 -0
  93. data/app/services/curation_concerns/curation_concern.rb +14 -0
  94. data/app/services/curation_concerns/embargo_service.rb +26 -0
  95. data/app/services/curation_concerns/lease_service.rb +23 -0
  96. data/app/views/catalog/_action_menu_partials/_collection.html.erb +27 -0
  97. data/app/views/catalog/_action_menu_partials/_default.html.erb +27 -0
  98. data/app/views/catalog/_document.html.erb +3 -0
  99. data/app/views/catalog/_document_list.html.erb +5 -0
  100. data/app/views/catalog/_home_text.html.erb +8 -0
  101. data/app/views/catalog/_index_default.html.erb +17 -0
  102. data/app/views/catalog/_index_header_list_default.html.erb +8 -0
  103. data/app/views/catalog/_navbar.html.erb +12 -0
  104. data/app/views/catalog/_show_partials/_default.html.erb +22 -0
  105. data/app/views/catalog/_show_partials/_default_details.html.erb +15 -0
  106. data/app/views/catalog/_show_partials/_facets.html.erb +52 -0
  107. data/app/views/catalog/index.html.erb +47 -0
  108. data/app/views/collections/_add_to_collection_modal.html.erb +15 -0
  109. data/app/views/collections/_batch_edits_actions.html.erb +3 -0
  110. data/app/views/collections/_button_for_creating_empty_collection.html.erb +3 -0
  111. data/app/views/collections/_collection.html.erb +1 -0
  112. data/app/views/collections/_dashboard_document_list.html.erb +6 -0
  113. data/app/views/collections/_document_list.html.erb +7 -0
  114. data/app/views/collections/_edit_actions.html.erb +5 -0
  115. data/app/views/collections/_edit_descriptions.html.erb +20 -0
  116. data/app/views/collections/_form.html.erb +26 -0
  117. data/app/views/collections/_form_additional_information.html.erb +6 -0
  118. data/app/views/collections/_form_for_select_collection.html.erb +34 -0
  119. data/app/views/collections/_form_permission.html.erb +36 -0
  120. data/app/views/collections/_form_representative_image.html.erb +13 -0
  121. data/app/views/collections/_form_required_information.html.erb +11 -0
  122. data/app/views/collections/_form_to_add_member.html.erb +21 -0
  123. data/app/views/collections/_identifier_and_action.html.erb +15 -0
  124. data/app/views/collections/_media_display.html.erb +1 -0
  125. data/app/views/collections/_paginate.html.erb +6 -0
  126. data/app/views/collections/_search_collection_dashboard_form.html.erb +10 -0
  127. data/app/views/collections/_show_actions.html.erb +8 -0
  128. data/app/views/collections/_show_descriptions.html.erb +10 -0
  129. data/app/views/collections/_show_fields.html.erb +0 -0
  130. data/app/views/collections/_single_item_action_fields.html.erb +6 -0
  131. data/app/views/collections/_sort_and_per_page.html.erb +29 -0
  132. data/app/views/collections/_view_type_group.html.erb +13 -0
  133. data/app/views/collections/edit.html.erb +17 -0
  134. data/app/views/collections/show.html.erb +24 -0
  135. data/app/views/curation_concerns/base/_attributes.html.erb +25 -0
  136. data/app/views/curation_concerns/base/_collections.html.erb +26 -0
  137. data/app/views/curation_concerns/base/_form.html.erb +25 -0
  138. data/app/views/curation_concerns/base/_form_additional_information.html.erb +7 -0
  139. data/app/views/curation_concerns/base/_form_content_license.html.erb +16 -0
  140. data/app/views/curation_concerns/base/_form_descriptive_fields.erb +11 -0
  141. data/app/views/curation_concerns/base/_form_editors.html.erb +15 -0
  142. data/app/views/curation_concerns/base/_form_files_and_links.html.erb +23 -0
  143. data/app/views/curation_concerns/base/_form_permission.html.erb +52 -0
  144. data/app/views/curation_concerns/base/_form_permission_embargo.html.erb +6 -0
  145. data/app/views/curation_concerns/base/_form_permission_lease.html.erb +6 -0
  146. data/app/views/curation_concerns/base/_form_permission_under_embargo.html.erb +16 -0
  147. data/app/views/curation_concerns/base/_form_permission_under_lease.html.erb +18 -0
  148. data/app/views/curation_concerns/base/_form_representative_image.html.erb +13 -0
  149. data/app/views/curation_concerns/base/_form_required_information.html.erb +11 -0
  150. data/app/views/curation_concerns/base/_form_supplementary_fields.html.erb +15 -0
  151. data/app/views/curation_concerns/base/_legally_binding_text.html.erb +33 -0
  152. data/app/views/curation_concerns/base/_related_files.html.erb +24 -0
  153. data/app/views/curation_concerns/base/_representative_media.html.erb +8 -0
  154. data/app/views/curation_concerns/base/edit.html.erb +13 -0
  155. data/app/views/curation_concerns/base/new.html.erb +12 -0
  156. data/app/views/curation_concerns/base/show.html.erb +21 -0
  157. data/app/views/curation_concerns/base/unauthorized.html.erb +3 -0
  158. data/app/views/curation_concerns/classify_concerns/new.html.erb +25 -0
  159. data/app/views/curation_concerns/collections/_form_additional_information.html.erb +6 -0
  160. data/app/views/curation_concerns/generic_files/_actions.html.erb +16 -0
  161. data/app/views/curation_concerns/generic_files/_form.html.erb +35 -0
  162. data/app/views/curation_concerns/generic_files/_generic_file.html.erb +12 -0
  163. data/app/views/curation_concerns/generic_files/_media_display.html.erb +19 -0
  164. data/app/views/curation_concerns/generic_files/edit.html.erb +5 -0
  165. data/app/views/curation_concerns/generic_files/jq_upload.json.jbuilder +8 -0
  166. data/app/views/curation_concerns/generic_files/show.html.erb +15 -0
  167. data/app/views/curation_concerns/permissions/confirm.html.erb +21 -0
  168. data/app/views/embargoes/_embargo_history.html.erb +7 -0
  169. data/app/views/embargoes/_list_active_embargoes.html.erb +16 -0
  170. data/app/views/embargoes/_list_deactivated_embargoes.html.erb +10 -0
  171. data/app/views/embargoes/_list_expired_active_embargoes.html.erb +44 -0
  172. data/app/views/embargoes/edit.html.erb +43 -0
  173. data/app/views/embargoes/index.html.erb +18 -0
  174. data/app/views/layouts/boilerplate.html.erb +22 -0
  175. data/app/views/layouts/curation_concerns/1_column.html.erb +11 -0
  176. data/app/views/layouts/curation_concerns/catalog.html.erb +37 -0
  177. data/app/views/layouts/curation_concerns.html.erb +22 -0
  178. data/app/views/leases/_lease_history.html.erb +7 -0
  179. data/app/views/leases/_list_active_leases.html.erb +16 -0
  180. data/app/views/leases/_list_deactivated_leases.html.erb +4 -0
  181. data/app/views/leases/_list_expired_active_leases.html.erb +38 -0
  182. data/app/views/leases/edit.html.erb +43 -0
  183. data/app/views/leases/index.html.erb +18 -0
  184. data/app/views/shared/_add_content.html.erb +32 -0
  185. data/app/views/shared/_brand_bar.html.erb +10 -0
  186. data/app/views/shared/_flash_message.html.erb +17 -0
  187. data/app/views/shared/_footer.html.erb +10 -0
  188. data/app/views/shared/_ga.html.erb +6 -0
  189. data/app/views/shared/_header.html.erb +12 -0
  190. data/app/views/shared/_my_actions.html.erb +21 -0
  191. data/app/views/shared/_site_actions.html.erb +7 -0
  192. data/app/views/shared/_site_search.html.erb +12 -0
  193. data/app/views/shared/_title_bar.html.erb +16 -0
  194. data/app/workers/visibility_copy_worker.rb +30 -0
  195. data/config/initializers/simple_form.rb +31 -0
  196. data/config/locales/curation_concerns.en.yml +96 -0
  197. data/config/routes.rb +4 -0
  198. data/curation_concerns-models/.gitignore +17 -0
  199. data/curation_concerns-models/Gemfile +4 -0
  200. data/curation_concerns-models/LICENSE.md +177 -0
  201. data/curation_concerns-models/README.md +42 -0
  202. data/curation_concerns-models/Rakefile +1 -0
  203. data/curation_concerns-models/app/actors/concerns/curation_concerns/manages_embargoes_actor.rb +99 -0
  204. data/curation_concerns-models/app/actors/curation_concerns/base_actor.rb +90 -0
  205. data/curation_concerns-models/app/actors/curation_concerns/generic_file_actor.rb +150 -0
  206. data/curation_concerns-models/app/actors/curation_concerns/work_actor_behavior.rb +88 -0
  207. data/curation_concerns-models/app/jobs/active_fedora_id_based_job.rb +22 -0
  208. data/curation_concerns-models/app/jobs/active_fedora_pid_based_job.rb +6 -0
  209. data/curation_concerns-models/app/jobs/audit_job.rb +58 -0
  210. data/curation_concerns-models/app/jobs/characterize_job.rb +11 -0
  211. data/curation_concerns-models/app/jobs/copy_permissions_job.rb +24 -0
  212. data/curation_concerns-models/app/jobs/create_derivatives_job.rb +15 -0
  213. data/curation_concerns-models/app/jobs/import_url_job.rb +56 -0
  214. data/curation_concerns-models/app/jobs/ingest_local_file_job.rb +48 -0
  215. data/curation_concerns-models/app/jobs/resolrize_job.rb +9 -0
  216. data/curation_concerns-models/app/models/checksum_audit_log.rb +21 -0
  217. data/curation_concerns-models/app/models/concerns/curation_concerns/ability.rb +34 -0
  218. data/curation_concerns-models/app/models/concerns/curation_concerns/basic_metadata.rb +87 -0
  219. data/curation_concerns-models/app/models/concerns/curation_concerns/collection_behavior.rb +47 -0
  220. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/belongs_to_works.rb +53 -0
  221. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/characterization.rb +89 -0
  222. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/content.rb +8 -0
  223. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/export.rb +343 -0
  224. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/full_text_indexing.rb +12 -0
  225. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/indexing.rb +14 -0
  226. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file/versions.rb +16 -0
  227. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file.rb +5 -0
  228. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_file_behavior.rb +44 -0
  229. data/curation_concerns-models/app/models/concerns/curation_concerns/generic_work_behavior.rb +38 -0
  230. data/curation_concerns-models/app/models/concerns/curation_concerns/has_representative.rb +14 -0
  231. data/curation_concerns-models/app/models/concerns/curation_concerns/human_readable_type.rb +23 -0
  232. data/curation_concerns-models/app/models/concerns/curation_concerns/permissions/readable.rb +19 -0
  233. data/curation_concerns-models/app/models/concerns/curation_concerns/permissions/writable.rb +75 -0
  234. data/curation_concerns-models/app/models/concerns/curation_concerns/permissions.rb +7 -0
  235. data/curation_concerns-models/app/models/concerns/curation_concerns/serializers.rb +15 -0
  236. data/curation_concerns-models/app/models/concerns/curation_concerns/solr_document_behavior.rb +135 -0
  237. data/curation_concerns-models/app/models/concerns/curation_concerns/user.rb +65 -0
  238. data/curation_concerns-models/app/models/concerns/curation_concerns/with_basic_metadata.rb +98 -0
  239. data/curation_concerns-models/app/models/concerns/curation_concerns/with_generic_files.rb +29 -0
  240. data/curation_concerns-models/app/models/curation_concerns/classify_concern.rb +47 -0
  241. data/curation_concerns-models/app/models/curation_concerns/quick_classification_query.rb +31 -0
  242. data/curation_concerns-models/app/models/datastreams/fits_datastream.rb +148 -0
  243. data/curation_concerns-models/app/models/version_committer.rb +2 -0
  244. data/curation_concerns-models/app/services/curation_concerns/characterization_service.rb +71 -0
  245. data/curation_concerns-models/app/services/curation_concerns/full_text_extraction_service.rb +38 -0
  246. data/curation_concerns-models/app/services/curation_concerns/generic_file_audit_service.rb +85 -0
  247. data/curation_concerns-models/app/services/curation_concerns/generic_file_indexing_service.rb +14 -0
  248. data/curation_concerns-models/app/services/curation_concerns/generic_work_indexing_service.rb +16 -0
  249. data/curation_concerns-models/app/services/curation_concerns/noid.rb +23 -0
  250. data/curation_concerns-models/app/services/curation_concerns/repository_audit_service.rb +9 -0
  251. data/curation_concerns-models/app/services/curation_concerns/versioning_service.rb +27 -0
  252. data/curation_concerns-models/config/locales/curation_concerns.en.yml +6 -0
  253. data/curation_concerns-models/curation_concerns-models.gemspec +34 -0
  254. data/curation_concerns-models/lib/curation_concerns/messages.rb +66 -0
  255. data/curation_concerns-models/lib/curation_concerns/models/engine.rb +61 -0
  256. data/curation_concerns-models/lib/curation_concerns/models/resque.rb +36 -0
  257. data/curation_concerns-models/lib/curation_concerns/models/utils.rb +22 -0
  258. data/curation_concerns-models/lib/curation_concerns/models/version.rb +5 -0
  259. data/curation_concerns-models/lib/curation_concerns/models.rb +32 -0
  260. data/curation_concerns-models/lib/generators/curation_concerns/models/abstract_migration_generator.rb +30 -0
  261. data/curation_concerns-models/lib/generators/curation_concerns/models/clamav_generator.rb +19 -0
  262. data/curation_concerns-models/lib/generators/curation_concerns/models/fulltext_generator.rb +28 -0
  263. data/curation_concerns-models/lib/generators/curation_concerns/models/install_generator.rb +70 -0
  264. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/app/models/collection.rb +4 -0
  265. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/app/models/generic_file.rb +4 -0
  266. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/clamav.rb +1 -0
  267. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/curation_concerns.rb +123 -0
  268. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/mime_types.rb +6 -0
  269. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/redis.yml +9 -0
  270. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/redis_config.rb +32 -0
  271. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/resque-pool.yml +1 -0
  272. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/resque_admin.rb +10 -0
  273. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/config/resque_config.rb +5 -0
  274. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/migrations/create_checksum_audit_logs.rb +19 -0
  275. data/curation_concerns-models/lib/generators/curation_concerns/models/templates/migrations/create_version_committers.rb +15 -0
  276. data/curation_concerns-models/lib/tasks/curation_concerns-models_tasks.rake +75 -0
  277. data/curation_concerns-models/lib/tasks/migrate.rake +13 -0
  278. data/curation_concerns-models/lib/tasks/resque.rake +13 -0
  279. data/curation_concerns-models/lib/tasks/solr_reindex.rake +8 -0
  280. data/curation_concerns.gemspec +46 -0
  281. data/lib/curation_concerns/configuration.rb +74 -0
  282. data/lib/curation_concerns/controller_resource.rb +10 -0
  283. data/lib/curation_concerns/engine.rb +20 -0
  284. data/lib/curation_concerns/rails/routes.rb +76 -0
  285. data/lib/curation_concerns/spec_support.rb +10 -0
  286. data/lib/curation_concerns/version.rb +3 -0
  287. data/lib/curation_concerns.rb +8 -0
  288. data/lib/generators/curation_concerns/install_generator.rb +103 -0
  289. data/lib/generators/curation_concerns/templates/curation_concerns.css.scss +3 -0
  290. data/lib/generators/curation_concerns/templates/curation_concerns.js +1 -0
  291. data/lib/generators/curation_concerns/templates/curation_concerns_config.rb +2 -0
  292. data/lib/generators/curation_concerns/templates/curation_concerns_helper.rb +4 -0
  293. data/lib/generators/curation_concerns/work/USAGE +19 -0
  294. data/lib/generators/curation_concerns/work/templates/README +13 -0
  295. data/lib/generators/curation_concerns/work/templates/actor.rb.erb +7 -0
  296. data/lib/generators/curation_concerns/work/templates/actor_spec.rb.erb +9 -0
  297. data/lib/generators/curation_concerns/work/templates/controller.rb.erb +7 -0
  298. data/lib/generators/curation_concerns/work/templates/controller_spec.rb.erb +9 -0
  299. data/lib/generators/curation_concerns/work/templates/model.rb.erb +7 -0
  300. data/lib/generators/curation_concerns/work/templates/model_spec.rb.erb +9 -0
  301. data/lib/generators/curation_concerns/work/work_generator.rb +78 -0
  302. data/solr_conf/conf/solrconfig.xml +223 -0
  303. data/spec/abilities/collection_abilities_spec.rb +48 -0
  304. data/spec/abilities/generic_file_abilities_spec.rb +62 -0
  305. data/spec/abilities/generic_work_abilities_spec.rb +58 -0
  306. data/spec/actors/curation_concerns/generic_file_actor_spec.rb +116 -0
  307. data/spec/actors/curation_concerns/manages_embargoes_actor_spec.rb +95 -0
  308. data/spec/actors/curation_concerns/work_actor_spec.rb +203 -0
  309. data/spec/controllers/catalog_controller_spec.rb +115 -0
  310. data/spec/controllers/curation_concerns/classify_concerns_controller_spec.rb +43 -0
  311. data/spec/controllers/curation_concerns/collections_controller_spec.rb +171 -0
  312. data/spec/controllers/curation_concerns/generic_files_controller_spec.rb +251 -0
  313. data/spec/controllers/curation_concerns/generic_works_controller_spec.rb +167 -0
  314. data/spec/controllers/curation_concerns/permissions_controller_spec.rb +29 -0
  315. data/spec/controllers/downloads_controller_spec.rb +51 -0
  316. data/spec/controllers/embargoes_controller_spec.rb +114 -0
  317. data/spec/controllers/leases_controller_spec.rb +94 -0
  318. data/spec/factories/collections.rb +15 -0
  319. data/spec/factories/create_curation_concern.rb +3 -0
  320. data/spec/factories/generic_files.rb +31 -0
  321. data/spec/factories/generic_works.rb +54 -0
  322. data/spec/factories/users.rb +28 -0
  323. data/spec/features/add_file_spec.rb +30 -0
  324. data/spec/features/collection_spec.rb +222 -0
  325. data/spec/features/create_work_spec.rb +43 -0
  326. data/spec/features/embargo_spec.rb +51 -0
  327. data/spec/features/lease_spec.rb +49 -0
  328. data/spec/features/update_file_spec.rb +32 -0
  329. data/spec/features/work_generator_spec.rb +58 -0
  330. data/spec/fixtures/Example.ogg +0 -0
  331. data/spec/fixtures/charter.docx +0 -0
  332. data/spec/fixtures/countdown.avi +0 -0
  333. data/spec/fixtures/curation_concerns_generic_stub.txt +1 -0
  334. data/spec/fixtures/files/image.png +0 -0
  335. data/spec/fixtures/image.jp2 +0 -0
  336. data/spec/fixtures/image.jpg +0 -0
  337. data/spec/fixtures/piano_note.wav +0 -0
  338. data/spec/fixtures/sample_mpeg4.mp4 +0 -0
  339. data/spec/fixtures/small_file.txt +1 -0
  340. data/spec/fixtures/spoken-text.m4a +0 -0
  341. data/spec/fixtures/test4.pdf +0 -0
  342. data/spec/fixtures/test5.mp3 +0 -0
  343. data/spec/fixtures/world.png +0 -0
  344. data/spec/forms/collection_edit_form_spec.rb +20 -0
  345. data/spec/forms/generic_file_edit_form_spec.rb +33 -0
  346. data/spec/helpers/catalog_helper_spec.rb +58 -0
  347. data/spec/helpers/configuration_helper_spec.rb +13 -0
  348. data/spec/helpers/curation_concerns/.keep +0 -0
  349. data/spec/helpers/curation_concerns/collections_helper_spec.rb +49 -0
  350. data/spec/helpers/render_constraints_helper_spec.rb +19 -0
  351. data/spec/helpers/thumbnail_helper_spec.rb +21 -0
  352. data/spec/helpers/url_helper_spec.rb +22 -0
  353. data/spec/jobs/active_fedora_id_based_job_spec.rb +14 -0
  354. data/spec/jobs/audit_job_spec.rb +53 -0
  355. data/spec/jobs/characterize_job_spec.rb +23 -0
  356. data/spec/jobs/copy_permissions_job_spec.rb +49 -0
  357. data/spec/jobs/create_derivatives_job_spec.rb +23 -0
  358. data/spec/jobs/curation_concerns_resque_queue_spec.rb +49 -0
  359. data/spec/jobs/import_url_job_spec.rb +45 -0
  360. data/spec/jobs/ingest_local_file_job_spec.rb +25 -0
  361. data/spec/lib/curation_concerns/messages_spec.rb +70 -0
  362. data/spec/lib/curation_concerns/readable_permissions_spec.rb +56 -0
  363. data/spec/lib/curation_concerns/writable_permissions_spec.rb +16 -0
  364. data/spec/matchers/metadata_field_matchers.rb +28 -0
  365. data/spec/matchers/response_matchers.rb +7 -0
  366. data/spec/matchers.rb +24 -0
  367. data/spec/models/checksum_audit_log_spec.rb +66 -0
  368. data/spec/models/curation_concerns/collection_behavior_spec.rb +107 -0
  369. data/spec/models/curation_concerns/generic_file/derivatives_spec.rb +88 -0
  370. data/spec/models/curation_concerns/generic_work_behavior_spec.rb +35 -0
  371. data/spec/models/fits_datastream_spec.rb +127 -0
  372. data/spec/models/generic_file_spec.rb +619 -0
  373. data/spec/models/generic_work_spec.rb +43 -0
  374. data/spec/models/user_spec.rb +23 -0
  375. data/spec/presenters/curation_concerns/collection_presenter_spec.rb +34 -0
  376. data/spec/presenters/curation_concerns/generic_file_presenter_spec.rb +16 -0
  377. data/spec/routing/curation_concerns/routes_spec.rb +36 -0
  378. data/spec/routing/route_spec.rb +86 -0
  379. data/spec/services/characterization_service_spec.rb +30 -0
  380. data/spec/services/embargo_service_spec.rb +38 -0
  381. data/spec/services/full_text_extraction_service_spec.rb +5 -0
  382. data/spec/services/generic_file_audit_service_spec.rb +71 -0
  383. data/spec/services/generic_file_indexing_service_spec.rb +57 -0
  384. data/spec/services/generic_work_indexing_service_spec.rb +18 -0
  385. data/spec/services/lease_service_spec.rb +53 -0
  386. data/spec/services/repository_audit_service_spec.rb +18 -0
  387. data/spec/services/versioning_service_spec.rb +32 -0
  388. data/spec/spec_helper.rb +94 -0
  389. data/spec/support/controllers/engine_helpers.rb +7 -0
  390. data/spec/support/curation_concerns/factory_helpers.rb +14 -0
  391. data/spec/support/features/fixture_file_upload.rb +14 -0
  392. data/spec/support/features/session_helpers.rb +41 -0
  393. data/spec/support/features.rb +19 -0
  394. data/spec/support/shared/shared_examples_has_dc_metadata.rb +17 -0
  395. data/spec/support/shared/shared_examples_is_embargoable.rb +8 -0
  396. data/spec/support/shared/shared_examples_with_access_rights.rb +63 -0
  397. data/spec/tasks/rake_spec.rb +24 -0
  398. data/spec/test_app_templates/Gemfile.extra +1 -0
  399. data/spec/test_app_templates/lib/generators/test_app_generator.rb +55 -0
  400. data/spec/views/catalog/index.html.erb_spec.rb +59 -0
  401. data/spec/views/curation_concerns/base/_attributes.html.erb_spec.rb +25 -0
  402. data/spec/views/curation_concerns/base/show.html.erb_spec.rb +29 -0
  403. data/spec/views/curation_concerns/permissions/confirm.html.erb_spec.rb +33 -0
  404. data/spec/views/shared/_add_content.html.erb_spec.rb +42 -0
  405. data/spec/views/shared/_my_actions.html.erb_spec.rb +23 -0
  406. data/spec/workers/visibility_copy_worker_spec.rb +70 -0
  407. data/tasks/jetty.rake +15 -0
  408. data/tasks/release.rake +93 -0
  409. data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  410. data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  411. data/vendor/assets/javascripts/handlebars.js +2278 -0
  412. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.autocomplete.js +602 -0
  413. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.core.js +356 -0
  414. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect-highlight.js +50 -0
  415. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect.js +1276 -0
  416. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.menu.js +610 -0
  417. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.position.js +498 -0
  418. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.widget.js +528 -0
  419. data/vendor/assets/javascripts/jquery.tokeninput.js +1061 -0
  420. data/vendor/assets/stylesheets/jquery-ui-lightness.css +474 -0
  421. data/vendor/assets/stylesheets/token-input-facebook.css +122 -0
  422. data/vendor/assets/stylesheets/token-input-mac.css +204 -0
  423. data/vendor/assets/stylesheets/token-input.css +127 -0
  424. metadata +888 -0
@@ -0,0 +1,150 @@
1
+ module CurationConcerns
2
+ # Actions are decoupled from controller logic so that they may be called from a controller or a background job.
3
+ class GenericFileActor
4
+ include CurationConcerns::ManagesEmbargoesActor
5
+
6
+ attr_reader :generic_file, :user, :attributes, :curation_concern
7
+
8
+ def initialize(generic_file, user)
9
+ # we're setting attributes and curation_concern to bridge the difference
10
+ # between CurationConcerns::GenericFileActor and ManagesEmbargoesActor
11
+ @curation_concern = generic_file
12
+ @generic_file = generic_file
13
+ @user = user
14
+ end
15
+
16
+ # Adds the appropriate metadata, visibility and relationships to generic_file
17
+ #
18
+ # *Note*: In past versions of Sufia this method did not perform a save because it is mainly used in conjunction with
19
+ # create_content, which also performs a save. However, due to the relationship between Hydra::PCDM objects,
20
+ # we have to save both the parent work and the generic_file in order to record the "metadata" relationship
21
+ # between them.
22
+ # @param [String] batch_id id of the batch that the file was uploaded within
23
+ # @param [String] work_id id of the parent work that will contain the generic_file.
24
+ # @param [Hash] generic_file_params specifying the visibility, lease and/or embargo of the generic file. If you don't provide at least one of visibility, embargo_release_date or lease_expiration_date, visibility will be copied from the parent.
25
+
26
+ def create_metadata(batch_id, work_id, generic_file_params={})
27
+ generic_file.apply_depositor_metadata(user)
28
+ time_in_utc = DateTime.now.new_offset(0)
29
+ generic_file.date_uploaded = time_in_utc
30
+ generic_file.date_modified = time_in_utc
31
+ generic_file.creator = [user.name]
32
+ # TODO: Remove this? see https://github.com/projecthydra-labs/curation_concerns/issues/27
33
+ if batch_id && generic_file.respond_to?(:batch_id=)
34
+ generic_file.batch_id = batch_id
35
+ else
36
+ ActiveFedora::Base.logger.warn "unable to find batch to attach to"
37
+ end
38
+
39
+ unless work_id.blank?
40
+ work = ActiveFedora::Base.find(work_id)
41
+
42
+ if !((generic_file_params || {}).keys & ["visibility", "embargo_release_date", "lease_expiration_date"]).empty?
43
+ interpret_visibility generic_file_params
44
+ else
45
+ copy_visibility(work, generic_file)
46
+ end
47
+ work.generic_files << generic_file
48
+ # Save the work so the association between the work and the generic_file is persisted (head_id)
49
+ work.save
50
+ end
51
+ yield(generic_file) if block_given?
52
+ end
53
+
54
+ def create_content(file)
55
+ # Tell UploadFileToGenericFile service to skip versioning because versions will be minted by VersionCommitter (called by save_characterize_and_record_committer) when necessary
56
+ Hydra::Works::UploadFileToGenericFile.call(generic_file, file, versioning: false)
57
+ generic_file.label ||= file.original_filename
58
+ generic_file.title = [generic_file.label] if generic_file.title.blank?
59
+ save_characterize_and_record_committer do
60
+ if CurationConcerns.config.respond_to?(:after_create_content)
61
+ CurationConcerns.config.after_create_content.call(generic_file, user)
62
+ end
63
+ end
64
+ end
65
+
66
+ def revert_content(revision_id)
67
+ generic_file.original_file.restore_version(revision_id)
68
+ save_characterize_and_record_committer do
69
+ if CurationConcerns.config.respond_to?(:after_revert_content)
70
+ CurationConcerns.config.after_revert_content.call(generic_file, user, revision_id)
71
+ end
72
+ end
73
+ end
74
+
75
+ def update_content(file)
76
+ # Tell UploadFileToGenericFile service to skip versioning because versions will be minted by VersionCommitter (called by save_characterize_and_record_committer) when necessary
77
+ Hydra::Works::UploadFileToGenericFile.call(generic_file, file, versioning: false)
78
+ save_characterize_and_record_committer do
79
+ if CurationConcerns.config.respond_to?(:after_update_content)
80
+ CurationConcerns.config.after_update_content.call(generic_file, user)
81
+ end
82
+ end
83
+ end
84
+
85
+ def update_metadata(model_attributes, all_attributes)
86
+ update_visibility(all_attributes)
87
+ model_attributes.delete(:visibility) # Applying this attribute is handled by update_visibility
88
+ generic_file.attributes = model_attributes
89
+ generic_file.date_modified = DateTime.now
90
+ save do
91
+ if CurationConcerns.config.respond_to?(:after_update_metadata)
92
+ CurationConcerns.config.after_update_metadata.call(generic_file, user)
93
+ end
94
+ end
95
+ end
96
+
97
+ def destroy
98
+ generic_file.destroy
99
+ if CurationConcerns.config.respond_to?(:after_destroy)
100
+ CurationConcerns.config.after_destroy.call(generic_file.id, user)
101
+ end
102
+ end
103
+
104
+ # Saves the generic file, queues a job to characterize it, and records the committer.
105
+ # Takes a block which is run if the save was successful.
106
+ def save_characterize_and_record_committer
107
+ save do
108
+ push_characterize_job
109
+ CurationConcerns::VersioningService.create(generic_file.original_file, user)
110
+ yield if block_given?
111
+ end
112
+ end
113
+
114
+ # Takes an optional block and executes the block if the save was successful.
115
+ # returns false if the save was unsuccessful
116
+ def save
117
+ save_tries = 0
118
+ begin
119
+ return false unless generic_file.save
120
+ rescue RSolr::Error::Http => error
121
+ ActiveFedora::Base.logger.warn "CurationConcerns::GenericFileActor#save Caught RSOLR error #{error.inspect}"
122
+ save_tries+=1
123
+ # fail for good if the tries is greater than 3
124
+ raise error if save_tries >=3
125
+ sleep 0.01
126
+ retry
127
+ end
128
+ yield if block_given?
129
+ true
130
+ end
131
+
132
+ def push_characterize_job
133
+ CurationConcerns.queue.push(CharacterizeJob.new(@generic_file.id))
134
+ end
135
+
136
+ protected
137
+
138
+ # This method can be overridden in case there is a custom approach for visibility (e.g. embargo)
139
+ def update_visibility(attributes)
140
+ interpret_visibility(attributes) # relies on CurationConcerns::ManagesEmbargoesActor to interpret and apply visibility
141
+ end
142
+
143
+ private
144
+
145
+ # copy visibility from source_concern to destination_concern
146
+ def copy_visibility(source_concern, destination_concern)
147
+ destination_concern.visibility = source_concern.visibility
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,88 @@
1
+
2
+ module CurationConcerns::WorkActorBehavior
3
+ include CurationConcerns::ManagesEmbargoesActor
4
+
5
+ def create
6
+ # set the @files ivar then remove the files attribute so it isn't set by default.
7
+ files && attributes.delete(:files)
8
+ # Files must be attached before saving in order to persist their relationship to the work
9
+ assign_pid && interpret_visibility && attach_files && super && assign_representative && copy_visibility
10
+ end
11
+
12
+ def update
13
+ add_to_collections(attributes.delete(:collection_ids)) &&
14
+ interpret_visibility && super && attach_files && copy_visibility
15
+ end
16
+
17
+ delegate :visibility_changed?, to: :curation_concern
18
+
19
+ protected
20
+
21
+ # Is this here to ensure that the curation_concern has a pid set before any of the other methods are executed?
22
+ def assign_pid
23
+ curation_concern.send(:assign_id)
24
+ end
25
+
26
+ def files
27
+ return @files if defined?(@files)
28
+ @files = [attributes[:files]].flatten.compact
29
+ end
30
+
31
+ def attach_files
32
+ files.all? do |file|
33
+ attach_file(file)
34
+ end
35
+ end
36
+
37
+ # The default behavior of active_fedora's aggregates association,
38
+ # when assigning the id accessor (e.g. collection_ids = ['foo:1']) is to add
39
+ # to new collections, but not remove from old collections.
40
+ # This method ensures it's removed from the old collections.
41
+ def add_to_collections(new_collection_ids)
42
+ return true unless new_collection_ids
43
+ # remove from old collections
44
+ # TODO Implement parent_collection_ids https://github.com/projecthydra-labs/hydra-pcdm/issues/157
45
+ (curation_concern.parent_collections.map(&:id) - new_collection_ids).each do |old_id|
46
+ Collection.find(old_id).members.delete(curation_concern)
47
+ end
48
+
49
+ #add to new
50
+ new_collection_ids.each do |coll_id|
51
+ collection = Collection.find(coll_id)
52
+ collection.members << curation_concern
53
+ collection.save
54
+ end
55
+ true
56
+ end
57
+
58
+ def assign_representative
59
+ @generic_files ||= []
60
+ unless curation_concern.representative
61
+ curation_concern.representative = @generic_files.first.id unless @generic_files.empty?
62
+ end
63
+ curation_concern.save
64
+ end
65
+
66
+ private
67
+
68
+ def attach_file(file)
69
+ generic_file = ::GenericFile.new
70
+ generic_file_actor = CurationConcerns::GenericFileActor.new(generic_file, user)
71
+ #TODO we're passing an ID rather than an object. This means the actor does an unnecessary lookup
72
+ generic_file_actor.create_metadata(curation_concern.id, curation_concern.id)
73
+ generic_file.visibility = visibility
74
+ generic_file_actor.create_content(file)
75
+ @generic_files ||= []
76
+ @generic_files << generic_file # This is so that other methods like assign_representative can access the generic_files wihtout reloading them from fedora
77
+ curation_concern.generic_files << generic_file
78
+ end
79
+
80
+ def valid_file?(file_path)
81
+ return file_path.present? && File.exists?(file_path) && !File.zero?(file_path)
82
+ end
83
+
84
+ # The path of the fedora node where we store the file data
85
+ def file_path
86
+ 'content'
87
+ end
88
+ end
@@ -0,0 +1,22 @@
1
+ class ActiveFedoraIdBasedJob
2
+ def queue_name
3
+ :id_based
4
+ end
5
+
6
+ attr_accessor :id
7
+
8
+ def initialize(id)
9
+ self.id = id
10
+ end
11
+
12
+ def object
13
+ @object ||= ActiveFedora::Base.find(id)
14
+ end
15
+
16
+ alias_method :generic_file, :object
17
+ alias_method :generic_file_id, :id
18
+
19
+ def run
20
+ raise RuntimeError, "Define #run in a subclass"
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ class ActiveFedoraPidBasedJob < ActiveFedoraIdBasedJob
2
+ extend Deprecation
3
+ def self.extended(document)
4
+ Deprecation.warn ActiveFedoraPidBasedJob, "ActiveFedoraPidBasedJob is deprecated; use ActiveFedoraIdBasedJob instead."
5
+ end
6
+ end
@@ -0,0 +1,58 @@
1
+ class AuditJob < ActiveFedoraIdBasedJob
2
+ def queue_name
3
+ :audit
4
+ end
5
+
6
+ attr_accessor :uri, :id, :file_id
7
+
8
+ # URI of the resource to audit.
9
+ # This URI could include the actual resource (e.g. content) and the version to audit:
10
+ # http://localhost:8983/fedora/rest/test/a/b/c/abcxyz/content/fcr:versions/version1
11
+ # but it could also just be:
12
+ # http://localhost:8983/fedora/rest/test/a/b/c/abcxyz/content
13
+ # @param [String] id of the parent object
14
+ # @param [String] file_id used to find the file within its parent object (usually "original_file")
15
+ # @param [String] uri of the specific file/version to be audited
16
+ def initialize(id, file_id, uri)
17
+ super(id)
18
+ self.file_id = file_id
19
+ self.uri = uri
20
+ end
21
+
22
+ def run
23
+ fixity_ok = false
24
+ log = run_audit
25
+ fixity_ok = (log.pass == 1)
26
+ unless fixity_ok
27
+ if CurationConcerns.config.respond_to?(:after_audit_failure)
28
+ login = generic_file.depositor
29
+ user = User.find_by_user_key(login)
30
+ CurationConcerns.config.after_audit_failure.call(generic_file, user, log.created_at)
31
+ end
32
+ end
33
+ fixity_ok
34
+ end
35
+
36
+ protected
37
+
38
+ def run_audit
39
+ begin
40
+ fixity_ok = ActiveFedora::FixityService.new(uri).check
41
+ rescue Ldp::NotFound
42
+ error_msg = "resource not found"
43
+ end
44
+
45
+ if fixity_ok
46
+ passing = 1
47
+ ChecksumAuditLog.prune_history(id, file_id)
48
+ else
49
+ logger.warn "***AUDIT*** Audit failed for #{uri} #{error_msg}"
50
+ passing = 0
51
+ end
52
+ ChecksumAuditLog.create!(pass: passing, generic_file_id: id, version: uri, file_id: file_id)
53
+ end
54
+
55
+ def logger
56
+ ActiveFedora::Base.logger
57
+ end
58
+ end
@@ -0,0 +1,11 @@
1
+ class CharacterizeJob < ActiveFedoraIdBasedJob
2
+ def queue_name
3
+ :characterize
4
+ end
5
+
6
+ def run
7
+ CurationConcerns::CharacterizationService.run(generic_file)
8
+ generic_file.save
9
+ CurationConcerns.queue.push(CreateDerivativesJob.new(generic_file.id))
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ class CopyPermissionsJob
2
+ def queue_name
3
+ :permissions
4
+ end
5
+
6
+ attr_accessor :id
7
+
8
+ def initialize(id)
9
+ self.id = id
10
+ end
11
+
12
+ def run
13
+ # work = ActiveFedora::Base.load_instance_from_solr(id)
14
+ work = ActiveFedora::Base.find(id) # Hydra::Works::GenericWork is not compatible with load_instance_from_solr. Using (slower) ActiveFedora::Base.find instead.
15
+ if work.respond_to?(:generic_files)
16
+ work.generic_files.each do |file|
17
+
18
+ work.permissions.each {|perm| file.permissions << Hydra::AccessControls::Permission.new(perm.to_hash)}
19
+ new_permissions = file.permissions.uniq! { |item| item.to_hash}
20
+ file.permissions = new_permissions unless new_permissions.blank?
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ class CreateDerivativesJob < ActiveFedoraIdBasedJob
2
+ def queue_name
3
+ :derivatives
4
+ end
5
+
6
+ def run
7
+ return unless generic_file.original_file.has_content?
8
+ if generic_file.video?
9
+ return unless CurationConcerns.config.enable_ffmpeg
10
+ end
11
+
12
+ generic_file.create_derivatives
13
+ generic_file.save
14
+ end
15
+ end
@@ -0,0 +1,56 @@
1
+ require 'net/https'
2
+ require 'uri'
3
+ require 'tempfile'
4
+
5
+ class ImportUrlJob < ActiveFedoraIdBasedJob
6
+
7
+ def queue_name
8
+ :import_url
9
+ end
10
+
11
+ def run
12
+ user = User.find_by_user_key(generic_file.depositor)
13
+
14
+ Tempfile.open(id.gsub('/', '_')) do |f|
15
+ copy_remote_file(generic_file.import_url, f)
16
+ # attach downloaded file to generic file stubbed out
17
+ if CurationConcerns::GenericFileActor.new(generic_file, user).create_content(f)
18
+
19
+ # send message to user on download success
20
+ if CurationConcerns.config.respond_to?(:after_import_url_success)
21
+ CurationConcerns.config.after_import_url_success.call(generic_file, user)
22
+ end
23
+ else
24
+
25
+ # send message to user on download failure
26
+ if CurationConcerns.config.respond_to?(:after_import_url_failure)
27
+ CurationConcerns.config.after_import_url_failure.call(generic_file, user)
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ def copy_remote_file(import_url, f)
34
+ f.binmode
35
+ # download file from url
36
+ uri = URI(generic_file.import_url)
37
+ http = Net::HTTP.new(uri.host, uri.port)
38
+ http.use_ssl = uri.scheme == "https" # enable SSL/TLS
39
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
40
+ mime_type = nil
41
+
42
+ http.start do
43
+ http.request_get(uri.request_uri) do |resp|
44
+ mime_type = resp.content_type
45
+ resp.read_body do |segment|
46
+ f.write(segment)
47
+ end
48
+ end
49
+ end
50
+ f.rewind
51
+ end
52
+
53
+ def job_user
54
+ User.batchuser
55
+ end
56
+ end
@@ -0,0 +1,48 @@
1
+ class IngestLocalFileJob
2
+ attr_accessor :directory, :filename, :user_key, :generic_file_id
3
+
4
+ def queue_name
5
+ :ingest
6
+ end
7
+
8
+ def initialize(generic_file_id, directory, filename, user_key)
9
+ self.generic_file_id = generic_file_id
10
+ self.directory = directory
11
+ self.filename = filename
12
+ self.user_key = user_key
13
+ end
14
+
15
+ def run
16
+ user = User.find_by_user_key(user_key)
17
+ raise "Unable to find user for #{user_key}" unless user
18
+ generic_file = GenericFile.find(generic_file_id)
19
+ generic_file.label ||= filename
20
+ path = File.join(directory, filename)
21
+
22
+ actor = CurationConcerns::GenericFileActor.new(generic_file, user)
23
+
24
+ if actor.create_content(File.open(path))
25
+ FileUtils.rm(path)
26
+
27
+ # send message to user on import success
28
+ if CurationConcerns.config.respond_to?(:after_import_local_file_success)
29
+ CurationConcerns.config.after_import_local_file_success.call(generic_file, user, filename)
30
+ end
31
+ else
32
+
33
+ # send message to user on import failure
34
+ if CurationConcerns.config.respond_to?(:after_import_local_file_failure)
35
+ CurationConcerns.config.after_import_local_file_failure.call(generic_file, user, filename)
36
+ end
37
+ end
38
+ end
39
+
40
+ def job_user
41
+ User.batchuser
42
+ end
43
+
44
+ def mime_type(file_name)
45
+ mime_types = MIME::Types.of(file_name)
46
+ mime_types.empty? ? "application/octet-stream" : mime_types.first.content_type
47
+ end
48
+ end
@@ -0,0 +1,9 @@
1
+ class ResolrizeJob
2
+ def queue_name
3
+ :resolrize
4
+ end
5
+
6
+ def run
7
+ ActiveFedora::Base.reindex_everything
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ class ChecksumAuditLog < ActiveRecord::Base
2
+
3
+ def self.get_audit_log(id, path, version_uri)
4
+ ChecksumAuditLog.find_or_create_by(generic_file_id: id, file_id: path, version: version_uri)
5
+ end
6
+
7
+ # Check to see if there are previous passing logs that we can delete
8
+ # we want to keep the first passing event after a failure, the most current passing event,
9
+ # and all failures so that this table doesn't grow too large
10
+ # Simple way (a little naieve): if the last 2 were passing, delete the first one
11
+ def self.prune_history(id, path)
12
+ list = logs_for(id, path).limit(2)
13
+ if list.size > 1 && (list[0].pass == 1) && (list[1].pass == 1)
14
+ list[0].destroy
15
+ end
16
+ end
17
+
18
+ def self.logs_for(id, path)
19
+ ChecksumAuditLog.where(generic_file_id: id, file_id: path).order('created_at desc, id desc')
20
+ end
21
+ end
@@ -0,0 +1,34 @@
1
+ module CurationConcerns
2
+ module Ability
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ self.ability_logic += [:curation_concerns_permissions]
6
+ end
7
+
8
+ def curation_concerns_permissions
9
+
10
+ unless current_user.new_record?
11
+ can :create, CurationConcerns::ClassifyConcern
12
+ # TODO: Shouldn't this be in `everyone_can_create_curation_concerns` ?
13
+ can :create, ::GenericFile
14
+ end
15
+
16
+ if user_groups.include? 'admin'
17
+ can [:create, :discover, :show, :read, :edit, :update, :destroy], :all
18
+ end
19
+
20
+ can :collect, :all
21
+
22
+ end
23
+
24
+ # Add this to your ability_logic if you want all logged in users to be able
25
+ # to submit content
26
+ def everyone_can_create_curation_concerns
27
+ unless current_user.new_record?
28
+ can :create, [ CurationConcerns.configuration.curation_concerns ]
29
+ can :create, ::Collection
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,87 @@
1
+ module CurationConcerns
2
+ module BasicMetadata
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+
7
+ property :label, predicate: ActiveFedora::RDF::Fcrepo::Model.downloadFilename, multiple: false
8
+
9
+ property :depositor, predicate: ::RDF::URI.new("http://id.loc.gov/vocabulary/relators/dpt"), multiple: false do |index|
10
+ index.as :symbol, :stored_searchable
11
+ end
12
+
13
+ property :relative_path, predicate: ::RDF::URI.new('http://scholarsphere.psu.edu/ns#relativePath'), multiple: false
14
+
15
+ property :import_url, predicate: ::RDF::URI.new('http://scholarsphere.psu.edu/ns#importUrl'), multiple: false do |index|
16
+ index.as :symbol
17
+ end
18
+
19
+ property :part_of, predicate: ::RDF::DC.isPartOf
20
+ property :resource_type, predicate: ::RDF::DC.type do |index|
21
+ index.as :stored_searchable, :facetable
22
+ end
23
+ property :title, predicate: ::RDF::DC.title do |index|
24
+ index.as :stored_searchable, :facetable
25
+ end
26
+ property :creator, predicate: ::RDF::DC.creator do |index|
27
+ index.as :stored_searchable, :facetable
28
+ end
29
+ property :contributor, predicate: ::RDF::DC.contributor do |index|
30
+ index.as :stored_searchable, :facetable
31
+ end
32
+ property :description, predicate: ::RDF::DC.description do |index|
33
+ index.type :text
34
+ index.as :stored_searchable
35
+ end
36
+ property :tag, predicate: ::RDF::DC.relation do |index|
37
+ index.as :stored_searchable, :facetable
38
+ end
39
+ property :rights, predicate: ::RDF::DC.rights do |index|
40
+ index.as :stored_searchable
41
+ end
42
+ property :publisher, predicate: ::RDF::DC.publisher do |index|
43
+ index.as :stored_searchable, :facetable
44
+ end
45
+ property :date_created, predicate: ::RDF::DC.created do |index|
46
+ index.as :stored_searchable
47
+ end
48
+
49
+ # We reserve date_uploaded for the original creation date of the record.
50
+ # For example, when migrating data from a fedora3 repo to fedora4,
51
+ # fedora's system created date will reflect the date when the record
52
+ # was created in fedora4, but the date_uploaded will preserve the
53
+ # original creation date from the old repository.
54
+ property :date_uploaded, predicate: ::RDF::DC.dateSubmitted, multiple: false do |index|
55
+ index.type :date
56
+ index.as :stored_sortable
57
+ end
58
+
59
+ property :date_modified, predicate: ::RDF::DC.modified, multiple: false do |index|
60
+ index.type :date
61
+ index.as :stored_sortable
62
+ end
63
+ property :subject, predicate: ::RDF::DC.subject do |index|
64
+ index.as :stored_searchable, :facetable
65
+ end
66
+ property :language, predicate: ::RDF::DC.language do |index|
67
+ index.as :stored_searchable, :facetable
68
+ end
69
+ property :identifier, predicate: ::RDF::DC.identifier do |index|
70
+ index.as :stored_searchable
71
+ end
72
+ property :based_near, predicate: ::RDF::FOAF.based_near do |index|
73
+ index.as :stored_searchable, :facetable
74
+ end
75
+ property :related_url, predicate: ::RDF::RDFS.seeAlso do |index|
76
+ index.as :stored_searchable
77
+ end
78
+ property :bibliographic_citation, predicate: ::RDF::DC.bibliographicCitation do |index|
79
+ index.as :stored_searchable
80
+ end
81
+ property :source, predicate: ::RDF::DC.source do |index|
82
+ index.as :stored_searchable
83
+ end
84
+ end
85
+
86
+ end
87
+ end
@@ -0,0 +1,47 @@
1
+ module CurationConcerns
2
+ module CollectionBehavior
3
+ extend ActiveSupport::Concern
4
+
5
+ include Hydra::AccessControls::WithAccessRight
6
+ include Hydra::Collection
7
+ include CurationConcerns::Noid
8
+ include CurationConcerns::HumanReadableType
9
+ include CurationConcerns::HasRepresentative
10
+ include CurationConcerns::Permissions
11
+
12
+ included do
13
+ validates :title, presence: true
14
+ end
15
+
16
+ def add_member(collectible)
17
+ if can_add_to_members?(collectible)
18
+ self.members << collectible
19
+ save
20
+ end
21
+ end
22
+
23
+ def to_s
24
+ title.present? ? title : "No Title"
25
+ end
26
+
27
+ def bytes
28
+ members.reduce(0) { |sum, gf| sum + gf.content.size.to_i }
29
+ end
30
+
31
+ def to_solr(solr_doc={})
32
+ super(solr_doc).tap do |solr_doc|
33
+ Solrizer.set_field(solr_doc, 'generic_type', human_readable_type, :facetable)
34
+ end
35
+ end
36
+
37
+ def can_be_member_of_collection?(collection)
38
+ collection == self ? false : true
39
+ end
40
+
41
+ private
42
+
43
+ def can_add_to_members?(collectible)
44
+ collectible.try(:can_be_member_of_collection?, self)
45
+ end
46
+ end
47
+ end