16263: Adds nullify behavior to users's batch_update endpoint.
authorLucas Di Pentima <lucas@di-pentima.com.ar>
Mon, 23 Mar 2020 15:27:18 +0000 (12:27 -0300)
committerPeter Amstutz <peter.amstutz@curii.com>
Mon, 13 Apr 2020 15:25:53 +0000 (11:25 -0400)
Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas@di-pentima.com.ar>

services/api/app/controllers/application_controller.rb
services/api/app/controllers/arvados/v1/users_controller.rb
services/api/test/functional/arvados/v1/users_controller_test.rb

index fbf177b01f4cf42be2678808fb28327d845b46e8..7b82cdb61952888fdb1b924d99e9005c1b2f42dd 100644 (file)
@@ -486,12 +486,20 @@ class ApplicationController < ActionController::Base
   # Go code may send empty values (ie: empty string instead of NULL) that
   # should be translated to NULL on the database.
   def set_nullable_attrs_to_null
-    (resource_attrs.keys & nullable_attributes).each do |attr|
-      val = resource_attrs[attr]
+    nullify_attrs(resource_attrs.to_hash).each do |k, v|
+      resource_attrs[k] = v
+    end
+  end
+
+  def nullify_attrs(a = {})
+    new_attrs = a.to_hash.symbolize_keys
+    (new_attrs.keys & nullable_attributes).each do |attr|
+      val = new_attrs[attr]
       if (val.class == Integer && val == 0) || (val.class == String && val == "")
-        resource_attrs[attr] = nil
+        new_attrs[attr] = nil
       end
     end
+    return new_attrs
   end
 
   def reload_object_before_update
index fecc0620c7c984932f5fefbd5c5468187212b51d..eb2402b80821c8fdeff02f33c85073fc77db99cf 100644 (file)
@@ -22,7 +22,7 @@ class Arvados::V1::UsersController < ApplicationController
       rescue ActiveRecord::RecordNotUnique
         retry
       end
-      u.update_attributes!(attrs)
+      u.update_attributes!(nullify_attrs(attrs))
       @objects << u
     end
     @offset = 0
index b38f0d52fb44d72e100d02b0d610909fa1ae2f70..817a1c9ef944eb38e2dc708d53a199a9e70e5e0f 100644 (file)
@@ -1057,6 +1057,7 @@ class Arvados::V1::UsersControllerTest < ActionController::TestCase
               newuuid => {
                 'first_name' => 'noot',
                 'email' => 'root@remot.example.com',
+                'username' => '',
               },
             }})
     assert_response(:success)