X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d2f68bd1e108c3f2dda2322c427050d019b17e04..12440f46cd197713157e19b44671a6e357d5431b:/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 e6ef6eb894..df489d2eeb 100644 --- a/apps/workbench/app/controllers/actions_controller.rb +++ b/apps/workbench/app/controllers/actions_controller.rb @@ -1,9 +1,22 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0 + require "arvados/collection" +require "app_version" class ActionsController < ApplicationController - skip_filter :require_thread_api_token, only: [:report_issue_popup, :report_issue] - skip_filter :check_user_agreements, only: [:report_issue_popup, :report_issue] + # Skip require_thread_api_token if this is a show action + # for an object uuid that supports anonymous access. + skip_around_action :require_thread_api_token, if: proc { |ctrl| + !Rails.configuration.Users.AnonymousUserToken.empty? and + 'show' == ctrl.action_name and + params['uuid'] and + model_class.in?([Collection, Group, Job, PipelineInstance, PipelineTemplate]) + } + skip_around_action :require_thread_api_token, only: [:report_issue_popup, :report_issue] + skip_before_action :check_user_agreements, only: [:report_issue_popup, :report_issue] @@exposed_actions = {} def self.expose_action method, &block @@ -21,6 +34,8 @@ class ActionsController < ApplicationController @object.link_class == 'name' and ArvadosBase::resource_class_for_uuid(@object.head_uuid) == Collection redirect_to collection_path(id: @object.uuid) + elsif @object.is_a?(Group) and (@object.group_class == 'project' or @object.group_class == 'filter') + redirect_to project_path(id: @object.uuid) elsif @object redirect_to @object else @@ -34,7 +49,7 @@ class ActionsController < ApplicationController return self.send(param) end end - redirect_to :back + redirect_back(fallback_location: root_path) end expose_action :copy_selections_into_project do @@ -71,7 +86,10 @@ class ActionsController < ApplicationController end end if resource_class == Collection - dst.manifest_text = Collection.select([:manifest_text]).where(uuid: src.uuid).first.manifest_text + dst.manifest_text = Collection.select([:manifest_text]).where(uuid: src.uuid).with_count("none").first.manifest_text + # Fixes bug 19144: nullify some fields that are managed by keep-balance. + dst.storage_classes_confirmed = [] + dst.storage_classes_confirmed_at = nil end when :move dst = src @@ -91,7 +109,8 @@ class ActionsController < ApplicationController end if (resource_classes == [Collection] and @object.is_a? Group and - @object.group_class == 'project') + @object.group_class == 'project') or + @object.is_a? User # In the common case where only collections are copied/moved # into a project, it's polite to land on the collections tab on # the destination project. @@ -103,45 +122,10 @@ class ActionsController < ApplicationController end expose_action :combine_selected_files_into_collection do - link_uuids, coll_ids = params["selection"].partition do |sel_s| - ArvadosBase::resource_class_for_uuid(sel_s) == Link - end - - unless link_uuids.empty? - Link.select([:head_uuid]).where(uuid: link_uuids).each do |link| - if ArvadosBase::resource_class_for_uuid(link.head_uuid) == Collection - coll_ids << link.head_uuid - end - end - end - - uuids = [] - pdhs = [] - source_paths = Hash.new { |hash, key| hash[key] = [] } - coll_ids.each do |coll_id| - if m = CollectionsHelper.match(coll_id) - key = m[1] + m[2] - pdhs << key - source_paths[key] << m[4] - elsif m = CollectionsHelper.match_uuid_with_optional_filepath(coll_id) - key = m[1] - uuids << key - source_paths[key] << m[4] - end - end - - unless pdhs.empty? - Collection.where(portable_data_hash: pdhs.uniq). - select([:uuid, :portable_data_hash]).each do |coll| - unless source_paths[coll.portable_data_hash].empty? - uuids << coll.uuid - source_paths[coll.uuid] = source_paths.delete(coll.portable_data_hash) - end - end - end + uuids, source_paths = selected_collection_files params new_coll = Arv::Collection.new - Collection.where(uuid: uuids.uniq). + Collection.where(uuid: uuids.uniq).with_count("none"). select([:uuid, :manifest_text]).each do |coll| src_coll = Arv::Collection.new(coll.manifest_text) src_pathlist = source_paths[coll.uuid] @@ -223,7 +207,36 @@ You can try recreating the collection to get a copy with full provenance data." respond_to do |format| IssueReporter.send_report(current_user, params).deliver - format.js {render nothing: true} + format.js {render body: nil} + end + end + + # star / unstar the current project + def star + links = Link.where(owner_uuid: current_user.uuid, + head_uuid: @object.uuid, + link_class: 'star') + + if params['status'] == 'create' + # create 'star' link if one does not already exist + if !links.andand.any? + dst = Link.new(owner_uuid: current_user.uuid, + tail_uuid: current_user.uuid, + head_uuid: @object.uuid, + link_class: 'star', + name: @object.uuid) + dst.save! + end + else # delete any existing 'star' links + if links.andand.any? + links.each do |link| + link.destroy + end + end + end + + respond_to do |format| + format.js end end