X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/68f12bfd1ca6612338ff65106f404019a28d0cd3..fde712e92ad33e03dfd79f5fca99d2005cdd0795:/apps/workbench/app/controllers/projects_controller.rb diff --git a/apps/workbench/app/controllers/projects_controller.rb b/apps/workbench/app/controllers/projects_controller.rb index 01ab89b910..2b605d3f83 100644 --- a/apps/workbench/app/controllers/projects_controller.rb +++ b/apps/workbench/app/controllers/projects_controller.rb @@ -8,7 +8,11 @@ class ProjectsController < ApplicationController end def show_pane_list - %w(Data_collections Jobs_and_pipelines Pipeline_templates Subprojects Other_objects Permissions Advanced) + if @user_is_manager + %w(Data_collections Jobs_and_pipelines Pipeline_templates Subprojects Other_objects Sharing Advanced) + else + %w(Data_collections Jobs_and_pipelines Pipeline_templates Subprojects Other_objects Advanced) + end end def remove_item @@ -48,6 +52,32 @@ class ProjectsController < ApplicationController end end + def move_items + target_uuid = params['target'] + uuids_to_add = session[:selected_move_items] + + 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 |dst| + if resource_class == Collection + dst = Link.new(owner_uuid: target_uuid, + tail_uuid: target_uuid, + head_uuid: dst.uuid, + link_class: 'name', + name: target_uuid) + else + dst.owner_uuid = target_uuid + dst.tail_uuid = target_uuid if dst.class == Link + end + dst.save! + end + end + session[:selected_move_items] = nil + redirect_to @object + end + def destroy while (objects = Link.filter([['owner_uuid','=',@object.uuid], ['tail_uuid','=',@object.uuid]])).any? @@ -79,28 +109,26 @@ class ProjectsController < ApplicationController end @objects = @object.contents(limit: 50, include_linked: true, + filters: params[:filters], offset: params[:offset] || 0) - @share_links = Link.filter([['head_uuid', '=', @object.uuid], - ['link_class', '=', 'permission']]) @logs = Log.limit(10).filter([['object_uuid', '=', @object.uuid]]) + @users = User.limit(10000). + select(["uuid", "is_active", "first_name", "last_name"]). + filter([['is_active', '=', 'true']]) + @groups = Group.limit(10000). + select(["uuid", "name", "description"]) - @objects_and_names = [] - @objects.each do |object| - if !(name_links = @objects.links_for(object, 'name')).empty? - name_links.each do |name_link| - @objects_and_names << [object, name_link] - end - elsif object.respond_to? :name - @objects_and_names << [object, object] - else - @objects_and_names << [object, - Link.new(owner_uuid: @object.uuid, - tail_uuid: @object.uuid, - head_uuid: object.uuid, - link_class: "name", - name: "")] - end + begin + @share_links = Link.permissions_for(@object) + @user_is_manager = true + rescue ArvadosApiClient::AccessForbiddenException, + ArvadosApiClient::NotFoundException + @share_links = [] + @user_is_manager = false end + + @objects_and_names = get_objects_and_names @objects + if params[:partial] respond_to do |f| f.json { @@ -112,7 +140,7 @@ class ProjectsController < ApplicationController project: @object }), next_page_href: (next_page_offset and - url_for(offset: next_page_offset, partial: true)) + url_for(offset: next_page_offset, filters: params[:filters], partial: true)) } } end @@ -131,4 +159,59 @@ class ProjectsController < ApplicationController @updates = params['project'] super end + + helper_method :get_objects_and_names + def get_objects_and_names(objects) + objects_and_names = [] + objects.each do |object| + if !(name_links = objects.links_for(object, 'name')).empty? + name_links.each do |name_link| + objects_and_names << [object, name_link] + end + elsif object.respond_to? :name + objects_and_names << [object, object] + else + objects_and_names << [object, + Link.new(owner_uuid: @object.uuid, + tail_uuid: @object.uuid, + head_uuid: object.uuid, + link_class: "name", + name: "")] + end + end + objects_and_names + end + + def share_with + if not params[:uuids].andand.any? + @errors = ["No user/group UUIDs specified to share with."] + return render_error(status: 422) + end + results = {"success" => [], "errors" => []} + params[:uuids].each do |shared_uuid| + begin + Link.create(tail_uuid: shared_uuid, link_class: "permission", + name: "can_read", head_uuid: @object.uuid) + rescue ArvadosApiClient::ApiError => error + error_list = error.api_response.andand[:errors] + if error_list.andand.any? + results["errors"] += error_list.map { |e| "#{shared_uuid}: #{e}" } + else + error_code = error.api_status || "Bad status" + results["errors"] << "#{shared_uuid}: #{error_code} response" + end + else + results["success"] << shared_uuid + end + end + if results["errors"].empty? + results.delete("errors") + status = 200 + else + status = 422 + end + respond_to do |f| + f.json { render(json: results, status: status) } + end + end end