From ed55da61a1516914d199ea149bfd227b90107ac9 Mon Sep 17 00:00:00 2001 From: Lucas Di Pentima Date: Mon, 10 Jun 2019 11:17:57 -0300 Subject: [PATCH] 14874: Adds default properties behaviors at collection creation. Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima --- services/api/app/models/arvados_model.rb | 12 +++++++++ services/api/app/models/collection.rb | 18 +++++++++++++ services/api/test/unit/collection_test.rb | 32 +++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/services/api/app/models/arvados_model.rb b/services/api/app/models/arvados_model.rb index 339bc9e23f..bbba0ab702 100644 --- a/services/api/app/models/arvados_model.rb +++ b/services/api/app/models/arvados_model.rb @@ -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 diff --git a/services/api/app/models/collection.rb b/services/api/app/models/collection.rb index 775ebdb494..2555a418a0 100644 --- a/services/api/app/models/collection.rb +++ b/services/api/app/models/collection.rb @@ -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 diff --git a/services/api/test/unit/collection_test.rb b/services/api/test/unit/collection_test.rb index 08d5b1fb72..5080d2b3a5 100644 --- a/services/api/test/unit/collection_test.rb +++ b/services/api/test/unit/collection_test.rb @@ -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 -- 2.30.2