end
def show_pane_list
- %w(Contents Permissions Advanced)
+ if @user_is_manager
+ %w(Contents Sharing Advanced)
+ else
+ %w(Contents Advanced)
+ end
end
def remove_item
end
end
- def find_objects_for_index
- @objects = Group.
- filter([['group_class','in',['project','folder']]]).
- order('name')
- super
- parent_of = {current_user.uuid => 'me'}
- @objects.each do |ob|
- parent_of[ob.uuid] = ob.owner_uuid
- end
- children_of = {false => [], 'me' => [current_user]}
- @objects.each do |ob|
- if ob.owner_uuid != current_user.uuid and
- not parent_of.has_key? ob.owner_uuid
- parent_of[ob.uuid] = false
+ def destroy
+ while (objects = Link.filter([['owner_uuid','=',@object.uuid],
+ ['tail_uuid','=',@object.uuid]])).any?
+ objects.each do |object|
+ object.destroy
end
- children_of[parent_of[ob.uuid]] ||= []
- children_of[parent_of[ob.uuid]] << ob
end
- buildtree = lambda do |children_of, root_uuid=false|
- tree = {}
- children_of[root_uuid].andand.each do |ob|
- tree[ob] = buildtree.call(children_of, ob.uuid)
+ while (objects = @object.contents(include_linked: false)).any?
+ objects.each do |object|
+ object.update_attributes! owner_uuid: current_user.uuid
end
- tree
end
- sorted_paths = lambda do |tree, depth=0|
- paths = []
- tree.keys.sort_by { |ob|
- ob.is_a?(String) ? ob : ob.friendly_link_name
- }.each do |ob|
- paths << {object: ob, depth: depth}
- paths += sorted_paths.call tree[ob], depth+1
- end
- paths
+ if ArvadosBase::resource_class_for_uuid(@object.owner_uuid) == Group
+ params[:return_to] ||= group_path(@object.owner_uuid)
+ else
+ params[:return_to] ||= projects_path
end
- @my_project_tree =
- sorted_paths.call buildtree.call(children_of, 'me')
- @shared_project_tree =
- sorted_paths.call({'Shared with me' =>
- buildtree.call(children_of, false)})
+ super
+ end
+
+ def find_objects_for_index
+ @objects = all_projects
+ super
end
def show
+ if !@object
+ return render_not_found("object not found")
+ end
@objects = @object.contents(limit: 50,
include_linked: true,
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|
@updates = params['project']
super
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