sufia 3.4.0 → 3.5.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.
- checksums.yaml +4 -4
- data/.travis.yml +6 -1
- data/Gemfile +7 -8
- data/README.md +13 -0
- data/SUFIA_VERSION +1 -1
- data/app/controllers/mailbox_controller.rb +8 -8
- data/app/jobs/ingest_local_file_job.rb +17 -13
- data/app/views/catalog/_home_text.html.erb +0 -3
- data/app/views/dashboard/_index_partials/_thumbnail_display.html.erb +5 -29
- data/app/views/mailbox/index.html.erb +9 -21
- data/app/views/users/_notify_link.html.erb +2 -17
- data/config/routes.rb +5 -3
- data/lib/sufia/files_controller_behavior.rb +45 -50
- data/lib/sufia/version.rb +1 -1
- data/lib/sufia/virus_found_error.rb +4 -0
- data/spec/controllers/generic_files_controller_spec.rb +14 -79
- data/spec/controllers/mailbox_controller_spec.rb +9 -13
- data/spec/features/users_spec.rb +0 -3
- data/spec/fixtures/sample_mpeg4.mp4 +0 -0
- data/spec/jobs/import_url_job_spec.rb +8 -8
- data/spec/jobs/ingest_local_file_job_spec.rb +13 -10
- data/spec/models/fits_datastream_spec.rb +72 -21
- data/spec/models/generic_file/actions_spec.rb +2 -17
- data/spec/models/generic_file/web_form_spec.rb +4 -3
- data/spec/models/generic_file_spec.rb +27 -0
- data/spec/routing/route_spec.rb +15 -20
- data/spec/spec_helper.rb +15 -2
- data/sufia-models/app/models/datastreams/fits_datastream.rb +10 -1
- data/sufia-models/lib/generators/sufia/models/install_generator.rb +1 -1
- data/sufia-models/lib/sufia/models/generic_file.rb +3 -0
- data/sufia-models/lib/sufia/models/generic_file/actions.rb +8 -11
- data/sufia-models/lib/sufia/models/generic_file/characterization.rb +19 -4
- data/sufia-models/lib/sufia/models/generic_file/virus_check.rb +33 -0
- data/sufia-models/lib/sufia/models/generic_file/web_form.rb +2 -3
- data/sufia-models/lib/sufia/models/jobs/import_url_job.rb +29 -31
- data/sufia-models/lib/sufia/models/version.rb +1 -1
- data/sufia.gemspec +1 -1
- data/tasks/sufia-dev.rake +2 -1
- metadata +10 -10
- data/app/assets/images/rails.png +0 -0
- data/app/assets/images/site_images/temp/guitar.jpg +0 -0
- data/app/assets/images/splashscreen.png +0 -0
- data/app/assets/images/video-still.png +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77cd255a8ab67cb2bcbd0bbfe17a9920d853251b
|
4
|
+
data.tar.gz: 528e7ca2aeb61cf7bcf5b10e370fcbfd8a51a1fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: acc4acc8293673da4aba37329ab6321be93241c9dfd2fd712a4bf5a3cf7218bfe25d5d6d8a99b1a45eb91934903dc31caacce9d7aa8311ebdfa9965075c5df4e
|
7
|
+
data.tar.gz: 656b6f49ed4a1a4a603cae1b40a3c9320ac42a3aa4e806ba228439442ba87168fa8e0ed2b60e7957014b9297d1221ca9e97ad77605379402f2ffa472af2f816b
|
data/.travis.yml
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
language: ruby
|
2
|
+
before_install:
|
3
|
+
- sudo apt-get install libclamav-dev clamav-data
|
2
4
|
rvm:
|
3
5
|
- "1.9.3"
|
4
6
|
- "2.0.0"
|
7
|
+
env:
|
8
|
+
global:
|
9
|
+
- NOKOGIRI_USE_SYSTEM_LIBRARIES=true
|
5
10
|
notifications:
|
6
11
|
email:
|
7
12
|
recipients:
|
@@ -16,4 +21,4 @@ notifications:
|
|
16
21
|
template:
|
17
22
|
- "%{repository}//%{branch}@%{commit} by %{author}: %{message} - %{build_url}"
|
18
23
|
services:
|
19
|
-
- redis-server
|
24
|
+
- redis-server
|
data/Gemfile
CHANGED
@@ -8,18 +8,17 @@ gem 'kaminari', github: 'harai/kaminari', branch: 'route_prefix_prototype'
|
|
8
8
|
gem 'sufia-models', path: './sufia-models'
|
9
9
|
|
10
10
|
group :development, :test do
|
11
|
+
gem 'devise'
|
12
|
+
# gem 'byebug'
|
13
|
+
gem 'clamav'
|
11
14
|
gem 'sqlite3'
|
12
|
-
gem '
|
13
|
-
gem '
|
14
|
-
gem '
|
15
|
-
gem 'database_cleaner'
|
16
|
-
gem 'capybara', '~>2.1.0'
|
17
|
-
gem 'bcrypt-ruby'
|
15
|
+
gem 'rspec-rails'
|
16
|
+
gem 'launchy' unless ENV['TRAVIS']
|
17
|
+
gem 'capybara'
|
18
18
|
gem "jettywrapper"
|
19
|
-
gem "factory_girl_rails"
|
19
|
+
gem "factory_girl_rails"
|
20
20
|
gem "devise"
|
21
21
|
gem 'jquery-rails'
|
22
|
-
gem 'sass-rails'
|
23
22
|
gem 'turbolinks'
|
24
23
|
gem "bootstrap-sass"
|
25
24
|
gem "simplecov", :require => false
|
data/README.md
CHANGED
@@ -146,3 +146,16 @@ rake fixtures
|
|
146
146
|
rake clean spec
|
147
147
|
bundle exec cucumber features
|
148
148
|
```
|
149
|
+
### Change validation behavior
|
150
|
+
|
151
|
+
To change what happens to files that fail validation add an after_validation hook
|
152
|
+
```
|
153
|
+
after_validation :dump_infected_files
|
154
|
+
|
155
|
+
def dump_infected_files
|
156
|
+
if Array(errors.get(:content)).any? { |msg| msg =~ /A virus was found/ }
|
157
|
+
content.content = errors.get(:content)
|
158
|
+
save
|
159
|
+
end
|
160
|
+
end
|
161
|
+
```
|
data/SUFIA_VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.5.0
|
@@ -4,7 +4,7 @@ class MailboxController < ApplicationController
|
|
4
4
|
def index
|
5
5
|
if user_signed_in?
|
6
6
|
@messages = current_user.mailbox.inbox
|
7
|
-
|
7
|
+
@messages.each{|m| m.mark_as_read(current_user)}
|
8
8
|
else
|
9
9
|
@messages =[]
|
10
10
|
end
|
@@ -15,20 +15,20 @@ class MailboxController < ApplicationController
|
|
15
15
|
delete_message(msg)
|
16
16
|
end
|
17
17
|
empty_trash(current_user)
|
18
|
-
redirect_to sufia.
|
18
|
+
redirect_to sufia.notifications_path
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
if
|
23
|
-
msg = Conversation.find(params[:
|
21
|
+
def destroy
|
22
|
+
if current_user
|
23
|
+
msg = Conversation.find(params[:id])
|
24
24
|
if (msg.participants[0] == current_user) || (msg.participants[1] == current_user)
|
25
25
|
delete_message(msg)
|
26
26
|
empty_trash(msg.participants[0])
|
27
27
|
end
|
28
|
-
|
28
|
+
else
|
29
29
|
flash[:alert] = "You do not have privileges to delete the notification..."
|
30
|
-
|
31
|
-
|
30
|
+
end
|
31
|
+
redirect_to sufia.notifications_path
|
32
32
|
end
|
33
33
|
|
34
34
|
private
|
@@ -1,34 +1,38 @@
|
|
1
1
|
class IngestLocalFileJob
|
2
|
+
attr_accessor :directory, :filename, :user_key, :generic_file_id
|
3
|
+
|
2
4
|
def queue_name
|
3
5
|
:ingest
|
4
6
|
end
|
5
7
|
|
6
|
-
attr_accessor :directory, :filename, :user_key, :generic_file_id
|
7
|
-
|
8
8
|
def initialize(generic_file_id, directory, filename, user_key)
|
9
9
|
self.generic_file_id = generic_file_id
|
10
10
|
self.directory = directory
|
11
|
-
self.filename = filename
|
11
|
+
self.filename = filename
|
12
12
|
self.user_key = user_key
|
13
13
|
end
|
14
14
|
|
15
15
|
def run
|
16
|
-
filedata = File.new( File.join(directory, filename) )
|
17
|
-
generic_file = GenericFile.find(generic_file_id)
|
18
16
|
user = User.find_by_user_key(user_key)
|
19
17
|
raise "Unable to find user for #{user_key}" unless user
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
raise "Virus checking did not pass for #{File.basename(filedata.path)} status = #{virus_stat}" unless virus_stat == 0
|
24
|
-
|
18
|
+
generic_file = GenericFile.find(generic_file_id)
|
19
|
+
path = File.join(directory, filename)
|
20
|
+
|
25
21
|
generic_file.label = File.basename(filename)
|
26
|
-
generic_file.add_file(File.open(
|
22
|
+
generic_file.add_file(File.open(path), 'content', generic_file.label)
|
27
23
|
generic_file.record_version_committer(user)
|
28
24
|
generic_file.save!
|
29
25
|
|
30
|
-
|
26
|
+
FileUtils.rm(path)
|
31
27
|
Sufia.queue.push(ContentDepositEventJob.new(generic_file.pid, user_key))
|
32
|
-
|
28
|
+
# add message to user for downloaded file
|
29
|
+
message = "The file (#{File.basename(filename)}) was successfully deposited."
|
30
|
+
job_user.send_message(user, message, 'Local file ingest')
|
31
|
+
rescue => error
|
32
|
+
job_user.send_message(user, error.message, 'Local file ingest error')
|
33
|
+
end
|
34
|
+
|
35
|
+
def job_user
|
36
|
+
User.batchuser
|
33
37
|
end
|
34
38
|
end
|
@@ -1,6 +1,3 @@
|
|
1
|
-
<!--<h1>Getting Started</h1>
|
2
|
-
<img src="/assets/splashscreen.png" width="450" height="259" alt="just a place holder" />
|
3
|
-
<br/><br/> -->
|
4
1
|
<h2 class="heading1">What is <%=t('sufia.product_name') %>?</h2>
|
5
2
|
<p>
|
6
3
|
<%=t('sufia.product_name') %> is a secure repository service enabling the <%=t('sufia.institution_name') %> community to share its research and scholarly work with a worldwide audience.
|
@@ -1,31 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
you may not use this file except in compliance with the License.
|
6
|
-
You may obtain a copy of the License at
|
7
|
-
|
8
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
|
10
|
-
Unless required by applicable law or agreed to in writing, software
|
11
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
See the License for the specific language governing permissions and
|
14
|
-
limitations under the License.
|
15
|
-
%>
|
16
|
-
|
17
|
-
<%- height = 42 if height.blank? -%>
|
18
|
-
<%- width = 36 if width.blank? -%>
|
19
|
-
<% if (document.mime_type) %>
|
20
|
-
<% if document.image? %>
|
21
|
-
<%= link_to image_tag(sufia.download_path(document["id"], {:datastream_id => 'thumbnail'}), {:width=>width}), sufia.generic_file_path(document.noid) %>
|
22
|
-
<% elsif document.pdf? %>
|
23
|
-
<%= link_to image_tag(sufia.download_path(document["id"], {:datastream_id => 'thumbnail'}), {:width=>width}),sufia.generic_file_path(document.noid) %>
|
24
|
-
<% elsif document.video? %>
|
25
|
-
<%= link_to image_tag(sufia.download_path(document["id"], {:datastream_id => 'thumbnail'}), {:width=>width}),sufia.generic_file_path(document.noid) %>
|
26
|
-
<% else %>
|
27
|
-
<%= link_to image_tag("/assets/default.png", {:width=>width}), sufia.generic_file_path(document) %>
|
28
|
-
<% end %>
|
1
|
+
<% width = 36 if width.blank? %>
|
2
|
+
<% if document.image? || document.pdf? || document.video? %>
|
3
|
+
<% path = sufia.download_path(document["id"], {datastream_id: 'thumbnail'}) %>
|
29
4
|
<% else %>
|
30
|
-
|
5
|
+
<% path = "/assets/default.png" %>
|
31
6
|
<% end %>
|
7
|
+
<%= link_to image_tag(path, {width: width}), sufia.generic_file_path(document) %>
|
@@ -1,21 +1,7 @@
|
|
1
|
-
<%#
|
2
|
-
Copyright © 2012 The Pennsylvania State University
|
3
|
-
|
4
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
you may not use this file except in compliance with the License.
|
6
|
-
You may obtain a copy of the License at
|
7
|
-
|
8
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
|
10
|
-
Unless required by applicable law or agreed to in writing, software
|
11
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
See the License for the specific language governing permissions and
|
14
|
-
limitations under the License.
|
15
|
-
%>
|
16
|
-
|
17
1
|
<h1>User Notifications</h1>
|
18
|
-
|
2
|
+
<%= link_to raw('<i class="icon-trash icon-large"> </i>Delete All'),
|
3
|
+
sufia.delete_all_notifications_path, method: :delete, class: 'btn',
|
4
|
+
title: 'Delete all user notifications' %>
|
19
5
|
<div id="Data">
|
20
6
|
<table class="table table-striped">
|
21
7
|
<thead>
|
@@ -27,10 +13,12 @@ limitations under the License.
|
|
27
13
|
<tbody>
|
28
14
|
<% @messages.each do |msg| %>
|
29
15
|
<tr class="<%= cycle("","zebra") %>">
|
30
|
-
<td
|
31
|
-
<td
|
32
|
-
<td
|
33
|
-
|
16
|
+
<td><%= msg.last_message.subject.html_safe %></td>
|
17
|
+
<td><%= msg.last_message.body.html_safe %></td>
|
18
|
+
<td><%= link_to raw('<i class="icon-trash icon-large"></i>'),
|
19
|
+
sufia.notification_path(msg.id), :class=> 'itemicon itemtrash',
|
20
|
+
:title => 'Delete File', :method => :delete %>
|
21
|
+
</td>
|
34
22
|
</tr>
|
35
23
|
<% end %>
|
36
24
|
</tbody>
|
@@ -1,21 +1,6 @@
|
|
1
|
-
|
2
|
-
Copyright © 2012 The Pennsylvania State University
|
3
|
-
|
4
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
you may not use this file except in compliance with the License.
|
6
|
-
You may obtain a copy of the License at
|
7
|
-
|
8
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
|
10
|
-
Unless required by applicable law or agreed to in writing, software
|
11
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
See the License for the specific language governing permissions and
|
14
|
-
limitations under the License.
|
15
|
-
%>
|
16
|
-
<a id="notify_link" href="<%= sufia.mailbox_path %>" class="icon-btn btn btn-small" title="click for User Notifications">
|
1
|
+
<%= link_to sufia.notifications_path, id: "notify_link", class: "icon-btn btn btn-small", title: "User Notifications" do %>
|
17
2
|
<%= render :partial => 'users/notify_number' %>
|
18
|
-
|
3
|
+
<% end %>
|
19
4
|
<div class='hide'>
|
20
5
|
<%= link_to "notify", sufia.user_notify_path, :remote => true, :id => 'notify_update_link' %>
|
21
6
|
</div>
|
data/config/routes.rb
CHANGED
@@ -27,9 +27,11 @@ Sufia::Engine.routes.draw do
|
|
27
27
|
resources :downloads, :only => "show"
|
28
28
|
|
29
29
|
# Messages
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
resources :notifications, only: [:destroy, :index], controller: :mailbox do
|
31
|
+
collection do
|
32
|
+
delete 'delete_all'
|
33
|
+
end
|
34
|
+
end
|
33
35
|
|
34
36
|
# User profile & follows
|
35
37
|
resources :users, only: [:index, :show, :edit, :update], as: :profiles
|
@@ -79,7 +79,7 @@ module Sufia
|
|
79
79
|
def create_from_url(params)
|
80
80
|
params[:dropbox_urls].each do |db_file|
|
81
81
|
next if db_file.blank?
|
82
|
-
# do not remove ::
|
82
|
+
# do not remove ::
|
83
83
|
@generic_file = ::GenericFile.new
|
84
84
|
@generic_file.import_url = db_file
|
85
85
|
@generic_file.label = File.basename(db_file)
|
@@ -90,27 +90,25 @@ module Sufia
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def create_from_upload(params)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
process_file(file)
|
106
|
-
end
|
107
|
-
rescue => error
|
108
|
-
logger.error "GenericFilesController::create rescued #{error.class}\n\t#{error.to_s}\n #{error.backtrace.join("\n")}\n\n"
|
109
|
-
json_error "Error occurred while creating generic file."
|
110
|
-
ensure
|
111
|
-
# remove the tempfile (only if it is a temp file)
|
112
|
-
file.tempfile.delete if file.respond_to?(:tempfile)
|
93
|
+
# check error condition No files
|
94
|
+
return json_error("Error! No file to save") if !params.has_key?(:files)
|
95
|
+
|
96
|
+
file = params[:files].detect {|f| f.respond_to?(:original_filename) }
|
97
|
+
if !file
|
98
|
+
json_error "Error! No file for upload", 'unknown file', :status => :unprocessable_entity
|
99
|
+
elsif (empty_file?(file))
|
100
|
+
json_error "Error! Zero Length File!", file.original_filename
|
101
|
+
elsif (!terms_accepted?)
|
102
|
+
json_error "You must accept the terms of service!", file.original_filename
|
103
|
+
else
|
104
|
+
process_file(file)
|
113
105
|
end
|
106
|
+
rescue => error
|
107
|
+
logger.error "GenericFilesController::create rescued #{error.class}\n\t#{error.to_s}\n #{error.backtrace.join("\n")}\n\n"
|
108
|
+
json_error "Error occurred while creating generic file."
|
109
|
+
ensure
|
110
|
+
# remove the tempfile (only if it is a temp file)
|
111
|
+
file.tempfile.delete if file.respond_to?(:tempfile)
|
114
112
|
end
|
115
113
|
|
116
114
|
# routed to /files/:id/citation
|
@@ -145,10 +143,8 @@ module Sufia
|
|
145
143
|
|
146
144
|
if params.has_key?(:filedata)
|
147
145
|
file = params[:filedata]
|
148
|
-
return unless virus_check(file) == 0
|
149
146
|
@generic_file.add_file(file, datastream_id, file.original_filename)
|
150
147
|
version_event = true
|
151
|
-
Sufia.queue.push(ContentNewVersionEventJob.new(@generic_file.pid, current_user.user_key))
|
152
148
|
end
|
153
149
|
|
154
150
|
# only update metadata if there is a generic_file object which is not the case for version updates
|
@@ -157,12 +153,20 @@ module Sufia
|
|
157
153
|
#always save the file so the new version or metadata gets recorded
|
158
154
|
if @generic_file.save
|
159
155
|
# do not trigger an update event if a version event has already been triggered
|
160
|
-
|
156
|
+
if version_event
|
157
|
+
Sufia.queue.push(ContentNewVersionEventJob.new(@generic_file.pid, current_user.user_key)) if params.has_key?(:filedata)
|
158
|
+
else
|
159
|
+
Sufia.queue.push(ContentUpdateEventJob.new(@generic_file.pid, current_user.user_key))
|
160
|
+
end
|
161
161
|
@generic_file.record_version_committer(current_user)
|
162
162
|
redirect_to sufia.edit_generic_file_path(:tab => params[:redirect_tab]), :notice => render_to_string(:partial=>'generic_files/asset_updated_flash', :locals => { :generic_file => @generic_file })
|
163
163
|
else
|
164
164
|
render action: 'edit'
|
165
165
|
end
|
166
|
+
rescue => error
|
167
|
+
flash[:error] = error.message
|
168
|
+
logger.error "GenericFilesController::update rescued #{error.class}\n\t#{error.message}\n #{error.backtrace.join("\n")}\n\n"
|
169
|
+
render action: 'edit'
|
166
170
|
end
|
167
171
|
|
168
172
|
protected
|
@@ -179,27 +183,26 @@ module Sufia
|
|
179
183
|
end
|
180
184
|
|
181
185
|
def process_file(file)
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
}
|
196
|
-
end
|
197
|
-
else
|
198
|
-
render :json => [{:error => "Error creating generic file."}]
|
186
|
+
@generic_file = ::GenericFile.new
|
187
|
+
update_metadata_from_upload_screen
|
188
|
+
create_metadata(@generic_file)
|
189
|
+
Sufia::GenericFile::Actions.create_content(@generic_file, file, file.original_filename, datastream_id, current_user)
|
190
|
+
respond_to do |format|
|
191
|
+
format.html {
|
192
|
+
render :json => [@generic_file.to_jq_upload],
|
193
|
+
:content_type => 'text/html',
|
194
|
+
:layout => false
|
195
|
+
}
|
196
|
+
format.json {
|
197
|
+
render :json => [@generic_file.to_jq_upload]
|
198
|
+
}
|
199
199
|
end
|
200
|
+
rescue ActiveFedora::RecordInvalid => af
|
201
|
+
flash[:error] = af.message
|
202
|
+
json_error "Error creating generic file: #{af.message}"
|
200
203
|
end
|
201
204
|
|
202
|
-
# override this method if you want to change how the terms are accepted on upload.
|
205
|
+
# override this method if you want to change how the terms are accepted on upload.
|
203
206
|
def terms_accepted?
|
204
207
|
params[:terms_of_service] == '1'
|
205
208
|
end
|
@@ -231,14 +234,6 @@ module Sufia
|
|
231
234
|
@generic_file.date_modified = DateTime.now
|
232
235
|
end
|
233
236
|
|
234
|
-
|
235
|
-
def virus_check( file)
|
236
|
-
stat = Sufia::GenericFile::Actions.virus_check(file)
|
237
|
-
flash[:error] = "Virus checking did not pass for #{File.basename(file.path)} status = #{stat}" unless stat == 0
|
238
|
-
stat
|
239
|
-
end
|
240
|
-
|
241
|
-
|
242
237
|
def create_metadata(file)
|
243
238
|
Sufia::GenericFile::Actions.create_metadata(file, current_user, params[:batch_id])
|
244
239
|
end
|
data/lib/sufia/version.rb
CHANGED