curation_concerns 0.1.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 (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,71 @@
1
+ module CurationConcerns
2
+ # Run FITS to gather technical metadata about the content and the full text.
3
+ # Store this extracted metadata in the characterization datastream.
4
+ class CharacterizationService
5
+ include Hydra::Derivatives::ExtractMetadata
6
+
7
+ delegate :mime_type, :uri, to: :@generic_file
8
+ attr_reader :generic_file
9
+
10
+ def self.run(generic_file)
11
+ new(generic_file).characterize
12
+ end
13
+
14
+ def initialize(generic_file)
15
+ @generic_file = generic_file
16
+ end
17
+
18
+ ## Extract the metadata from the content datastream and record it in the characterization datastream
19
+ def characterize
20
+ store_metadata(extract_metadata)
21
+ store_fulltext(extract_fulltext)
22
+ generic_file.filename = [generic_file.original_file.original_name]
23
+ end
24
+
25
+ protected
26
+
27
+ def store_fulltext(extracted_text)
28
+ if extracted_text.present?
29
+ extracted_text_file = generic_file.build_extracted_text
30
+ extracted_text_file.content = extracted_text
31
+ end
32
+ end
33
+
34
+ def extract_fulltext
35
+ FullTextExtractionService.run(generic_file)
36
+ end
37
+
38
+ def store_metadata(metadata)
39
+ generic_file.characterization.ng_xml = metadata if metadata.present?
40
+ append_metadata
41
+ end
42
+
43
+ def extract_metadata
44
+ return unless generic_file.original_file.has_content?
45
+ Hydra::FileCharacterization.characterize(generic_file.original_file.content, filename_for_characterization.join, :fits) do |config|
46
+ config[:fits] = Hydra::Derivatives.fits_path
47
+ end
48
+ end
49
+
50
+ # Populate GenericFile's properties with fields from FITS (e.g. Author from pdfs)
51
+ def append_metadata
52
+ terms = generic_file.characterization_terms
53
+ CurationConcerns.config.fits_to_desc_mapping.each_pair do |k, v|
54
+ if terms.has_key?(k)
55
+ # coerce to array to remove a conditional
56
+ terms[k] = [terms[k]] unless terms[k].is_a? Array
57
+ terms[k].each do |term_value|
58
+ proxy_term = generic_file.send(v)
59
+ if proxy_term.kind_of?(Array)
60
+ proxy_term << term_value unless proxy_term.include?(term_value)
61
+ else
62
+ # these are single-valued terms which cannot be appended to
63
+ generic_file.send("#{v}=", term_value)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,38 @@
1
+ module CurationConcerns
2
+ # Extract the full text from the content using Solr's extract handler
3
+ class FullTextExtractionService
4
+ def self.run(generic_file)
5
+ new(generic_file).extract
6
+ end
7
+
8
+ delegate :original_file, :logger, :mime_type, :id, to: :@generic_file
9
+
10
+ def initialize(generic_file)
11
+ @generic_file = generic_file
12
+ end
13
+
14
+ def extract
15
+ uri = URI("#{connection_url}/update/extract?extractOnly=true&wt=json&extractFormat=text")
16
+ req = Net::HTTP.new(uri.host, uri.port)
17
+ resp = req.post(uri.to_s, original_file.content, {
18
+ 'Content-type' => "#{mime_type};charset=utf-8",
19
+ 'Content-Length' => original_file.content.size.to_s
20
+ })
21
+ raise "URL '#{uri}' returned code #{resp.code}" unless resp.code == "200"
22
+ original_file.content.rewind if original_file.content.respond_to?(:rewind)
23
+ JSON.parse(resp.body)[''].rstrip
24
+ rescue => e
25
+ logger.error("Error extracting content from #{id}: #{e.inspect}")
26
+ return nil
27
+ end
28
+
29
+ def connection_url
30
+ case
31
+ when Blacklight.connection_config[:url] then Blacklight.connection_config[:url]
32
+ when Blacklight.connection_config["url"] then Blacklight.connection_config["url"]
33
+ when Blacklight.connection_config[:fulltext] then Blacklight.connection_config[:fulltext]["url"]
34
+ else Blacklight.connection_config[:default]["url"]
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,85 @@
1
+ module CurationConcerns
2
+ class GenericFileAuditService
3
+ attr_reader :generic_file
4
+ def initialize(file)
5
+ @generic_file = file
6
+ end
7
+
8
+ NO_RUNS = 999
9
+
10
+ # provides a human readable version of the audit status
11
+ def human_readable_audit_status(stat)
12
+ case stat
13
+ when 0
14
+ 'failing'
15
+ when 1
16
+ 'passing'
17
+ else
18
+ stat
19
+ end
20
+ end
21
+
22
+ # Audits each version of each file if it hasn't been audited recently
23
+ # Returns the set of most recent audit status for each version of the content file
24
+ # @param [Hash] log container for messages, mapping file ids to status
25
+ def audit(log={})
26
+ generic_file.files.each { |f| log[f.id] = audit_file(f) }
27
+ log
28
+ end
29
+
30
+ private
31
+
32
+ # Retrieve or generate the audit check for a file (all versions are checked for versioned files)
33
+ # @param [ActiveFedora::File] file to audit
34
+ # @param [Array] log container for messages
35
+ def audit_file(file, log=[])
36
+ versions = file.has_versions? ? file.versions.all : file
37
+ versions.each { |v| log << audit_file_version(file.id, v.uri) }
38
+ log
39
+ end
40
+
41
+ # Retrieve or generate the audit check for a file and provide a human-readable status message.
42
+ # @param [ActiveFedora::File] file to audit
43
+ def audit_stat(file)
44
+ audit_results = audit_file(file).collect { |result| result["pass"] }
45
+ # check how many non runs we had
46
+ non_runs = audit_results.reduce(0) { |sum, value| value == NO_RUNS ? sum += 1 : sum }
47
+ if non_runs == 0
48
+ audit_results.reduce(true) { |sum, value| sum && value }
49
+ elsif non_runs < audit_results.length
50
+ result = audit_results.reduce(true) { |sum, value| value == NO_RUNS ? sum : sum && value }
51
+ "Some audits have not been run, but the ones run were #{human_readable_audit_status(result)}."
52
+ else
53
+ 'Audits have not yet been run on this file.'
54
+ end
55
+ end
56
+
57
+ # Retrieve or generate the audit check for a specific version of a file
58
+ # @param [String] file_id used to find the file within its parent object (usually "original_file")
59
+ # @param [String] version_uri the version to be audited (or the file uri for non-versioned files)
60
+ def audit_file_version(file_id, version_uri)
61
+ latest_audit = ChecksumAuditLog.logs_for(generic_file.id, file_id).first
62
+ return latest_audit unless needs_audit?(latest_audit)
63
+ CurationConcerns.queue.push(AuditJob.new(generic_file.id, file_id, version_uri))
64
+ latest_audit || ChecksumAuditLog.new(pass: NO_RUNS, generic_file_id: generic_file.id, file_id: file_id, version: version_uri)
65
+ end
66
+
67
+ # Check if time since the last audit is greater than the maximum days allowed between audits
68
+ # @param [ChecksumAuditLog] latest_audit the most recent audit event
69
+ def needs_audit?(latest_audit)
70
+ return true unless latest_audit
71
+ unless latest_audit.updated_at
72
+ logger.warn "***AUDIT*** problem with audit log! Latest Audit is not nil, but updated_at is not set #{latest_audit}"
73
+ return true
74
+ end
75
+ days_since_last_audit(latest_audit) >= CurationConcerns.config.max_days_between_audits
76
+ end
77
+
78
+ # Return the number of days since the latest audit event
79
+ # @param [ChecksumAuditLog] latest_audit the most recent audit event
80
+ def days_since_last_audit(latest_audit)
81
+ (DateTime.now - latest_audit.updated_at.to_date).to_i
82
+ end
83
+
84
+ end
85
+ end
@@ -0,0 +1,14 @@
1
+ module CurationConcerns
2
+ class GenericFileIndexingService < ActiveFedora::IndexingService
3
+ def generate_solr_document
4
+ super.tap do |solr_doc|
5
+ solr_doc[Solrizer.solr_name('label')] = object.label
6
+ solr_doc[Solrizer.solr_name('file_format')] = object.file_format
7
+ solr_doc[Solrizer.solr_name('file_format', :facetable)] = object.file_format
8
+ solr_doc[Solrizer.solr_name(:file_size, :symbol)] = object.file_size[0]
9
+ solr_doc['all_text_timv'] = object.full_text.content
10
+ solr_doc[Solrizer.solr_name('generic_work_ids', :symbol)] = object.generic_work_ids unless object.generic_work_ids.empty?
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ module CurationConcerns
2
+ class GenericWorkIndexingService < ActiveFedora::IndexingService
3
+
4
+ def generate_solr_document
5
+ super.tap do |solr_doc|
6
+ # We know that all the members of GenericWorks are GenericFiles so we can use
7
+ # member_ids which requires fewer Fedora API calls than generic_file_ids.
8
+ # generic_file_ids requires loading all the members from Fedora but member_ids
9
+ # looks just at solr
10
+ solr_doc[Solrizer.solr_name('generic_file_ids', :symbol)] = object.member_ids
11
+ Solrizer.set_field(solr_doc, 'generic_type', 'Work', :facetable)
12
+ end
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,23 @@
1
+ require 'active_fedora/noid'
2
+
3
+ module CurationConcerns
4
+ module Noid
5
+ extend ActiveSupport::Concern
6
+
7
+ ## This overrides the default behavior, which is to ask Fedora for an id
8
+ # @see ActiveFedora::Persistence.assign_id
9
+ def assign_id
10
+ service.mint if CurationConcerns.config.enable_noids
11
+ end
12
+
13
+ def to_param
14
+ id
15
+ end
16
+
17
+ private
18
+
19
+ def service
20
+ @service ||= ActiveFedora::Noid::Service.new
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ module CurationConcerns
2
+ class RepositoryAuditService
3
+ def self.audit_everything
4
+ ::GenericFile.find_each do |gf|
5
+ gf.audit
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ module CurationConcerns
2
+ class VersioningService
3
+ # Make a version and record the version committer
4
+ # @param [ActiveFedora::File] content
5
+ # @param [User] user
6
+ def self.create(content, user=nil)
7
+ content.create_version
8
+ record_committer(content, user) if user
9
+ end
10
+
11
+ # @param [ActiveFedora::File] file
12
+ def self.latest_version_of(file)
13
+ file.versions.last
14
+ end
15
+
16
+ protected
17
+
18
+ # Record the version committer of the last version
19
+ # @param [ActiveFedora::File] content
20
+ # @param [User] user
21
+ def self.record_committer(content, user)
22
+ version = latest_version_of(content)
23
+ return if version.nil?
24
+ VersionCommitter.create(version_id: version.uri, committer_login: user.user_key)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,6 @@
1
+ en:
2
+ curation_concerns:
3
+ product_name: "CurationConcerns"
4
+ product_twitter_handle: "@HydraSphere"
5
+ institution_name: "Institution Name"
6
+ institution_name_full: "The Institution Name"
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ version = File.read(File.expand_path("../../VERSION", __FILE__)).strip
3
+
4
+ lib = File.expand_path('../lib', __FILE__)
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "curation_concerns-models"
9
+ spec.version = version
10
+ spec.authors = ["Justin Coyne"]
11
+ spec.email = ["justin@curationexperts.com"]
12
+ spec.summary = %q{Simple institutional repository models for Hydra}
13
+ spec.description = %q{An extensible repository data-model with works and and many attached files}
14
+ spec.homepage = ""
15
+ spec.license = "APACHE2"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency 'active_attr'
23
+ spec.add_dependency 'nest', '~> 1.1'
24
+ spec.add_dependency 'hydra-collections', '~> 6.0.0.alpha'
25
+ spec.add_dependency 'hydra-head', '~> 9.2.2'
26
+ spec.add_dependency 'hydra-works', '~> 0.1'
27
+ spec.add_dependency 'active-fedora', '~> 9.3.0'
28
+ spec.add_dependency 'active_fedora-noid', '~> 1.0.2'
29
+ spec.add_dependency 'resque', '~> 1.23'
30
+ spec.add_dependency 'resque-pool', '~> 0.3'
31
+
32
+ spec.add_development_dependency 'bundler', '~> 1.6'
33
+ spec.add_development_dependency 'rake'
34
+ end
@@ -0,0 +1,66 @@
1
+ module CurationConcerns
2
+ module Messages
3
+ extend ActiveSupport::Concern
4
+
5
+ # Borrowed from AbstractController so we can render html content tags
6
+ attr_accessor :output_buffer
7
+ include ActionView::Helpers::TagHelper
8
+ include ActionView::Helpers::UrlHelper
9
+
10
+ def success_subject
11
+ I18n.t("curation_concerns.messages.success.subject")
12
+ end
13
+
14
+ def failure_subject
15
+ I18n.t("curation_concerns.messages.failure.subject")
16
+ end
17
+
18
+ def single_success id, file
19
+ content_tag :span, id: "ss-"+id do
20
+ [link_to_file(file), I18n.t("curation_concerns.messages.success.single")].join(" ").html_safe
21
+ end
22
+ end
23
+
24
+ def multiple_success id, files
25
+ content_tag :span, id: "ss-"+id do
26
+ [success_link(files), I18n.t("curation_concerns.messages.success.multiple.tag")].join(" ").html_safe
27
+ end
28
+ end
29
+
30
+ def single_failure id, file
31
+ content_tag :span, id: "ss-"+id do
32
+ [link_to_file(file), I18n.t("curation_concerns.messages.failure.single")].join(" ").html_safe
33
+ end
34
+ end
35
+
36
+ def multiple_failure id, files
37
+ content_tag :span, id: "ss-"+id do
38
+ [failure_link(files), I18n.t("curation_concerns.messages.failure.multiple.tag")].join(" ").html_safe
39
+ end
40
+ end
41
+
42
+ # Double-quotes are replaced with single ones so this list can be included in a data block. Ex:
43
+ # <a href="#" data-content="<a href='#'>embedded link</a>" rel="popover">Click me</a>
44
+ def file_list files
45
+ files.map { |gf| link_to_file(gf) }.join(', ').gsub(/"/, "'")
46
+ end
47
+
48
+ def link_to_file file
49
+ link_to(file.to_s, Rails.application.class.routes.url_helpers.curation_concerns_generic_file_path(file))
50
+ end
51
+
52
+ private
53
+
54
+ def success_link files
55
+ link_to I18n.t("curation_concerns.messages.success.multiple.link"), "#",
56
+ rel: "popover",
57
+ data: { content: file_list(files).html_safe, title: I18n.t("curation_concerns.messages.success.title") }
58
+ end
59
+
60
+ def failure_link files
61
+ link_to I18n.t("curation_concerns.messages.failure.multiple.link"), "#",
62
+ rel: "popover",
63
+ data: { content: file_list(files).html_safe, title: I18n.t("curation_concerns.messages.failure.title") }
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,61 @@
1
+ module CurationConcerns
2
+ module Models
3
+
4
+ def self.config(&block)
5
+ @@config ||= Engine::Configuration.new
6
+ yield @@config if block
7
+ return @@config
8
+ end
9
+
10
+
11
+ class Engine < ::Rails::Engine
12
+
13
+ require 'curation_concerns/models/resque'
14
+
15
+ # Set some configuration defaults
16
+ config.persistent_hostpath = "http://localhost/files/"
17
+ config.enable_ffmpeg = false
18
+ config.ffmpeg_path = 'ffmpeg'
19
+ config.fits_message_length = 5
20
+ config.temp_file_base = nil
21
+ config.enable_noids = true
22
+ config.noid_template = '.reeddeeddk'
23
+ config.minter_statefile = '/tmp/minter-state'
24
+ config.redis_namespace = "curation_concerns"
25
+ config.fits_path = "fits.sh"
26
+ config.enable_local_ingest = nil
27
+ config.queue = CurationConcerns::Resque::Queue
28
+
29
+ # Defaulting analytic start date to whenever the file was uploaded by leaving it blank
30
+ config.analytic_start_date = nil
31
+
32
+ config.autoload_paths += %W(
33
+ #{config.root}/app/actors/concerns
34
+ #{config.root}/lib/curation_concerns
35
+ #{config.root}/app/models/datastreams
36
+ )
37
+
38
+ initializer 'requires' do
39
+ require 'active_fedora/noid'
40
+ require 'curation_concerns/noid'
41
+ require 'curation_concerns/permissions'
42
+ end
43
+
44
+ initializer 'configure' do
45
+ CurationConcerns.config.tap do |c|
46
+ Hydra::Derivatives.ffmpeg_path = c.ffmpeg_path
47
+ Hydra::Derivatives.temp_file_base = c.temp_file_base
48
+ Hydra::Derivatives.fits_path = c.fits_path
49
+ Hydra::Derivatives.enable_ffmpeg = c.enable_ffmpeg
50
+
51
+ ActiveFedora::Base.translate_uri_to_id = ActiveFedora::Noid.config.translate_uri_to_id
52
+ ActiveFedora::Base.translate_id_to_uri = ActiveFedora::Noid.config.translate_id_to_uri
53
+ ActiveFedora::Noid.config.template = c.noid_template
54
+ ActiveFedora::Noid.config.statefile = c.minter_statefile
55
+ end
56
+ end
57
+
58
+ end
59
+
60
+ end
61
+ end
@@ -0,0 +1,36 @@
1
+ # Borrowed from:
2
+ # https://github.com/jeremy/resque-rails/blob/master/lib/resque/rails/queue.rb
3
+ module CurationConcerns
4
+ module Resque
5
+ class Queue
6
+ attr_reader :default_queue_name
7
+
8
+ def initialize(default_queue_name)
9
+ @default_queue_name = default_queue_name
10
+ end
11
+
12
+ def push(job)
13
+ push_tries = 0
14
+ queue = job.respond_to?(:queue_name) ? job.queue_name : default_queue_name
15
+ begin
16
+ ::Resque.enqueue_to queue, MarshaledJob, Base64.encode64(Marshal.dump(job))
17
+ rescue Redis::CannotConnectError
18
+ ActiveFedora::Base.logger.error "Redis is down!"
19
+ rescue Redis::TimeoutError => error
20
+ ActiveFedora::Base.logger.warn "Redis Timed out. Trying again! #{job.inspect}"
21
+ push_tries+=1
22
+ # fail for good if the tries is greater than 3
23
+ raise error if push_tries >=3
24
+ sleep 0.01
25
+ retry
26
+ end
27
+ end
28
+ end
29
+
30
+ class MarshaledJob
31
+ def self.perform(marshaled_job)
32
+ Marshal.load(Base64.decode64(marshaled_job)).run
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,22 @@
1
+ module CurationConcerns
2
+ module Utils
3
+ extend ActiveSupport::Concern
4
+
5
+ def retry_unless(number_of_tries, condition, &block)
6
+ self.class.retry_unless(number_of_tries, condition, &block)
7
+ end
8
+
9
+ module ClassMethods
10
+ def retry_unless(number_of_tries, condition, &block)
11
+ raise ArgumentError, "First argument must be an enumerator" unless number_of_tries.is_a? Enumerator
12
+ raise ArgumentError, "Second argument must be a lambda" unless condition.respond_to? :call
13
+ raise ArgumentError, "Must pass a block of code to retry" unless block_given?
14
+ number_of_tries.each do
15
+ result = block.call
16
+ return result unless condition.call
17
+ end
18
+ raise RuntimeError, "retry_unless could not complete successfully. Try upping the # of tries?"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ module CurationConcerns
2
+ module Models
3
+ VERSION = "0.1.2"
4
+ end
5
+ end
@@ -0,0 +1,32 @@
1
+ require "curation_concerns/models/version"
2
+ require "curation_concerns/models/engine"
3
+
4
+ require 'hydra/head'
5
+ require 'nest'
6
+ # require "active_resource" # used by GenericFile to catch errors & by GeoNamesResource
7
+ require 'resque/server'
8
+
9
+ module CurationConcerns
10
+ extend ActiveSupport::Autoload
11
+
12
+ module Models
13
+ end
14
+
15
+ autoload :Utils, 'curation_concerns/models/utils'
16
+ autoload :Permissions
17
+ autoload :Messages
18
+
19
+ attr_writer :queue
20
+
21
+ def self.queue
22
+ @queue ||= config.queue.new('curation_concerns')
23
+ end
24
+
25
+ def self.config(&block)
26
+ @@config ||= CurationConcerns::Models::Engine::Configuration.new
27
+
28
+ yield @@config if block
29
+
30
+ return @@config
31
+ end
32
+ end
@@ -0,0 +1,30 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'rails/generators'
3
+ require 'rails/generators/migration'
4
+
5
+ class CurationConcerns::Models::AbstractMigrationGenerator < Rails::Generators::Base
6
+ include Rails::Generators::Migration
7
+
8
+ # Implement the required interface for Rails::Generators::Migration.
9
+ # taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
10
+ def self.next_migration_number(path)
11
+ if @prev_migration_nr
12
+ @prev_migration_nr += 1
13
+ else
14
+ if last_migration = Dir[File.join(path, '*.rb')].sort.last
15
+ @prev_migration_nr = last_migration.sub(File.join(path, '/'), '').to_i + 1
16
+ else
17
+ @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
18
+ end
19
+ end
20
+ @prev_migration_nr.to_s
21
+ end
22
+
23
+ protected
24
+
25
+ def better_migration_template(file)
26
+ migration_template "migrations/#{file}", "db/migrate/#{file}"
27
+ rescue Rails::Generators::Error => e
28
+ say_status("warning", e.message, :yellow)
29
+ end
30
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'rails/generators'
3
+
4
+ class CurationConcerns::Models::ClamavGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __FILE__)
6
+
7
+ desc """
8
+ This generator makes the following changes to your application:
9
+ 1. Generates clamav initializer
10
+ """
11
+
12
+ def banner
13
+ say_status("info", "Generating clamav initializers", :blue)
14
+ end
15
+
16
+ def create_initializer_file
17
+ copy_file 'config/clamav.rb', 'config/initializers/clamav.rb'
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'rails/generators'
3
+
4
+ class CurationConcerns::Models::FulltextGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __FILE__)
6
+
7
+ desc """
8
+ This generator makes the following changes to your application:
9
+ 1. Copies solrconfig.xml into solr_conf/conf/
10
+ 2. Reconfigures jetty
11
+ """
12
+
13
+ def banner
14
+ say_status("warning", "GENERATING CURATION_CONCERNS FULL-TEXT", :yellow)
15
+ end
16
+
17
+ # Copy CurationConcerns's solrconfig into the dir from which the jetty:config task pulls
18
+ # CurationConcerns's solrconfig includes full-text extraction
19
+ def copy_solr_config
20
+ src = File.join(__FILE__, '..', '..', '..', '..', '..', '..', 'solr_conf', 'conf', 'solrconfig.xml')
21
+ copy_file File.expand_path(src), 'solr_conf/conf/solrconfig.xml', force: true
22
+ end
23
+
24
+ # Copy config, schema, and jars into jetty dir if it exists
25
+ def reconfigure_jetty
26
+ rake "curation_concerns:jetty:config" if File.directory?('jetty')
27
+ end
28
+ end