X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/5620a47e20e004188e0f1d0245ae9e916575e806..b31cc1c673b03aec2a77b81a6bfc1da676a9dc69:/apps/workbench/app/models/arvados_base.rb diff --git a/apps/workbench/app/models/arvados_base.rb b/apps/workbench/app/models/arvados_base.rb index 83588f0aa0..72b76a5229 100644 --- a/apps/workbench/app/models/arvados_base.rb +++ b/apps/workbench/app/models/arvados_base.rb @@ -3,21 +3,22 @@ class ArvadosBase < ActiveRecord::Base attr_accessor :attribute_sortkey def self.uuid_infix_object_kind - @@uuid_infix_object_kind ||= { - '4zz18' => 'arvados#collection', - 'tpzed' => 'arvados#user', - 'ozdt8' => 'arvados#api_client', - '8i9sb' => 'arvados#job', - 'o0j2j' => 'arvados#link', - '57u5n' => 'arvados#log', - 'j58dm' => 'arvados#specimen', - 'p5p6p' => 'arvados#pipeline_template', - 'mxsvm' => 'arvados#pipeline_template', # legacy Pipeline objects - 'd1hrv' => 'arvados#pipeline_instance', - 'uo14g' => 'arvados#pipeline_instance', # legacy PipelineInstance objects - 'j7d0g' => 'arvados#group', - 'ldvyl' => 'arvados#group' # only needed for legacy Project objects - } + @@uuid_infix_object_kind ||= + begin + infix_kind = {} + $arvados_api_client.discovery[:schemas].each do |name, schema| + if schema[:uuidPrefix] + infix_kind[schema[:uuidPrefix]] = + 'arvados#' + name.to_s.camelcase(:lower) + end + end + + # Recognize obsolete types. + infix_kind. + merge('mxsvm' => 'arvados#pipelineTemplate', # Pipeline + 'uo14g' => 'arvados#pipelineInstance', # PipelineInvocation + 'ldvyl' => 'arvados#group') # Project + end end def initialize(*args) @@ -67,11 +68,21 @@ class ArvadosBase < ActiveRecord::Base self.columns @attribute_info end - def self.find(uuid) + def self.find(uuid, opts={}) if uuid.class != String or uuid.length < 27 then raise 'argument to find() must be a uuid string. Acceptable formats: warehouse locator or string with format xxxxx-xxxxx-xxxxxxxxxxxxxxx' end - new.private_reload(uuid) + + # Only do one lookup on the API side per {class, uuid, workbench + # request} unless {cache: false} is given via opts. + cache_key = "request_#{Thread.current.object_id}_#{self.to_s}_#{uuid}" + if opts[:cache] == false + Rails.cache.write cache_key, $arvados_api_client.api(self, '/' + uuid) + end + hash = Rails.cache.fetch cache_key do + $arvados_api_client.api(self, '/' + uuid) + end + new.private_reload(hash) end def self.order(*args) ArvadosResourceList.new(self).order(*args) @@ -260,6 +271,10 @@ class ArvadosBase < ActiveRecord::Base resource_class end + def friendly_link_name + (name if self.respond_to? :name) || uuid + end + protected def forget_uuid!