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,75 @@
1
+ module CurationConcerns
2
+ module Permissions
3
+ module Writable
4
+ extend ActiveSupport::Concern
5
+
6
+ #we're overriding the permissions= method which is in Hydra::AccessControls::Permissions
7
+ include Hydra::AccessControls::Permissions
8
+ include Hydra::AccessControls::Visibility
9
+
10
+ included do
11
+ validate :paranoid_permissions
12
+ end
13
+
14
+ def paranoid_permissions
15
+ valid = true
16
+ paranoid_edit_permissions.each do |validation|
17
+ if validation[:condition].call(self)
18
+ errors[validation[:key]] ||= []
19
+ errors[validation[:key]] << validation[:message]
20
+ valid = false
21
+ end
22
+ end
23
+ return valid
24
+ end
25
+
26
+ def paranoid_edit_permissions
27
+ [
28
+ {key: :edit_users, message: 'Depositor must have edit access', condition: lambda { |obj| !obj.edit_users.include?(obj.depositor) }},
29
+ {key: :edit_groups, message: 'Public cannot have edit access', condition: lambda { |obj| obj.edit_groups.include?('public') }},
30
+ {key: :edit_groups, message: 'Registered cannot have edit access', condition: lambda { |obj| obj.edit_groups.include?('registered') }}
31
+ ]
32
+ end
33
+
34
+ def clear_permissions!
35
+ self.permissions = []
36
+ end
37
+
38
+ ## Updates those permissions that are provided to it. Does not replace any permissions unless they are provided
39
+ # def permissions=(params)
40
+ # raise "Fixme #{params}"
41
+ # perm_hash = permission_hash
42
+ # params[:new_user_name].each { |name, access| perm_hash['person'][name] = access } if params[:new_user_name].present?
43
+ # params[:new_group_name].each { |name, access| perm_hash['group'][name] = access } if params[:new_group_name].present?
44
+
45
+ # params[:user].each { |name, access| perm_hash['person'][name] = access} if params[:user]
46
+ # params[:group].each { |name, access| perm_hash['group'][name] = access if ['read', 'edit'].include?(access)} if params[:group]
47
+
48
+ # # rightsMetadata.update_permissions(perm_hash)
49
+ # end
50
+
51
+ # def permissions
52
+ # raise "Fixme "
53
+ # perms = super
54
+ # perms.map {|p| { name: p.name, access: p.access, type:p.type } }
55
+ # end
56
+
57
+ private
58
+
59
+ def permission_hash
60
+ old_perms = self.permissions
61
+ user_perms = {}
62
+ old_perms.select{|r| r[:type] == 'user'}.each do |r|
63
+ user_perms[r[:name]] = r[:access]
64
+ end
65
+ user_perms
66
+ group_perms = {}
67
+ old_perms.select{|r| r[:type] == 'group'}.each do |r|
68
+ group_perms[r[:name]] = r[:access]
69
+ end
70
+ {'person'=>user_perms, 'group'=>group_perms}
71
+ end
72
+
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,7 @@
1
+ module CurationConcerns
2
+ module Permissions
3
+ extend ActiveSupport::Concern
4
+ include CurationConcerns::Permissions::Writable
5
+ include CurationConcerns::Permissions::Readable
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ module CurationConcerns
2
+ module Serializers
3
+
4
+ def to_s
5
+ if title.present?
6
+ Array(title).join(" | ")
7
+ elsif label.present?
8
+ Array(label).join(" | ")
9
+ else
10
+ "No Title"
11
+ end
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,135 @@
1
+ module CurationConcerns
2
+ module SolrDocumentBehavior
3
+ def title_or_label
4
+ title || label
5
+ end
6
+
7
+ ##
8
+ # Give our SolrDocument an ActiveModel::Naming appropriate route_key
9
+ def route_key
10
+ get(Solrizer.solr_name('has_model', :symbol)).split(':').last.downcase
11
+ end
12
+
13
+ def to_param
14
+ id
15
+ end
16
+
17
+ def to_s
18
+ title_or_label
19
+ end
20
+
21
+ ##
22
+ # Offer the source (ActiveFedora-based) model to Rails for some of the
23
+ # Rails methods (e.g. link_to).
24
+ # @example
25
+ # link_to '...', SolrDocument(:id => 'bXXXXXX5').new => <a href="/dams_object/bXXXXXX5">...</a>
26
+ def to_model
27
+ @model ||= begin
28
+ m = ActiveFedora::Base.load_instance_from_solr(id, self)
29
+ m.class == ActiveFedora::Base ? self : m
30
+ end
31
+ end
32
+
33
+ def collection?
34
+ hydra_model == 'Collection'
35
+ end
36
+
37
+ # Method to return the ActiveFedora model
38
+ def hydra_model
39
+ self[Solrizer.solr_name('active_fedora_model', Solrizer::Descriptor.new(:string, :stored, :indexed))]
40
+ end
41
+
42
+ def human_readable_type
43
+ Array(self[Solrizer.solr_name('human_readable_type', :stored_searchable)]).first
44
+ end
45
+
46
+ def representative
47
+ Array(self[Solrizer.solr_name('representative', :stored_searchable)]).first
48
+ end
49
+
50
+ def date_uploaded
51
+ field = self[Solrizer.solr_name("date_uploaded", :stored_sortable, type: :date)]
52
+ return unless field.present?
53
+ begin
54
+ Date.parse(field).to_formatted_s(:standard)
55
+ rescue
56
+ Rails.logger.info "Unable to parse date: #{field.first.inspect} for #{self['id']}"
57
+ end
58
+ end
59
+
60
+ def depositor(default = '')
61
+ val = Array(self[Solrizer.solr_name("depositor")]).first
62
+ val.present? ? val : default
63
+ end
64
+
65
+ def title
66
+ Array(self[Solrizer.solr_name('title')]).first
67
+ end
68
+
69
+ def description
70
+ Array(self[Solrizer.solr_name('description')]).first
71
+ end
72
+
73
+ def label
74
+ Array(self[Solrizer.solr_name('label')]).first
75
+ end
76
+
77
+ def file_format
78
+ Array(self[Solrizer.solr_name('file_format')]).first
79
+ end
80
+
81
+ def creator
82
+ Array(self[Solrizer.solr_name("creator")]).first
83
+ end
84
+
85
+ def tags
86
+ Array(self[Solrizer.solr_name("tag")])
87
+ end
88
+
89
+ def resource_type
90
+ Array(self[Solrizer.solr_name("resource_type")])
91
+ end
92
+
93
+ def mime_type
94
+ Array(self[Solrizer.solr_name("mime_type")]).first
95
+ end
96
+
97
+ def read_groups
98
+ Array(self[::Ability.read_group_field])
99
+ end
100
+
101
+ def edit_groups
102
+ Array(self[::Ability.edit_group_field])
103
+ end
104
+
105
+ def edit_people
106
+ Array(self[::Ability.edit_user_field])
107
+ end
108
+
109
+ def public?
110
+ read_groups.include?('public')
111
+ end
112
+
113
+ def registered?
114
+ read_groups.include?('registered')
115
+ end
116
+
117
+ def pdf?
118
+ ['application/pdf'].include? self.mime_type
119
+ end
120
+
121
+ def image?
122
+ ['image/png','image/jpeg', 'image/jpg', 'image/jp2', 'image/bmp', 'image/gif', 'image/tiff'].include? self.mime_type
123
+ end
124
+
125
+ def video?
126
+ ['video/mpeg', 'video/mp4', 'video/webm', 'video/x-msvideo', 'video/avi', 'video/quicktime', 'application/mxf'].include? self.mime_type
127
+ end
128
+
129
+ def audio?
130
+ # audio/x-wave is the mime type that fits 0.6.0 returns for a wav file.
131
+ # audio/mpeg is the mime type that fits 0.6.0 returns for an mp3 file.
132
+ ['audio/mp3', 'audio/mpeg', 'audio/x-wave', 'audio/x-wav', 'audio/ogg'].include? self.mime_type
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,65 @@
1
+ module CurationConcerns::User
2
+ extend ActiveSupport::Concern
3
+
4
+ # Copied piecemeal from the pcdm branch of sufia-models. More may yet be necessary.
5
+
6
+ included do
7
+ # Connects this user object to Blacklight's Bookmarks and Folders.
8
+ include Blacklight::User
9
+ include Hydra::User
10
+
11
+ delegate :can?, :cannot?, to: :ability
12
+
13
+ attr_accessor :update_directory
14
+ end
15
+
16
+ # Format the json for select2 which requires just an id and a field called text.
17
+ # If we need an alternate format we should probably look at a json template gem
18
+ def as_json(opts = nil)
19
+ { id: user_key, text: display_name ? "#{display_name} (#{user_key})" : user_key }
20
+ end
21
+
22
+ # Populate user instance with attributes from remote system (e.g., LDAP)
23
+ # There is no default implementation -- override this in your application
24
+ # def populate_attributes
25
+ # end
26
+
27
+ def email_address
28
+ self.email
29
+ end
30
+
31
+ def name
32
+ self.display_name.titleize || raise
33
+ rescue
34
+ self.user_key
35
+ end
36
+
37
+ # Redefine this for more intuitive keys in Redis
38
+ def to_param
39
+ # hack because rails doesn't like periods in urls.
40
+ user_key.gsub(/\./, '-dot-')
41
+ end
42
+
43
+ # The basic groups method, override or will fallback to S ufia::Ldap::User
44
+ # def groups
45
+ # @groups ||= self.group_list ? self.group_list.split(";?;") : []
46
+ # end
47
+
48
+ def ability
49
+ @ability ||= ::Ability.new(self)
50
+ end
51
+
52
+ module ClassMethods
53
+ def current
54
+ Thread.current[:user]
55
+ end
56
+
57
+ def current=(user)
58
+ Thread.current[:user] = user
59
+ end
60
+
61
+ # def from_url_component(component)
62
+ # User.find_by_user_key(component.gsub(/-dot-/, '.'))
63
+ # end
64
+ end
65
+ end
@@ -0,0 +1,98 @@
1
+ module CurationConcerns
2
+ # This is a direct copy of Sufia::GenericFile::Metadata with a few modifications:
3
+ # * title & description are single-value instead of multivalue
4
+ module DefaultMetadata
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+
9
+ property :label, predicate: ::RDF::DC.title, multiple: false
10
+
11
+ property :depositor, predicate: ::RDF::URI.new("http://id.loc.gov/vocabulary/relators/dpt"), multiple: false do |index|
12
+ index.as :symbol, :stored_searchable
13
+ end
14
+
15
+ property :relative_path, predicate: ::RDF::URI.new('http://scholarsphere.psu.edu/ns#relativePath'), multiple: false
16
+
17
+ property :import_url, predicate: ::RDF::URI.new('http://scholarsphere.psu.edu/ns#importUrl'), multiple: false do |index|
18
+ index.as :symbol
19
+ end
20
+
21
+ property :part_of, predicate: ::RDF::DC.isPartOf
22
+ property :resource_type, predicate: ::RDF::DC.type do |index|
23
+ index.as :stored_searchable, :facetable
24
+ end
25
+ property :title, predicate: ::RDF::DC.title, multiple:false do |index|
26
+ index.as :stored_searchable, :facetable
27
+ end
28
+ property :creator, predicate: ::RDF::DC.creator do |index|
29
+ index.as :stored_searchable, :facetable
30
+ end
31
+ property :contributor, predicate: ::RDF::DC.contributor do |index|
32
+ index.as :stored_searchable, :facetable
33
+ end
34
+ property :description, predicate: ::RDF::DC.description, multiple: false do |index|
35
+ index.type :text
36
+ index.as :stored_searchable
37
+ end
38
+ property :tag, predicate: ::RDF::DC.relation do |index|
39
+ index.as :stored_searchable, :facetable
40
+ end
41
+ property :rights, predicate: ::RDF::DC.rights do |index|
42
+ index.as :stored_searchable
43
+ end
44
+ property :publisher, predicate: ::RDF::DC.publisher do |index|
45
+ index.as :stored_searchable, :facetable
46
+ end
47
+ property :date_created, predicate: ::RDF::DC.created do |index|
48
+ index.as :stored_searchable
49
+ end
50
+ property :date_uploaded, predicate: ::RDF::DC.dateSubmitted, multiple: false do |index|
51
+ index.type :date
52
+ index.as :stored_sortable
53
+ end
54
+ property :date_modified, predicate: ::RDF::DC.modified, multiple: false do |index|
55
+ index.type :date
56
+ index.as :stored_sortable
57
+ end
58
+ property :subject, predicate: ::RDF::DC.subject do |index|
59
+ index.as :stored_searchable, :facetable
60
+ end
61
+ property :language, predicate: ::RDF::DC.language do |index|
62
+ index.as :stored_searchable, :facetable
63
+ end
64
+ property :identifier, predicate: ::RDF::DC.identifier do |index|
65
+ index.as :stored_searchable
66
+ end
67
+ property :based_near, predicate: ::RDF::FOAF.based_near do |index|
68
+ index.as :stored_searchable, :facetable
69
+ end
70
+ property :related_url, predicate: ::RDF::RDFS.seeAlso do |index|
71
+ index.as :stored_searchable
72
+ end
73
+ property :bibliographic_citation, predicate: ::RDF::DC.bibliographicCitation do |index|
74
+ index.as :stored_searchable
75
+ end
76
+ property :source, predicate: ::RDF::DC.source do |index|
77
+ index.as :stored_searchable
78
+ end
79
+
80
+ # TODO: Move this somewhere more appropriate
81
+ begin
82
+ LocalAuthority.register_vocabulary(self, "subject", "lc_subjects")
83
+ LocalAuthority.register_vocabulary(self, "language", "lexvo_languages")
84
+ LocalAuthority.register_vocabulary(self, "tag", "lc_genres")
85
+ rescue
86
+ puts "tables for vocabularies missing"
87
+ end
88
+ end
89
+
90
+ # Add a schema.org itemtype
91
+ def itemtype
92
+ # Look up the first non-empty resource type value in a hash from the config
93
+ CurationConcerns.config.resource_types_to_schema[resource_type.to_a.reject { |type| type.empty? }.first] || 'http://schema.org/CreativeWork'
94
+ rescue
95
+ 'http://schema.org/CreativeWork'
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,29 @@
1
+ # Copied from Curate
2
+ module CurationConcerns
3
+ module WithGenericFiles
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ # The generic_files association and its accessor methods comes from Hydra::Works::AggregatesGenericFiles
8
+ before_destroy :before_destroy_cleanup_generic_files
9
+ end
10
+
11
+ # Stopgap unil ActiveFedora ContainerAssociation includes an *_ids accessor.
12
+ # At the moment, this is no more efficient than calling generic_files, but hopefully that will change in the future.
13
+ def generic_file_ids
14
+ generic_files.map { |generic_file| generic_file.id }
15
+ end
16
+
17
+ def before_destroy_cleanup_generic_files
18
+ generic_files.each(&:destroy)
19
+ end
20
+
21
+ def copy_visibility_to_files
22
+ generic_files.each do |gf|
23
+ gf.visibility = visibility
24
+ gf.save!
25
+ end
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,47 @@
1
+ require 'active_attr'
2
+ module CurationConcerns
3
+ class ClassifyConcern
4
+ include ActiveAttr::Model
5
+ attribute :curation_concern_type
6
+
7
+ validates(
8
+ :curation_concern_type,
9
+ presence: true,
10
+ inclusion: { in: lambda { |record| record.registered_curation_concern_types } }
11
+ )
12
+
13
+ def all_curation_concern_classes
14
+ registered_curation_concern_types.sort.map { |c| self.class.to_class(c) }
15
+ end
16
+
17
+ def registered_curation_concern_types
18
+ CurationConcerns.configuration.registered_curation_concern_types
19
+ end
20
+
21
+ def possible_curation_concern_types
22
+ registered_curation_concern_types.collect do |concern|
23
+ [self.class.to_class(concern).human_readable_type, concern]
24
+ end
25
+ end
26
+
27
+ def curation_concern_class
28
+ if possible_curation_concern_types.detect{|name, class_name|
29
+ class_name == curation_concern_type
30
+ }
31
+ self.class.to_class(curation_concern_type)
32
+ else
33
+ raise RuntimeError, "Invalid :curation_concern_type"
34
+ end
35
+ end
36
+
37
+ def self.to_class(type)
38
+ # TODO we may want to allow a different (or nil) namespace
39
+ type.camelize.constantize
40
+ # begin
41
+ # "::#{type.camelize}".constantize
42
+ # rescue NameError
43
+ # "CurationConcerns::#{type}".constantize
44
+ # end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,31 @@
1
+ module CurationConcerns
2
+ class QuickClassificationQuery
3
+
4
+ def self.each_for_context(*args, &block)
5
+ new(*args).all.each(&block)
6
+ end
7
+
8
+ attr_reader :user
9
+
10
+ def initialize(user, options = {})
11
+ @user = user
12
+ @concern_name_normalizer = options.fetch(:concern_name_normalizer, ClassifyConcern.method(:to_class))
13
+ @registered_curation_concern_names = options.fetch(:registered_curation_concern_names, CurationConcerns.configuration.registered_curation_concern_types)
14
+ end
15
+
16
+ def all
17
+ ActiveFedora::Base.logger.debug "User is #{user}"
18
+ ActiveFedora::Base.logger.debug "try is #{normalized_curation_concern_names.first}"
19
+ ActiveFedora::Base.logger.debug "can is #{user.can?(:create, normalized_curation_concern_names.first)}"
20
+ normalized_curation_concern_names.select {|klass| user.can?(:create, klass)}
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :concern_name_normalizer, :registered_curation_concern_names
26
+
27
+ def normalized_curation_concern_names
28
+ registered_curation_concern_names.collect{|name| concern_name_normalizer.call(name) }
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,148 @@
1
+ class FitsDatastream < ActiveFedora::OmDatastream
2
+ include OM::XML::Document
3
+
4
+ set_terminology do |t|
5
+ t.root(path: "fits",
6
+ xmlns: "http://hul.harvard.edu/ois/xml/ns/fits/fits_output",
7
+ schema: "http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd")
8
+ t.identification {
9
+ t.identity {
10
+ t.format_label(path: {attribute: "format"})
11
+ t.mime_type(path: {attribute: "mimetype"})
12
+ }
13
+ }
14
+ t.fileinfo {
15
+ t.file_size(path: "size")
16
+ t.last_modified(path: "lastmodified")
17
+ t.filename(path: "filename")
18
+ t.original_checksum(path: "md5checksum")
19
+ t.rights_basis(path: "rightsBasis")
20
+ t.copyright_basis(path: "copyrightBasis")
21
+ t.copyright_note(path: "copyrightNote")
22
+ }
23
+ t.filestatus {
24
+ t.well_formed(path: "well-formed")
25
+ t.valid(path: "valid")
26
+ t.status_message(path: "message")
27
+ }
28
+ t.metadata {
29
+ t.document {
30
+ t.file_title(path: "title")
31
+ t.file_author(path: "author")
32
+ t.file_language(path: "language")
33
+ t.page_count(path: "pageCount")
34
+ t.word_count(path: "wordCount")
35
+ t.character_count(path: "characterCount")
36
+ t.paragraph_count(path: "paragraphCount")
37
+ t.line_count(path: "lineCount")
38
+ t.table_count(path: "tableCount")
39
+ t.graphics_count(path: "graphicsCount")
40
+ }
41
+ t.image {
42
+ t.byte_order(path: "byteOrder")
43
+ t.compression(path: "compressionScheme")
44
+ t.width(path: "imageWidth")
45
+ t.height(path: "imageHeight")
46
+ t.color_space(path: "colorSpace")
47
+ t.profile_name(path: "iccProfileName")
48
+ t.profile_version(path: "iccProfileVersion")
49
+ t.orientation(path: "orientation")
50
+ t.color_map(path: "colorMap")
51
+ t.image_producer(path: "imageProducer")
52
+ t.capture_device(path: "captureDevice")
53
+ t.scanning_software(path: "scanningSoftwareName")
54
+ t.exif_version(path: "exifVersion")
55
+ t.gps_timestamp(path: "gpsTimeStamp")
56
+ t.latitude(path: "gpsDestLatitude")
57
+ t.longitude(path: "gpsDestLongitude")
58
+ }
59
+ t.text {
60
+ t.character_set(path: "charset")
61
+ t.markup_basis(path: "markupBasis")
62
+ t.markup_language(path: "markupLanguage")
63
+ }
64
+ t.audio {
65
+ t.duration(path: "duration")
66
+ t.bit_depth(path: "bitDepth")
67
+ t.sample_rate(path: "sampleRate")
68
+ t.channels(path: "channels")
69
+ t.data_format(path: "dataFormatType")
70
+ t.offset(path: "offset")
71
+ }
72
+ t.video {
73
+ t.width(path: "imageWidth")
74
+ t.height(path: "imageHeight")
75
+ t.duration(path: "duration")
76
+ t.sample_rate(path: "sampleRate")
77
+ t.frame_rate(path: "frameRate")
78
+ }
79
+ }
80
+ t.format_label(proxy: [:identification, :identity, :format_label])
81
+ t.mime_type(proxy: [:identification, :identity, :mime_type])
82
+ t.file_size(proxy: [:fileinfo, :file_size])
83
+ t.last_modified(proxy: [:fileinfo, :last_modified])
84
+ t.filename(proxy: [:fileinfo, :filename])
85
+ t.original_checksum(proxy: [:fileinfo, :original_checksum])
86
+ t.rights_basis(proxy: [:fileinfo, :rights_basis])
87
+ t.copyright_basis(proxy: [:fileinfo, :copyright_basis])
88
+ t.copyright_note(proxy: [:fileinfo, :copyright_note])
89
+ t.well_formed(proxy: [:filestatus, :well_formed])
90
+ t.valid(proxy: [:filestatus, :valid])
91
+ t.status_message(proxy: [:filestatus, :status_message])
92
+ t.file_title(proxy: [:metadata, :document, :file_title])
93
+ t.file_author(proxy: [:metadata, :document, :file_author])
94
+ t.page_count(proxy: [:metadata, :document, :page_count])
95
+ t.file_language(proxy: [:metadata, :document, :file_language])
96
+ t.word_count(proxy: [:metadata, :document, :word_count])
97
+ t.character_count(proxy: [:metadata, :document, :character_count])
98
+ t.paragraph_count(proxy: [:metadata, :document, :paragraph_count])
99
+ t.line_count(proxy: [:metadata, :document, :line_count])
100
+ t.table_count(proxy: [:metadata, :document, :table_count])
101
+ t.graphics_count(proxy: [:metadata, :document, :graphics_count])
102
+ t.byte_order(proxy: [:metadata, :image, :byte_order])
103
+ t.compression(proxy: [:metadata, :image, :compression])
104
+ t.width(proxy: [:metadata, :image, :width])
105
+ t.video_width( proxy: [:metadata, :video, :width])
106
+ t.height(proxy: [:metadata, :image, :height])
107
+ t.video_height(proxy: [:metadata, :video, :height])
108
+ t.color_space(proxy: [:metadata, :image, :color_space])
109
+ t.profile_name(proxy: [:metadata, :image, :profile_name])
110
+ t.profile_version(proxy: [:metadata, :image, :profile_version])
111
+ t.orientation(proxy: [:metadata, :image, :orientation])
112
+ t.color_map(proxy: [:metadata, :image, :color_map])
113
+ t.image_producer(proxy: [:metadata, :image, :image_producer])
114
+ t.capture_device(proxy: [:metadata, :image, :capture_device])
115
+ t.scanning_software(proxy: [:metadata, :image, :scanning_software])
116
+ t.exif_version(proxy: [:metadata, :image, :exif_version])
117
+ t.gps_timestamp(proxy: [:metadata, :image, :gps_timestamp])
118
+ t.latitude(proxy: [:metadata, :image, :latitude])
119
+ t.longitude(proxy: [:metadata, :image, :longitude])
120
+ t.character_set(proxy: [:metadata, :text, :character_set])
121
+ t.markup_basis(proxy: [:metadata, :text, :markup_basis])
122
+ t.markup_language(proxy: [:metadata, :text, :markup_language])
123
+ t.duration(proxy: [:metadata, :audio, :duration])
124
+ t.video_duration(proxy: [:metadata, :video, :duration])
125
+ t.bit_depth(proxy: [:metadata, :audio, :bit_depth])
126
+ t.sample_rate(proxy: [:metadata, :audio, :sample_rate])
127
+ t.video_sample_rate(proxy: [:metadata, :video, :sample_rate])
128
+ t.channels(proxy: [:metadata, :audio, :channels])
129
+ t.data_format(proxy: [:metadata, :audio, :data_format])
130
+ t.offset(proxy: [:metadata, :audio, :offset])
131
+ t.frame_rate(proxy: [:metadata, :video, :frame_rate])
132
+ end
133
+
134
+ def self.xml_template
135
+ builder = Nokogiri::XML::Builder.new do |xml|
136
+ xml.fits(xmlns: 'http://hul.harvard.edu/ois/xml/ns/fits/fits_output',
137
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
138
+ 'xsi:schemaLocation' =>
139
+ "http://hul.harvard.edu/ois/xml/ns/fits/fits_output
140
+ http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd",
141
+ version: "0.6.0",
142
+ timestamp: "1/25/12 11:04 AM") {
143
+ xml.identification { xml.identity(toolname: 'FITS') }
144
+ }
145
+ end
146
+ builder.doc
147
+ end
148
+ end
@@ -0,0 +1,2 @@
1
+ class VersionCommitter < ActiveRecord::Base
2
+ end