sufia 0.1.0 → 1.0.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 (129) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.travis.yml +6 -0
  4. data/Gemfile +5 -2
  5. data/History.md +6 -0
  6. data/README.md +40 -0
  7. data/Rakefile +4 -0
  8. data/app/assets/javascripts/sufia.js +3 -115
  9. data/app/assets/javascripts/sufia/batch_select_all.js +179 -0
  10. data/app/assets/javascripts/sufia/edit_metadata.js +86 -0
  11. data/app/assets/javascripts/sufia/multiForm.js +57 -0
  12. data/app/assets/javascripts/terms_of_service.js +7 -0
  13. data/app/assets/stylesheets/audio-js.css +3 -0
  14. data/app/assets/stylesheets/dashboard.css.scss +51 -0
  15. data/app/assets/stylesheets/generic_files.css +36 -0
  16. data/app/assets/stylesheets/sufia.css.scss +2 -0
  17. data/app/controllers/batch_controller.rb +11 -0
  18. data/app/controllers/batch_edits_controller.rb +1 -77
  19. data/app/controllers/generic_files_controller.rb +1 -0
  20. data/app/controllers/mailbox_controller.rb +1 -1
  21. data/app/controllers/single_use_link_controller.rb +11 -7
  22. data/app/helpers/generic_file_helper.rb +11 -3
  23. data/app/helpers/sufia_helper.rb +13 -10
  24. data/app/models/batch.rb +1 -1
  25. data/app/models/datastreams/fits_datastream.rb +2 -2
  26. data/app/models/datastreams/generic_file_rdf_datastream.rb +22 -18
  27. data/app/models/datastreams/properties_datastream.rb +2 -2
  28. data/app/views/_user_util_links.html.erb +2 -2
  29. data/app/views/batch/_metadata.html.erb +82 -0
  30. data/app/views/batch/_more_metadata.html.erb +6 -0
  31. data/app/views/batch/edit.html.erb +1 -8
  32. data/app/views/batch_edits/_check_all.html.erb +0 -157
  33. data/app/views/batch_edits/edit.html.erb +0 -29
  34. data/app/views/catalog/_index_partials/_list_files.html.erb +8 -10
  35. data/app/views/catalog/_recent_document.html.erb +9 -18
  36. data/app/views/catalog/_results_pagination.html.erb +1 -1
  37. data/app/views/contact_form/new.html.erb +1 -1
  38. data/app/views/dashboard/_index_partials/_default_group.html.erb +1 -1
  39. data/app/views/dashboard/_index_partials/_list_files.html.erb +12 -14
  40. data/app/views/dashboard/_index_partials/_thumbnail_display.html.erb +9 -19
  41. data/app/views/dashboard/_results_pagination.html.erb +1 -1
  42. data/app/views/dashboard/index.html.erb +6 -82
  43. data/app/views/error/single_use_error.html.erb +35 -0
  44. data/app/views/generic_files/_descriptions.html.erb +2 -2
  45. data/app/views/generic_files/_extra_fields_modal.html.erb +1 -1
  46. data/app/views/generic_files/_field_form.html.erb +2 -5
  47. data/app/views/generic_files/_media_display.html.erb +8 -6
  48. data/app/views/generic_files/_permission.html.erb +2 -2
  49. data/app/views/generic_files/_rights_modal.html.erb +1 -1
  50. data/app/views/generic_files/_show_actions.html.erb +1 -1
  51. data/app/views/generic_files/_show_details.html.erb +11 -6
  52. data/app/views/generic_files/edit.html.erb +0 -8
  53. data/app/views/generic_files/edit_fields/_type.html.erb +1 -1
  54. data/app/views/generic_files/show.html.erb +5 -8
  55. data/app/views/generic_files/show_fields/_based_near.html.erb +4 -1
  56. data/app/views/generic_files/show_fields/_contributor.html.erb +4 -1
  57. data/app/views/generic_files/show_fields/_creator.html.erb +4 -1
  58. data/app/views/generic_files/show_fields/_date_created.html.erb +4 -1
  59. data/app/views/generic_files/show_fields/_description.html.erb +4 -1
  60. data/app/views/generic_files/show_fields/_language.html.erb +1 -1
  61. data/app/views/generic_files/show_fields/_publisher.html.erb +4 -1
  62. data/app/views/generic_files/show_fields/_related_url.html.erb +3 -1
  63. data/app/views/generic_files/show_fields/_resource_type.html.erb +1 -1
  64. data/app/views/generic_files/show_fields/_subject.html.erb +4 -1
  65. data/app/views/generic_files/show_fields/_tag.html.erb +1 -1
  66. data/app/views/generic_files/show_fields/_title.html.erb +4 -1
  67. data/app/views/layouts/error.html.erb +0 -4
  68. data/app/views/layouts/hydra-head.html.erb +2 -6
  69. data/app/views/single_use_link/show.html.erb +1 -1
  70. data/app/views/users/index.html.erb +1 -1
  71. data/app/views/users/show.html.erb +1 -1
  72. data/config/locales/sufia.en.yml +1 -0
  73. data/config/routes.rb +11 -4
  74. data/lib/generators/sufia/sufia_generator.rb +2 -1
  75. data/lib/generators/sufia/templates/catalog_controller.rb +143 -117
  76. data/lib/generators/sufia/templates/config/resque_admin.rb +10 -0
  77. data/lib/generators/sufia/templates/config/sufia.rb +8 -0
  78. data/lib/sufia.rb +4 -14
  79. data/lib/sufia/batch_edits_controller_behavior.rb +89 -0
  80. data/lib/sufia/controller.rb +7 -5
  81. data/lib/sufia/downloads_controller_behavior.rb +14 -19
  82. data/lib/sufia/file_content/extract_metadata.rb +11 -4
  83. data/lib/sufia/files_controller_behavior.rb +63 -44
  84. data/lib/sufia/generic_file.rb +29 -11
  85. data/lib/sufia/generic_file/audit.rb +1 -1
  86. data/lib/sufia/generic_file/thumbnail.rb +51 -26
  87. data/lib/sufia/id_service.rb +28 -11
  88. data/lib/sufia/jobs/batch_update_job.rb +2 -2
  89. data/lib/sufia/jobs/characterize_job.rb +11 -3
  90. data/lib/sufia/jobs/ffmpeg_transcode_job.rb +61 -0
  91. data/lib/sufia/jobs/resolrize_job.rb +1 -1
  92. data/lib/sufia/jobs/transcode_audio_job.rb +40 -0
  93. data/lib/sufia/jobs/transcode_video_job.rb +9 -49
  94. data/lib/sufia/queue/resque.rb +2 -2
  95. data/lib/sufia/single_use_error.rb +4 -0
  96. data/lib/sufia/solr_document_behavior.rb +108 -1
  97. data/lib/sufia/version.rb +1 -1
  98. data/solr_conf/conf/schema.xml +332 -652
  99. data/solr_conf/conf/solrconfig.xml +60 -196
  100. data/spec/controllers/batch_controller_spec.rb +4 -5
  101. data/spec/controllers/catalog_controller_spec.rb +13 -13
  102. data/spec/controllers/dashboard_controller_spec.rb +2 -2
  103. data/spec/controllers/downloads_controller_spec.rb +74 -62
  104. data/spec/controllers/generic_files_controller_spec.rb +10 -8
  105. data/spec/controllers/single_use_link_controller_spec.rb +12 -4
  106. data/spec/fixtures/Example.ogg +0 -0
  107. data/spec/fixtures/piano_note.wav +0 -0
  108. data/spec/fixtures/sufia_generic_stub.descMeta.txt +1 -1
  109. data/spec/helpers/sufia_helper_spec.rb +12 -0
  110. data/spec/models/characterize_job_spec.rb +89 -0
  111. data/spec/models/checksum_audit_log_spec.rb +1 -0
  112. data/spec/models/event_jobs_spec.rb +9 -9
  113. data/spec/models/file_content_datastream_spec.rb +16 -10
  114. data/spec/models/fits_datastream_spec.rb +2 -8
  115. data/spec/models/generic_file_spec.rb +131 -60
  116. data/spec/models/solr_document_spec.rb +21 -0
  117. data/spec/models/transcode_audio_job_spec.rb +81 -0
  118. data/spec/models/transcode_video_job_spec.rb +2 -2
  119. data/spec/models/unzip_job_spec.rb +3 -3
  120. data/spec/spec_helper.rb +21 -0
  121. data/spec/support/Gemfile +7 -3
  122. data/sufia.gemspec +8 -11
  123. data/tasks/cucumber.rake +1 -2
  124. data/tasks/sufia-dev.rake +13 -2
  125. data/tasks/sufia.rake +1 -1
  126. metadata +77 -118
  127. data/app/views/batch_edits/_metadata.html.erb +0 -180
  128. data/lib/generators/sufia/templates/config/hydra_config.rb +0 -32
  129. data/lib/kaminari/helpers/tag.rb +0 -11
@@ -0,0 +1,10 @@
1
+ module Sufia
2
+ class ResqueAdmin
3
+ def self.matches?(request)
4
+ current_user = request.env['warden'].user
5
+ return false if current_user.blank?
6
+ # TODO code a group here that makes sense
7
+ #current_user.groups.include? 'umg/up.dlt.scholarsphere-admin'
8
+ end
9
+ end
10
+ end
@@ -61,6 +61,14 @@ Sufia.config do |config|
61
61
  # Map hostnames onto Google Analytics tracking IDs
62
62
  #config.google_analytics_id = 'UA-99999999-1'
63
63
 
64
+
65
+ # Where to store tempfiles, leave blank for the system temp directory (e.g. /tmp)
66
+ #config.temp_file_base = '/home/developer1'
67
+
68
+ # If you have ffmpeg installed and want to transcode audio and video uncomment this line
69
+ #config.enable_ffmpeg = true
70
+
64
71
  end
65
72
 
73
+ Date::DATE_FORMATS[:standard] = "%m/%d/%Y"
66
74
 
@@ -24,10 +24,12 @@ module Sufia
24
24
  class Engine < ::Rails::Engine
25
25
  engine_name 'sufia'
26
26
 
27
+ # Set some configuration defaults
27
28
  config.queue = Sufia::Resque::Queue
29
+ config.enable_ffmpeg = false
28
30
  config.ffmpeg_path = 'ffmpeg'
29
31
  config.fits_message_length = 5
30
-
32
+ config.temp_file_base = nil
31
33
 
32
34
  config.autoload_paths << File.expand_path("../sufia/jobs", __FILE__)
33
35
 
@@ -35,25 +37,12 @@ module Sufia
35
37
  require 'sufia/active_fedora/redis'
36
38
  end
37
39
 
38
- initializer "Patch kaminari" do
39
- require "kaminari/helpers/tag"
40
- end
41
-
42
40
  initializer "Patch active_record" do
43
41
  require 'sufia/active_record/redis'
44
42
  end
45
43
 
46
44
  end
47
45
 
48
- class ResqueAdmin
49
- def self.matches?(request)
50
- current_user = request.env['warden'].user
51
- return false if current_user.blank?
52
- # TODO code a group here that makes sense
53
- #current_user.groups.include? 'umg/up.dlt.scholarsphere-admin'
54
- end
55
- end
56
-
57
46
  def self.config(&block)
58
47
  @@config ||= Sufia::Engine::Configuration.new
59
48
 
@@ -76,6 +65,7 @@ module Sufia
76
65
  autoload :HttpHeaderAuth
77
66
  autoload :SolrDocumentBehavior
78
67
  autoload :FilesControllerBehavior
68
+ autoload :BatchEditsControllerBehavior
79
69
  autoload :DownloadsControllerBehavior
80
70
  autoload :FileContent
81
71
  end
@@ -0,0 +1,89 @@
1
+ module Sufia
2
+ module BatchEditsControllerBehavior
3
+ extend ActiveSupport::Concern
4
+
5
+ def edit
6
+ super
7
+ @generic_file = ::GenericFile.new
8
+ @generic_file.depositor = current_user.user_key
9
+ @terms = @generic_file.terms_for_editing - [:title, :format, :resource_type]
10
+
11
+ # do we want to show the original values for anything...
12
+ @show_file = ::GenericFile.new
13
+ @show_file.depositor = current_user.user_key
14
+ h = {}
15
+ @names = []
16
+ permissions = []
17
+
18
+ # For each of the files in the batch, set the attributes to be the concatination of all the attributes
19
+ batch.each do |doc_id|
20
+ gf = ::GenericFile.find(doc_id)
21
+ gf.terms_for_editing.each do |key|
22
+ h[key] ||= []
23
+ h[key] = (h[key] + gf.send(key)).uniq
24
+ end
25
+ @names << display_title(gf)
26
+ permissions = (permissions+gf.permissions).uniq
27
+ end
28
+
29
+ initialize_fields(h, @show_file)
30
+
31
+ # map the permissions to parameter like input so that the assign will work
32
+ # todo sort the access level some how...
33
+ perm_param ={'user'=>{},'group'=>{"public"=>"1"}}
34
+ permissions.each{ |perm| perm_param[perm[:type]][perm[:name]] = perm[:access]}
35
+ @show_file.permissions = HashWithIndifferentAccess.new(perm_param)
36
+ end
37
+
38
+ def after_update
39
+ redirect_to sufia.dashboard_index_path unless request.xhr?
40
+ end
41
+
42
+ def update_document(obj)
43
+ super
44
+ obj.date_modified = Time.now.ctime
45
+ obj.set_visibility(params[:visibility])
46
+ end
47
+
48
+ def update
49
+ # keep the batch around if we are doing ajax calls
50
+ batch_sav = batch.dup if request.xhr?
51
+ catalog_index_path = sufia.dashboard_index_path
52
+ type = params["update_type"]
53
+ if (type == "update")
54
+ #params["generic_file"].reject! {|k,v| (v.blank? || (v.respond_to?(:length) && v.length==1 && v.first.blank?))}
55
+ super
56
+ elsif (type == "delete_all")
57
+ batch.each do |doc_id|
58
+ gf = ::GenericFile.find(doc_id)
59
+ gf.delete
60
+ end
61
+ clear_batch!
62
+ after_update
63
+ end
64
+
65
+ # reset the batch around if we are doing ajax calls
66
+ if request.xhr?
67
+ self.batch = batch_sav.dup
68
+ @key = params["key"]
69
+ if (@key != "permissions")
70
+ @vals = params["generic_file"][@key]
71
+ else
72
+ @vals = [""]
73
+ end
74
+ render :update_edit
75
+ end
76
+ end
77
+
78
+ protected
79
+
80
+ # override this method if you need to initialize more complex RDF assertions (b-nodes)
81
+ def initialize_fields(attributes, file)
82
+ file.terms_for_editing.each do |key|
83
+ # if value is empty, we create an one element array to loop over for output
84
+ file[key] = attributes[key].empty? ? [''] : attributes[key]
85
+ end
86
+ end
87
+
88
+ end
89
+ end
@@ -25,11 +25,11 @@ module Sufia::Controller
25
25
  end
26
26
 
27
27
  def current_ability
28
- current_user ? current_user.ability : super
28
+ user_signed_in? ? current_user.ability : super
29
29
  end
30
30
 
31
31
  def groups
32
- @groups ||= current_user ? current_user.groups : []
32
+ @groups ||= user_signed_in? ? current_user.groups : []
33
33
  end
34
34
 
35
35
  def render_404(exception)
@@ -42,12 +42,16 @@ module Sufia::Controller
42
42
  render :template => '/error/500', :layout => "error", :formats => [:html], :status => 500
43
43
  end
44
44
 
45
+ def render_single_use_error(exception)
46
+ logger.error("Rendering PAGE due to exception: #{exception.inspect} - #{exception.backtrace if exception.respond_to? :backtrace}")
47
+ render :template => '/error/single_use_error', :layout => "error", :formats => [:html], :status => 404
48
+ end
45
49
 
46
50
  def notifications_number
47
51
  @notify_number=0
48
52
  @batches=[]
49
53
  return if action_name == "index" && controller_name == "mailbox"
50
- if current_user
54
+ if user_signed_in?
51
55
  @notify_number= current_user.mailbox.inbox(:unread => true).count(:id, :distinct => true)
52
56
  @batches=current_user.mailbox.inbox.map {|msg| msg.last_message.body[/<a class="batchid ui-helper-hidden">(.*)<\/a>The file(.*)/,1]}.select{|val| !val.blank?}
53
57
  end
@@ -60,6 +64,4 @@ module Sufia::Controller
60
64
  true
61
65
  end
62
66
 
63
- # include Sufia::HttpHeaderAuth
64
-
65
67
  end
@@ -36,36 +36,31 @@ module Sufia
36
36
  end
37
37
 
38
38
  protected
39
-
40
- def send_content (asset)
41
- opts = {}
42
- ds = nil
43
- opts[:filename] = params["filename"] || asset.label
44
- opts[:disposition] = 'inline'
45
- if params.has_key?(:datastream_id)
39
+
40
+ def datastream_name
41
+ @datastream_name ||= params[:datastream_id] || DownloadsController.default_content_dsid
42
+ end
43
+
44
+ def send_content(asset)
45
+ opts = {disposition: 'inline'}
46
+ if default_datastream?
47
+ opts[:filename] = params["filename"] || asset.label
48
+ else
46
49
  opts[:filename] = params[:datastream_id]
47
- ds = asset.datastreams[params[:datastream_id]]
48
50
  end
49
- ds = default_content_ds(asset) if ds.nil?
51
+ ds = asset.datastreams[datastream_name]
50
52
  raise ActionController::RoutingError.new('Not Found') if ds.nil?
51
53
  data = ds.content
52
54
  opts[:type] = ds.mimeType
53
55
  send_data data, opts
54
- return
55
56
  end
56
57
 
58
+ def default_datastream?
59
+ datastream_name == self.class.default_content_dsid
60
+ end
57
61
 
58
62
  private
59
63
 
60
- def default_content_ds(asset)
61
- ActiveFedora::ContentModel.known_models_for(asset).each do |model_class|
62
- return model_class.default_content_ds if model_class.respond_to?(:default_content_ds)
63
- end
64
- if asset.datastreams.keys.include?(DownloadsController.default_content_dsid)
65
- return asset.datastreams[DownloadsController.default_content_dsid]
66
- end
67
- end
68
-
69
64
  module ClassMethods
70
65
  def default_content_dsid
71
66
  "content"
@@ -13,7 +13,8 @@ module Sufia
13
13
  end
14
14
 
15
15
  def to_tempfile &block
16
- return if content.nil?
16
+ return unless has_content?
17
+ tmp_base = Sufia::Engine.config.temp_file_base
17
18
  f = Tempfile.new("#{pid}-#{dsVersionID}")
18
19
  f.binmode
19
20
  if content.respond_to? :read
@@ -25,21 +26,27 @@ module Sufia
25
26
  content.rewind if content.respond_to? :rewind
26
27
  yield(f)
27
28
  f.unlink
29
+ end
28
30
 
31
+ # Return true if the content is present
32
+ # You can override this method if your content is an external datastream
33
+ def has_content?
34
+ !content.nil?
29
35
  end
30
36
 
31
37
  private
32
38
 
33
39
 
34
40
  def run_fits!(file_path)
35
- command = "#{fits_path} -i #{file_path}"
36
- stdin, stdout, stderr = popen3(command)
41
+ command = "#{fits_path} -i \"#{file_path}\""
42
+ stdin, stdout, stderr, wait_thr = popen3(command)
37
43
  stdin.close
38
44
  out = stdout.read
39
45
  stdout.close
40
46
  err = stderr.read
41
47
  stderr.close
42
- raise "Unable to execute command \"#{command}\"\n#{err}" unless err.empty? or err.include? "Error parsing Exiftool XML Output"
48
+ exit_status = wait_thr.value
49
+ raise "Unable to execute command \"#{command}\"\n#{err}" unless exit_status.success?
43
50
  out
44
51
  end
45
52
 
@@ -53,7 +53,7 @@ module Sufia
53
53
 
54
54
  # routed to /files/:id/edit
55
55
  def edit
56
- @terms = @generic_file.terms_for_editing
56
+ initialize_fields(@generic_file)
57
57
  @groups = current_user.groups
58
58
  end
59
59
 
@@ -74,55 +74,26 @@ module Sufia
74
74
  # routed to /files (POST)
75
75
  def create
76
76
  begin
77
- retval = " "
78
77
  # check error condition No files
79
- return render(:json => [{:error => "Error! No file to save"}].to_json) if !params.has_key?(:files)
78
+ return json_error("Error! No file to save") if !params.has_key?(:files)
80
79
 
81
80
  file = params[:files].detect {|f| f.respond_to?(:original_filename) }
82
81
  if !file
83
- render :json => [{:name => 'unknown file', :error => "Error! No file for upload"}], :status => :unprocessable_entity
84
- return false
85
- end
86
-
87
- # check error condition empty file
88
- if ((file.respond_to?(:tempfile)) && (file.tempfile.size == 0))
89
- retval = render :json => [{ :name => file.original_filename, :error => "Error! Zero Length File!"}].to_json
90
- elsif ((file.respond_to?(:size)) && (file.size == 0))
91
- retval = render :json => [{ :name => file.original_filename, :error => "Error! Zero Length File!"}].to_json
92
- elsif (params[:terms_of_service] != '1')
93
- retval = render :json => [{ :name => file.original_filename, :error => "You must accept the terms of service!"}].to_json
94
-
95
- # process file
82
+ json_error "Error! No file for upload", 'unknown file', :status => :unprocessable_entity
83
+ elsif (empty_file?(file))
84
+ json_error "Error! Zero Length File!", file.original_filename
85
+ elsif (!terms_accepted?)
86
+ json_error "You must accept the terms of service!", file.original_filename
96
87
  else
97
- if virus_check(file) == 0
98
- @generic_file = ::GenericFile.new
99
- # Relative path is set by the jquery uploader when uploading a directory
100
- @generic_file.relative_path = params[:relative_path] if params[:relative_path]
101
- Sufia::GenericFile::Actions.create_metadata(@generic_file, current_user, params[:batch_id])
102
- Sufia::GenericFile::Actions.create_content(@generic_file, file, file.original_filename, datastream_id, current_user)
103
- respond_to do |format|
104
- format.html {
105
- retval = render :json => [@generic_file.to_jq_upload].to_json,
106
- :content_type => 'text/html',
107
- :layout => false
108
- }
109
- format.json {
110
- retval = render :json => [@generic_file.to_jq_upload].to_json
111
- }
112
- end
113
- else
114
- retval = render :json => [{:error => "Error creating generic file."}].to_json
115
- end
88
+ process_file(file)
116
89
  end
117
90
  rescue => error
118
91
  logger.error "GenericFilesController::create rescued #{error.class}\n\t#{error.to_s}\n #{error.backtrace.join("\n")}\n\n"
119
- retval = render :json => [{:error => "Error occurred while creating generic file."}].to_json
92
+ json_error "Error occurred while creating generic file."
120
93
  ensure
121
94
  # remove the tempfile (only if it is a temp file)
122
95
  file.tempfile.delete if file.respond_to?(:tempfile)
123
96
  end
124
-
125
- return retval
126
97
  end
127
98
 
128
99
  # routed to /files/:id/citation
@@ -131,11 +102,10 @@ module Sufia
131
102
 
132
103
  # routed to /files/:id
133
104
  def show
134
- @can_edit = can? :edit, @generic_file
135
- @events = @generic_file.events(100)
136
-
137
105
  respond_to do |format|
138
- format.html
106
+ format.html {
107
+ @events = @generic_file.events(100)
108
+ }
139
109
  format.endnote { render :text => @generic_file.export_as_endnote }
140
110
  end
141
111
  end
@@ -164,7 +134,12 @@ module Sufia
164
134
  Sufia.queue.push(ContentNewVersionEventJob.new(@generic_file.pid, current_user.user_key))
165
135
  end
166
136
 
167
- update_metadata
137
+ # only update metadata if there is a generic_file object which is not the case for version updates
138
+ update_metadata if params[:generic_file]
139
+
140
+ #always save the file so the new version or metadata gets recorded
141
+ @generic_file.save!
142
+
168
143
 
169
144
  # do not trigger an update event if a version event has already been triggered
170
145
  Sufia.queue.push(ContentUpdateEventJob.new(@generic_file.pid, current_user.user_key)) unless version_event
@@ -175,6 +150,51 @@ module Sufia
175
150
 
176
151
  protected
177
152
 
153
+ def json_error(error, name=nil, additional_arguments={})
154
+ args = {:error => error}
155
+ args[:name] = name if name
156
+ render additional_arguments.merge({:json => [args]})
157
+ end
158
+
159
+ def empty_file?(file)
160
+ (file.respond_to?(:tempfile) && file.tempfile.size == 0) || (file.respond_to?(:size) && file.size == 0)
161
+ end
162
+
163
+ def process_file(file)
164
+ if virus_check(file) == 0
165
+ @generic_file = ::GenericFile.new
166
+ # Relative path is set by the jquery uploader when uploading a directory
167
+ @generic_file.relative_path = params[:relative_path] if params[:relative_path]
168
+ Sufia::GenericFile::Actions.create_metadata(@generic_file, current_user, params[:batch_id])
169
+ Sufia::GenericFile::Actions.create_content(@generic_file, file, file.original_filename, datastream_id, current_user)
170
+ respond_to do |format|
171
+ format.html {
172
+ render :json => [@generic_file.to_jq_upload],
173
+ :content_type => 'text/html',
174
+ :layout => false
175
+ }
176
+ format.json {
177
+ render :json => [@generic_file.to_jq_upload]
178
+ }
179
+ end
180
+ else
181
+ render :json => [{:error => "Error creating generic file."}]
182
+ end
183
+ end
184
+
185
+ # override this method if you want to change how the terms are accepted on upload.
186
+ def terms_accepted?
187
+ params[:terms_of_service] == '1'
188
+ end
189
+
190
+ # override this method if you need to initialize more complex RDF assertions (b-nodes)
191
+ def initialize_fields(file)
192
+ file.terms_for_editing.each do |key|
193
+ # if value is empty, we create an one element array to loop over for output
194
+ file[key] = [''] if file[key].empty?
195
+ end
196
+ end
197
+
178
198
  # The name of the datastream where we store the file data
179
199
  def datastream_id
180
200
  'content'
@@ -186,7 +206,6 @@ module Sufia
186
206
  @generic_file.attributes = valid_attributes
187
207
  @generic_file.set_visibility(params[:visibility])
188
208
  @generic_file.date_modified = DateTime.now
189
- @generic_file.save!
190
209
  end
191
210
 
192
211