end
def show_pane_list
- %w(Contents 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
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?
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 {
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
@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