[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