sufia 6.3.0 → 6.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -2
  3. data/.rubocop.yml +10 -0
  4. data/Gemfile +16 -7
  5. data/History.md +43 -0
  6. data/README.md +26 -19
  7. data/SUFIA_VERSION +1 -1
  8. data/app/assets/javascripts/notifications_check.js.erb +46 -0
  9. data/app/assets/javascripts/sufia.js +1 -2
  10. data/app/assets/javascripts/sufia/uploader.js +3 -3
  11. data/app/assets/stylesheets/sufia/_collections.scss +5 -0
  12. data/app/assets/stylesheets/sufia/_dashboard.scss +6 -1
  13. data/app/assets/stylesheets/sufia/_file-listing.scss +44 -6
  14. data/app/assets/stylesheets/sufia/_file-show.scss +4 -0
  15. data/app/assets/stylesheets/sufia/_settings.scss +3 -0
  16. data/app/controllers/api/items_controller.rb +7 -3
  17. data/app/controllers/concerns/sufia/admin/depositor_stats.rb +1 -1
  18. data/app/controllers/concerns/sufia/admin/stats_behavior.rb +6 -76
  19. data/app/controllers/concerns/sufia/batch_controller_behavior.rb +10 -2
  20. data/app/controllers/concerns/sufia/contact_form_controller_behavior.rb +1 -0
  21. data/app/controllers/concerns/sufia/files_controller_behavior.rb +11 -1
  22. data/app/controllers/concerns/sufia/homepage_controller.rb +1 -1
  23. data/app/controllers/concerns/sufia/my_controller_behavior.rb +2 -0
  24. data/app/controllers/concerns/sufia/users_controller_behavior.rb +2 -2
  25. data/app/helpers/generic_file_helper.rb +8 -5
  26. data/app/jobs/content_delete_event_job.rb +16 -11
  27. data/app/jobs/content_deposit_event_job.rb +4 -16
  28. data/app/jobs/content_depositor_change_event_job.rb +32 -20
  29. data/app/jobs/content_event_job.rb +39 -0
  30. data/app/jobs/content_new_version_event_job.rb +4 -16
  31. data/app/jobs/content_restored_version_event_job.rb +6 -19
  32. data/app/jobs/content_update_event_job.rb +4 -16
  33. data/app/jobs/event_job.rb +48 -4
  34. data/app/jobs/user_edit_profile_event_job.rb +4 -17
  35. data/app/jobs/user_follow_event_job.rb +10 -12
  36. data/app/jobs/user_unfollow_event_job.rb +10 -15
  37. data/app/models/concerns/sufia/solr_document_behavior.rb +11 -1
  38. data/app/models/system_stats.rb +108 -0
  39. data/app/presenters/sufia/admin_stats_presenter.rb +49 -0
  40. data/app/views/_controls.html.erb +1 -1
  41. data/app/views/_footer.html.erb +1 -1
  42. data/app/views/_logo.html.erb +1 -3
  43. data/app/views/admin/stats/_date_form.html.erb +8 -0
  44. data/app/views/admin/stats/_deposits.html.erb +2 -10
  45. data/app/views/admin/stats/_files.html.erb +6 -14
  46. data/app/views/admin/stats/_new_users.html.erb +7 -14
  47. data/app/views/admin/stats/_stats_by_date.html.erb +8 -0
  48. data/app/views/admin/stats/_top_data.html.erb +24 -0
  49. data/app/views/admin/stats/index.html.erb +5 -31
  50. data/app/views/collections/_form_for_select_collection.html.erb +5 -4
  51. data/app/views/collections/_show_actions.html.erb +7 -2
  52. data/app/views/collections/_show_document_list_row.html.erb +1 -9
  53. data/app/views/generic_files/_browse_everything.html.erb +3 -0
  54. data/app/views/generic_files/_descriptions.html.erb +1 -1
  55. data/app/views/generic_files/_generic_file.html.erb +1 -1
  56. data/app/views/generic_files/_local_file_import.html.erb +3 -0
  57. data/app/views/generic_files/_show_actions.html.erb +4 -0
  58. data/app/views/generic_files/upload/_form.html.erb +3 -0
  59. data/app/views/generic_files/upload/_to_collection.html.erb +5 -0
  60. data/app/views/homepage/_recent_document.html.erb +1 -7
  61. data/app/views/my/_index_partials/_default_group.html.erb +1 -1
  62. data/app/views/my/_index_partials/_list_collections.html.erb +3 -10
  63. data/app/views/my/_index_partials/_list_files.html.erb +13 -22
  64. data/app/views/my/_sort_and_per_page.html.erb +3 -3
  65. data/app/views/records/edit_fields/_rights.html.erb +2 -1
  66. data/app/views/static/terms.html.erb +1 -1
  67. data/config/locales/sufia.en.yml +13 -0
  68. data/lib/generators/sufia/templates/catalog_controller.rb +2 -2
  69. data/lib/sufia/version.rb +1 -1
  70. data/spec/actors/generic_file/actor_spec.rb +35 -0
  71. data/spec/controllers/admin_stats_controller_spec.rb +53 -23
  72. data/spec/controllers/api/items_controller_spec.rb +47 -41
  73. data/spec/controllers/batch_controller_spec.rb +1 -0
  74. data/spec/controllers/generic_files_controller_spec.rb +35 -1
  75. data/spec/controllers/my/files_controller_spec.rb +5 -0
  76. data/spec/factories/generic_files.rb +3 -0
  77. data/spec/features/collection_spec.rb +91 -0
  78. data/spec/features/contact_form_spec.rb +1 -0
  79. data/spec/forms/collection_edit_form_spec.rb +3 -3
  80. data/spec/forms/generic_file_edit_form_spec.rb +1 -1
  81. data/spec/jobs/create_derivatives_job_spec.rb +6 -0
  82. data/spec/models/file_content_datastream_spec.rb +1 -1
  83. data/spec/models/file_download_stat_spec.rb +4 -4
  84. data/spec/models/file_usage_spec.rb +2 -2
  85. data/spec/models/file_view_stat_spec.rb +4 -4
  86. data/spec/models/generic_file_spec.rb +15 -3
  87. data/spec/models/geo_names_resource_spec.rb +10 -0
  88. data/spec/models/solr_document_spec.rb +28 -0
  89. data/spec/models/system_stats_spec.rb +184 -0
  90. data/spec/models/user_spec.rb +1 -1
  91. data/spec/models/user_usage_stats_spec.rb +1 -1
  92. data/spec/services/generic_file_csv_service_spec.rb +66 -0
  93. data/spec/services/generic_file_indexing_service_spec.rb +35 -0
  94. data/spec/services/lock_manager_spec.rb +12 -0
  95. data/spec/spec_helper.rb +2 -1
  96. data/spec/views/admin/stats/index.html.erb_spec.rb +11 -10
  97. data/spec/views/catalog/sort_and_per_page.html.erb_spec.rb +1 -1
  98. data/spec/views/collections/_form_for_select_collection.html.erb_spec.rb +51 -0
  99. data/spec/views/generic_file/_browse_everything.html.erb_spec.rb +4 -0
  100. data/spec/views/generic_file/edit.html.erb_spec.rb +31 -24
  101. data/spec/views/generic_file/new.html.erb_spec.rb +70 -0
  102. data/spec/views/generic_file/show.html.erb_spec.rb +23 -0
  103. data/sufia.gemspec +3 -2
  104. data/tasks/sufia-dev.rake +2 -0
  105. metadata +42 -9
  106. data/lib/sufia/role_mapper.rb +0 -7
@@ -22,3 +22,7 @@
22
22
  -webkit-column-width: 20em;
23
23
  column-width: 20em;
24
24
  }
25
+
26
+ .img-responsive, figure {
27
+ display: inline-block;
28
+ }
@@ -5,6 +5,7 @@
5
5
 
6
6
  $basic-black: #000;
7
7
  $blue-dark: #036;
8
+ $blue-default: #337AB7;
8
9
  $blue-medium: #1C5798;
9
10
  $blue-medium-bright: #2674CA;
10
11
  $teal: #2CAEB7;
@@ -79,3 +80,5 @@ $view-select-text-hover: $blue-medium-bright;
79
80
  // File Show Page
80
81
  $file-show-term-color: $gray-dark;
81
82
  $heading-border-color: $gray-light;
83
+ $link-color: $blue-default;
84
+ $link-color-hover: $gray-dark;
@@ -57,12 +57,16 @@ module API
57
57
  end
58
58
 
59
59
  def validate_item
60
- return render plain: 'no item parameter', status: :bad_request if params[:item].blank?
61
- Sufia::Arkivo::SchemaValidator.new(params[:item]).call
60
+ return render plain: 'no item parameter', status: :bad_request if post_data.blank?
61
+ Sufia::Arkivo::SchemaValidator.new(post_data).call
62
62
  rescue Sufia::Arkivo::InvalidItem => exception
63
63
  return render plain: "invalid item parameter: #{exception.message}", status: :bad_request
64
64
  else
65
- @item = JSON.parse(params[:item])
65
+ @item = JSON.parse(post_data)
66
+ end
67
+
68
+ def post_data
69
+ request.raw_post
66
70
  end
67
71
 
68
72
  def authorize_token
@@ -19,7 +19,7 @@ module Sufia::Admin::DepositorStats
19
19
  start_datetime = DateTime.parse(deposit_stats[:start_date]) unless deposit_stats[:start_date].blank?
20
20
  end_datetime = DateTime.parse(deposit_stats[:end_date]).end_of_day unless deposit_stats[:end_date].blank?
21
21
 
22
- query = GenericFile.build_date_query(start_datetime, end_datetime) unless start_datetime.blank?
22
+ query = ::GenericFile.build_date_query(start_datetime, end_datetime) unless start_datetime.blank?
23
23
  sb = DepositSearchBuilder.new([:include_depositor_facet], self)
24
24
  facet_results = repository.search(sb.merge(q: query).query)
25
25
  facets = facet_results["facet_counts"]["facet_fields"]["depositor_ssim"]
@@ -8,87 +8,17 @@ module Sufia
8
8
  end
9
9
 
10
10
  def index
11
- # total user count
12
- @users_count = ::User.count
11
+ stats_filters = params.fetch(:stats_filters, {})
13
12
 
14
- # The most recent users to join
15
- @users_stats = params.fetch(:users_stats, {})
16
- @recent_users = recent_users
13
+ # initialize the presenter
14
+ @presenter = AdminStatsPresenter.new(stats_filters, params.fetch(:limit, "5").to_i)
17
15
 
18
- # Query Solr for top depositors
19
- @active_users = top_depositors
16
+ # get deposit stats
17
+ @presenter.deposit_stats = stats_filters
18
+ @presenter.depositors = depositors(stats_filters)
20
19
 
21
- # Count of documents by permissions
22
- @files_count = document_by_permission
23
-
24
- # Query Solr for top file formats
25
- @top_formats = top_formats
26
-
27
- @deposit_stats = params.fetch(:deposit_stats, {})
28
- @depositors = depositors(@deposit_stats)
29
20
  render 'index'
30
21
  end
31
-
32
- private
33
-
34
- def top_depositors_count
35
- count = params[:dep_count].to_i
36
- count.in?(5..20) ? count : 5
37
- end
38
-
39
- def document_by_permission
40
- return document_by_date_by_permission if @users_stats[:file_start_date]
41
-
42
- files_count = {}
43
- files_count[:total] = ::GenericFile.count
44
- files_count[:public] = ::GenericFile.where_public.count
45
- files_count[:registered] = ::GenericFile.where_registered.count
46
- files_count[:private] = files_count[:total] - (files_count[:registered] + files_count[:public])
47
- files_count
48
- end
49
-
50
- def document_by_date_by_permission
51
- start_date = DateTime.parse(@users_stats[:file_start_date])
52
- end_date = DateTime.parse(@users_stats[:file_end_date]).end_of_day unless @users_stats[:file_end_date].blank?
53
- files_count = {}
54
- files_count[:total] = ::GenericFile.find_by_date_created(start_date, end_date).count
55
- files_count[:public] = ::GenericFile.find_by_date_created(start_date, end_date).merge(::GenericFile.where_public).count
56
- files_count[:registered] = ::GenericFile.find_by_date_created(start_date, end_date).merge(::GenericFile.where_registered).count
57
- files_count[:private] = files_count[:total] - (files_count[:registered] + files_count[:public])
58
- files_count
59
- end
60
-
61
- def top_depositors
62
- depositor_key = Solrizer.solr_name('depositor', :stored_searchable, type: :string)
63
- top_data(depositor_key, top_depositors_count)
64
- end
65
-
66
- def top_formats
67
- format_key = Solrizer.solr_name('file_format', Solrizer::Descriptor.new(:string, :indexed, :multivalued))
68
- top_data(format_key, 5)
69
- end
70
-
71
- def top_data(key, limit)
72
- query_url = "#{ActiveFedora.solr_config[:url]}/terms?terms.fl=#{key}&terms.sort=count&terms.limit=#{limit}&wt=json&omitHeader=true"
73
- # Parse JSON response (looks like {"terms":{"depositor_tesim":["mjg36",3]}} for depositor)
74
- json = open(query_url).read
75
- begin
76
- tuples = JSON.parse(json)['terms'][key]
77
- rescue
78
- []
79
- end
80
- # Change to hash where keys = logins and values = counts
81
- Hash[*tuples]
82
- end
83
-
84
- def recent_users
85
- # no dates return the top 5
86
- return ::User.order('created_at DESC').limit(5) if @users_stats[:start_date].blank?
87
-
88
- start_date = DateTime.parse @users_stats[:start_date]
89
- end_date = DateTime.parse(@users_stats[:end_date]).end_of_day unless @users_stats[:end_date].blank?
90
- ::User.recent_users start_date, end_date
91
- end
92
22
  end
93
23
  end
94
24
  end
@@ -22,8 +22,7 @@ module Sufia
22
22
  @batch = Batch.find_or_create(params[:id])
23
23
  @batch.status = ["processing"]
24
24
  @batch.save
25
- file_attributes = edit_form_class.model_attributes(params[:generic_file])
26
- Sufia.queue.push(BatchUpdateJob.new(current_user.user_key, params[:id], params[:title], file_attributes, params[:visibility]))
25
+ Sufia.queue.push(batch_update_job)
27
26
  flash[:notice] = 'Your files are being processed by ' + t('sufia.product_name') + ' in the background. The metadata and access controls you specified are being applied. Files will be marked <span class="label label-danger" title="Private">Private</span> until this process is complete (shouldn\'t take too long, hang in there!). You may need to refresh your dashboard to see these updates.'
28
27
  if uploading_on_behalf_of? @batch
29
28
  redirect_to sufia.dashboard_shares_path
@@ -49,5 +48,14 @@ module Sufia
49
48
  return false if file.nil? || file.on_behalf_of.blank?
50
49
  current_user.user_key != file.on_behalf_of
51
50
  end
51
+
52
+ def batch_update_job
53
+ @batch_update_job ||= BatchUpdateJob.new(
54
+ current_user.user_key,
55
+ params[:id],
56
+ params[:title],
57
+ edit_form_class.model_attributes(params[:generic_file]),
58
+ params[:visibility])
59
+ end
52
60
  end
53
61
  end
@@ -11,6 +11,7 @@ module Sufia
11
11
  if @contact_form.respond_to?(:deliver_now) ? @contact_form.deliver_now : @contact_form.deliver
12
12
  flash.now[:notice] = 'Thank you for your message!'
13
13
  after_deliver
14
+ @contact_form = ContactForm.new
14
15
  render :new
15
16
  else
16
17
  flash.now[:error] = 'Sorry, this message was not sent successfully. '
@@ -9,6 +9,8 @@ module Sufia
9
9
  extend ActiveSupport::Concern
10
10
  extend Sufia::FilesController::UploadCompleteBehavior
11
11
  include Sufia::Breadcrumbs
12
+ include Hydra::Catalog
13
+ include Hydra::Collections::SelectsCollections
12
14
 
13
15
  included do
14
16
  include Hydra::Controller::ControllerBehavior
@@ -38,6 +40,9 @@ module Sufia
38
40
  before_action :authenticate_user!, except: [:show, :citation, :stats]
39
41
  before_action :has_access?, except: [:show]
40
42
  before_action :build_breadcrumbs, only: [:show, :edit, :stats]
43
+ before_action only: [:new] do
44
+ find_collections_with_edit_access(true, -1, t("sufia.upload.collection.select_default_option"))
45
+ end
41
46
  load_resource only: [:audit]
42
47
  load_and_authorize_resource except: [:index, :audit, :show]
43
48
 
@@ -59,6 +64,7 @@ module Sufia
59
64
 
60
65
  # routed to /files/new
61
66
  def new
67
+ set_variables_for_new_form
62
68
  @batch_id = ActiveFedora::Noid::Service.new.mint
63
69
  end
64
70
 
@@ -152,6 +158,10 @@ module Sufia
152
158
 
153
159
  protected
154
160
 
161
+ def set_variables_for_new_form
162
+ @collection_id = params[:collection] if @user_collections.collect(&:id).include? params[:collection]
163
+ end
164
+
155
165
  def set_variables_for_edit_form
156
166
  @form = edit_form
157
167
  @groups = current_user.groups
@@ -227,7 +237,7 @@ module Sufia
227
237
 
228
238
  update_metadata_from_upload_screen
229
239
  actor.create_metadata(params[:batch_id])
230
- if actor.create_content(file, file.original_filename, file_path, file.content_type)
240
+ if actor.create_content(file, file.original_filename, file_path, file.content_type, params[:collection])
231
241
  respond_to do |format|
232
242
  format.html do
233
243
  render 'jq_upload', formats: 'json', content_type: 'text/html'
@@ -4,7 +4,7 @@ module Sufia::HomepageController
4
4
  included do
5
5
  # Adds Hydra behaviors into the application controller
6
6
  include Hydra::Controller::ControllerBehavior
7
- include Blacklight::Catalog::SearchContext
7
+ include Blacklight::SearchContext
8
8
  include Sufia::Controller
9
9
  include Blacklight::SearchHelper
10
10
  include Hydra::Controller::SearchBuilder
@@ -52,6 +52,8 @@ module Sufia
52
52
  @batch_size_on_other_page = batch_size - count_on_page
53
53
  @batch_part_on_other_page = (@batch_size_on_other_page) > 0
54
54
 
55
+ @add_files_to_collection = params.fetch(:add_files_to_collection, '')
56
+
55
57
  respond_to do |format|
56
58
  format.html {}
57
59
  format.rss { render layout: false }
@@ -2,9 +2,9 @@ module Sufia::UsersControllerBehavior
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  included do
5
- include Blacklight::Catalog::SearchContext
5
+ include Blacklight::SearchContext
6
6
  layout "sufia-one-column"
7
- prepend_before_filter :find_user, except: [:index, :search, :notifications_number]
7
+ prepend_before_action :find_user, except: [:index, :search, :notifications_number]
8
8
  before_action :authenticate_user!, only: [:edit, :update, :follow, :unfollow, :toggle_trophy]
9
9
  before_action :user_not_current_user, only: [:follow, :unfollow]
10
10
  authorize_resource only: [:edit, :update, :toggle_trophy]
@@ -13,7 +13,7 @@ module GenericFileHelper
13
13
  if title.nil?
14
14
  link_to download_image_tag, sufia.download_path(@generic_file), target: "_blank", title: "Download the document", id: "file_download", data: { label: @generic_file.id }
15
15
  else
16
- label = download_image_tag(title) + title
16
+ label = download_image_tag(title)
17
17
  link_to label, sufia.download_path(@generic_file), target: "_blank", title: title, id: "file_download", data: { label: @generic_file.id }
18
18
  end
19
19
  end
@@ -34,10 +34,13 @@ module GenericFileHelper
34
34
  private
35
35
 
36
36
  def download_image_tag(title = nil)
37
- if title.nil?
38
- image_tag "default.png", alt: "No preview available", class: "img-responsive"
39
- else
40
- image_tag sufia.download_path(@generic_file, file: 'thumbnail'), class: "img-responsive", alt: "#{title} of #{@generic_file.title.first}"
37
+ content_tag :figure do
38
+ if title.nil?
39
+ concat image_tag "default.png", alt: "No preview available", class: "img-responsive"
40
+ else
41
+ concat image_tag sufia.download_path(@generic_file, file: 'thumbnail'), class: "img-responsive", alt: "#{title} of #{@generic_file.title.first}"
42
+ end
43
+ concat content_tag :figcaption, "Download the full sized image"
41
44
  end
42
45
  end
43
46
 
@@ -1,15 +1,20 @@
1
+ # A specific job to log a file deletion to a user's activity stream
2
+ #
3
+ # @attr_reader deleted_file_id The id of the file that has been deleted by the user
1
4
  class ContentDeleteEventJob < EventJob
2
- def run
3
- action = "User #{link_to_profile depositor_id} has deleted file '#{generic_file_id}'"
4
- timestamp = Time.now.to_i
5
- depositor = User.find_by_user_key(depositor_id)
6
- # Create the event
7
- event = depositor.create_event(action, timestamp)
8
- # Log the event to the depositor's profile stream
5
+ attr_reader :deleted_file_id
6
+
7
+ def initialize(deleted_file_id, depositor_id)
8
+ super(depositor_id)
9
+ @deleted_file_id = deleted_file_id
10
+ end
11
+
12
+ def action
13
+ @action ||= "User #{link_to_profile depositor_id} has deleted file '#{deleted_file_id}'"
14
+ end
15
+
16
+ # override to log the event to the users profile stream instead of the user's stream
17
+ def log_user_event
9
18
  depositor.log_profile_event(event)
10
- # Fan out the event to all followers
11
- depositor.followers.each do |follower|
12
- follower.log_event(event)
13
- end
14
19
  end
15
20
  end
@@ -1,18 +1,6 @@
1
- class ContentDepositEventJob < EventJob
2
- def run
3
- gf = GenericFile.find(generic_file_id)
4
- action = "User #{link_to_profile depositor_id} has deposited #{link_to gf.title.first, Sufia::Engine.routes.url_helpers.generic_file_path(gf)}"
5
- timestamp = Time.now.to_i
6
- depositor = User.find_by_user_key(depositor_id)
7
- # Create the event
8
- event = depositor.create_event(action, timestamp)
9
- # Log the event to the depositor's profile stream
10
- depositor.log_profile_event(event)
11
- # Log the event to the GF's stream
12
- gf.log_event(event)
13
- # Fan out the event to all followers who have access
14
- depositor.followers.select { |user| user.can? :read, gf }.each do |follower|
15
- follower.log_event(event)
16
- end
1
+ # A specific job to log a file deposit to a user's activity stream
2
+ class ContentDepositEventJob < ContentEventJob
3
+ def action
4
+ "User #{link_to_profile depositor_id} has deposited #{link_to generic_file.title.first, Sufia::Engine.routes.url_helpers.generic_file_path(generic_file)}"
17
5
  end
18
6
  end
@@ -1,4 +1,11 @@
1
- class ContentDepositorChangeEventJob < EventJob
1
+ # A specific job to log a file deposit change to a user's activity stream
2
+ #
3
+ # This is a bit wierd becuase the job performs the depositor transfer along with logging the job
4
+ #
5
+ # @attr [String] id identifier of the file to be transfered
6
+ # @attr [String] login the user key of the user the file is being transfered to.
7
+ # @attr [Boolean] reset (false) should the access controls be reset. This means revoking edit access from the depositor
8
+ class ContentDepositorChangeEventJob < ContentEventJob
2
9
  def queue_name
3
10
  :proxy_deposit
4
11
  end
@@ -9,34 +16,39 @@ class ContentDepositorChangeEventJob < EventJob
9
16
  # @param [String] login the user key of the user the file is being transfered to.
10
17
  # @param [Boolean] reset (false) should the access controls be reset. This means revoking edit access from the depositor
11
18
  def initialize(id, login, reset = false)
19
+ super(id, login)
12
20
  self.id = id
13
21
  self.login = login
14
22
  self.reset = reset
15
23
  end
16
24
 
17
25
  def run
18
- # TODO: This should be in its own job, not this event job
19
- file = ::GenericFile.find(id)
20
- file.proxy_depositor = file.depositor
21
- file.clear_permissions! if reset
22
- file.apply_depositor_metadata(login)
23
- file.save!
26
+ super
24
27
 
25
- action = "User #{link_to_profile file.proxy_depositor} has transferred #{link_to file.title.first, Sufia::Engine.routes.url_helpers.generic_file_path(file)} to user #{link_to_profile login}"
26
- timestamp = Time.now.to_i
27
- depositor = ::User.find_by_user_key(file.depositor)
28
- proxy_depositor = ::User.find_by_user_key(file.proxy_depositor)
29
- # Create the event
30
- event = proxy_depositor.create_event(action, timestamp)
31
- # Log the event to the GF's stream
32
- file.log_event(event)
33
28
  # log the event to the proxy depositor's profile
29
+ proxy_depositor = ::User.find_by_user_key(generic_file.proxy_depositor)
34
30
  proxy_depositor.log_profile_event(event)
35
- # log the event to the depositor's dashboard
36
- depositor.log_event(event)
37
- # Fan out the event to the depositor's followers who have access
38
- depositor.followers.select { |user| user.can? :read, file }.each do |follower|
39
- follower.log_event(event)
31
+ end
32
+
33
+ def action
34
+ "User #{link_to_profile generic_file.proxy_depositor} has transferred #{link_to generic_file.title.first, Sufia::Engine.routes.url_helpers.generic_file_path(generic_file)} to user #{link_to_profile login}"
35
+ end
36
+
37
+ # overriding default to load from fedora and change the depositor
38
+ def generic_file
39
+ # TODO: This should be in its own job, not this event job
40
+ @generic_file ||= begin
41
+ file = ::GenericFile.find(id)
42
+ file.proxy_depositor = file.depositor
43
+ file.clear_permissions! if reset
44
+ file.apply_depositor_metadata(login)
45
+ file.save!
46
+ file
40
47
  end
41
48
  end
49
+
50
+ # overriding default to log the event to the depositor instead of their profile
51
+ def log_user_event
52
+ depositor.log_event(event)
53
+ end
42
54
  end
@@ -0,0 +1,39 @@
1
+ # A generic job for sending events about a generic files to a user and their followers.
2
+ #
3
+ # @attr [String] generic_file_id the id of the file the event is specified for
4
+ #
5
+ class ContentEventJob < EventJob
6
+ attr_accessor :generic_file_id
7
+
8
+ def initialize(generic_file_id, depositor_id)
9
+ super(depositor_id)
10
+ @generic_file_id = generic_file_id
11
+ end
12
+
13
+ def run
14
+ super
15
+
16
+ log_generic_file_event
17
+ end
18
+
19
+ def generic_file
20
+ @generic_file ||= GenericFile.load_instance_from_solr(generic_file_id)
21
+ end
22
+
23
+ # Log the event to the GF's stream
24
+ def log_generic_file_event
25
+ generic_file.log_event(event) unless generic_file.nil?
26
+ end
27
+
28
+ # override to check file permissions before logging to followers
29
+ def log_to_followers
30
+ depositor.followers.select { |user| user.can?(:read, generic_file) }.each do |follower|
31
+ follower.log_event(event)
32
+ end
33
+ end
34
+
35
+ # log the event to the users profile stream
36
+ def log_user_event
37
+ depositor.log_profile_event(event)
38
+ end
39
+ end