[Rt-commit] rt branch 5.0/dont-insert-duplicate-cfs-on-queue created. rt-5.0.3-237-ga1b347b747

BPS Git Server git at git.bestpractical.com
Mon Feb 6 21:43:24 UTC 2023


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "rt".

The branch, 5.0/dont-insert-duplicate-cfs-on-queue has been created
        at  a1b347b74707cc5a06696710c1a6a5a9fbd16f6a (commit)

- Log -----------------------------------------------------------------
commit a1b347b74707cc5a06696710c1a6a5a9fbd16f6a
Author: Jason Crome <jcrome at bestpractical.com>
Date:   Mon Jan 30 16:00:20 2023 -0500

    Don't add duplicate Cfs to object when inserting data
    
    It is possible to inadvertently add a custom field to an object multiple
    times when inserting from an initialdata file. This change prevents this
    from happening.

diff --git a/lib/RT/Handle.pm b/lib/RT/Handle.pm
index 5b63911441..0c5046ec98 100644
--- a/lib/RT/Handle.pm
+++ b/lib/RT/Handle.pm
@@ -1343,7 +1343,53 @@ sub InsertData {
                     delete $item->{'BasedOn'};
                 }
 
-            } 
+            }
+
+            my $cf_check = RT::CustomField->new($RT::SystemUser);
+            my ($found) = $cf_check->LoadByName(
+                Name       => $item->{'Name'},
+                LookupType => $item->{LookupType} // 'RT::Queue-RT::Ticket',
+                IncludeGlobal => 1,
+            );
+            if ($found) {
+                my ( $is_global, $is_applied, $what );
+
+                if ( $cf_check->IsGlobal ) {
+                    $is_global = 1;
+                } else {
+                    $is_applied = $cf_check->IsAddedToAny;
+                    my $thing;
+                    my $class = $cf_check->RecordClassFromLookupType(
+                        $item->{LookupType} );
+                    if ($class) {
+                        $thing    = $class->new( RT->SystemUser );
+                        $apply_to = [$apply_to] unless ref $apply_to;
+                        foreach my $key ( @{$apply_to} ) {
+                            my ( $ok, $msg ) = $thing->Load($key);
+                            if ($ok) {
+                                my $ocf = RT::ObjectCustomField->new(
+                                    RT->SystemUser );
+                                ($is_applied) = $ocf->LoadByCols(
+                                    CustomField => $cf_check->id,
+                                    ObjectId    => $thing->id,
+                                );
+                                if ($is_applied) {
+                                    $what = "$class $key";
+                                    last;
+                                }
+                            }
+                        }
+                    }
+                }
+                if ( $is_global or $is_applied ) {
+                    $RT::Logger->warn( "Custom field "
+                            . $item->{Name}
+                            . " already exists"
+                            . ( $is_global ? " globally" : " for $what" )
+                            . ". Skipping." );
+                    next;
+                }
+            }
 
             my ( $return, $msg ) = $new_entry->Create(%$item);
             unless( $return ) {
diff --git a/t/api/initialdata-roundtrip.t b/t/api/initialdata-roundtrip.t
index e55223acc7..b2e3c24781 100644
--- a/t/api/initialdata-roundtrip.t
+++ b/t/api/initialdata-roundtrip.t
@@ -1069,6 +1069,7 @@ for my $test (@tests) {
             qr/^Invalid value for Name$/,
             qr/^Queue already exists$/,
             qr/^Invalid Name \(names must be unique and may not be all digits\)$/,
+            qr/^Custom field .* already exists/,
         );
 
         # Avoid reporting this anonymous call frame as the source of the warning

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


hooks/post-receive
-- 
rt


More information about the rt-commit mailing list