14874: Adds default properties behaviors at collection creation.
authorLucas Di Pentima <ldipentima@veritasgenetics.com>
Mon, 10 Jun 2019 14:17:57 +0000 (11:17 -0300)
committerLucas Di Pentima <ldipentima@veritasgenetics.com>
Mon, 10 Jun 2019 14:17:57 +0000 (11:17 -0300)
Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <ldipentima@veritasgenetics.com>

services/api/app/models/arvados_model.rb
services/api/app/models/collection.rb
services/api/test/unit/collection_test.rb

index 339bc9e23fdaf2334b060fda789e97130772be6a..bbba0ab70216089f139a9c2e407162c79d826972 100644 (file)
@@ -410,6 +410,18 @@ class ArvadosModel < ApplicationRecord
     end
   end
 
+  def user_owner_uuid
+    if self.owner_uuid.nil?
+      return current_user.uuid
+    end
+    owner_class = ArvadosModel.resource_class_for_uuid(self.owner_uuid)
+    if owner_class == User
+      self.owner_uuid
+    else
+      owner_class.find_by_uuid(self.owner_uuid).user_owner_uuid
+    end
+  end
+
   def logged_attributes
     attributes.except(*Rails.configuration.AuditLogs.UnloggedAttributes)
   end
index 775ebdb49486861d73f20b97ba562d77656de765..2555a418a012283182850c7542f5432759b822ad 100644 (file)
@@ -22,6 +22,7 @@ class Collection < ArvadosModel
 
   before_validation :default_empty_manifest
   before_validation :default_storage_classes, on: :create
+  before_validation :default_properties, on: :create
   before_validation :check_encoding
   before_validation :check_manifest_validity
   before_validation :check_signatures
@@ -606,6 +607,23 @@ class Collection < ArvadosModel
     self.storage_classes_confirmed ||= []
   end
 
+  # Sets default properties at creation time
+  def default_properties
+    default_props = Rails.configuration.Collections.DefaultProperties
+    if default_props.empty?
+      return
+    end
+    (default_props.keys - self.properties.keys).each do |key|
+      if default_props[key].has_key?('value')
+        self.properties[key] = default_props[key]['value']
+      elsif default_props[key]['function'].andand == 'original_owner'
+        self.properties[key] = self.user_owner_uuid
+      else
+        logger.warn "Unidentified default property definition '#{key}': #{default_props[key].inspect}"
+      end
+    end
+  end
+
   def portable_manifest_text
     self.class.munge_manifest_locators(manifest_text) do |match|
       if match[2] # size
index 08d5b1fb72cb9544ba8ae651e0936826462703d3..5080d2b3a5a491b2809c40f2ec69fb2531601a71 100644 (file)
@@ -1012,4 +1012,36 @@ class CollectionTest < ActiveSupport::TestCase
     SweepTrashedObjects.sweep_now
     assert_empty Collection.where(uuid: uuid)
   end
+
+  test "create collections with DefaultProperties configuration" do
+    Rails.configuration.Collections.DefaultProperties = {
+      'default_prop1' => {'value' => 'prop1_value'},
+      'responsible_person_uuid' => {'function' => 'original_owner'}
+    }
+    # Test collection without initial properties
+    act_as_user users(:active) do
+      c = create_collection 'foo', Encoding::US_ASCII
+      assert c.valid?
+      assert_not_empty c.properties
+      assert_equal 'prop1_value', c.properties['default_prop1']
+      assert_equal users(:active).uuid, c.properties['responsible_person_uuid']
+    end
+    # Test collection with default_prop1 property already set
+    act_as_user users(:active) do
+      c = Collection.create(manifest_text: ". d41d8cd98f00b204e9800998ecf8427e 0:34:foo.txt\n",
+                            properties: {'default_prop1' => 'custom_value'})
+      assert c.valid?
+      assert_not_empty c.properties
+      assert_equal 'custom_value', c.properties['default_prop1']
+      assert_equal users(:active).uuid, c.properties['responsible_person_uuid']
+    end
+    # Test collection inside a sub project
+    act_as_user users(:active) do
+      c = Collection.create(manifest_text: ". d41d8cd98f00b204e9800998ecf8427e 0:34:foo.txt\n",
+                            owner_uuid: groups(:asubproject).uuid)
+      assert c.valid?
+      assert_not_empty c.properties
+      assert_equal users(:active).uuid, c.properties['responsible_person_uuid']
+    end
+  end
 end