X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/5dd1249f3ec74643957202977f92e42be78f65d8..8fa6952e7aaf9afc6d72699b165a693962151a21:/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 6b5ee81c04..fbf7ee5e79 100644 --- a/apps/workbench/app/models/arvados_base.rb +++ b/apps/workbench/app/models/arvados_base.rb @@ -61,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| @@ -118,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 @@ -159,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, '', { @@ -171,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 @@ -196,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 @@ -265,6 +296,10 @@ class ArvadosBase < ActiveRecord::Base (name if self.respond_to? :name) || uuid end + def selection_label + friendly_link_name + end + protected def forget_uuid!