def move_or_copy action
uuids_to_add = params["selection"]
- move_or_copy_items action, uuids_to_add, @object.uuid
+ uuids_to_add = [ uuids_to_add ] unless uuids_to_add.is_a? Array
+ uuids_to_add.
+ collect { |x| ArvadosBase::resource_class_for_uuid(x) }.
+ uniq.
+ each do |resource_class|
+ resource_class.filter([['uuid','in',uuids_to_add]]).each do |src|
+ if resource_class == Collection and not Collection.attribute_info.include?(:name)
+ dst = Link.new(owner_uuid: @object.uuid,
+ tail_uuid: @object.uuid,
+ head_uuid: src.uuid,
+ link_class: 'name',
+ name: src.uuid)
+ else
+ case action
+ when :copy
+ dst = src.dup
+ if dst.respond_to? :'name='
+ if dst.name
+ dst.name = "Copy of #{dst.name}"
+ else
+ dst.name = "Copy of unnamed #{dst.class_for_display.downcase}"
+ end
+ end
+ if resource_class == Collection
+ dst.manifest_text = Collection.select([:manifest_text]).where(uuid: src.uuid).first.manifest_text
+ end
+ when :move
+ dst = src
+ else
+ raise ArgumentError.new "Unsupported action #{action}"
+ end
+ dst.owner_uuid = @object.uuid
+ dst.tail_uuid = @object.uuid if dst.class == Link
+ end
+ begin
+ dst.save!
+ rescue
+ dst.name += " (#{Time.now.localtime})" if dst.respond_to? :name=
+ dst.save!
+ end
+ end
+ end
redirect_to @object
end
end
expose_action :combine_selected_files_into_collection do
- lst = []
+ uuids = []
+ pdhs = []
files = []
params["selection"].each do |s|
a = ArvadosBase::resource_class_for_uuid s
- m = nil
if a == Link
begin
- m = CollectionsHelper.match(Link.find(s).head_uuid)
+ if (m = CollectionsHelper.match(Link.find(s).head_uuid))
+ pdhs.append(m[1] + m[2])
+ files.append(m)
+ end
rescue
end
- else
- m = CollectionsHelper.match(s)
- end
-
- if m and m[1] and m[2]
- lst.append(m[1] + m[2])
+ elsif (m = CollectionsHelper.match(s))
+ pdhs.append(m[1] + m[2])
+ files.append(m)
+ elsif (m = CollectionsHelper.match_uuid_with_optional_filepath(s))
+ uuids.append(m[1])
files.append(m)
end
end
- collections = Collection.where(uuid: lst)
-
+ pdhs = pdhs.uniq
+ uuids = uuids.uniq
chash = {}
- collections.each do |c|
- c.reload()
+
+ Collection.select([:uuid, :manifest_text]).where(uuid: uuids).each do |c|
chash[c.uuid] = c
end
+ Collection.select([:portable_data_hash, :manifest_text]).where(portable_data_hash: pdhs).each do |c|
+ chash[c.portable_data_hash] = c
+ end
+
combined = ""
files.each do |m|
- mt = chash[m[1]+m[2]].manifest_text
- if m[4]
- combined += arv_normalize mt, '--extract', m[4][1..-1]
+ mt = chash[m[1]+m[2]].andand.manifest_text
+ if not m[4].nil? and m[4].size > 1
+ combined += arv_normalize mt, '--extract', ".#{m[4]}"
else
- combined += chash[m[1]+m[2]].manifest_text
+ combined += mt
end
end
normalized = arv_normalize combined
newc = Collection.new({:manifest_text => normalized})
+ newc.name = newc.name || "Collection created at #{Time.now.localtime}"
+
+ # set owner_uuid to current project, provided it is writable
+ current_project_writable = false
+ action_data = JSON.parse(params['action_data']) if params['action_data']
+ if action_data && action_data['current_project_uuid']
+ current_project = Group.find(action_data['current_project_uuid']) rescue nil
+ if (current_project && current_project.writable_by.andand.include?(current_user.uuid))
+ newc.owner_uuid = action_data['current_project_uuid']
+ current_project_writable = true
+ end
+ end
+
newc.save!
chash.each do |k,v|
l.save!
end
- redirect_to controller: 'collections', action: :show, id: newc.uuid
+ msg = current_project_writable ?
+ "Created new collection in the project #{current_project.name}." :
+ "Created new collection in your Home project."
+
+ redirect_to newc, flash: {'message' => msg}
end
def report_issue_popup