X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/2f1baf225599d7ae5dec4611696774e6a7100d58..5e592e0e063eb8db81181375f7cafd74683098f5:/apps/workbench/app/models/collection.rb diff --git a/apps/workbench/app/models/collection.rb b/apps/workbench/app/models/collection.rb index a64f7e1e10..ead2c951c3 100644 --- a/apps/workbench/app/models/collection.rb +++ b/apps/workbench/app/models/collection.rb @@ -1,33 +1,60 @@ -class Collection < ArvadosBase - include ApplicationHelper +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0 + +require "arvados/keep" +class Collection < ArvadosBase MD5_EMPTY = 'd41d8cd98f00b204e9800998ecf8427e' + def default_name + if Collection.is_empty_blob_locator? self.uuid + "Empty Collection" + else + super + end + end + # Return true if the given string is the locator of a zero-length blob def self.is_empty_blob_locator? locator !!locator.to_s.match("^#{MD5_EMPTY}(\\+.*)?\$") end - def self.goes_in_folders? + def self.goes_in_projects? true end + def manifest + if @manifest.nil? or manifest_text_changed? + @manifest = Keep::Manifest.new(manifest_text || "") + end + @manifest + end + + def files + # This method provides backwards compatibility for code that relied on + # the old files field in API results. New code should use manifest + # methods directly. + manifest.files + end + def content_summary - human_readable_bytes_html(total_bytes) + " " + super + if total_bytes > 0 + ApplicationController.helpers.human_readable_bytes_html(total_bytes) + " " + super + else + super + " modified at " + modified_at.to_s + end end def total_bytes - if files - tot = 0 - files.each do |file| - tot += file[2] - end - tot - end + manifest.files.inject(0) { |sum, filespec| sum + filespec.last } end def files_tree - tree = files.group_by { |file_spec| File.split(file_spec.first) } + tree = manifest.files.group_by do |file_spec| + File.split(file_spec.first) + end + return [] if tree.empty? # Fill in entries for empty directories. tree.keys.map { |basedir, _| File.split(basedir) }.each do |splitdir| until tree.include?(splitdir) @@ -41,18 +68,14 @@ class Collection < ArvadosBase .sort.flat_map do |parts| [parts + [nil]] + dir_to_tree.call(File.join(parts)) end - # Then extend that list with files in this directory. - subnodes + tree[File.split(dirname)] + # Then extend that list with files in this directory, except the empty dir placeholders (0:0:. files). + subnodes + tree[File.split(dirname)].reject { |_, basename, size| (basename == '.') and (size == 0) } end dir_to_tree.call('.') end - def attribute_editable? attr, *args - false - end - - def self.creatable? - false + def editable_attributes + %w(name description manifest_text filename) end def provenance @@ -63,4 +86,15 @@ class Collection < ArvadosBase arvados_api_client.api "collections/#{self.uuid}/", "used_by" end + def friendly_link_name lookup=nil + name || portable_data_hash + end + + def textile_attributes + [ 'description' ] + end + + def untrash + arvados_api_client.api(self.class, "/#{self.uuid}/untrash", {"ensure_unique_name" => true}) + end end