3114: When current user, show root/home project rather than user attributes when...
[arvados.git] / apps / workbench / app / controllers / projects_controller.rb
index 118a46755b5a89eb43dd7842978c5ff8b7d73b2e..9f4c58877581dfdba308d9167c8610b2f7b4ac31 100644 (file)
@@ -3,6 +3,31 @@ class ProjectsController < ApplicationController
     Group
   end
 
+  def find_object_by_uuid
+    if current_user and params[:uuid] == current_user.uuid
+      @object = current_user.dup
+      @object.uuid = current_user.uuid
+      class << @object
+        def name
+          'Home'
+        end
+        def description
+          ''
+        end
+        def attribute_editable? attr, *args
+          case attr
+          when 'description', 'name'
+            false
+          else
+            super
+          end
+        end
+      end
+    else
+      super
+    end
+  end
+
   def index_pane_list
     %w(Projects)
   end
@@ -52,6 +77,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?
@@ -92,13 +143,15 @@ class ProjectsController < ApplicationController
     @groups = Group.limit(10000).
       select(["uuid", "name", "description"])
 
-    begin
-      @share_links = Link.permissions_for(@object)
-      @user_is_manager = true
-    rescue ArvadosApiClient::AccessForbiddenException,
-           ArvadosApiClient::NotFoundException
-      @share_links = []
-      @user_is_manager = false
+    @user_is_manager = false
+    @share_links = []
+    if @object.uuid != current_user.uuid
+      begin
+        @share_links = Link.permissions_for(@object)
+        @user_is_manager = true
+      rescue ArvadosApiClient::AccessForbiddenException,
+        ArvadosApiClient::NotFoundException
+      end
     end
 
     @objects_and_names = get_objects_and_names @objects
@@ -161,18 +214,29 @@ class ProjectsController < ApplicationController
       @errors = ["No user/group UUIDs specified to share with."]
       return render_error(status: 422)
     end
-    results = {"success" => [], "failure" => {}}
+    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
-        results["failure"][shared_uuid] = error.api_response.andand[:errors]
+        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
-    status = (results["failure"].empty?) ? 200 : 422
+    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