sufia 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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