Merge branch 'master' into 3140-project-content-tabs
authorradhika <radhika@curoverse.com>
Mon, 21 Jul 2014 19:02:25 +0000 (15:02 -0400)
committerradhika <radhika@curoverse.com>
Mon, 21 Jul 2014 19:02:25 +0000 (15:02 -0400)
Conflicts:
apps/workbench/app/controllers/projects_controller.rb

1  2 
apps/workbench/app/controllers/projects_controller.rb
apps/workbench/test/integration/projects_test.rb

index 6e62b5cc1e129f50494130b11770d44615085c2d,31cb5eff3e7fdad1a48aa4b1032735e62b431783..118a46755b5a89eb43dd7842978c5ff8b7d73b2e
@@@ -8,7 -8,11 +8,11 @@@ class ProjectsController < ApplicationC
    end
  
    def show_pane_list
-     %w(Data_collections Jobs_and_pipelines Pipeline_templates Subprojects Other_objects Permissions Advanced)
+     if @user_is_manager
 -      %w(Contents Sharing Advanced)
++      %w(Data_collections Jobs_and_pipelines Pipeline_templates Subprojects Other_objects Sharing Advanced)
+     else
 -      %w(Contents Advanced)
++      %w(Data_collections Jobs_and_pipelines Pipeline_templates Subprojects Other_objects Advanced)
+     end
    end
  
    def remove_item
      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"])
+     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 = []
 -    @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 = get_objects_and_names @objects
 +
      if params[:partial]
        respond_to do |f|
          f.json {
      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" => [], "failure" => {}}
+     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]
+       else
+         results["success"] << shared_uuid
+       end
+     end
+     status = (results["failure"].empty?) ? 200 : 422
+     respond_to do |f|
+       f.json { render(json: results, status: status) }
+     end
+   end
  end