sufia 6.0.0 → 6.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 (290) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -5
  3. data/CONTRIBUTING.md +4 -4
  4. data/Gemfile +2 -1
  5. data/History.md +69 -0
  6. data/README.md +84 -4
  7. data/SUFIA_VERSION +1 -1
  8. data/app/assets/images/zotero.png +0 -0
  9. data/app/assets/javascripts/sufia/featured_works.js +20 -3
  10. data/app/assets/stylesheets/generic_files.css.erb +2 -2
  11. data/app/assets/stylesheets/sufia.css.scss +2 -2
  12. data/app/assets/stylesheets/sufia/_buttons.scss +2 -2
  13. data/app/assets/stylesheets/sufia/_collections.scss +4 -4
  14. data/app/assets/stylesheets/sufia/_dashboard.scss +1 -1
  15. data/app/assets/stylesheets/sufia/_file-listing.scss +3 -0
  16. data/app/assets/stylesheets/sufia/_modal.scss +4 -0
  17. data/app/assets/stylesheets/sufia/_settings.scss +4 -3
  18. data/app/assets/stylesheets/sufia/_styles.scss +4 -0
  19. data/app/controllers/admin/stats_controller.rb +68 -0
  20. data/app/controllers/api/items_controller.rb +78 -0
  21. data/app/controllers/api/zotero_controller.rb +70 -0
  22. data/app/controllers/authorities_controller.rb +6 -5
  23. data/app/controllers/concerns/sufia/batch_edits_controller_behavior.rb +2 -1
  24. data/app/controllers/concerns/sufia/breadcrumbs.rb +1 -1
  25. data/app/controllers/concerns/sufia/depositors_controller_behavior.rb +11 -0
  26. data/app/controllers/concerns/sufia/files_controller/browse_everything.rb +1 -1
  27. data/app/controllers/concerns/sufia/files_controller/local_ingest_behavior.rb +1 -1
  28. data/app/controllers/concerns/sufia/files_controller_behavior.rb +23 -11
  29. data/app/controllers/concerns/sufia/my_controller_behavior.rb +1 -7
  30. data/app/controllers/concerns/sufia/users_controller_behavior.rb +1 -2
  31. data/app/controllers/my/collections_controller.rb +1 -0
  32. data/app/controllers/my/files_controller.rb +1 -1
  33. data/app/helpers/sufia/sufia_helper_behavior.rb +28 -16
  34. data/app/models/my_search_builder.rb +4 -0
  35. data/app/search_builders/sufia/my_search_builder_behavior.rb +20 -0
  36. data/app/search_builders/sufia/search_builder.rb +1 -1
  37. data/app/views/admin/stats/index.html.erb +68 -0
  38. data/app/views/collections/_action_menu.html.erb +22 -20
  39. data/app/views/collections/_collection.html.erb +1 -1
  40. data/app/views/collections/_form_for_select_collection.html.erb +5 -3
  41. data/app/views/generic_files/_show_actions.html.erb +4 -2
  42. data/app/views/generic_files/show.html.erb +1 -1
  43. data/app/views/layouts/sufia-dashboard.html.erb +5 -4
  44. data/app/views/layouts/sufia-one-column.html.erb +2 -0
  45. data/app/views/layouts/sufia-two-column.html.erb +6 -4
  46. data/app/views/my/_facet_layout.html.erb +2 -2
  47. data/app/views/my/_facets.html.erb +4 -6
  48. data/app/views/my/index.html.erb +4 -3
  49. data/app/views/users/_edit_primary.html.erb +18 -17
  50. data/app/views/users/_follower_modal.html.erb +5 -1
  51. data/app/views/users/_following_modal.html.erb +5 -1
  52. data/app/views/users/_user_info.html.erb +6 -1
  53. data/app/views/users/_zotero.html.erb +12 -0
  54. data/config/locales/sufia.en.yml +10 -1
  55. data/config/routes.rb +23 -1
  56. data/lib/generators/sufia/admin_stat_generator.rb +17 -0
  57. data/lib/generators/sufia/install_generator.rb +8 -3
  58. data/{sufia-models/lib/generators/sufia/models/templates/config/resque_admin.rb → lib/generators/sufia/templates/sufia/stats_admin.rb} +3 -3
  59. data/lib/generators/sufia/upgrade400_generator.rb +2 -2
  60. data/lib/sufia.rb +3 -0
  61. data/lib/sufia/arkivo.rb +11 -0
  62. data/lib/sufia/arkivo/actor.rb +95 -0
  63. data/lib/sufia/arkivo/config.rb +11 -0
  64. data/lib/sufia/arkivo/create_subscription_job.rb +67 -0
  65. data/lib/sufia/arkivo/metadata_munger.rb +51 -0
  66. data/lib/sufia/arkivo/schema_validator.rb +55 -0
  67. data/lib/sufia/form_builder.rb +1 -1
  68. data/lib/sufia/inflections.rb +3 -0
  69. data/lib/sufia/version.rb +1 -1
  70. data/lib/sufia/zotero.rb +6 -0
  71. data/lib/sufia/zotero/config.rb +15 -0
  72. data/solr_conf/conf/solrconfig.xml +11 -0
  73. data/spec/controllers/admin_stats_controller_spec.rb +73 -0
  74. data/spec/controllers/api/items_controller_spec.rb +476 -0
  75. data/spec/controllers/api/zotero_controller_spec.rb +178 -0
  76. data/spec/controllers/batch_edits_controller_spec.rb +7 -0
  77. data/spec/controllers/collections_controller_spec.rb +1 -1
  78. data/spec/controllers/dashboard_controller_spec.rb +1 -1
  79. data/spec/controllers/depositors_controller_spec.rb +9 -5
  80. data/spec/controllers/generic_files_controller_spec.rb +5 -4
  81. data/spec/controllers/mailbox_controller_spec.rb +2 -2
  82. data/spec/controllers/my/collections_controller_spec.rb +1 -2
  83. data/spec/controllers/my/files_controller_spec.rb +5 -5
  84. data/spec/controllers/my/shares_controller_spec.rb +15 -3
  85. data/spec/controllers/pages_controller_spec.rb +1 -1
  86. data/spec/controllers/users_controller_spec.rb +10 -9
  87. data/spec/factories/api_items.rb +91 -0
  88. data/spec/factories/generic_files.rb +4 -0
  89. data/spec/factories/users.rb +4 -4
  90. data/spec/features/featured_item_spec.rb +26 -0
  91. data/spec/features/ingest_upload_files_spec.rb +2 -3
  92. data/spec/features/proxy_spec.rb +0 -1
  93. data/spec/helpers/permissions_helper_spec.rb +2 -2
  94. data/spec/helpers/sufia_helper_spec.rb +11 -5
  95. data/spec/inputs/select_with_help_input_spec.rb +2 -2
  96. data/spec/javascripts/helpers/.gitkeep +0 -0
  97. data/spec/javascripts/helpers/jasmine-jquery.js +832 -0
  98. data/spec/javascripts/jasmine_spec.rb +31 -0
  99. data/spec/javascripts/notify_update_link_spec.js +8 -0
  100. data/spec/javascripts/single_use_link_spec.js.coffee +23 -0
  101. data/spec/javascripts/support/jasmine.yml +124 -0
  102. data/spec/javascripts/support/jasmine_helper.rb +15 -0
  103. data/spec/javascripts/terms_of_service_spec.js.coffee +32 -0
  104. data/spec/javascripts/toggle_icon_spec.js +11 -0
  105. data/spec/jobs/active_fedora_id_based_job_spec.rb +3 -3
  106. data/spec/jobs/import_url_job_spec.rb +0 -2
  107. data/spec/lib/sufia/arkivo/actor_spec.rb +139 -0
  108. data/spec/lib/sufia/arkivo/create_subscription_job_spec.rb +54 -0
  109. data/spec/lib/sufia/arkivo/metadata_munger_spec.rb +48 -0
  110. data/spec/lib/sufia/arkivo/schema_validator_spec.rb +65 -0
  111. data/spec/lib/sufia/upload_complete_behavior_spec.rb +1 -1
  112. data/spec/lib/sufia/user_stat_importer_spec.rb +60 -0
  113. data/spec/lib/sufia/zotero/config_spec.rb +30 -0
  114. data/spec/models/collection_spec.rb +36 -7
  115. data/spec/models/file_download_stat_spec.rb +5 -5
  116. data/spec/models/file_usage_spec.rb +23 -0
  117. data/spec/models/file_view_stat_spec.rb +6 -6
  118. data/spec/models/fits_datastream_spec.rb +0 -5
  119. data/spec/models/generic_file_spec.rb +49 -14
  120. data/spec/models/local_authority_spec.rb +1 -1
  121. data/spec/models/proxy_deposit_request_spec.rb +1 -1
  122. data/spec/models/trophy_spec.rb +8 -8
  123. data/spec/models/user_spec.rb +33 -0
  124. data/spec/presenters/sufia/collection_presenter_spec.rb +1 -1
  125. data/spec/routing/api_route_spec.rb +91 -0
  126. data/spec/routing/route_spec.rb +1 -1
  127. data/spec/services/generic_file_audit_service_spec.rb +44 -8
  128. data/spec/spec_helper.rb +18 -3
  129. data/spec/support/features.rb +0 -2
  130. data/spec/support/locations.rb +0 -21
  131. data/spec/support/rake.rb +41 -0
  132. data/spec/support/selectors.rb +0 -50
  133. data/spec/tasks/rake_spec.rb +33 -12
  134. data/spec/test_app_templates/lib/generators/test_app_generator.rb +12 -0
  135. data/spec/views/admin/stats/index.html.erb_spec.rb +45 -0
  136. data/spec/views/catalog/sort_and_per_page.html.erb_spec.rb +0 -1
  137. data/spec/views/dashboard/index_spec.rb +1 -1
  138. data/spec/views/generic_file/edit.html.erb_spec.rb +1 -1
  139. data/spec/views/generic_file/show.html.erb_spec.rb +1 -3
  140. data/spec/views/users/_follower_modal.html.erb_spec.rb +44 -7
  141. data/spec/views/users/_following_modal.html.erb_spec.rb +49 -7
  142. data/spec/views/users/edit.html.erb_spec.rb +72 -0
  143. data/spec/views/users/show.html.erb_spec.rb +1 -1
  144. data/sufia.gemspec +6 -2
  145. data/tasks/sufia-user.rake +14 -0
  146. metadata +130 -156
  147. data/spec/lib/sufia/id_service_spec.rb +0 -32
  148. data/spec/services/noid_spec.rb +0 -9
  149. data/spec/support/poltergeist.rb +0 -11
  150. data/spec/support/rake_output.rb +0 -20
  151. data/sufia-models/.gitignore +0 -17
  152. data/sufia-models/Gemfile +0 -4
  153. data/sufia-models/LICENSE.md +0 -177
  154. data/sufia-models/README.md +0 -39
  155. data/sufia-models/Rakefile +0 -1
  156. data/sufia-models/app/actors/sufia/generic_file/actor.rb +0 -137
  157. data/sufia-models/app/jobs/active_fedora_id_based_job.rb +0 -22
  158. data/sufia-models/app/jobs/active_fedora_pid_based_job.rb +0 -7
  159. data/sufia-models/app/jobs/audit_job.rb +0 -62
  160. data/sufia-models/app/jobs/batch_update_job.rb +0 -72
  161. data/sufia-models/app/jobs/characterize_job.rb +0 -10
  162. data/sufia-models/app/jobs/create_derivatives_job.rb +0 -14
  163. data/sufia-models/app/jobs/import_url_job.rb +0 -52
  164. data/sufia-models/app/jobs/ingest_local_file_job.rb +0 -46
  165. data/sufia-models/app/jobs/resolrize_job.rb +0 -9
  166. data/sufia-models/app/models/batch.rb +0 -36
  167. data/sufia-models/app/models/checksum_audit_log.rb +0 -21
  168. data/sufia-models/app/models/concerns/sufia/ability.rb +0 -61
  169. data/sufia-models/app/models/concerns/sufia/collection_behavior.rb +0 -24
  170. data/sufia-models/app/models/concerns/sufia/file_stat_utils.rb +0 -35
  171. data/sufia-models/app/models/concerns/sufia/generic_file.rb +0 -25
  172. data/sufia-models/app/models/concerns/sufia/generic_file/batches.rb +0 -28
  173. data/sufia-models/app/models/concerns/sufia/generic_file/characterization.rb +0 -89
  174. data/sufia-models/app/models/concerns/sufia/generic_file/content.rb +0 -13
  175. data/sufia-models/app/models/concerns/sufia/generic_file/derivatives.rb +0 -26
  176. data/sufia-models/app/models/concerns/sufia/generic_file/export.rb +0 -343
  177. data/sufia-models/app/models/concerns/sufia/generic_file/featured.rb +0 -11
  178. data/sufia-models/app/models/concerns/sufia/generic_file/full_text_indexing.rb +0 -43
  179. data/sufia-models/app/models/concerns/sufia/generic_file/indexing.rb +0 -14
  180. data/sufia-models/app/models/concerns/sufia/generic_file/metadata.rb +0 -98
  181. data/sufia-models/app/models/concerns/sufia/generic_file/mime_types.rb +0 -69
  182. data/sufia-models/app/models/concerns/sufia/generic_file/permissions.rb +0 -11
  183. data/sufia-models/app/models/concerns/sufia/generic_file/proxy_deposit.rb +0 -31
  184. data/sufia-models/app/models/concerns/sufia/generic_file/trophies.rb +0 -14
  185. data/sufia-models/app/models/concerns/sufia/generic_file/versions.rb +0 -16
  186. data/sufia-models/app/models/concerns/sufia/generic_file/virus_check.rb +0 -37
  187. data/sufia-models/app/models/concerns/sufia/model_methods.rb +0 -20
  188. data/sufia-models/app/models/concerns/sufia/user.rb +0 -137
  189. data/sufia-models/app/models/concerns/sufia/user_usage_stats.rb +0 -15
  190. data/sufia-models/app/models/datastreams/file_content_datastream.rb +0 -4
  191. data/sufia-models/app/models/datastreams/fits_datastream.rb +0 -152
  192. data/sufia-models/app/models/domain_term.rb +0 -5
  193. data/sufia-models/app/models/featured_work.rb +0 -22
  194. data/sufia-models/app/models/file_download_stat.rb +0 -18
  195. data/sufia-models/app/models/file_usage.rb +0 -34
  196. data/sufia-models/app/models/file_view_stat.rb +0 -18
  197. data/sufia-models/app/models/follow.rb +0 -12
  198. data/sufia-models/app/models/generic_file.rb +0 -3
  199. data/sufia-models/app/models/geo_names_resource.rb +0 -18
  200. data/sufia-models/app/models/group.rb +0 -8
  201. data/sufia-models/app/models/local_authority.rb +0 -86
  202. data/sufia-models/app/models/local_authority_entry.rb +0 -3
  203. data/sufia-models/app/models/proxy_deposit_request.rb +0 -85
  204. data/sufia-models/app/models/proxy_deposit_rights.rb +0 -4
  205. data/sufia-models/app/models/single_use_link.rb +0 -42
  206. data/sufia-models/app/models/subject_local_authority_entry.rb +0 -2
  207. data/sufia-models/app/models/sufia/avatar_uploader.rb +0 -20
  208. data/sufia-models/app/models/sufia/avatar_validator.rb +0 -8
  209. data/sufia-models/app/models/sufia/collection.rb +0 -5
  210. data/sufia-models/app/models/sufia/download.rb +0 -9
  211. data/sufia-models/app/models/sufia/orcid_validator.rb +0 -12
  212. data/sufia-models/app/models/sufia/pageview.rb +0 -9
  213. data/sufia-models/app/models/trophy.rb +0 -10
  214. data/sufia-models/app/models/user_stat.rb +0 -2
  215. data/sufia-models/app/models/version_committer.rb +0 -2
  216. data/sufia-models/app/services/sufia/analytics.rb +0 -50
  217. data/sufia-models/app/services/sufia/generic_file_audit_service.rb +0 -83
  218. data/sufia-models/app/services/sufia/generic_file_indexing_service.rb +0 -12
  219. data/sufia-models/app/services/sufia/id_service.rb +0 -45
  220. data/sufia-models/app/services/sufia/noid.rb +0 -22
  221. data/sufia-models/app/services/sufia/repository_audit_service.rb +0 -9
  222. data/sufia-models/config/locales/sufia.en.yml +0 -6
  223. data/sufia-models/lib/generators/sufia/models/abstract_migration_generator.rb +0 -30
  224. data/sufia-models/lib/generators/sufia/models/cached_stats_generator.rb +0 -24
  225. data/sufia-models/lib/generators/sufia/models/fulltext_generator.rb +0 -27
  226. data/sufia-models/lib/generators/sufia/models/install_generator.rb +0 -106
  227. data/sufia-models/lib/generators/sufia/models/orcid_field_generator.rb +0 -19
  228. data/sufia-models/lib/generators/sufia/models/proxies_generator.rb +0 -24
  229. data/sufia-models/lib/generators/sufia/models/templates/app/models/collection.rb +0 -2
  230. data/sufia-models/lib/generators/sufia/models/templates/config/analytics.yml +0 -9
  231. data/sufia-models/lib/generators/sufia/models/templates/config/clamav.rb +0 -1
  232. data/sufia-models/lib/generators/sufia/models/templates/config/mailboxer.rb +0 -17
  233. data/sufia-models/lib/generators/sufia/models/templates/config/mime_types.rb +0 -6
  234. data/sufia-models/lib/generators/sufia/models/templates/config/redis.yml +0 -9
  235. data/sufia-models/lib/generators/sufia/models/templates/config/redis_config.rb +0 -32
  236. data/sufia-models/lib/generators/sufia/models/templates/config/resque-pool.yml +0 -1
  237. data/sufia-models/lib/generators/sufia/models/templates/config/resque_config.rb +0 -5
  238. data/sufia-models/lib/generators/sufia/models/templates/config/setup_mail.rb +0 -3
  239. data/sufia-models/lib/generators/sufia/models/templates/config/solrconfig.xml +0 -223
  240. data/sufia-models/lib/generators/sufia/models/templates/config/sufia.rb +0 -144
  241. data/sufia-models/lib/generators/sufia/models/templates/migrations/acts_as_follower_migration.rb +0 -17
  242. data/sufia-models/lib/generators/sufia/models/templates/migrations/add_avatars_to_users.rb +0 -15
  243. data/sufia-models/lib/generators/sufia/models/templates/migrations/add_external_key_to_content_blocks.rb +0 -6
  244. data/sufia-models/lib/generators/sufia/models/templates/migrations/add_groups_to_users.rb +0 -11
  245. data/sufia-models/lib/generators/sufia/models/templates/migrations/add_ldap_attrs_to_user.rb +0 -27
  246. data/sufia-models/lib/generators/sufia/models/templates/migrations/add_linkedin_to_users.rb +0 -5
  247. data/sufia-models/lib/generators/sufia/models/templates/migrations/add_orcid_to_users.rb +0 -5
  248. data/sufia-models/lib/generators/sufia/models/templates/migrations/add_social_to_users.rb +0 -13
  249. data/sufia-models/lib/generators/sufia/models/templates/migrations/change_audit_log_pid_to_generic_file_id.rb +0 -5
  250. data/sufia-models/lib/generators/sufia/models/templates/migrations/change_proxy_deposit_request_pid_to_generic_file_id.rb +0 -5
  251. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_checksum_audit_logs.rb +0 -19
  252. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_content_blocks.rb +0 -10
  253. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_featured_works.rb +0 -12
  254. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_file_download_stats.rb +0 -12
  255. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_file_view_stats.rb +0 -12
  256. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_local_authorities.rb +0 -50
  257. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_proxy_deposit_requests.rb +0 -16
  258. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_proxy_deposit_rights.rb +0 -11
  259. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_single_use_links.rb +0 -12
  260. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_tinymce_assets.rb +0 -8
  261. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_trophies.rb +0 -10
  262. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_user_stats.rb +0 -19
  263. data/sufia-models/lib/generators/sufia/models/templates/migrations/create_version_committers.rb +0 -15
  264. data/sufia-models/lib/generators/sufia/models/update_content_blocks_generator.rb +0 -18
  265. data/sufia-models/lib/generators/sufia/models/upgrade400_generator.rb +0 -54
  266. data/sufia-models/lib/generators/sufia/models/upgrade600_generator.rb +0 -21
  267. data/sufia-models/lib/generators/sufia/models/usagestats_generator.rb +0 -19
  268. data/sufia-models/lib/generators/sufia/models/user_stats_generator.rb +0 -31
  269. data/sufia-models/lib/sufia/messages.rb +0 -66
  270. data/sufia-models/lib/sufia/models.rb +0 -34
  271. data/sufia-models/lib/sufia/models/active_fedora/redis.rb +0 -43
  272. data/sufia-models/lib/sufia/models/active_record/redis.rb +0 -56
  273. data/sufia-models/lib/sufia/models/engine.rb +0 -79
  274. data/sufia-models/lib/sufia/models/file_content.rb +0 -6
  275. data/sufia-models/lib/sufia/models/file_content/versions.rb +0 -21
  276. data/sufia-models/lib/sufia/models/resque.rb +0 -36
  277. data/sufia-models/lib/sufia/models/stats/user_stat_importer.rb +0 -108
  278. data/sufia-models/lib/sufia/models/user_local_directory_behavior.rb +0 -29
  279. data/sufia-models/lib/sufia/models/utils.rb +0 -22
  280. data/sufia-models/lib/sufia/models/version.rb +0 -5
  281. data/sufia-models/lib/sufia/models/virus_found_error.rb +0 -4
  282. data/sufia-models/lib/sufia/permissions.rb +0 -9
  283. data/sufia-models/lib/sufia/permissions/readable.rb +0 -20
  284. data/sufia-models/lib/sufia/permissions/writable.rb +0 -74
  285. data/sufia-models/lib/tasks/batch_cleanup.rake +0 -19
  286. data/sufia-models/lib/tasks/migrate.rake +0 -21
  287. data/sufia-models/lib/tasks/resque.rake +0 -13
  288. data/sufia-models/lib/tasks/stats_tasks.rake +0 -12
  289. data/sufia-models/lib/tasks/sufia-models_tasks.rake +0 -80
  290. data/sufia-models/sufia-models.gemspec +0 -52
@@ -1,6 +0,0 @@
1
- module Sufia
2
- module FileContent
3
- extend ActiveSupport::Autoload
4
- autoload :Versions, 'sufia/models/file_content/versions'
5
- end
6
- end
@@ -1,21 +0,0 @@
1
- module Sufia
2
- module FileContent
3
- module Versions
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- has_many_versions
8
- end
9
-
10
- def latest_version
11
- versions.last unless versions.empty?
12
- end
13
-
14
- def save
15
- super.tap do |passing|
16
- create_version if passing
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,36 +0,0 @@
1
- # Borrowed from:
2
- # https://github.com/jeremy/resque-rails/blob/master/lib/resque/rails/queue.rb
3
- module Sufia
4
- module Resque
5
- class Queue
6
- attr_reader :default_queue_name
7
-
8
- def initialize(default_queue_name)
9
- @default_queue_name = default_queue_name
10
- end
11
-
12
- def push(job)
13
- push_tries = 0
14
- queue = job.respond_to?(:queue_name) ? job.queue_name : default_queue_name
15
- begin
16
- ::Resque.enqueue_to queue, MarshaledJob, Base64.encode64(Marshal.dump(job))
17
- rescue Redis::CannotConnectError
18
- ActiveFedora::Base.logger.error "Redis is down!"
19
- rescue Redis::TimeoutError => error
20
- ActiveFedora::Base.logger.warn "Redis Timed out. Trying again! #{job.inspect}"
21
- push_tries+=1
22
- # fail for good if the tries is greater than 3
23
- raise error if push_tries >=3
24
- sleep 0.01
25
- retry
26
- end
27
- end
28
- end
29
-
30
- class MarshaledJob
31
- def self.perform(marshaled_job)
32
- Marshal.load(Base64.decode64(marshaled_job)).run
33
- end
34
- end
35
- end
36
- end
@@ -1,108 +0,0 @@
1
- module Sufia
2
- class UserStatImporter
3
-
4
- UserRecord = Struct.new("UserRecord", :id, :user_key, :last_stats_update)
5
-
6
- def initialize(options={})
7
- @verbose = options[:verbose]
8
- @logging = options[:logging]
9
- @delay_secs = options[:delay_secs].to_f
10
- end
11
-
12
- def import
13
- log_message('Begin import of User stats.')
14
- sorted_users.each do |user|
15
- start_date = date_since_last_cache(user)
16
-
17
- stats = {}
18
- file_ids_for_user(user).each do |file_id|
19
- view_stats = FileViewStat.statistics(file_id, start_date, user.id)
20
- stats = tally_results(view_stats, :views, stats)
21
- delay
22
-
23
- dl_stats = FileDownloadStat.statistics(file_id, start_date, user.id)
24
- stats = tally_results(dl_stats, :downloads, stats)
25
- delay
26
- end
27
-
28
- create_or_update_user_stats(stats, user)
29
- end
30
- log_message('User stats import complete.')
31
- end
32
-
33
- # Returns an array of users sorted by the date of their last
34
- # stats update. Users that have not been recently updated
35
- # will be at the top of the array.
36
- def sorted_users
37
- users = []
38
- ::User.find_each do |user|
39
- users.push(UserRecord.new(user.id, user.user_key, date_since_last_cache(user)))
40
- end
41
- users.sort! {|a, b| a.last_stats_update <=> b.last_stats_update}
42
- end
43
-
44
- private
45
-
46
- def delay
47
- sleep @delay_secs
48
- end
49
-
50
- def date_since_last_cache(user)
51
- last_cached_stat = UserStat.where(user_id: user.id).order(date: :asc).last
52
-
53
- if last_cached_stat
54
- last_cached_stat.date + 1.day
55
- else
56
- Sufia.config.analytic_start_date
57
- end
58
- end
59
-
60
- def file_ids_for_user(user)
61
- ids = []
62
- ::GenericFile.find_in_batches("#{Solrizer.solr_name('depositor', :symbol)}:\"#{user.user_key}\"", fl:"id") do |group|
63
- ids.concat group.map { |doc| doc["id"] }
64
- end
65
- ids
66
- end
67
-
68
- # For each date, add the view and download counts for this
69
- # file to the view & download sub-totals for that day.
70
- # The resulting hash will look something like this:
71
- # {"2014-11-30 00:00:00 UTC" => {:views=>2, :downloads=>5},
72
- # "2014-12-01 00:00:00 UTC" => {:views=>4, :downloads=>4}}
73
- def tally_results(file_stats, stat_name, total_stats)
74
- file_stats.each do |stats|
75
- # Exclude the stats from today since it will only be a partial day's worth of data
76
- break if stats.date == Date.today
77
-
78
- date_key = stats.date.to_s
79
- old_count = total_stats[date_key] ? total_stats[date_key].fetch(stat_name) { 0 } : 0
80
- new_count = old_count + stats.method(stat_name).call
81
-
82
- old_values = total_stats[date_key] || {}
83
- total_stats.store(date_key, old_values)
84
- total_stats[date_key].store(stat_name, new_count)
85
- end
86
- total_stats
87
- end
88
-
89
- def create_or_update_user_stats(stats, user)
90
- stats.each do |date_string, data|
91
- date = Time.zone.parse(date_string)
92
-
93
- user_stat = UserStat.where(user_id: user.id).where(date: date).first
94
- user_stat ||= UserStat.new(user_id: user.id, date: date)
95
-
96
- user_stat.file_views = data[:views] || 0
97
- user_stat.file_downloads = data[:downloads] || 0
98
- user_stat.save!
99
- end
100
- end
101
-
102
- def log_message(message)
103
- puts message if @verbose
104
- Rails.logger.info "#{self.class}: #{message}" if @logging
105
- end
106
-
107
- end
108
- end
@@ -1,29 +0,0 @@
1
- # To enable local file ingest,
2
- # - Make User model define .directory method that returns a String corresponding to the User's personal import directory on the server. This can be a simple ActiveRecord attribute on the User model, or it can be something more elaborate.
3
- # - Include this module in your User model, or define a .files() method that behaves the same
4
- # - Set Sufia.config.enable_local_ingest to true
5
- #
6
- module Sufia::UserLocalDirectoryBehavior
7
-
8
- # You can use this validator in your User model.
9
- # Ensures that a string defining the path to the user's directory has been provided
10
- # and corresponds to a real directory on the server.
11
- # @example
12
- # validate :directory_must_exist
13
- def directory_must_exist
14
- unless directory.blank? || File.directory?(directory)
15
- errors.add(:directory, "must be an existing directory")
16
- end
17
- end
18
-
19
- # List the contents of the user's directory on the server
20
- # Indicates whether each item is a directory or not.
21
- def files
22
- return [] unless directory.present? && File.directory?(directory)
23
- Dir[File.join(directory, '*')].inject([]) do |accum, val|
24
- accum << { name: File.basename(val), directory: File.directory?(val)}
25
- accum
26
- end
27
- end
28
-
29
- end
@@ -1,22 +0,0 @@
1
- module Sufia
2
- module Utils
3
- extend ActiveSupport::Concern
4
-
5
- def retry_unless(number_of_tries, condition, &block)
6
- self.class.retry_unless(number_of_tries, condition, &block)
7
- end
8
-
9
- module ClassMethods
10
- def retry_unless(number_of_tries, condition, &block)
11
- raise ArgumentError, "First argument must be an enumerator" unless number_of_tries.is_a? Enumerator
12
- raise ArgumentError, "Second argument must be a lambda" unless condition.respond_to? :call
13
- raise ArgumentError, "Must pass a block of code to retry" unless block_given?
14
- number_of_tries.each do
15
- result = block.call
16
- return result unless condition.call
17
- end
18
- raise RuntimeError, "retry_unless could not complete successfully. Try upping the # of tries?"
19
- end
20
- end
21
- end
22
- end
@@ -1,5 +0,0 @@
1
- module Sufia
2
- module Models
3
- VERSION = "6.0.0"
4
- end
5
- end
@@ -1,4 +0,0 @@
1
- module Sufia
2
- class VirusFoundError < StandardError
3
- end
4
- end
@@ -1,9 +0,0 @@
1
- module Sufia
2
- module Permissions
3
- extend ActiveSupport::Autoload
4
-
5
- autoload :Writable
6
- autoload :Readable
7
-
8
- end
9
- end
@@ -1,20 +0,0 @@
1
- module Sufia
2
- module Permissions
3
- module Readable
4
- extend ActiveSupport::Concern
5
-
6
- def public?
7
- read_groups.include?('public')
8
- end
9
-
10
- def registered?
11
- read_groups.include?('registered')
12
- end
13
-
14
- def private?
15
- !(public? || registered?)
16
- end
17
-
18
- end
19
- end
20
- end
@@ -1,74 +0,0 @@
1
- module Sufia
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
- VALIDATIONS.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
- VALIDATIONS = [
27
- {key: :edit_users, message: 'Depositor must have edit access', condition: lambda { |obj| !obj.edit_users.include?(obj.depositor) }},
28
- {key: :edit_groups, message: 'Public cannot have edit access', condition: lambda { |obj| obj.edit_groups.include?('public') }},
29
- {key: :edit_groups, message: 'Registered cannot have edit access', condition: lambda { |obj| obj.edit_groups.include?('registered') }}
30
- ]
31
-
32
-
33
- def clear_permissions!
34
- self.permissions = []
35
- end
36
-
37
- ## Updates those permissions that are provided to it. Does not replace any permissions unless they are provided
38
- # def permissions=(params)
39
- # raise "Fixme #{params}"
40
- # perm_hash = permission_hash
41
- # params[:new_user_name].each { |name, access| perm_hash['person'][name] = access } if params[:new_user_name].present?
42
- # params[:new_group_name].each { |name, access| perm_hash['group'][name] = access } if params[:new_group_name].present?
43
-
44
- # params[:user].each { |name, access| perm_hash['person'][name] = access} if params[:user]
45
- # params[:group].each { |name, access| perm_hash['group'][name] = access if ['read', 'edit'].include?(access)} if params[:group]
46
-
47
- # # rightsMetadata.update_permissions(perm_hash)
48
- # end
49
-
50
- # def permissions
51
- # raise "Fixme "
52
- # perms = super
53
- # perms.map {|p| { name: p.name, access: p.access, type:p.type } }
54
- # end
55
-
56
- private
57
-
58
- def permission_hash
59
- old_perms = self.permissions
60
- user_perms = {}
61
- old_perms.select{|r| r[:type] == 'user'}.each do |r|
62
- user_perms[r[:name]] = r[:access]
63
- end
64
- user_perms
65
- group_perms = {}
66
- old_perms.select{|r| r[:type] == 'group'}.each do |r|
67
- group_perms[r[:name]] = r[:access]
68
- end
69
- {'person'=>user_perms, 'group'=>group_perms}
70
- end
71
-
72
- end
73
- end
74
- end
@@ -1,19 +0,0 @@
1
- namespace :sufia do
2
-
3
- desc "Reports on and optionally removes empty batches that contain no associated files"
4
- task :empty_batches, [:remove] => :environment do |t, args|
5
- option = args.to_hash.fetch(:remove, "keep")
6
- Batch.all.each do |batch|
7
- if batch.generic_files.empty?
8
- print "#{batch.id} contains no files - "
9
- if option == "remove"
10
- batch.destroy
11
- puts "deleted"
12
- else
13
- puts "to delete, rerun with the remove option: rake sufia:empty_batches[remove]"
14
- end
15
- end
16
- end
17
- end
18
-
19
- end
@@ -1,21 +0,0 @@
1
- namespace :sufia do
2
- namespace :migrate do
3
-
4
- desc "Migrate proxy deposits"
5
- task proxy_deposits: :environment do
6
- ProxyDepositRequest.all.each do |pd|
7
- pd.generic_file_id = pd.generic_file_id.delete "#{Sufia.config.redis_namespace}:"
8
- pd.save
9
- end
10
- end
11
-
12
- desc "Migrate audit logs"
13
- task audit_logs: :environment do
14
- ChecksumAuditLog.all.each do |cs|
15
- cs.generic_file_id = cs.generic_file_id.delete "#{Sufia.config.redis_namespace}:"
16
- cs.save
17
- end
18
- end
19
-
20
- end
21
- end
@@ -1,13 +0,0 @@
1
- require 'resque/pool/tasks'
2
-
3
- # This provides access to the Rails env within all Resque workers
4
- task 'resque:setup' => :environment
5
-
6
- # Set up resque-pool
7
- task 'resque:pool:setup' do
8
- ActiveRecord::Base.connection.disconnect!
9
- Resque::Pool.after_prefork do |job|
10
- ActiveRecord::Base.establish_connection
11
- Resque.redis.client.reconnect
12
- end
13
- end
@@ -1,12 +0,0 @@
1
- namespace :sufia do
2
- namespace :stats do
3
-
4
- desc "Cache file view & download stats for all users"
5
- task :user_stats => :environment do
6
- require 'sufia/models/stats/user_stat_importer'
7
- importer = Sufia::UserStatImporter.new(verbose: true, logging: true)
8
- importer.import
9
- end
10
-
11
- end
12
- end
@@ -1,80 +0,0 @@
1
- require 'net/http'
2
-
3
- namespace :solr do
4
- desc "Enqueue a job to resolrize the repository objects"
5
- task reindex: :environment do
6
- Sufia.queue.push(ResolrizeJob.new)
7
- end
8
- end
9
-
10
- namespace :sufia do
11
- namespace :jetty do
12
-
13
- FULLTEXT_JARS = %w(
14
- org/apache/james/apache-mime4j-core/0.7.2/apache-mime4j-core-0.7.2.jar
15
- org/apache/james/apache-mime4j-dom/0.7.2/apache-mime4j-dom-0.7.2.jar
16
- org/apache/solr/solr-cell/4.0.0/solr-cell-4.0.0.jar
17
- org/bouncycastle/bcmail-jdk15/1.45/bcmail-jdk15-1.45.jar
18
- org/bouncycastle/bcprov-jdk15/1.45/bcprov-jdk15-1.45.jar
19
- de/l3s/boilerpipe/boilerpipe/1.1.0/boilerpipe-1.1.0.jar
20
- org/apache/commons/commons-compress/1.4.1/commons-compress-1.4.1.jar
21
- dom4j/dom4j/1.6.1/dom4j-1.6.1.jar
22
- org/apache/pdfbox/fontbox/1.7.0/fontbox-1.7.0.jar
23
- com/ibm/icu/icu4j/49.1/icu4j-49.1.jar
24
- com/googlecode/mp4parser/isoparser/1.0-RC-1/isoparser-1.0-RC-1.jar
25
- jdom/jdom/1.0/jdom-1.0.jar
26
- org/apache/pdfbox/jempbox/1.7.0/jempbox-1.7.0.jar
27
- com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar
28
- com/drewnoakes/metadata-extractor/2.4.0-beta-1/metadata-extractor-2.4.0-beta-1.jar
29
- edu/ucar/netcdf/4.2-min/netcdf-4.2-min.jar
30
- org/apache/pdfbox/pdfbox/1.7.0/pdfbox-1.7.0.jar
31
- org/apache/poi/poi/3.8/poi-3.8.jar
32
- org/apache/poi/poi-ooxml/3.8/poi-ooxml-3.8.jar
33
- org/apache/poi/poi-ooxml-schemas/3.8/poi-ooxml-schemas-3.8.jar
34
- org/apache/poi/poi-scratchpad/3.8/poi-scratchpad-3.8.jar
35
- rome/rome/0.9/rome-0.9.jar
36
- org/ccil/cowan/tagsoup/tagsoup/1.2.1/tagsoup-1.2.1.jar
37
- org/apache/tika/tika-core/1.2/tika-core-1.2.jar
38
- org/apache/tika/tika-parsers/1.2/tika-parsers-1.2.jar
39
- org/gagravarr/vorbis-java-core/0.1/vorbis-java-core-0.1.jar
40
- org/gagravarr/vorbis-java-tika/0.1/vorbis-java-tika-0.1.jar
41
- xerces/xercesImpl/2.9.1/xercesImpl-2.9.1.jar
42
- org/apache/xmlbeans/xmlbeans/2.3.0/xmlbeans-2.3.0.jar
43
- org/tukaani/xz/1.0/xz-1.0.jar
44
- org/aspectj/aspectjrt/1.8.5/aspectjrt-1.8.5.jar
45
- )
46
-
47
- desc 'Configure jetty with full-text indexing'
48
- task config: :download_jars do
49
- Rake::Task['jetty:config'].invoke
50
- end
51
-
52
- desc 'Download Solr full-text extraction jars'
53
- task :download_jars do
54
- puts "Downloading full-text jars from maven.org ..."
55
- fulltext_dir = 'jetty/solr/lib/contrib/extraction/lib'
56
- FileUtils.mkdir_p(fulltext_dir) unless File.directory?(fulltext_dir)
57
- Dir.chdir(fulltext_dir) do
58
- FULLTEXT_JARS.each do |jar|
59
- destination = jar.split('/').last
60
- download_from_maven(jar, destination) unless File.exists?(destination)
61
- end
62
- end
63
- end
64
- end
65
- end
66
-
67
- def download_from_maven url, dst
68
- full_url = '/remotecontent?filepath=' + url
69
- file = File.open(dst, "w")
70
- Net::HTTP.start("search.maven.org") do |http|
71
- puts "Fetching #{full_url}"
72
- begin
73
- http.request_get(full_url) do |resp|
74
- resp.read_body { |segment| file.write(segment) }
75
- end
76
- ensure
77
- file.close
78
- end
79
- end
80
- end