X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/3405a938ca9358b0ebdfeb01890db8407378a840..3716ba580adb3d9ddd5452daa8e8fdfd5b3edcc0:/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 172c91d4bc..5c7e44f136 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) @@ -25,11 +26,11 @@ class ArvadosBase < ActiveRecord::Base @attribute_sortkey ||= { 'id' => nil, 'uuid' => '000', - 'owner' => '001', + 'owner_uuid' => '001', 'created_at' => '002', 'modified_at' => '003', - 'modified_by_user' => '004', - 'modified_by_client' => '005', + 'modified_by_user_uuid' => '004', + 'modified_by_client_uuid' => '005', 'name' => '050', 'tail_kind' => '100', 'tail_uuid' => '100', @@ -73,6 +74,9 @@ class ArvadosBase < ActiveRecord::Base end new.private_reload(uuid) end + def self.order(*args) + ArvadosResourceList.new(self).order(*args) + end def self.where(*args) ArvadosResourceList.new(self).where(*args) end @@ -106,10 +110,12 @@ class ArvadosBase < ActiveRecord::Base @kind = resp[:kind] # these attrs can be modified by "save" -- we should update our copies - %w(uuid owner created_at - modified_at modified_by_user modified_by_client + %w(uuid owner_uuid created_at + modified_at modified_by_user_uuid modified_by_client_uuid ).each do |attr| - self.send(attr + '=', resp[attr.to_sym]) + if self.respond_to? "#{attr}=".to_sym + self.send(attr + '=', resp[attr.to_sym]) + end end self @@ -204,19 +210,25 @@ class ArvadosBase < ActiveRecord::Base } end + def self.creatable? + current_user + end + def editable? - (current_user and + (current_user and current_user.is_active and (current_user.is_admin or - current_user.uuid == self.owner)) + current_user.uuid == self.owner_uuid)) end def attribute_editable?(attr) - if "created_at modified_at modified_by_user modified_by_client updated_at".index(attr.to_s) + if "created_at modified_at modified_by_user_uuid modified_by_client_uuid updated_at".index(attr.to_s) + false + elsif not (current_user.andand.is_active) false - elsif "uuid owner".index(attr.to_s) - current_user and current_user.is_admin + elsif "uuid owner_uuid".index(attr.to_s) or current_user.is_admin + current_user.is_admin else - current_user and current_user.uuid == owner + current_user.uuid == self.owner_uuid or current_user.uuid == self.uuid end end @@ -249,6 +261,12 @@ class ArvadosBase < ActiveRecord::Base resource_class end + def friendly_link_name + if self.class.column_names.include? 'name' + self.name + end + end + protected def forget_uuid! @@ -257,7 +275,11 @@ class ArvadosBase < ActiveRecord::Base self end - def current_user + def self.current_user + Thread.current[:user] ||= User.current if Thread.current[:arvados_api_token] Thread.current[:user] end + def current_user + self.class.current_user + end end