X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/2679a9f68531ee7c29ee4e1d68faef408de92d48..cf1097ef1225c05eb4431093a4971739a3ee5a37:/apps/workbench/app/controllers/actions_controller.rb diff --git a/apps/workbench/app/controllers/actions_controller.rb b/apps/workbench/app/controllers/actions_controller.rb index 5c3d82749b..59dcbb92bb 100644 --- a/apps/workbench/app/controllers/actions_controller.rb +++ b/apps/workbench/app/controllers/actions_controller.rb @@ -45,7 +45,48 @@ class ActionsController < ApplicationController 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 @@ -71,46 +112,65 @@ class ActionsController < ApplicationController 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| @@ -123,7 +183,11 @@ class ActionsController < ApplicationController 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