[Rt-commit] rt branch, 4.4/serialize-json-initialdata, updated. rt-4.4.1-382-g1cf2af1

Shawn Moore shawn at bestpractical.com
Tue Mar 21 15:18:59 EDT 2017


The branch, 4.4/serialize-json-initialdata has been updated
       via  1cf2af194b19b068a0a0b3fbc064019823a0ba72 (commit)
       via  daedbbe0533f54c35944936386efe86d27c19398 (commit)
       via  4121b57bc30438b5287299e221d807b8987617d6 (commit)
       via  f5fcc419eb4e9537bde0d9b5a7c708768070ff99 (commit)
       via  074c9d47d62a0e3777471d29568d0d9425113261 (commit)
       via  0bededac8c4685d17545d8310910c0320b9b60b7 (commit)
       via  27a5f18bdac4162477ba156ed618b17d2340ec93 (commit)
       via  5a2dfa87d3ce52e215b80d14ea0423be1034e7fd (commit)
       via  bab977a940d6bbc693e61f0bc691bdb9b828c866 (commit)
      from  41a9ab1d99a10d392d7f340ca3e536bccad464c6 (commit)

Summary of changes:
 lib/RT/Migrate/Serializer/JSON.pm | 83 +++++++++++++++++++++++++++++++++------
 t/api/initialdata-roundtrip.t     |  1 -
 2 files changed, 70 insertions(+), 14 deletions(-)

- Log -----------------------------------------------------------------
commit bab977a940d6bbc693e61f0bc691bdb9b828c866
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Tue Mar 21 16:42:35 2017 +0000

    Remove create/update metadata on initialdata export
    
    RT doesn't handle it well on import, and we also don't export/import
    transactions through initialdata anyway.
    
    Better to let create/update reflect when the records in this RT instance
    were actually created/updated and by whom, rather than whichever RT
    instance happened to have exported the initialdata (which may have a
    completely different set of users anyway!)

diff --git a/lib/RT/Migrate/Serializer/JSON.pm b/lib/RT/Migrate/Serializer/JSON.pm
index 6720a49..9123876 100644
--- a/lib/RT/Migrate/Serializer/JSON.pm
+++ b/lib/RT/Migrate/Serializer/JSON.pm
@@ -220,10 +220,6 @@ sub CanonicalizeReference {
     my $context = shift;
     my $for_key = shift;
 
-    if ($for_key eq 'Creator' || $for_key eq 'LastUpdatedBy') {
-        return $self->_GetObjectByRef($ref)->Id;
-    }
-
     my $record = $self->_GetSerializedByRef($ref)
         or return $ref;
 
@@ -321,8 +317,6 @@ sub CanonicalizeGroupMembers {
         my $member = $self->_GetObjectByRef(delete $record->{MemberId});
         $record->{Class} = ref($member->Object);
         $record->{Name} = $member->Object->Name;
-
-        delete @$record{qw/Creator Created LastUpdated LastUpdatedBy/};
     }
 }
 
@@ -335,7 +329,7 @@ sub CanonicalizeObjectCustomFieldValues {
         my $cf = $self->_GetSerializedByRef(delete $record->{CustomField});
         $record->{CustomField} = $cf->{Name};
 
-        delete @$record{qw/id Created Creator LastUpdated LastUpdatedBy/};
+        delete @$record{qw/id/};
 
         push @{ $object->{CustomFields} }, $record;
     }
@@ -364,7 +358,7 @@ sub CanonicalizeObjects {
         primary_key         => 'Values',
         canonicalize_object => sub {
             my %object = %$_;
-            delete @object{qw/id CustomField Created LastUpdated Creator LastUpdatedBy/};
+            delete @object{qw/id CustomField/};
             return \%object;
         },
     );
@@ -394,7 +388,7 @@ sub CanonicalizeObjects {
         add_to_primary      => { NoAutoGlobal => 1 },
         canonicalize_object => sub {
             my %object = %$_;
-            delete @object{qw/id Scrip Created LastUpdated Creator LastUpdatedBy/};
+            delete @object{qw/id Scrip/};
             $object{ObjectId} = $self->_GetSerializedByRef($object{ObjectId})->{Name}
                 if $object{ObjectId}; # 0 meaning Global can stay 0
             return \%object;
@@ -406,6 +400,10 @@ sub WriteFile {
     my $self = shift;
     my %output;
 
+    for my $record (map { values %$_ } values %{ $self->{Records} }) {
+        delete @$record{qw/Creator Created LastUpdated LastUpdatedBy/};
+    }
+
     $self->CanonicalizeObjects;
     $self->CanonicalizeObjectCustomFieldValues;
     $self->CanonicalizeACLs;

commit 5a2dfa87d3ce52e215b80d14ea0423be1034e7fd
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Tue Mar 21 16:46:25 2017 +0000

    Remove spurious Principal and PrincipalId fields on Groups

diff --git a/lib/RT/Migrate/Serializer/JSON.pm b/lib/RT/Migrate/Serializer/JSON.pm
index 9123876..ac21bf8 100644
--- a/lib/RT/Migrate/Serializer/JSON.pm
+++ b/lib/RT/Migrate/Serializer/JSON.pm
@@ -307,6 +307,15 @@ sub CanonicalizeUsers {
     }
 }
 
+sub CanonicalizeGroups {
+    my $self = shift;
+
+    for my $group (values %{ $self->{Records}{'RT::Group'} }) {
+        delete $group->{Principal};
+        delete $group->{PrincipalId};
+    }
+}
+
 sub CanonicalizeGroupMembers {
     my $self = shift;
 
@@ -408,6 +417,7 @@ sub WriteFile {
     $self->CanonicalizeObjectCustomFieldValues;
     $self->CanonicalizeACLs;
     $self->CanonicalizeUsers;
+    $self->CanonicalizeGroups;
     $self->CanonicalizeGroupMembers;
 
     delete $self->{Records}{'RT::Attribute'};

commit 27a5f18bdac4162477ba156ed618b17d2340ec93
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Tue Mar 21 19:00:56 2017 +0000

    Remove spurious NoAutoGlobal

diff --git a/lib/RT/Migrate/Serializer/JSON.pm b/lib/RT/Migrate/Serializer/JSON.pm
index ac21bf8..8bb22f0 100644
--- a/lib/RT/Migrate/Serializer/JSON.pm
+++ b/lib/RT/Migrate/Serializer/JSON.pm
@@ -242,7 +242,7 @@ sub _CanonicalizeManyToMany {
     my $object_primary_ref = $args{object_primary_ref};
     my $primary_class = $args{primary_class};
     my $primary_key = $args{primary_key};
-    my %add_to_primary = %{ $args{add_to_primary} || {} };
+    my $add_to_primary = $args{add_to_primary};
     my $canonicalize_object = $args{canonicalize_object};
 
     if (my $objects = delete $self->{Records}{$object_class}) {
@@ -257,7 +257,9 @@ sub _CanonicalizeManyToMany {
                   sort { $a->{SortOrder} <=> $b->{SortOrder} }
                   @{ $primary->{$primary_key} || [] };
 
-            %$primary = (%$primary, %add_to_primary);
+            if (ref($add_to_primary) eq 'CODE') {
+                $add_to_primary->($primary);
+            }
         }
     }
 }
@@ -394,7 +396,10 @@ sub CanonicalizeObjects {
         object_primary_ref  => 'Scrip',
         primary_class       => 'RT::Scrip',
         primary_key         => 'Queue',
-        add_to_primary      => { NoAutoGlobal => 1 },
+        add_to_primary      => sub {
+            my $primary = shift;
+            $primary->{NoAutoGlobal} = 1 if @{ $primary->{Queue} || [] } == 0;
+        },
         canonicalize_object => sub {
             my %object = %$_;
             delete @object{qw/id Scrip/};

commit 0bededac8c4685d17545d8310910c0320b9b60b7
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Tue Mar 21 19:01:19 2017 +0000

    ACLs without object type are for RT::System

diff --git a/lib/RT/Migrate/Serializer/JSON.pm b/lib/RT/Migrate/Serializer/JSON.pm
index 8bb22f0..30d4d7e 100644
--- a/lib/RT/Migrate/Serializer/JSON.pm
+++ b/lib/RT/Migrate/Serializer/JSON.pm
@@ -290,8 +290,10 @@ sub CanonicalizeACLs {
             $ace->{UserId} = $principal->Object->Name;
         }
 
-        $ace->{ObjectType} = ref($object);
-        $ace->{ObjectId} = $object->Id;
+        unless ($object->isa('RT::System')) {
+            $ace->{ObjectType} = ref($object);
+            $ace->{ObjectId} = $object->Id;
+        }
     }
 }
 

commit 074c9d47d62a0e3777471d29568d0d9425113261
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Tue Mar 21 19:02:40 2017 +0000

    ACL PrincipalType is implicit
    
    Furthermore we were exporting UserId => '...', PrincipalType => 'Group'

diff --git a/lib/RT/Migrate/Serializer/JSON.pm b/lib/RT/Migrate/Serializer/JSON.pm
index 30d4d7e..3ac7285 100644
--- a/lib/RT/Migrate/Serializer/JSON.pm
+++ b/lib/RT/Migrate/Serializer/JSON.pm
@@ -268,6 +268,7 @@ sub CanonicalizeACLs {
     my $self = shift;
 
     for my $ace (values %{ $self->{Records}{'RT::ACE'} }) {
+        delete $ace->{PrincipalType};
         my $principal = $self->_GetObjectByRef(delete $ace->{PrincipalId});
         my $object = $self->_GetObjectByRef(delete $ace->{Object});
 

commit f5fcc419eb4e9537bde0d9b5a7c708768070ff99
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Tue Mar 21 19:17:39 2017 +0000

    Instance doesn't make sense for UserDefined or SystemInternal groups

diff --git a/lib/RT/Migrate/Serializer/JSON.pm b/lib/RT/Migrate/Serializer/JSON.pm
index 3ac7285..3b1fd29 100644
--- a/lib/RT/Migrate/Serializer/JSON.pm
+++ b/lib/RT/Migrate/Serializer/JSON.pm
@@ -318,6 +318,9 @@ sub CanonicalizeGroups {
     for my $group (values %{ $self->{Records}{'RT::Group'} }) {
         delete $group->{Principal};
         delete $group->{PrincipalId};
+
+        delete $group->{Instance} if $group->{Domain} eq 'UserDefined'
+                                  || $group->{Domain} eq 'SystemInternal';
     }
 }
 

commit 4121b57bc30438b5287299e221d807b8987617d6
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Tue Mar 21 19:17:52 2017 +0000

    Avoid serializing some empty keys for CFs

diff --git a/lib/RT/Migrate/Serializer/JSON.pm b/lib/RT/Migrate/Serializer/JSON.pm
index 3b1fd29..2560703 100644
--- a/lib/RT/Migrate/Serializer/JSON.pm
+++ b/lib/RT/Migrate/Serializer/JSON.pm
@@ -337,6 +337,15 @@ sub CanonicalizeGroupMembers {
     }
 }
 
+sub CanonicalizeCustomFields {
+    my $self = shift;
+
+    for my $record (values %{ $self->{Records}{'RT::CustomField'} }) {
+        delete $record->{Pattern} if $record->{Pattern} eq "";
+        delete $record->{UniqueValues} if !$record->{UniqueValues};
+    }
+}
+
 sub CanonicalizeObjectCustomFieldValues {
     my $self = shift;
 
@@ -430,6 +439,7 @@ sub WriteFile {
     $self->CanonicalizeUsers;
     $self->CanonicalizeGroups;
     $self->CanonicalizeGroupMembers;
+    $self->CanonicalizeCustomFields;
 
     delete $self->{Records}{'RT::Attribute'};
 

commit daedbbe0533f54c35944936386efe86d27c19398
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Tue Mar 21 19:18:18 2017 +0000

    Avoid serializing Disabled:0 for all objects

diff --git a/lib/RT/Migrate/Serializer/JSON.pm b/lib/RT/Migrate/Serializer/JSON.pm
index 2560703..57e429d 100644
--- a/lib/RT/Migrate/Serializer/JSON.pm
+++ b/lib/RT/Migrate/Serializer/JSON.pm
@@ -456,6 +456,8 @@ sub WriteFile {
                 }
             }
             delete $record->{id};
+            delete $record->{Disabled} if !$record->{Disabled};
+
             push @{ $output{$outtype} }, $record;
         }
     }

commit 1cf2af194b19b068a0a0b3fbc064019823a0ba72
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Tue Mar 21 19:18:34 2017 +0000

    Avoid exporting crucial system objects like RT_System user

diff --git a/lib/RT/Migrate/Serializer/JSON.pm b/lib/RT/Migrate/Serializer/JSON.pm
index 57e429d..fe5bddc 100644
--- a/lib/RT/Migrate/Serializer/JSON.pm
+++ b/lib/RT/Migrate/Serializer/JSON.pm
@@ -425,6 +425,29 @@ sub CanonicalizeObjects {
     );
 }
 
+# Exclude critical system objects that should already be present in the importing side
+sub ShouldExcludeObject {
+    my $self = shift;
+    my $class = shift;
+    my $id = shift;
+    my $record = shift;
+
+    return 1 if $class eq 'RT::User'
+             && ($record->{Name} eq 'RT__System' || $record->{Name} eq 'Nobody');
+
+    return 1 if $class eq 'RT::ACE'
+             && ((($record->{UserId}||'') eq 'Nobody' && $record->{RightName} eq 'OwnTicket')
+             || (($record->{UserId}||'') eq 'RT_System' && $record->{RightName} eq 'SuperUser'));
+
+    return 1 if $class eq 'RT::Group'
+             && ($record->{Domain} eq 'RT::System-Role' || $record->{Domain} eq 'SystemInternal');
+
+    return 1 if $class eq 'RT::Queue'
+             && $record->{Name} eq '___Approvals';
+
+    return 0;
+}
+
 sub WriteFile {
     my $self = shift;
     my %output;
@@ -450,6 +473,9 @@ sub WriteFile {
 
         for my $id (keys %{ $self->{Records}{$intype} }) {
             my $record = $self->{Records}{$intype}{$id};
+
+            next if $self->ShouldExcludeObject($intype, $id, $record);
+
             for my $key (keys %$record) {
                 if (ref($record->{$key}) eq 'SCALAR') {
                     $record->{$key} = $self->CanonicalizeReference($record->{$key}, $record, $key);
diff --git a/t/api/initialdata-roundtrip.t b/t/api/initialdata-roundtrip.t
index a072834..0216bb1 100644
--- a/t/api/initialdata-roundtrip.t
+++ b/t/api/initialdata-roundtrip.t
@@ -514,7 +514,6 @@ for my $test (@tests) {
     local $SIG{__WARN__} = sub {
         return if $_[0] =~ join '|', (
             qr/^Name in use$/,
-            qr/^Group name '.*' is already in use$/,
             qr/^A Template with that name already exists$/,
             qr/^.* already has the right .* on .*$/,
             qr/^Invalid value for Name$/,

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


More information about the rt-commit mailing list