sufia 7.2.0 → 7.3.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (259) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +2 -0
  3. data/.rubocop.yml +3 -0
  4. data/.rubocop_todo.yml +1 -2
  5. data/.travis.yml +0 -1
  6. data/Gemfile +2 -1
  7. data/README.md +23 -106
  8. data/app/actors/sufia/apply_permission_template_actor.rb +19 -0
  9. data/app/actors/sufia/create_with_remote_files_actor.rb +2 -2
  10. data/app/actors/sufia/default_admin_set_actor.rb +42 -0
  11. data/app/actors/sufia/interpret_visibility_actor.rb +115 -0
  12. data/app/assets/images/collection.png +0 -0
  13. data/app/assets/javascripts/sufia.js +6 -0
  14. data/app/assets/javascripts/sufia/admin/admin_set/participants.es6 +9 -0
  15. data/app/assets/javascripts/sufia/admin/admin_set/visibility.es6 +134 -0
  16. data/app/assets/javascripts/sufia/admin/admin_set_controls.es6 +11 -0
  17. data/app/assets/javascripts/sufia/app.js +27 -5
  18. data/app/assets/javascripts/sufia/autocomplete.es6 +15 -0
  19. data/app/assets/javascripts/sufia/autocomplete/work.es6 +29 -0
  20. data/app/assets/javascripts/sufia/dashboard_actions.js +2 -4
  21. data/app/assets/javascripts/sufia/save_work/save_work_control.es6 +14 -2
  22. data/app/assets/javascripts/sufia/save_work/uploaded_files.es6 +7 -2
  23. data/app/assets/javascripts/sufia/save_work/visibility_component.es6 +245 -4
  24. data/app/assets/javascripts/sufia/select_work_type.es6 +38 -0
  25. data/app/assets/javascripts/sufia/workflow_actions_affix.js +14 -0
  26. data/app/assets/stylesheets/sufia/_dashboard.scss +50 -29
  27. data/app/assets/stylesheets/sufia/_footer.scss +30 -0
  28. data/app/assets/stylesheets/sufia/_header.scss +3 -4
  29. data/app/assets/stylesheets/sufia/_home-page.scss +10 -8
  30. data/app/assets/stylesheets/sufia/_select_work_type.scss +43 -0
  31. data/app/assets/stylesheets/sufia/_sufia.scss +4 -1
  32. data/app/assets/stylesheets/sufia/_variables.scss +3 -0
  33. data/app/assets/stylesheets/sufia/admin.scss +66 -169
  34. data/app/assets/stylesheets/sufia/blacklight_gallery.scss +17 -0
  35. data/app/authorities/qa/authorities/find_works.rb +15 -0
  36. data/app/controllers/concerns/sufia/batch_edits_controller_behavior.rb +2 -1
  37. data/app/controllers/concerns/sufia/batch_uploads_controller_behavior.rb +26 -13
  38. data/app/controllers/concerns/sufia/collections_controller_behavior.rb +25 -0
  39. data/app/controllers/concerns/sufia/controller.rb +8 -0
  40. data/app/controllers/concerns/sufia/deny_access_override_behavior.rb +1 -1
  41. data/app/controllers/concerns/sufia/file_sets_controller_behavior.rb +5 -14
  42. data/app/controllers/concerns/sufia/homepage_controller_behavior.rb +2 -0
  43. data/app/controllers/concerns/sufia/users_controller_behavior.rb +18 -7
  44. data/app/controllers/concerns/sufia/works_controller_behavior.rb +13 -10
  45. data/app/controllers/my/collections_controller.rb +5 -0
  46. data/app/controllers/my/shares_controller.rb +5 -0
  47. data/app/controllers/my/works_controller.rb +5 -0
  48. data/app/controllers/stats_controller.rb +1 -1
  49. data/app/controllers/sufia/admin/admin_sets_controller.rb +20 -2
  50. data/app/controllers/sufia/admin/permission_template_accesses_controller.rb +15 -0
  51. data/app/controllers/sufia/admin/permission_templates_controller.rb +29 -0
  52. data/app/controllers/sufia/admin_controller.rb +2 -0
  53. data/app/controllers/sufia/trophies_controller.rb +0 -2
  54. data/app/forms/sufia/forms/admin_set_form.rb +19 -0
  55. data/app/forms/sufia/forms/batch_edit_form.rb +16 -6
  56. data/app/forms/sufia/forms/batch_upload_form.rb +3 -2
  57. data/app/forms/sufia/forms/permission_template_form.rb +115 -0
  58. data/app/forms/sufia/forms/work_form.rb +6 -0
  59. data/app/helpers/batch_edits_helper.rb +1 -1
  60. data/app/helpers/sufia/citations_behavior.rb +0 -5
  61. data/app/helpers/sufia/citations_behaviors/formatters.rb +0 -1
  62. data/app/helpers/sufia/sufia_helper_behavior.rb +38 -6
  63. data/app/indexers/sufia/collection_indexer.rb +6 -0
  64. data/app/jobs/batch_create_job.rb +7 -15
  65. data/app/models/batch_upload_item.rb +2 -0
  66. data/app/models/concerns/sufia/ability.rb +12 -1
  67. data/app/models/sufia/permission_template.rb +102 -0
  68. data/app/models/sufia/permission_template_access.rb +18 -0
  69. data/app/presenters/sufia/admin_set_presenter.rb +1 -1
  70. data/app/presenters/sufia/model_icon.rb +7 -0
  71. data/app/presenters/sufia/select_type_list_presenter.rb +37 -0
  72. data/app/presenters/sufia/select_type_presenter.rb +35 -0
  73. data/app/presenters/sufia/work_show_presenter.rb +0 -2
  74. data/app/search_builders/collection_search_builder.rb +0 -2
  75. data/app/search_builders/sufia/admin_set_search_builder.rb +24 -0
  76. data/app/search_builders/sufia/catalog_search_builder.rb +10 -4
  77. data/app/search_builders/sufia/find_works_search_builder.rb +44 -0
  78. data/app/search_builders/sufia/my_search_builder_behavior.rb +0 -4
  79. data/app/search_builders/sufia/my_works_search_builder.rb +1 -1
  80. data/app/services/sufia/actor_factory.rb +6 -2
  81. data/app/services/sufia/admin_set_create_service.rb +22 -0
  82. data/app/services/sufia/admin_set_service.rb +46 -16
  83. data/app/services/sufia/collection_thumbnail_path_service.rb +10 -0
  84. data/app/services/sufia/workflow/abstract_notification.rb +39 -0
  85. data/app/services/sufia/workflow/changes_required_notification.rb +22 -0
  86. data/app/services/sufia/workflow/complete_notification.rb +22 -0
  87. data/app/services/sufia/workflow/pending_review_notification.rb +21 -0
  88. data/app/services/sufia/workflow/workflow_by_admin_set_strategy.rb +15 -0
  89. data/app/views/_masthead.html.erb +4 -4
  90. data/app/views/_toolbar.html.erb +31 -9
  91. data/app/views/_user_util_links.html.erb +7 -7
  92. data/app/views/batch_edits/edit.html.erb +24 -12
  93. data/app/views/catalog/_thumbnail_list_collection.html.erb +1 -1
  94. data/app/views/collections/_form.html.erb +2 -2
  95. data/app/views/collections/_media_display.html.erb +1 -1
  96. data/app/views/curation_concerns/base/_find_work_widget.html.erb +16 -0
  97. data/app/views/curation_concerns/base/_form.html.erb +6 -0
  98. data/app/views/curation_concerns/base/_form_child_work_relationships.html.erb +1 -1
  99. data/app/views/curation_concerns/base/_form_metadata.html.erb +1 -1
  100. data/app/views/curation_concerns/base/_form_parent_work_relationships.html.erb +43 -0
  101. data/app/views/curation_concerns/base/_form_progress.html.erb +7 -4
  102. data/app/views/curation_concerns/base/_form_relationships.html.erb +6 -6
  103. data/app/views/curation_concerns/base/_form_share.html.erb +1 -2
  104. data/app/views/curation_concerns/base/_guts4form.html.erb +1 -1
  105. data/app/views/curation_concerns/base/_social_media.html.erb +1 -1
  106. data/app/views/curation_concerns/base/_workflow_actions_widget.erb +3 -0
  107. data/app/views/curation_concerns/base/edit.html.erb +1 -1
  108. data/app/views/curation_concerns/base/new.html.erb +1 -1
  109. data/app/views/curation_concerns/base/show.html.erb +4 -1
  110. data/app/views/curation_concerns/file_sets/_show_actions.html.erb +0 -3
  111. data/app/views/dashboard/_create_work_action.html.erb +20 -0
  112. data/app/views/dashboard/_index_partials/_heading_actions.html.erb +9 -22
  113. data/app/views/layouts/admin.html.erb +8 -68
  114. data/app/views/layouts/curation_concerns/1_column.html.erb +4 -31
  115. data/app/views/layouts/homepage.html.erb +15 -45
  116. data/app/views/layouts/sufia-dashboard.html.erb +1 -36
  117. data/app/views/layouts/sufia.html.erb +49 -0
  118. data/app/views/my/_document_list.html.erb +1 -1
  119. data/app/views/my/_facet_limit.html.erb +2 -2
  120. data/app/views/my/_index_partials/_default_group.html.erb +10 -10
  121. data/app/views/my/_index_partials/_list_collections.html.erb +1 -1
  122. data/app/views/my/_sort_and_per_page.html.erb +8 -8
  123. data/app/views/records/edit_fields/_rights.html.erb +0 -1
  124. data/app/views/shared/_footer.html.erb +1 -1
  125. data/app/views/shared/_select_work_type_modal.html.erb +34 -0
  126. data/app/views/sufia/admin/_collections.html.erb +31 -0
  127. data/app/views/sufia/admin/_sidebar.html.erb +35 -23
  128. data/app/views/sufia/admin/admin_sets/_form.html.erb +38 -15
  129. data/app/views/sufia/admin/admin_sets/_form_metadata.html.erb +2 -0
  130. data/app/views/sufia/admin/admin_sets/_form_participant_table.html.erb +21 -0
  131. data/app/views/sufia/admin/admin_sets/_form_participants.html.erb +68 -0
  132. data/app/views/sufia/admin/admin_sets/_form_visibility.html.erb +58 -0
  133. data/app/views/sufia/admin/admin_sets/index.html.erb +29 -33
  134. data/app/views/sufia/admin/admin_sets/show.html.erb +3 -0
  135. data/app/views/sufia/admin/show.html.erb +22 -19
  136. data/app/views/sufia/batch_uploads/_form.html.erb +2 -1
  137. data/app/views/sufia/homepage/index.html.erb +11 -3
  138. data/app/views/sufia/uploads/_js_templates.html.erb +15 -11
  139. data/app/views/users/_user_row.html.erb +10 -0
  140. data/app/views/users/index.html.erb +1 -12
  141. data/config/features.rb +2 -0
  142. data/config/locales/sufia.en.yml +122 -37
  143. data/config/routes.rb +4 -1
  144. data/db/migrate/20161021175854_create_permission_template.rb +11 -0
  145. data/db/migrate/20161021180154_create_permission_template_access.rb +11 -0
  146. data/db/migrate/20161116222307_add_release_to_permission_templates.rb +6 -0
  147. data/lib/generators/sufia/install_generator.rb +12 -3
  148. data/lib/generators/sufia/templates/catalog_controller.rb +3 -13
  149. data/lib/generators/sufia/templates/workflow.json.erb +65 -0
  150. data/lib/generators/sufia/upgrade700_generator.rb +1 -1
  151. data/lib/generators/sufia/work/templates/locale.en.yml.erb +37 -0
  152. data/lib/generators/sufia/{work_generator.rb → work/work_generator.rb} +25 -5
  153. data/lib/sufia.rb +0 -1
  154. data/lib/sufia/engine.rb +7 -0
  155. data/lib/sufia/move_all_works_to_admin_set.rb +8 -0
  156. data/lib/sufia/version.rb +1 -1
  157. data/lib/tasks/migrate.rake +8 -0
  158. data/spec/actors/sufia/apply_permission_template_actor_spec.rb +64 -0
  159. data/spec/actors/sufia/create_with_remote_files_actor_spec.rb +8 -0
  160. data/spec/actors/sufia/default_admin_set_actor_spec.rb +43 -0
  161. data/spec/actors/sufia/interpret_visibility_actor_spec.rb +266 -0
  162. data/spec/authorities/qa/authorities/find_works_spec.rb +55 -0
  163. data/spec/controllers/batch_edits_controller_spec.rb +1 -6
  164. data/spec/controllers/citations_controller_spec.rb +49 -10
  165. data/spec/controllers/collections_controller_spec.rb +39 -0
  166. data/spec/controllers/curation_concerns/generic_works_controller_spec.rb +22 -1
  167. data/spec/controllers/dashboard_controller_spec.rb +0 -8
  168. data/spec/controllers/depositors_controller_spec.rb +2 -2
  169. data/spec/controllers/downloads_controller_spec.rb +2 -2
  170. data/spec/controllers/my/collections_controller_spec.rb +5 -0
  171. data/spec/controllers/my/shares_controller_spec.rb +5 -0
  172. data/spec/controllers/my/works_controller_spec.rb +5 -0
  173. data/spec/controllers/stats_controller_spec.rb +1 -1
  174. data/spec/controllers/sufia/admin/admin_sets_controller_spec.rb +33 -5
  175. data/spec/controllers/sufia/admin/permission_template_accesses_controller_spec.rb +36 -0
  176. data/spec/controllers/sufia/admin/permission_templates_controller_spec.rb +46 -0
  177. data/spec/controllers/sufia/admin_controller_spec.rb +6 -0
  178. data/spec/controllers/sufia/batch_uploads_controller_spec.rb +40 -42
  179. data/spec/controllers/sufia/homepage_controller_spec.rb +14 -0
  180. data/spec/controllers/sufia/trophies_controller_spec.rb +17 -4
  181. data/spec/controllers/users_controller_spec.rb +13 -4
  182. data/spec/factories/permission_template_accesses.rb +5 -0
  183. data/spec/factories/permission_templates.rb +5 -0
  184. data/spec/factories/sipity_entities.rb +7 -0
  185. data/spec/factories/users.rb +4 -0
  186. data/spec/factories/workflow_states.rb +6 -0
  187. data/spec/factories/workflows.rb +5 -0
  188. data/spec/features/admin_admin_set_spec.rb +6 -4
  189. data/spec/features/batch_edit_spec.rb +0 -1
  190. data/spec/features/collection_spec.rb +4 -4
  191. data/spec/features/edit_work_spec.rb +1 -0
  192. data/spec/features/work_show_spec.rb +10 -0
  193. data/spec/forms/sufia/forms/admin_set_form_spec.rb +2 -1
  194. data/spec/forms/sufia/forms/batch_edit_form_spec.rb +30 -0
  195. data/spec/forms/sufia/forms/permission_template_form_spec.rb +196 -0
  196. data/spec/forms/sufia/forms/work_form_spec.rb +35 -1
  197. data/spec/helpers/batch_edits_helper_spec.rb +4 -4
  198. data/spec/helpers/blacklight_helper_spec.rb +1 -1
  199. data/spec/helpers/sufia_helper_spec.rb +39 -7
  200. data/spec/indexers/sufia/collection_indexer_spec.rb +12 -0
  201. data/spec/javascripts/autocomplete_spec.js.coffee +46 -6
  202. data/spec/javascripts/visibility_component_spec.js +491 -0
  203. data/spec/jobs/batch_create_job_spec.rb +27 -28
  204. data/spec/lib/sufia/arkivo_spec.rb +14 -0
  205. data/spec/lib/sufia/controlled_vocabulary/importer/downloader_spec.rb +31 -0
  206. data/spec/lib/sufia/move_all_works_to_admin_set_spec.rb +13 -0
  207. data/spec/lib/sufia/zotero_spec.rb +8 -0
  208. data/spec/models/sufia/ability_spec.rb +54 -14
  209. data/spec/models/sufia/permission_template_spec.rb +144 -0
  210. data/spec/models/sufia/user_usage_stats_spec.rb +8 -2
  211. data/spec/presenters/sufia/homepage_presenter_spec.rb +1 -1
  212. data/spec/presenters/sufia/select_type_list_presenter_spec.rb +26 -0
  213. data/spec/presenters/sufia/select_type_presenter_spec.rb +21 -0
  214. data/spec/search_builder/sufia/admin_set_search_builder_spec.rb +57 -0
  215. data/spec/search_builder/sufia/catalog_search_builder_spec.rb +40 -14
  216. data/spec/search_builder/sufia/find_works_search_builder_spec.rb +60 -0
  217. data/spec/search_builder/sufia/my_shares_search_builder_spec.rb +4 -1
  218. data/spec/search_builder/sufia/single_admin_set_search_builder_spec.rb +5 -1
  219. data/spec/services/sufia/actor_factory_spec.rb +13 -5
  220. data/spec/services/sufia/admin_set_create_service_spec.rb +27 -0
  221. data/spec/services/sufia/admin_set_service_spec.rb +104 -17
  222. data/spec/services/sufia/workflow/changes_required_notification_spec.rb +32 -0
  223. data/spec/services/sufia/workflow/complete_notification_spec.rb +32 -0
  224. data/spec/services/sufia/workflow/pending_review_notification_spec.rb +31 -0
  225. data/spec/services/sufia/workflow/workflow_by_admin_set_strategy_spec.rb +22 -0
  226. data/spec/spec_helper.rb +24 -5
  227. data/spec/support/proxies.rb +1 -1
  228. data/spec/test_app_templates/lib/generators/test_app_generator.rb +4 -0
  229. data/spec/views/_toolbar.html.erb_spec.rb +23 -6
  230. data/spec/views/batch_edits/edit.html.erb_spec.rb +7 -1
  231. data/spec/views/collections/_form_for_select_collection.html.erb_spec.rb +1 -3
  232. data/spec/views/curation_concerns/base/_find_work_widget.html.erb_spec.rb +22 -0
  233. data/spec/views/curation_concerns/base/_form.html.erb_spec.rb +7 -0
  234. data/spec/views/curation_concerns/base/_form_child_work_relationships.html.erb_spec.rb +1 -0
  235. data/spec/views/curation_concerns/base/_form_parent_work_relationships.html.erb_spec.rb +114 -0
  236. data/spec/views/curation_concerns/base/_form_progress.html.erb_spec.rb +3 -2
  237. data/spec/views/curation_concerns/base/_social_media.html.erb_spec.rb +1 -1
  238. data/spec/views/curation_concerns/base/edit.html.erb_spec.rb +1 -1
  239. data/spec/views/curation_concerns/base/show.html.erb_spec.rb +5 -1
  240. data/spec/views/curation_concerns/file_sets/_show_actions.html.erb_spec.rb +2 -2
  241. data/spec/views/dashboard/create_work_action.html.erb_spec.rb +27 -0
  242. data/spec/views/dashboard/index_spec.rb +7 -2
  243. data/spec/views/my/_sort_and_per_page.html.erb_spec.rb +33 -0
  244. data/spec/views/shared/select_work_type_modal.html.erb_spec.rb +32 -0
  245. data/spec/views/sufia/admin/admin_sets/_form.html.erb_spec.rb +18 -0
  246. data/spec/views/sufia/admin/admin_sets/_form_participants.html.erb_spec.rb +13 -0
  247. data/spec/views/sufia/admin/admin_sets/_form_visibility.html.erb_spec.rb +23 -0
  248. data/spec/views/sufia/batch_uploads/_form.html.erb_spec.rb +2 -12
  249. data/spec/views/sufia/homepage/index.html.erb_spec.rb +29 -8
  250. data/sufia.gemspec +5 -6
  251. data/tasks/sufia-dev.rake +6 -10
  252. data/template.rb +15 -0
  253. metadata +140 -28
  254. data/app/assets/stylesheets/sufia/widgets.css +0 -288
  255. data/app/helpers/sufia/citations_behaviors/formatters/endnote_formatter.rb +0 -49
  256. data/app/models/domain_term.rb +0 -4
  257. data/app/views/citations/file.html.erb +0 -0
  258. data/app/views/records/_rights_modal.html.erb +0 -1
  259. data/db/migrate/20160328222160_create_local_authorities.rb +0 -50
@@ -0,0 +1,102 @@
1
+ module Sufia
2
+ class PermissionTemplate < ActiveRecord::Base
3
+ has_many :access_grants, class_name: 'Sufia::PermissionTemplateAccess'
4
+ accepts_nested_attributes_for :access_grants, reject_if: :all_blank
5
+
6
+ # Valid Release Period values
7
+ RELEASE_TEXT_VALUE_FIXED = 'fixed'.freeze
8
+ RELEASE_TEXT_VALUE_NO_DELAY = 'now'.freeze
9
+
10
+ # Valid Release Varies sub-options
11
+ RELEASE_TEXT_VALUE_BEFORE_DATE = 'before'.freeze
12
+ RELEASE_TEXT_VALUE_EMBARGO = 'embargo'.freeze
13
+ RELEASE_TEXT_VALUE_6_MONTHS = '6mos'.freeze
14
+ RELEASE_TEXT_VALUE_1_YEAR = '1yr'.freeze
15
+ RELEASE_TEXT_VALUE_2_YEARS = '2yrs'.freeze
16
+ RELEASE_TEXT_VALUE_3_YEARS = '3yrs'.freeze
17
+
18
+ # Key/value pair of valid embargo periods. Values are number of months embargoed.
19
+ RELEASE_EMBARGO_PERIODS = {
20
+ RELEASE_TEXT_VALUE_6_MONTHS => 6,
21
+ RELEASE_TEXT_VALUE_1_YEAR => 12,
22
+ RELEASE_TEXT_VALUE_2_YEARS => 24,
23
+ RELEASE_TEXT_VALUE_3_YEARS => 36
24
+ }.freeze
25
+
26
+ # Does this permission template require a specific date of release for all works
27
+ # NOTE: date will be in release_date
28
+ def release_fixed_date?
29
+ release_period == RELEASE_TEXT_VALUE_FIXED
30
+ end
31
+
32
+ # Does this permission template require no release delays (i.e. no embargoes allowed)
33
+ def release_no_delay?
34
+ release_period == RELEASE_TEXT_VALUE_NO_DELAY
35
+ end
36
+
37
+ # Does this permission template require a date (or embargo) that all works are released before
38
+ # NOTE: date will be in release_date
39
+ def release_before_date?
40
+ # All PermissionTemplate embargoes are dynamically determined release before dates
41
+ release_period == RELEASE_TEXT_VALUE_BEFORE_DATE || release_max_embargo?
42
+ end
43
+
44
+ # Is there a maximum embargo period specified by this permission template
45
+ # NOTE: latest embargo date returned by release_date, maximum embargo period will be in release_period
46
+ def release_max_embargo?
47
+ # Is it a release period in one of our valid embargo periods?
48
+ RELEASE_EMBARGO_PERIODS.key?(release_period)
49
+ end
50
+
51
+ # Override release_date getter to return a dynamically calculated date of release
52
+ # based one release requirements. Returns embargo date when release_max_embargo?==true.
53
+ # Returns today's date when release_no_delay?==true.
54
+ def release_date
55
+ # If no release delays allowed, return today's date as release date
56
+ return Time.zone.today if release_no_delay?
57
+
58
+ # If this isn't an embargo, just return release_date from database
59
+ return self[:release_date] unless release_max_embargo?
60
+
61
+ # Otherwise (if an embargo), return latest embargo date by adding specified months to today's date
62
+ Time.zone.today + RELEASE_EMBARGO_PERIODS.fetch(release_period).months
63
+ end
64
+
65
+ # Determines whether a given release date is valid based on this template's requirements
66
+ # @param [Date] date to validate
67
+ def valid_release_date?(date)
68
+ # Validate date against all release date requirements
69
+ check_no_delay_requirements(date) && check_before_date_requirements(date) && check_fixed_date_requirements(date)
70
+ end
71
+
72
+ # Determines whether a given visibility setting is valid based on this template's requirements
73
+ # @param [String] visibility value to validate
74
+ def valid_visibility?(value)
75
+ # If template doesn't specify a visiblity (i.e. is "varies"), then any visibility is valid
76
+ return true unless visibility.present?
77
+
78
+ # Validate that passed in value matches visibility requirement exactly
79
+ visibility == value
80
+ end
81
+
82
+ private
83
+
84
+ # If template requires no delays, check if date is exactly today
85
+ def check_no_delay_requirements(date)
86
+ return true unless release_no_delay?
87
+ date == Time.zone.today
88
+ end
89
+
90
+ # If template requires a release before a specific date, check this date is valid
91
+ def check_before_date_requirements(date)
92
+ return true unless release_before_date? && release_date.present?
93
+ date <= release_date
94
+ end
95
+
96
+ # If template requires an exact date, check this date matches
97
+ def check_fixed_date_requirements(date)
98
+ return true unless release_fixed_date? && release_date.present?
99
+ date == release_date
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ module Sufia
3
+ class PermissionTemplateAccess < ActiveRecord::Base
4
+ belongs_to :permission_template
5
+
6
+ def view?
7
+ access == 'view'
8
+ end
9
+
10
+ def deposit?
11
+ access == 'deposit'
12
+ end
13
+
14
+ def manage?
15
+ access == 'manage'
16
+ end
17
+ end
18
+ end
@@ -1,7 +1,7 @@
1
1
  module Sufia
2
2
  class AdminSetPresenter < CollectionPresenter
3
3
  def total_items
4
- ActiveFedora::SolrService.count("{!field f=isPartOf_ssim}#{id}", fl: id)
4
+ ActiveFedora::SolrService.count("{!field f=isPartOf_ssim}#{id}")
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,7 @@
1
+ module Sufia
2
+ class ModelIcon
3
+ def self.css_class_for(model)
4
+ I18n.t(:"sufia.icons.#{model.model_name.i18n_key}", default: :"sufia.icons.default")
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,37 @@
1
+ module Sufia
2
+ # Presents the list of work type options that a user may choose from when deciding to
3
+ # create a new work
4
+ class SelectTypeListPresenter
5
+ # @param current_user [User]
6
+ def initialize(current_user)
7
+ @current_user = current_user
8
+ end
9
+
10
+ class_attribute :row_presenter
11
+ self.row_presenter = SelectTypePresenter
12
+
13
+ # @return [Boolean] are there many differnt types to choose?
14
+ def many?
15
+ authorized_models.size > 1
16
+ end
17
+
18
+ def authorized_models
19
+ return [] unless @current_user
20
+ @authorized_models ||= CurationConcerns::QuickClassificationQuery.new(@current_user).authorized_models
21
+ end
22
+
23
+ # Return or yield the first model in the list. This is used when the list
24
+ # only has a single element.
25
+ # @yieldparam [Class] model a class that decends from ActiveFedora::Base
26
+ # @return [Class] a class that decends from ActiveFedora::Base
27
+ def first_model
28
+ yield(authorized_models.first) if block_given?
29
+ authorized_models.first
30
+ end
31
+
32
+ # @yieldparam [SelectTypePresenter] presenter a presenter for the item
33
+ def each
34
+ authorized_models.each { |model| yield row_presenter.new(model) }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ module Sufia
2
+ class SelectTypePresenter
3
+ def initialize(concern)
4
+ @concern = concern
5
+ end
6
+
7
+ attr_reader :concern
8
+
9
+ def icon_class
10
+ ModelIcon.css_class_for(concern)
11
+ end
12
+
13
+ def description
14
+ translate('description')
15
+ end
16
+
17
+ def name
18
+ translate('name')
19
+ end
20
+
21
+ private
22
+
23
+ def object_name
24
+ @object_name ||= concern.model_name.i18n_key
25
+ end
26
+
27
+ def translate(key)
28
+ defaults = []
29
+ defaults << :"sufia.select_type.#{object_name}.#{key}"
30
+ defaults << :"sufia.select_type.#{key}"
31
+ defaults << ''
32
+ I18n.t(defaults.shift, default: defaults)
33
+ end
34
+ end
35
+ end
@@ -4,8 +4,6 @@ module Sufia
4
4
  delegate :based_near, :related_url, :depositor, :identifier, :resource_type,
5
5
  :keyword, :itemtype, :admin_set, to: :solr_document
6
6
 
7
- self.file_presenter_class = Sufia::FileSetPresenter
8
-
9
7
  def editor?
10
8
  current_ability.can?(:edit, solr_document)
11
9
  end
@@ -1,7 +1,5 @@
1
1
  # Finds the child objects contained within a collection
2
2
  class CollectionSearchBuilder < CurationConcerns::MemberSearchBuilder
3
- include BlacklightAdvancedSearch::AdvancedSearchBuilder
4
-
5
3
  self.from_field = 'child_object_ids_ssim'
6
4
  self.default_processor_chain += [:include_contained_files]
7
5
 
@@ -0,0 +1,24 @@
1
+ module Sufia
2
+ ### Allows :deposit as a valid type
3
+ class AdminSetSearchBuilder < CurationConcerns::AdminSetSearchBuilder
4
+ # We're going to check the permission_templates
5
+ def gated_discovery_filters
6
+ return super if @access != :deposit
7
+ ["{!terms f=id}#{admin_set_ids.join(',')}"]
8
+ end
9
+
10
+ private
11
+
12
+ def admin_set_ids
13
+ PermissionTemplateAccess.joins(:permission_template)
14
+ .where(agent_type: 'user',
15
+ agent_id: user,
16
+ access: ['deposit', 'manage'])
17
+ .pluck('DISTINCT admin_set_id')
18
+ end
19
+
20
+ def user
21
+ current_ability.current_user.user_key
22
+ end
23
+ end
24
+ end
@@ -1,17 +1,23 @@
1
1
  class Sufia::CatalogSearchBuilder < Sufia::SearchBuilder
2
2
  self.default_processor_chain += [
3
3
  :add_access_controls_to_solr_params,
4
- :add_advanced_parse_q_to_solr,
5
- :show_works_or_works_that_contain_files
4
+ :show_works_or_works_that_contain_files,
5
+ :show_only_active_records
6
6
  ]
7
7
 
8
8
  # show both works that match the query and works that contain files that match the query
9
9
  def show_works_or_works_that_contain_files(solr_parameters)
10
- return if solr_parameters[:q].blank?
11
- solr_parameters[:user_query] = solr_parameters[:q]
10
+ return if blacklight_params[:q].blank? || blacklight_params[:search_field]
11
+ solr_parameters[:user_query] = blacklight_params[:q]
12
12
  solr_parameters[:q] = new_query
13
13
  end
14
14
 
15
+ # show works that are in the active state.
16
+ def show_only_active_records(solr_parameters)
17
+ solr_parameters[:fq] ||= []
18
+ solr_parameters[:fq] << '-suppressed_bsi:true'
19
+ end
20
+
15
21
  private
16
22
 
17
23
  # the {!lucene} gives us the OR syntax
@@ -0,0 +1,44 @@
1
+ # Search for possible works that user can edit and could be a work's child or parent.
2
+ class Sufia::FindWorksSearchBuilder < Sufia::SearchBuilder
3
+ include Sufia::MySearchBuilderBehavior
4
+ include CurationConcerns::FilterByType
5
+
6
+ self.default_processor_chain += [:filter_on_title, :show_only_resources_deposited_by_current_user, :show_only_other_works, :show_only_works_not_child, :show_only_works_not_parent]
7
+
8
+ def initialize(context)
9
+ super(context)
10
+ @id = context.params[:id]
11
+ @q = context.params[:q]
12
+ end
13
+
14
+ def filter_on_title(solr_parameters)
15
+ solr_parameters[:fq] ||= []
16
+ solr_parameters[:fq] += [ActiveFedora::SolrQueryBuilder.construct_query(title_tesim: @q)]
17
+ end
18
+
19
+ def show_only_other_works(solr_parameters)
20
+ solr_parameters[:fq] ||= []
21
+ solr_parameters[:fq] += [
22
+ "-" + ActiveFedora::SolrQueryBuilder.construct_query_for_ids([@id])
23
+ ]
24
+ end
25
+
26
+ def show_only_works_not_child(solr_parameters)
27
+ ids = ActiveFedora::SolrService.query("{!field f=id}#{@id}", fl: "member_ids_ssim", rows: 10_000).flat_map { |x| x.fetch("member_ids_ssim", []) }
28
+ solr_parameters[:fq] ||= []
29
+ solr_parameters[:fq] += [
30
+ "-" + ActiveFedora::SolrQueryBuilder.construct_query_for_ids(ids)
31
+ ]
32
+ end
33
+
34
+ def show_only_works_not_parent(solr_parameters)
35
+ solr_parameters[:fq] ||= []
36
+ solr_parameters[:fq] += [
37
+ "-" + ActiveFedora::SolrQueryBuilder.construct_query(member_ids_ssim: @id)
38
+ ]
39
+ end
40
+
41
+ def only_works?
42
+ true
43
+ end
44
+ end
@@ -5,10 +5,6 @@
5
5
  module Sufia::MySearchBuilderBehavior
6
6
  extend ActiveSupport::Concern
7
7
 
8
- included do
9
- self.default_processor_chain += [:add_advanced_parse_q_to_solr]
10
- end
11
-
12
8
  # show only files with edit permissions in lib/hydra/access_controls_enforcement.rb apply_gated_discovery
13
9
  def discovery_permissions
14
10
  ["edit"]
@@ -3,7 +3,7 @@ class Sufia::MyWorksSearchBuilder < Sufia::SearchBuilder
3
3
  include Sufia::MySearchBuilderBehavior
4
4
  include CurationConcerns::FilterByType
5
5
 
6
- self.default_processor_chain += [:add_advanced_search_to_solr, :show_only_resources_deposited_by_current_user]
6
+ self.default_processor_chain += [:show_only_resources_deposited_by_current_user]
7
7
 
8
8
  def only_works?
9
9
  true
@@ -1,14 +1,18 @@
1
1
  module Sufia
2
2
  class ActorFactory < CurationConcerns::Actors::ActorFactory
3
3
  def self.stack_actors(curation_concern)
4
- [CreateWithRemoteFilesActor,
4
+ [CurationConcerns::OptimisticLockValidator,
5
+ CreateWithRemoteFilesActor,
5
6
  CreateWithFilesActor,
6
7
  CurationConcerns::Actors::AddToCollectionActor,
7
8
  CurationConcerns::Actors::AddToWorkActor,
8
9
  CurationConcerns::Actors::AssignRepresentativeActor,
9
10
  CurationConcerns::Actors::AttachFilesActor,
10
11
  CurationConcerns::Actors::ApplyOrderActor,
11
- CurationConcerns::Actors::InterpretVisibilityActor,
12
+ InterpretVisibilityActor,
13
+ DefaultAdminSetActor,
14
+ CurationConcerns::Actors::InitializeWorkflowActor,
15
+ ApplyPermissionTemplateActor,
12
16
  model_actor(curation_concern)]
13
17
  end
14
18
  end
@@ -0,0 +1,22 @@
1
+ module Sufia
2
+ # Creates AdminSets
3
+ class AdminSetCreateService
4
+ # @param admin_set [AdminSet] the admin set to operate on
5
+ # @param creating_user [User] the user who created the admin set.
6
+ def initialize(admin_set, creating_user)
7
+ @admin_set = admin_set
8
+ @creating_user = creating_user
9
+ end
10
+
11
+ attr_reader :creating_user, :admin_set
12
+
13
+ # Creates an admin set, setting the creator and the default access controls.
14
+ # @return [TrueClass, FalseClass] true if it was successful
15
+ def create
16
+ admin_set.read_groups = ['public']
17
+ admin_set.edit_groups = ['admin']
18
+ admin_set.creator = [creating_user.user_key]
19
+ admin_set.save
20
+ end
21
+ end
22
+ end
@@ -1,22 +1,52 @@
1
+ # frozen_string_literal: true
1
2
  module Sufia
2
- # Creates AdminSets
3
- class AdminSetService
4
- # @param admin_set [AdminSet] the admin set to operate on
5
- # @param creating_user [User] the user who created the admin set.
6
- def initialize(admin_set, creating_user)
7
- @admin_set = admin_set
8
- @creating_user = creating_user
3
+ # Returns AdminSets that the current user has permission to use.
4
+ class AdminSetService < CurationConcerns::AdminSetService
5
+ # This performs a two pass query, first getting the AdminSets and then getting the work counts
6
+ # @param [Symbol] access :read or :edit
7
+ # @return [Array<Array>] a list with document, then work count
8
+ def search_results_with_work_count(access)
9
+ documents = search_results(access)
10
+ ids = documents.map(&:id).join(',')
11
+ join_field = "isPartOf_ssim"
12
+ query = "{!terms f=#{join_field}}#{ids}"
13
+ results = ActiveFedora::SolrService.instance.conn.get(
14
+ ActiveFedora::SolrService.select_path,
15
+ params: { fq: query,
16
+ 'facet.field' => join_field }
17
+ )
18
+ counts = results['facet_counts']['facet_fields'][join_field].each_slice(2).to_h
19
+ documents.map do |doc|
20
+ [doc, counts[doc.id]]
21
+ end
9
22
  end
10
23
 
11
- attr_reader :creating_user, :admin_set
12
-
13
- # Creates an admin set, setting the creator and the default access controls.
14
- # @return [TrueClass, FalseClass] true if it was successful
15
- def create
16
- admin_set.read_groups = ['public']
17
- admin_set.edit_groups = ['admin']
18
- admin_set.creator = [creating_user.user_key]
19
- admin_set.save
24
+ # Return AdminSet selectbox options based on access type
25
+ # @param [Symbol] access :read or :edit
26
+ def select_options(access = :read)
27
+ search_results(access).map do |admin_set|
28
+ [admin_set.to_s, admin_set.id, data_attributes(admin_set)]
29
+ end
20
30
  end
31
+
32
+ private
33
+
34
+ # Create a hash of HTML5 'data' attributes. These attributes are added to select_options and
35
+ # later utilized by Javascript to limit new Work options based on AdminSet selected
36
+ def data_attributes(admin_set)
37
+ attrs = {}
38
+ # Get permission template associated with this AdminSet (if any)
39
+ permission_template = PermissionTemplate.find_by(admin_set_id: admin_set.id)
40
+
41
+ # Only add data attributes if permission template exists
42
+ if permission_template
43
+ # Save all PermissionTemplate release & visibility data attributes (if not blank or false)
44
+ attrs['data-release-date'] = permission_template.release_date unless permission_template.release_date.blank?
45
+ attrs['data-release-before-date'] = true if permission_template.release_before_date?
46
+ attrs['data-visibility'] = permission_template.visibility unless permission_template.visibility.blank?
47
+ end
48
+
49
+ attrs
50
+ end
21
51
  end
22
52
  end