X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/23aec28ff071904f5145ebb535a1c6d32e915f85..8fa6952e7aaf9afc6d72699b165a693962151a21:/apps/workbench/app/models/arvados_base.rb?ds=sidebyside diff --git a/apps/workbench/app/models/arvados_base.rb b/apps/workbench/app/models/arvados_base.rb index 02e7bce836..fbf7ee5e79 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#apiClient', - '8i9sb' => 'arvados#job', - 'o0j2j' => 'arvados#link', - '57u5n' => 'arvados#log', - 'j58dm' => 'arvados#specimen', - 'p5p6p' => 'arvados#pipelineTemplate', - 'mxsvm' => 'arvados#pipelineTemplate', # legacy Pipeline objects - 'd1hrv' => 'arvados#pipelineInstance', - 'uo14g' => 'arvados#pipelineInstance', # 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) @@ -60,34 +61,53 @@ class ArvadosBase < ActiveRecord::Base attr_reader :kind @columns end + def self.column(name, sql_type = nil, default = nil, null = true) ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type.to_s, null) end + def self.attribute_info 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) end + def self.where(*args) ArvadosResourceList.new(self).where(*args) end + def self.limit(*args) ArvadosResourceList.new(self).limit(*args) end + def self.eager(*args) ArvadosResourceList.new(self).eager(*args) end + def self.all(*args) ArvadosResourceList.new(self).all(*args) end + def save obdata = {} self.class.columns.each do |col| @@ -117,8 +137,11 @@ class ArvadosBase < ActiveRecord::Base end end + @new_record = false + self end + def save! self.save or raise Exception.new("Save failed") end @@ -158,6 +181,7 @@ class ArvadosBase < ActiveRecord::Base @links = $arvados_api_client.api Link, '', { _method: 'GET', where: o, eager: true } @links = $arvados_api_client.unpack_api_response(@links) end + def all_links return @all_links if @all_links res = $arvados_api_client.api Link, '', { @@ -170,9 +194,11 @@ class ArvadosBase < ActiveRecord::Base } @all_links = $arvados_api_client.unpack_api_response(res) end + def reload private_reload(self.uuid) end + def private_reload(uuid_or_hash) raise "No such object" if !uuid_or_hash if uuid_or_hash.is_a? Hash @@ -195,8 +221,14 @@ class ArvadosBase < ActiveRecord::Base end end @all_links = nil + @new_record = false self end + + def to_param + uuid + end + def dup super.forget_uuid! end @@ -261,9 +293,11 @@ class ArvadosBase < ActiveRecord::Base end def friendly_link_name - if self.class.column_names.include? 'name' - self.name - end + (name if self.respond_to? :name) || uuid + end + + def selection_label + friendly_link_name end protected