[Rt-commit] rt branch, 4.4/user-create-skip-cfs, created. rt-4.4.4-64-g3295013b0

Jim Brandt jbrandt at bestpractical.com
Mon Sep 23 15:44:23 EDT 2019


The branch, 4.4/user-create-skip-cfs has been created
        at  3295013b07d80d5e5b35cb606b0355c24cab24a4 (commit)

- Log -----------------------------------------------------------------
commit 4035b3670f2bbc372016174eb27e06f6e4df950f
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Mon Sep 23 15:22:27 2019 -0400

    Add test showing user CF deleted after create

diff --git a/t/externalauth/ldap.t b/t/externalauth/ldap.t
index 671d3fcd9..362ab5fb5 100644
--- a/t/externalauth/ldap.t
+++ b/t/externalauth/ldap.t
@@ -171,7 +171,7 @@ diag "test admin user create";
     $user->Load( $id );
     is( $user->EmailAddress, "$username\@invalid.tld", 'email is not changed' );
     is( $user->Name, $username, 'got canonicalized Name' );
-
+    is( $user->FirstCustomFieldValue('Employee Type'), 'sale', 'Employee Type set to sale from LDAP' );
 }
 
 diag "test user update via login";

commit 3295013b07d80d5e5b35cb606b0355c24cab24a4
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Mon Sep 23 15:23:07 2019 -0400

    Clear user CFs from form args if set on create
    
    On create, user objects can now have custom field values set
    from LDAP or other sources. The user create form submission
    also submitted these values and, even if left empty, they
    replaced the values set during create.
    
    Check any submitted user CFs on create and if the user object
    already has a value, remove the form arg to prevent a second
    update and give precedence to the value set on create.

diff --git a/lib/RT/Interface/Web.pm b/lib/RT/Interface/Web.pm
index b6ccf6ff7..3ea5dbc44 100644
--- a/lib/RT/Interface/Web.pm
+++ b/lib/RT/Interface/Web.pm
@@ -3467,6 +3467,44 @@ sub _NormalizeObjectCustomFieldValue {
     return @values;
 }
 
+=head2 _FilterUserCFValuesOnCreate
+
+On create, user objects can have CFs set from LDAP or other sources.
+Clear submitted user custom field form values on create if the custom field
+already has a value set on create.
+
+=cut
+
+sub _FilterUserCFValuesOnCreate {
+    my %args    = @_;
+    my $ARGSRef = $args{'ARGSRef'};
+    my $UserObj = $args{'UserObj'};
+
+    my %custom_fields_to_mod = _ParseObjectCustomFieldArgs($ARGSRef);
+
+    foreach my $cf ( keys %{ $custom_fields_to_mod{'RT::User'}{0} } ) {
+        my $CustomFieldObj = RT::CustomField->new( $session{'CurrentUser'} );
+        $CustomFieldObj->SetContextObject($UserObj);
+        $CustomFieldObj->LoadById($cf);
+        unless ( $CustomFieldObj->id ) {
+            $RT::Logger->warning("Couldn't load custom field #$cf");
+            next;
+        }
+
+        if ( $UserObj->FirstCustomFieldValue($CustomFieldObj->Id) ) {
+
+            my ($ret, $grouping) = _ValidateConsistentCustomFieldValues($cf,
+                    $custom_fields_to_mod{'RT::User'}{0}{$cf});
+            my $user_cf_name = GetCustomFieldInputName( CustomField => $CustomFieldObj, Grouping => $grouping );
+
+            delete $ARGSRef->{$user_cf_name} if exists $ARGSRef->{$user_cf_name};
+            delete $ARGSRef->{$user_cf_name . "-Magic"} if exists $ARGSRef->{$user_cf_name . "-Magic"};
+        }
+    }
+
+    return;
+}
+
 =head2 ProcessTicketWatchers ( TicketObj => $Ticket, ARGSRef => \%ARGS );
 
 Returns an array of results messages.
diff --git a/share/html/Admin/Users/Modify.html b/share/html/Admin/Users/Modify.html
index fc80c9aa7..6f1d21b5a 100644
--- a/share/html/Admin/Users/Modify.html
+++ b/share/html/Admin/Users/Modify.html
@@ -282,6 +282,7 @@ if ($Create) {
 
     if ($val) {
         push @results, $msg;
+        _FilterUserCFValuesOnCreate( ARGSRef => \%ARGS, UserObj => $UserObj );
         push @results, ProcessObjectCustomFieldUpdates( ARGSRef => \%ARGS, Object => $UserObj );
         $title = loc("Modify the user [_1]", $UserObj->Name);
     } else {

-----------------------------------------------------------------------


More information about the rt-commit mailing list