worthwhile 0.0.1.alpha → 0.0.1

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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.rspec +1 -0
  4. data/.travis.yml +19 -0
  5. data/Gemfile +7 -11
  6. data/README.md +8 -12
  7. data/Rakefile +17 -2
  8. data/app/actors/concerns/worthwhile/manages_embargoes_actor.rb +79 -0
  9. data/app/actors/curation_concern/base_actor.rb +68 -0
  10. data/app/actors/curation_concern/generic_file_actor.rb +40 -0
  11. data/app/actors/curation_concern/generic_work_actor.rb +92 -0
  12. data/app/actors/curation_concern/linked_resource_actor.rb +4 -0
  13. data/app/assets/images/default.png +0 -0
  14. data/app/assets/images/nope.png +0 -0
  15. data/app/assets/javascripts/.gitkeep +0 -0
  16. data/app/assets/javascripts/modernizr.js +3 -0
  17. data/app/assets/javascripts/worthwhile/.gitkeep +0 -0
  18. data/app/assets/javascripts/worthwhile/accept_contributor_agreement.js +15 -0
  19. data/app/assets/javascripts/worthwhile/application.js +18 -0
  20. data/app/assets/javascripts/worthwhile/browse_everything_implement.js +7 -0
  21. data/app/assets/javascripts/worthwhile/embargoes.js +17 -0
  22. data/app/assets/javascripts/worthwhile/facet_mine.js +22 -0
  23. data/app/assets/javascripts/worthwhile/help_modal.js +36 -0
  24. data/app/assets/javascripts/worthwhile/link_groups.js.coffee +123 -0
  25. data/app/assets/javascripts/worthwhile/link_users.js.coffee +126 -0
  26. data/app/assets/javascripts/worthwhile/manage_repeating_fields.js +74 -0
  27. data/app/assets/javascripts/worthwhile/proxy_rights.js.coffee +95 -0
  28. data/app/assets/javascripts/worthwhile/proxy_submission.js +23 -0
  29. data/app/assets/javascripts/worthwhile/select_works.js.coffee +20 -0
  30. data/app/assets/javascripts/worthwhile/worthwhile.js +45 -0
  31. data/app/assets/stylesheets/worthwhile.css.scss +23 -0
  32. data/app/assets/stylesheets/worthwhile/_global-variables.css.scss +5 -0
  33. data/app/assets/stylesheets/worthwhile/_modules.css.scss +14 -0
  34. data/app/assets/stylesheets/worthwhile/_positioning.css.scss +138 -0
  35. data/app/assets/stylesheets/worthwhile/_theme.css.scss +46 -0
  36. data/app/assets/stylesheets/worthwhile/_typography.css.scss +142 -0
  37. data/app/assets/stylesheets/worthwhile/_variables_bootstrap.css.scss +7 -0
  38. data/app/assets/stylesheets/worthwhile/_worthwhile.css.scss +7 -0
  39. data/app/assets/stylesheets/worthwhile/downloads.css.scss +3 -0
  40. data/app/assets/stylesheets/worthwhile/help_requests.css.scss +3 -0
  41. data/app/assets/stylesheets/worthwhile/modules/accessibility.css.scss +50 -0
  42. data/app/assets/stylesheets/worthwhile/modules/accordion.css.scss +33 -0
  43. data/app/assets/stylesheets/worthwhile/modules/attributes.css.scss +26 -0
  44. data/app/assets/stylesheets/worthwhile/modules/classify_work.css.scss +100 -0
  45. data/app/assets/stylesheets/worthwhile/modules/collections.css.scss +42 -0
  46. data/app/assets/stylesheets/worthwhile/modules/embargoes.css.scss +15 -0
  47. data/app/assets/stylesheets/worthwhile/modules/emphatic_action_area.css.scss +14 -0
  48. data/app/assets/stylesheets/worthwhile/modules/forms.css.scss +116 -0
  49. data/app/assets/stylesheets/worthwhile/modules/multi_value_fields.css.scss +52 -0
  50. data/app/assets/stylesheets/worthwhile/modules/pagination.css.scss +4 -0
  51. data/app/assets/stylesheets/worthwhile/modules/search_results.css.scss +55 -0
  52. data/app/assets/stylesheets/worthwhile/modules/site_actions.css.scss +53 -0
  53. data/app/assets/stylesheets/worthwhile/modules/site_search.css.scss +46 -0
  54. data/app/controllers/catalog_controller.rb +3 -0
  55. data/app/controllers/collections_controller.rb +59 -0
  56. data/app/controllers/concerns/worthwhile/application_controller_behavior.rb +23 -0
  57. data/app/controllers/concerns/worthwhile/catalog_controller.rb +347 -0
  58. data/app/controllers/concerns/worthwhile/curation_concern_controller.rb +131 -0
  59. data/app/controllers/concerns/worthwhile/files_controller.rb +149 -0
  60. data/app/controllers/concerns/worthwhile/manages_embargoes.rb +22 -0
  61. data/app/controllers/concerns/worthwhile/parent_container.rb +31 -0
  62. data/app/controllers/concerns/worthwhile/themed_layout_controller.rb +31 -0
  63. data/app/controllers/concerns/worthwhile/without_namespace.rb +15 -0
  64. data/app/controllers/curation_concern/generic_files_controller.rb +6 -0
  65. data/app/controllers/curation_concern/generic_works_controller.rb +6 -0
  66. data/app/controllers/curation_concern/linked_resources_controller.rb +68 -0
  67. data/app/controllers/curation_concern/permissions_controller.rb +19 -0
  68. data/app/controllers/downloads_controller.rb +4 -0
  69. data/app/controllers/embargoes_controller.rb +44 -0
  70. data/app/controllers/leases_controller.rb +34 -0
  71. data/app/controllers/registrations_controller.rb +20 -0
  72. data/app/controllers/sessions_controller.rb +4 -0
  73. data/app/controllers/worthwhile/application_controller.rb +7 -0
  74. data/app/controllers/worthwhile/classify_concerns_controller.rb +35 -0
  75. data/app/datastreams/generic_work_metadata.rb +3 -0
  76. data/app/datastreams/worthwhile/generic_work_rdf_properties.rb +57 -0
  77. data/app/datastreams/worthwhile/properties_datastream.rb +28 -0
  78. data/app/helpers/curate/collections_helper.rb +133 -0
  79. data/app/helpers/worthwhile/ability_helper.rb +46 -0
  80. data/app/helpers/worthwhile/attribute_helper.rb +67 -0
  81. data/app/helpers/worthwhile/catalog_helper.rb +38 -0
  82. data/app/helpers/worthwhile/collections_helper.rb +19 -0
  83. data/app/helpers/worthwhile/embargo_helper.rb +17 -0
  84. data/app/helpers/worthwhile/generic_file_helper.rb +19 -0
  85. data/app/helpers/worthwhile/lease_helper.rb +18 -0
  86. data/app/helpers/worthwhile/main_app_helpers.rb +14 -0
  87. data/app/helpers/worthwhile/render_constraints_helper.rb +42 -0
  88. data/app/helpers/worthwhile/search_paths_helper.rb +13 -0
  89. data/app/helpers/worthwhile/thumbnail_helper.rb +11 -0
  90. data/app/helpers/worthwhile/title_helper.rb +23 -0
  91. data/app/helpers/worthwhile/url_helper.rb +16 -0
  92. data/app/inputs/multi_value_input.rb +72 -0
  93. data/app/models/collection.rb +15 -0
  94. data/app/models/concerns/curation_concern/collection_model.rb +62 -0
  95. data/app/models/concerns/curation_concern/curatable.rb +77 -0
  96. data/app/models/concerns/curation_concern/has_representative.rb +14 -0
  97. data/app/models/concerns/curation_concern/human_readable_type.rb +23 -0
  98. data/app/models/concerns/curation_concern/with_basic_metadata.rb +49 -0
  99. data/app/models/concerns/curation_concern/with_editors.rb +44 -0
  100. data/app/models/concerns/curation_concern/with_generic_files.rb +23 -0
  101. data/app/models/concerns/curation_concern/with_linked_resources.rb +21 -0
  102. data/app/models/concerns/curation_concern/work.rb +24 -0
  103. data/app/models/concerns/worthwhile/ability.rb +34 -0
  104. data/app/models/concerns/worthwhile/generic_file/versioned_content.rb +18 -0
  105. data/app/models/concerns/worthwhile/generic_file_base.rb +64 -0
  106. data/app/models/concerns/worthwhile/solr_document_behavior.rb +140 -0
  107. data/app/models/generic_work.rb +5 -0
  108. data/app/models/worthwhile/classify_concern.rb +47 -0
  109. data/app/models/worthwhile/content_version.rb +23 -0
  110. data/app/models/worthwhile/contributor_agreement.rb +23 -0
  111. data/app/models/worthwhile/generic_file.rb +5 -0
  112. data/app/models/worthwhile/linked_resource.rb +41 -0
  113. data/app/models/worthwhile/quick_classification_query.rb +31 -0
  114. data/app/services/worthwhile/curation_concern.rb +21 -0
  115. data/app/services/worthwhile/embargo_service.rb +26 -0
  116. data/app/services/worthwhile/lease_service.rb +23 -0
  117. data/app/views/catalog/_action_menu_partials/_collection.html.erb +27 -0
  118. data/app/views/catalog/_action_menu_partials/_default.html.erb +27 -0
  119. data/app/views/catalog/_document.html.erb +3 -0
  120. data/app/views/catalog/_document_list.html.erb +5 -0
  121. data/app/views/catalog/_home_text.html.erb +8 -0
  122. data/app/views/catalog/_index_default.html.erb +17 -0
  123. data/app/views/catalog/_index_header_list_default.html.erb +17 -0
  124. data/app/views/catalog/_navbar.html.erb +12 -0
  125. data/app/views/catalog/_show_partials/_default.html.erb +22 -0
  126. data/app/views/catalog/_show_partials/_default_details.html.erb +15 -0
  127. data/app/views/catalog/_show_partials/_facets.html.erb +52 -0
  128. data/app/views/catalog/index.html.erb +48 -0
  129. data/app/views/collections/_batch_edits_actions.html.erb +3 -0
  130. data/app/views/collections/_button_for_creating_empty_collection.html.erb +3 -0
  131. data/app/views/collections/_collection.html.erb +1 -0
  132. data/app/views/collections/_dashboard_document_list.html.erb +6 -0
  133. data/app/views/collections/_document_list.html.erb +7 -0
  134. data/app/views/collections/_edit_actions.html.erb +5 -0
  135. data/app/views/collections/_edit_descriptions.html.erb +20 -0
  136. data/app/views/collections/_form.html.erb +26 -0
  137. data/app/views/collections/_form_for_select_collection.html.erb +34 -0
  138. data/app/views/collections/_form_permission.html.erb +36 -0
  139. data/app/views/collections/_form_required_information.html.erb +11 -0
  140. data/app/views/collections/_identifier_and_action.html.erb +15 -0
  141. data/app/views/collections/_media_display.html.erb +1 -0
  142. data/app/views/collections/_paginate.html.erb +6 -0
  143. data/app/views/collections/_search_collection_dashboard_form.html.erb +10 -0
  144. data/app/views/collections/_show_actions.html.erb +8 -0
  145. data/app/views/collections/_show_descriptions.html.erb +10 -0
  146. data/app/views/collections/_show_fields.html.erb +0 -0
  147. data/app/views/collections/_single_item_action_fields.html.erb +6 -0
  148. data/app/views/collections/_sort_and_per_page.html.erb +29 -0
  149. data/app/views/collections/_view_type_group.html.erb +13 -0
  150. data/app/views/collections/edit.html.erb +22 -0
  151. data/app/views/collections/new.html.erb +15 -0
  152. data/app/views/collections/show.html.erb +24 -0
  153. data/app/views/curate/collections/_add_to_collection_modal.html.erb +15 -0
  154. data/app/views/curate/collections/_button_remove_from_collection.html.erb +6 -0
  155. data/app/views/curate/collections/_form_to_add_member.html.erb +27 -0
  156. data/app/views/curate/collections/add_member_form.html.erb +6 -0
  157. data/app/views/curation_concern/base/_attributes.html.erb +25 -0
  158. data/app/views/curation_concern/base/_collections.html.erb +26 -0
  159. data/app/views/curation_concern/base/_form.html.erb +27 -0
  160. data/app/views/curation_concern/base/_form_additional_information.html.erb +9 -0
  161. data/app/views/curation_concern/base/_form_content_license.html.erb +16 -0
  162. data/app/views/curation_concern/base/_form_contributor_agreement.html.erb +29 -0
  163. data/app/views/curation_concern/base/_form_descriptive_fields.erb +23 -0
  164. data/app/views/curation_concern/base/_form_files_and_links.html.erb +29 -0
  165. data/app/views/curation_concern/base/_form_permission.html.erb +52 -0
  166. data/app/views/curation_concern/base/_form_permission_embargo.html.erb +6 -0
  167. data/app/views/curation_concern/base/_form_permission_lease.html.erb +6 -0
  168. data/app/views/curation_concern/base/_form_permission_under_embargo.html.erb +16 -0
  169. data/app/views/curation_concern/base/_form_permission_under_lease.html.erb +18 -0
  170. data/app/views/curation_concern/base/_form_representative_image.html.erb +13 -0
  171. data/app/views/curation_concern/base/_form_required_information.html.erb +11 -0
  172. data/app/views/curation_concern/base/_form_supplementary_fields.html.erb +15 -0
  173. data/app/views/curation_concern/base/_legally_binding_text.html.erb +33 -0
  174. data/app/views/curation_concern/base/_related_files.html.erb +24 -0
  175. data/app/views/curation_concern/base/_related_resources.html.erb +40 -0
  176. data/app/views/curation_concern/base/_representative_media.html.erb +8 -0
  177. data/app/views/curation_concern/base/edit.html.erb +15 -0
  178. data/app/views/curation_concern/base/new.html.erb +14 -0
  179. data/app/views/curation_concern/base/show.html.erb +32 -0
  180. data/app/views/curation_concern/base/unauthorized.html.erb +3 -0
  181. data/app/views/curation_concern/generic_files/_form.html.erb +35 -0
  182. data/app/views/curation_concern/generic_files/_media_display.html.erb +20 -0
  183. data/app/views/curation_concern/generic_files/edit.html.erb +5 -0
  184. data/app/views/curation_concern/generic_files/show.html.erb +15 -0
  185. data/app/views/curation_concern/generic_works/_generic_work.html.erb +3 -0
  186. data/app/views/curation_concern/linked_resources/_form.html.erb +11 -0
  187. data/app/views/curation_concern/linked_resources/edit.html.erb +5 -0
  188. data/app/views/curation_concern/linked_resources/new.html.erb +5 -0
  189. data/app/views/curation_concern/permissions/confirm.html.erb +13 -0
  190. data/app/views/curation_concern/worthwhile/generic_files/_actions.html.erb +16 -0
  191. data/app/views/curation_concern/worthwhile/generic_files/_generic_file.html.erb +12 -0
  192. data/app/views/embargoes/_embargo_history.html.erb +7 -0
  193. data/app/views/embargoes/_list_active_embargoes.html.erb +16 -0
  194. data/app/views/embargoes/_list_deactivated_embargoes.html.erb +10 -0
  195. data/app/views/embargoes/_list_expired_active_embargoes.html.erb +44 -0
  196. data/app/views/embargoes/edit.html.erb +43 -0
  197. data/app/views/embargoes/index.html.erb +18 -0
  198. data/app/views/layouts/boilerplate.html.erb +22 -0
  199. data/app/views/layouts/common_objects.html.erb +36 -0
  200. data/app/views/layouts/curate_nd.html.erb +33 -0
  201. data/app/views/layouts/curate_nd/1_column.html.erb +22 -0
  202. data/app/views/layouts/curate_nd/2_column.html.erb +26 -0
  203. data/app/views/layouts/curate_nd/catalog.html.erb +38 -0
  204. data/app/views/layouts/curate_nd/dashboard.html.erb +22 -0
  205. data/app/views/leases/_lease_history.html.erb +7 -0
  206. data/app/views/leases/_list_active_leases.html.erb +16 -0
  207. data/app/views/leases/_list_deactivated_leases.html.erb +4 -0
  208. data/app/views/leases/_list_expired_active_leases.html.erb +38 -0
  209. data/app/views/leases/edit.html.erb +43 -0
  210. data/app/views/leases/index.html.erb +18 -0
  211. data/app/views/shared/_add_content.html.erb +32 -0
  212. data/app/views/shared/_brand_bar.html.erb +10 -0
  213. data/app/views/shared/_flash_message.html.erb +17 -0
  214. data/app/views/shared/_footer.html.erb +10 -0
  215. data/app/views/shared/_ga.html.erb +6 -0
  216. data/app/views/shared/_header.html.erb +12 -0
  217. data/app/views/shared/_my_actions.html.erb +21 -0
  218. data/app/views/shared/_site_actions.html.erb +7 -0
  219. data/app/views/shared/_site_search.html.erb +12 -0
  220. data/app/views/shared/_title_bar.html.erb +16 -0
  221. data/app/views/worthwhile/classify_concerns/new.html.erb +27 -0
  222. data/app/workers/visibility_copy_worker.rb +29 -0
  223. data/config/initializers/simple_form.rb +31 -0
  224. data/config/locales/sufia.en.yml +26 -0
  225. data/config/locales/worthwhile.en.yml +68 -0
  226. data/config/routes.rb +4 -0
  227. data/lib/generators/worthwhile/install_generator.rb +74 -0
  228. data/lib/generators/worthwhile/templates/worthwhile.css.scss +3 -0
  229. data/lib/generators/worthwhile/templates/worthwhile.js +1 -0
  230. data/lib/generators/worthwhile/templates/worthwhile_config.rb +3 -0
  231. data/lib/generators/worthwhile/templates/worthwhile_helper.rb +4 -0
  232. data/lib/worthwhile.rb +3 -1
  233. data/lib/worthwhile/configuration.rb +74 -0
  234. data/lib/worthwhile/controller_resource.rb +10 -0
  235. data/lib/worthwhile/engine.rb +20 -0
  236. data/lib/worthwhile/rails/routes.rb +78 -0
  237. data/lib/worthwhile/spec_support.rb +10 -0
  238. data/lib/worthwhile/version.rb +1 -1
  239. data/spec/abilities/generic_file_abilities_spec.rb +62 -0
  240. data/spec/abilities/generic_work_abilities_spec.rb +58 -0
  241. data/spec/actors/curation_concern/generic_work_actor_spec.rb +215 -0
  242. data/spec/actors/curation_concern/linked_resource_actor_spec.rb +36 -0
  243. data/spec/actors/worthwile/manages_embargoes_actor_spec.rb +95 -0
  244. data/spec/controllers/catalog_controller_spec.rb +114 -0
  245. data/spec/controllers/collections_controller_spec.rb +216 -0
  246. data/spec/controllers/curation_concern/generic_files_controller_spec.rb +258 -0
  247. data/spec/controllers/curation_concern/generic_works_controller_spec.rb +171 -0
  248. data/spec/controllers/curation_concern/linked_resources_controller_spec.rb +123 -0
  249. data/spec/controllers/curation_concern/permissions_controller_spec.rb +29 -0
  250. data/spec/controllers/downloads_controller_spec.rb +53 -0
  251. data/spec/controllers/embargoes_controller_spec.rb +107 -0
  252. data/spec/controllers/leases_controller_spec.rb +95 -0
  253. data/spec/controllers/worthwhile/classify_concerns_controller_spec.rb +35 -0
  254. data/spec/factories/collections_factory.rb +21 -0
  255. data/spec/factories/create_curation_concern.rb +3 -0
  256. data/spec/factories/generic_files.rb +18 -0
  257. data/spec/factories/generic_works.rb +37 -0
  258. data/spec/factories/linked_resources_factory.rb +18 -0
  259. data/spec/factories/users.rb +15 -0
  260. data/spec/features/add_external_link_spec.rb +25 -0
  261. data/spec/features/add_file_spec.rb +28 -0
  262. data/spec/features/collection_spec.rb +238 -0
  263. data/spec/features/embargo_spec.rb +45 -0
  264. data/spec/features/lease_spec.rb +43 -0
  265. data/spec/features/update_file_spec.rb +28 -0
  266. data/spec/fixtures/files/image.png +0 -0
  267. data/spec/helpers/catalog_helper_spec.rb +58 -0
  268. data/spec/helpers/configuration_helper_spec.rb +13 -0
  269. data/spec/helpers/render_constraints_helper_spec.rb +19 -0
  270. data/spec/helpers/thumbnail_helper_spec.rb +21 -0
  271. data/spec/helpers/url_helper_spec.rb +19 -0
  272. data/spec/matchers.rb +24 -0
  273. data/spec/matchers/metadata_field_matchers.rb +28 -0
  274. data/spec/models/collection_spec.rb +136 -0
  275. data/spec/models/curation_concern/collection_model_spec.rb +50 -0
  276. data/spec/models/curation_concern/work_spec.rb +30 -0
  277. data/spec/models/generic_work_spec.rb +24 -0
  278. data/spec/models/worthwhile/content_version_spec.rb +27 -0
  279. data/spec/models/worthwhile/generic_file_spec.rb +77 -0
  280. data/spec/models/worthwhile/linked_resource_spec.rb +76 -0
  281. data/spec/routing/worthwhile/routes_spec.rb +23 -0
  282. data/spec/services/embargo_service_spec.rb +38 -0
  283. data/spec/services/lease_service_spec.rb +37 -0
  284. data/spec/spec_helper.rb +30 -5
  285. data/spec/support/controllers/engine_helpers.rb +7 -0
  286. data/spec/support/curation_concern/factory_helpers.rb +14 -0
  287. data/spec/support/features.rb +19 -0
  288. data/spec/support/features/fixture_file_upload.rb +14 -0
  289. data/spec/support/features/session_helpers.rb +41 -0
  290. data/spec/support/shared/shared_examples_has_dc_metadata.rb +17 -0
  291. data/spec/support/shared/shared_examples_is_a_curation_concern_model.rb +40 -0
  292. data/spec/support/shared/shared_examples_is_embargoable.rb +8 -0
  293. data/spec/support/shared/shared_examples_with_access_rights.rb +63 -0
  294. data/spec/test_app_templates/lib/generators/test_app_generator.rb +8 -29
  295. data/spec/views/curation_concern/base/_attributes.html.erb_spec.rb +25 -0
  296. data/spec/views/curation_concern/base/show.html.erb_spec.rb +25 -0
  297. data/spec/views/shared/_add_content.html.erb_spec.rb +42 -0
  298. data/spec/views/shared/_my_actions.html.erb_spec.rb +23 -0
  299. data/spec/workers/visibility_copy_worker_spec.rb +68 -0
  300. data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  301. data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  302. data/vendor/assets/javascripts/handlebars.js +2278 -0
  303. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.autocomplete.js +602 -0
  304. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.core.js +356 -0
  305. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect-highlight.js +50 -0
  306. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect.js +1276 -0
  307. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.menu.js +610 -0
  308. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.position.js +498 -0
  309. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.widget.js +528 -0
  310. data/vendor/assets/javascripts/jquery.tokeninput.js +1061 -0
  311. data/vendor/assets/stylesheets/jquery-ui-lightness.css +474 -0
  312. data/vendor/assets/stylesheets/token-input-facebook.css +122 -0
  313. data/vendor/assets/stylesheets/token-input-mac.css +204 -0
  314. data/vendor/assets/stylesheets/token-input.css +127 -0
  315. data/worthwhile.gemspec +9 -3
  316. metadata +469 -9
@@ -0,0 +1,131 @@
1
+ module Worthwhile::CurationConcernController
2
+ extend ActiveSupport::Concern
3
+ include Worthwhile::WithoutNamespace
4
+ include Blacklight::Catalog::SearchContext
5
+
6
+ included do
7
+ include Worthwhile::ThemedLayoutController
8
+ with_themed_layout '1_column'
9
+ helper Worthwhile::AbilityHelper
10
+
11
+ class_attribute :curation_concern_type
12
+ attr_accessor :curation_concern
13
+ helper_method :curation_concern
14
+ helper_method :contributor_agreement
15
+
16
+ respond_to :html
17
+ end
18
+
19
+ module ClassMethods
20
+ def set_curation_concern_type(curation_concern_type)
21
+ load_and_authorize_resource class: curation_concern_type, instance_name: :curation_concern
22
+ self.curation_concern_type = curation_concern_type
23
+ end
24
+
25
+ def cancan_resource_class
26
+ Worthwhile::ControllerResource
27
+ end
28
+ end
29
+
30
+ def contributor_agreement
31
+ @contributor_agreement ||= Worthwhile::ContributorAgreement.new(curation_concern, current_user, params)
32
+ end
33
+
34
+
35
+ def new
36
+ end
37
+
38
+ def create
39
+ return unless verify_acceptance_of_user_agreement!
40
+ if actor.create
41
+ after_create_response
42
+ else
43
+ setup_form
44
+ respond_with([:curation_concern, curation_concern]) do |wants|
45
+ wants.html { render 'new', status: :unprocessable_entity }
46
+ end
47
+ end
48
+ end
49
+
50
+ def show
51
+ end
52
+
53
+ def edit
54
+ end
55
+
56
+ def update
57
+ if actor.update
58
+ after_update_response
59
+ else
60
+ setup_form
61
+ respond_with([:curation_concern, curation_concern]) do |wants|
62
+ wants.html { render 'edit', status: :unprocessable_entity }
63
+ end
64
+ end
65
+ end
66
+
67
+ def destroy
68
+ title = curation_concern.to_s
69
+ curation_concern.destroy
70
+ after_destroy_response(title)
71
+ end
72
+
73
+ attr_writer :actor
74
+
75
+ protected
76
+ def actor
77
+ @actor ||= Worthwhile::CurationConcern.actor(curation_concern, current_user, attributes_for_actor)
78
+ end
79
+
80
+ # Override setup_form in concrete controllers to get the form ready for display
81
+ def setup_form
82
+ if curation_concern.respond_to?(:contributor) && curation_concern.contributor.blank?
83
+ curation_concern.contributor << current_user.name
84
+ end
85
+ end
86
+
87
+ def verify_acceptance_of_user_agreement!
88
+ return true if contributor_agreement.is_being_accepted?
89
+ # Calling the new action to make sure we are doing our best to preserve
90
+ # the input values; Its a stretch but hopefully it'll work
91
+ self.new
92
+ respond_with([:curation_concern, curation_concern]) do |wants|
93
+ wants.html {
94
+ flash.now[:error] = "You must accept the contributor agreement"
95
+ render 'new', status: :conflict
96
+ }
97
+ end
98
+ false
99
+ end
100
+
101
+ def _prefixes
102
+ @_prefixes ||= super + ['curation_concern/base']
103
+ end
104
+
105
+ def after_create_response
106
+ respond_with([:curation_concern, curation_concern])
107
+ end
108
+
109
+ def after_update_response
110
+ if actor.visibility_changed?
111
+ redirect_to confirm_curation_concern_permission_path(curation_concern)
112
+ else
113
+ respond_with([:curation_concern, curation_concern])
114
+ end
115
+ end
116
+
117
+ def after_destroy_response(title)
118
+ flash[:notice] = "Deleted #{title}"
119
+ respond_with { |wants|
120
+ wants.html { redirect_to main_app.catalog_index_path }
121
+ }
122
+ end
123
+
124
+ def attributes_for_actor
125
+ params[hash_key_for_curation_concern]
126
+ end
127
+
128
+ def hash_key_for_curation_concern
129
+ self.class.curation_concern_type.name.underscore.to_sym
130
+ end
131
+ end
@@ -0,0 +1,149 @@
1
+ module Worthwhile
2
+ module FilesController
3
+ extend ActiveSupport::Concern
4
+ include Worthwhile::WithoutNamespace
5
+
6
+ included do
7
+ include Worthwhile::ThemedLayoutController
8
+ with_themed_layout '1_column'
9
+ load_and_authorize_resource class: Worthwhile::GenericFile
10
+ helper_method :curation_concern
11
+ include Worthwhile::ParentContainer
12
+ end
13
+
14
+ def curation_concern
15
+ @generic_file
16
+ end
17
+
18
+ # routed to /files/new
19
+ def new
20
+ @batch_noid = Sufia::Noid.noidify(Sufia::IdService.mint)
21
+ end
22
+
23
+ # routed to /files/:id/edit
24
+ def edit
25
+ @generic_file.initialize_fields
26
+ @groups = current_user.groups
27
+ end
28
+
29
+ # routed to /files (POST)
30
+ def create
31
+ create_from_upload(params)
32
+ end
33
+
34
+ def create_from_upload(params)
35
+ # check error condition No files
36
+ return json_error("Error! No file to save") if !params.has_key?(:files)
37
+
38
+ file = params[:files].detect {|f| f.respond_to?(:original_filename) }
39
+ if !file
40
+ json_error "Error! No file for upload", 'unknown file', :status => :unprocessable_entity
41
+ elsif (empty_file?(file))
42
+ json_error "Error! Zero Length File!", file.original_filename
43
+ else
44
+ process_file(file)
45
+ end
46
+ rescue RSolr::Error::Http => error
47
+ logger.error "GenericFilesController::create rescued #{error.class}\n\t#{error.to_s}\n #{error.backtrace.join("\n")}\n\n"
48
+ json_error "Error occurred while creating generic file."
49
+ ensure
50
+ # remove the tempfile (only if it is a temp file)
51
+ file.tempfile.delete if file.respond_to?(:tempfile)
52
+ end
53
+
54
+ # routed to /files/:id
55
+ def show
56
+ end
57
+
58
+ def destroy
59
+ @generic_file.destroy
60
+ redirect_to [:curation_concern, @generic_file.batch], notice: "The file has been deleted."
61
+ end
62
+
63
+ # routed to /files/:id (PUT)
64
+ def update
65
+ success = if wants_to_revert?
66
+ actor.revert_content(params[:revision], datastream_id)
67
+ elsif params.has_key? :files
68
+ actor.update_content(params[:files].first, datastream_id)
69
+ elsif params.has_key? :generic_file
70
+ actor.update_metadata(params[:generic_file], params[:generic_file][:visibility])
71
+ end
72
+
73
+ if success
74
+ redirect_to [:curation_concern, @generic_file], notice:
75
+ "The file #{view_context.link_to(@generic_file, [main_app, :curation_concern, @generic_file])} has been updated."
76
+ else
77
+ render action: 'edit'
78
+ end
79
+ rescue RSolr::Error::Http => error
80
+ flash[:error] = error.message
81
+ logger.error "GenericFilesController::update rescued #{error.class}\n\t#{error.message}\n #{error.backtrace.join("\n")}\n\n"
82
+ render action: 'edit'
83
+ end
84
+
85
+ protected
86
+
87
+ def wants_to_revert?
88
+ params.has_key?(:revision) && params[:revision] != @generic_file.content.latest_version.versionID
89
+ end
90
+
91
+ def actor
92
+ @actor ||= ::CurationConcern::GenericFileActor.new(@generic_file, current_user, attributes)
93
+ end
94
+
95
+ def attributes
96
+ params[:generic_file]
97
+ end
98
+
99
+ def json_error(error, name=nil, additional_arguments={})
100
+ args = {:error => error}
101
+ args[:name] = name if name
102
+ render additional_arguments.merge({:json => [args]})
103
+ end
104
+
105
+ def _prefixes
106
+ # This allows us to use the unauthorized and form_permission template in curation_concern/base
107
+ @_prefixes ||= super + ['curation_concern/base']
108
+ end
109
+
110
+ def empty_file?(file)
111
+ (file.respond_to?(:tempfile) && file.tempfile.size == 0) || (file.respond_to?(:size) && file.size == 0)
112
+ end
113
+
114
+ def process_file(file)
115
+ update_metadata_from_upload_screen
116
+ actor.create_metadata(namespaced_parent_id)
117
+ if actor.create_content(file, file.original_filename, datastream_id)
118
+ respond_to do |format|
119
+ format.html {
120
+ if request.xhr?
121
+ render json: [@generic_file.to_jq_upload], content_type: 'text/html', layout: false
122
+ else
123
+ redirect_to [:curation_concern, @generic_file.batch]
124
+ end
125
+ }
126
+ format.json {
127
+ render json: [@generic_file.to_jq_upload]
128
+ }
129
+ end
130
+ else
131
+ msg = @generic_file.errors.full_messages.join(', ')
132
+ flash[:error] = msg
133
+ json_error "Error creating generic file: #{msg}"
134
+ end
135
+ end
136
+
137
+ # The name of the datastream where we store the file data
138
+ def datastream_id
139
+ 'content'
140
+ end
141
+
142
+ # this is provided so that implementing application can override this behavior and map params to different attributes
143
+ def update_metadata_from_upload_screen
144
+ # Relative path is set by the jquery uploader when uploading a directory
145
+ @generic_file.relative_path = params[:relative_path] if params[:relative_path]
146
+ end
147
+
148
+ end
149
+ end
@@ -0,0 +1,22 @@
1
+ module Worthwhile
2
+ module ManagesEmbargoes
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ include Worthwhile::ThemedLayoutController
7
+ with_themed_layout '1_column'
8
+
9
+ attr_accessor :curation_concern
10
+ helper_method :curation_concern
11
+ load_and_authorize_resource class: ActiveFedora::Base, instance_name: :curation_concern
12
+ end
13
+
14
+
15
+ def index
16
+ authorize! :discover, :embargo
17
+ end
18
+
19
+ def edit
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ module Worthwhile::ParentContainer
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ helper_method :parent
6
+ before_filter :authorize_edit_parent_rights!, except: [:show]
7
+ end
8
+
9
+ def parent
10
+ @parent ||= new_or_create? ? ActiveFedora::Base.find(parent_id) : curation_concern.batch
11
+ end
12
+
13
+ def parent_id
14
+ @parent_id ||= new_or_create? ? namespaced_parent_id : curation_concern.batch_id
15
+ end
16
+
17
+ protected
18
+
19
+ def new_or_create?
20
+ ['create', 'new'].include? action_name
21
+ end
22
+
23
+ def namespaced_parent_id
24
+ Sufia::Noid.namespaceize(params[:parent_id])
25
+ end
26
+
27
+ def authorize_edit_parent_rights!
28
+ authorize! :edit, parent_id
29
+ end
30
+
31
+ end
@@ -0,0 +1,31 @@
1
+ # Copied from Curate
2
+ module Worthwhile::ThemedLayoutController
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ class_attribute :theme
7
+ self.theme = 'curate_nd'
8
+ helper_method :theme
9
+ helper_method :show_site_actions?
10
+ helper_method :show_site_search?
11
+ end
12
+
13
+ module ClassMethods
14
+ def with_themed_layout(view_name = nil)
15
+ if view_name
16
+ layout("#{theme}/#{view_name}")
17
+ else
18
+ layout(theme)
19
+ end
20
+ end
21
+ end
22
+
23
+ def show_site_actions?
24
+ true
25
+ end
26
+
27
+ def show_site_search?
28
+ true
29
+ end
30
+
31
+ end
@@ -0,0 +1,15 @@
1
+ module Worthwhile
2
+ # Including WithoutNamespace on a controller allows us to prepend the default namespace to the params[:id]
3
+ module WithoutNamespace
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ prepend_before_filter :normalize_identifier, except: [:index, :create, :new]
8
+ end
9
+
10
+ protected
11
+ def normalize_identifier
12
+ params[:id] = Sufia::Noid.namespaceize(params[:id])
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ module CurationConcern
2
+ class GenericFilesController < ApplicationController
3
+ include Worthwhile::FilesController
4
+ end
5
+ end
6
+
@@ -0,0 +1,6 @@
1
+ module CurationConcern
2
+ class GenericWorksController < ApplicationController
3
+ include Worthwhile::CurationConcernController
4
+ set_curation_concern_type GenericWork
5
+ end
6
+ end
@@ -0,0 +1,68 @@
1
+ class CurationConcern::LinkedResourcesController < ApplicationController
2
+ include Worthwhile::ThemedLayoutController
3
+ include Worthwhile::WithoutNamespace
4
+ with_themed_layout '1_column'
5
+ respond_to(:html)
6
+
7
+ load_and_authorize_resource class: Worthwhile::LinkedResource, instance_name: :curation_concern
8
+ include Worthwhile::ParentContainer
9
+
10
+ def new
11
+ respond_with(curation_concern)
12
+ end
13
+
14
+ def create
15
+ curation_concern.batch = parent
16
+ if actor.create
17
+ respond_with([:curation_concern, parent])
18
+ else
19
+ respond_with([:curation_concern, curation_concern]) { |wants|
20
+ wants.html { render 'new', status: :unprocessable_entity }
21
+ }
22
+ end
23
+ end
24
+
25
+ def edit
26
+ respond_with(curation_concern)
27
+ end
28
+
29
+ def update
30
+ if actor.update
31
+ respond_with([:curation_concern, curation_concern.batch])
32
+ else
33
+ respond_with([:curation_concern, curation_concern]) { |wants|
34
+ wants.html { render 'edit', status: :unprocessable_entity }
35
+ }
36
+ end
37
+ end
38
+
39
+ def destroy
40
+ parent = curation_concern.batch
41
+ flash[:notice] = "Deleted #{curation_concern}"
42
+ curation_concern.destroy
43
+ respond_with([:curation_concern, parent])
44
+ end
45
+
46
+ def attach_action_breadcrumb
47
+ add_breadcrumb "#{parent.human_readable_type}", polymorphic_path([:curation_concern, parent])
48
+ super
49
+ end
50
+
51
+ attr_writer :actor
52
+ def actor
53
+ @actor ||= Worthwhile::CurationConcern.actor(curation_concern, current_user, params[:linked_resource])
54
+ end
55
+
56
+ def curation_concern
57
+ @curation_concern
58
+ end
59
+
60
+ helper_method :curation_concern
61
+
62
+ protected
63
+ def _prefixes
64
+ # This allows us to use the unauthorized template in curation_concern/base
65
+ @_prefixes ||= super + ['curation_concern/base']
66
+ end
67
+
68
+ end