X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/e08c67024acccb83a30d2010c34862973b883585..5b5c9a43929d392f32f7a4db1393df2dd106cbeb:/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 a66b3903d6..f5be0e1edc 100644 --- a/apps/workbench/app/models/arvados_base.rb +++ b/apps/workbench/app/models/arvados_base.rb @@ -1,6 +1,7 @@ class ArvadosBase < ActiveRecord::Base self.abstract_class = true attr_accessor :attribute_sortkey + attr_accessor :create_params def self.arvados_api_client ArvadosApiClient.new_or_current @@ -29,8 +30,9 @@ class ArvadosBase < ActiveRecord::Base end end - def initialize raw_params={} + def initialize raw_params={}, create_params={} super self.class.permit_attribute_params(raw_params) + @create_params = create_params @attribute_sortkey ||= { 'id' => nil, 'name' => '000', @@ -54,7 +56,7 @@ class ArvadosBase < ActiveRecord::Base end def self.columns - return @columns unless @columns.nil? + return @columns if @columns.andand.any? @columns = [] @attribute_info ||= {} schema = arvados_api_client.discovery[:schemas][self.to_s.to_sym] @@ -129,6 +131,10 @@ class ArvadosBase < ActiveRecord::Base ArvadosResourceList.new(self).limit(*args) end + def self.select(*args) + ArvadosResourceList.new(self).select(*args) + end + def self.eager(*args) ArvadosResourceList.new(self).eager(*args) end @@ -148,8 +154,10 @@ class ArvadosBase < ActiveRecord::Base ActionController::Parameters.new(raw_params).permit! end - def self.create raw_params={} - super(permit_attribute_params(raw_params)) + def self.create raw_params={}, create_params={} + x = super(permit_attribute_params(raw_params)) + x.create_params = create_params + x end def update_attributes raw_params={} @@ -159,7 +167,9 @@ class ArvadosBase < ActiveRecord::Base def save obdata = {} self.class.columns.each do |col| - obdata[col.name.to_sym] = self.send(col.name.to_sym) + unless self.send(col.name.to_sym).nil? and !self.changed.include?(col.name) + obdata[col.name.to_sym] = self.send(col.name.to_sym) + end end obdata.delete :id postdata = { self.class.to_s.underscore => obdata } @@ -168,6 +178,7 @@ class ArvadosBase < ActiveRecord::Base obdata.delete :uuid resp = arvados_api_client.api(self.class, '/' + uuid, postdata) else + postdata.merge!(@create_params) if @create_params resp = arvados_api_client.api(self.class, '', postdata) end return false if !resp[:etag] || !resp[:uuid] @@ -290,6 +301,15 @@ class ArvadosBase < ActiveRecord::Base self.class.to_s.underscore.humanize end + def self.class_for_display + self.to_s.underscore.humanize + end + + # Array of strings that are names of attributes that should be rendered as textile. + def textile_attributes + [] + end + def self.creatable? current_user end @@ -298,16 +318,31 @@ class ArvadosBase < ActiveRecord::Base false end + # can this class of object be copied into a project? + # override to false on indivudal model classes for which this should not be true + def self.copies_to_projects? + self.goes_in_projects? + end + def editable? (current_user and current_user.is_active and (current_user.is_admin or current_user.uuid == self.owner_uuid or new_record? or - (writable_by.include? current_user.uuid rescue false))) + (respond_to?(:writable_by) ? + writable_by.include?(current_user.uuid) : + (ArvadosBase.find(owner_uuid).writable_by.include? current_user.uuid rescue false)))) or false + end + + # Array of strings that are the names of attributes that can be edited + # with X-Editable. + def editable_attributes + self.class.columns.map(&:name) - + %w(created_at modified_at modified_by_user_uuid modified_by_client_uuid updated_at) end def attribute_editable?(attr, ever=nil) - if "created_at modified_at modified_by_user_uuid modified_by_client_uuid updated_at".index(attr.to_s) + if not editable_attributes.include?(attr.to_s) false elsif not (current_user.andand.is_active) false @@ -353,7 +388,7 @@ class ArvadosBase < ActiveRecord::Base self.class.to_s.underscore end - def friendly_link_name + def friendly_link_name lookup=nil (name if self.respond_to? :name) || default_name end