[Rt-commit] rt branch, 4.4/search-watcher-by-group-name, created. rt-4.4.4-507-ga08bc07924
? sunnavy
sunnavy at bestpractical.com
Thu Jun 3 17:26:05 EDT 2021
The branch, 4.4/search-watcher-by-group-name has been created
at a08bc079243e48bafc9bc7b2c66ea4aa90b333f7 (commit)
- Log -----------------------------------------------------------------
commit 09f2808ca851cae010d9e84c44fd8c3e66e6ce05
Author: sunnavy <sunnavy at bestpractical.com>
Date: Tue Nov 3 05:00:16 2020 +0800
Support to search user defined group names in watcher limit
To search tickets that have a specified group in a role, previously we
had to specify the group id like "AdminCc.id = 123", which is not
convenient. Here we support group names to improve this, e.g.
"AdminCc.Name = 'team foo'".
In case the name in question is shared by a user and a group(which is
weird and should be quite rare in real world), both will be respected.
I.e. we return tickets that have either the user or the group in the
role.
diff --git a/lib/RT/SearchBuilder/Role/Roles.pm b/lib/RT/SearchBuilder/Role/Roles.pm
index 98fb469f3c..fee24f4b7f 100644
--- a/lib/RT/SearchBuilder/Role/Roles.pm
+++ b/lib/RT/SearchBuilder/Role/Roles.pm
@@ -255,7 +255,7 @@ sub RoleLimit {
my $column = $type ? $class->Role($type)->{Column} : undef;
- # if it's equality op and search by Email or Name then we can preload user
+ # if it's equality op and search by Email or Name then we can preload user/group
# we do it to help some DBs better estimate number of rows and get better plans
if ( $args{QUOTEVALUE} && $args{OPERATOR} =~ /^!?=$/
&& (!$args{FIELD} || $args{FIELD} eq 'Name' || $args{FIELD} eq 'EmailAddress') ) {
@@ -265,8 +265,27 @@ sub RoleLimit {
? ($column ? 'Load' : 'LoadByEmail')
: $args{FIELD} eq 'EmailAddress' ? 'LoadByEmail': 'Load';
$o->$method( $args{VALUE} );
+ my @values;
+ @values = $o->Id if $o->Id;
+
+ if ( !$args{FIELD} || $args{FIELD} eq 'Name' ) {
+ my $group = RT::Group->new( $self->CurrentUser );
+ $group->LoadUserDefinedGroup( $args{VALUE} );
+ push @values, $group->Id if $group->Id;
+ }
+
$args{FIELD} = 'id';
- $args{VALUE} = $o->id || 0;
+ if ( @values == 1 ) {
+ $args{VALUE} = $values[0];
+ }
+ elsif ( @values > 1 ) {
+ RT->Logger->debug("Name $args{VALUE} is used in both user and group");
+ $args{VALUE} = \@values;
+ $args{OPERATOR} = $args{OPERATOR} =~ /!/ ? 'NOT IN' : 'IN';
+ }
+ else {
+ $args{VALUE} = 0;
+ }
}
if ( $column and $args{FIELD} and $args{FIELD} eq 'id' ) {
@@ -396,15 +415,12 @@ sub RoleLimit {
GroupsAlias => $groups, New => 1, Left => 0
);
if ($args{FIELD} eq "id") {
- my @ids;
- if ( $is_shallow ) {
- @ids = $args{VALUE};
- }
- else {
+ my @ids = ref $args{VALUE} eq 'ARRAY' ? @{ $args{VALUE} } : $args{VALUE};
+ if ( !$is_shallow ) {
my $groups = RT::Groups->new( RT->SystemUser );
$groups->LimitToUserDefinedGroups;
$groups->WithMember( PrincipalId => $args{VALUE}, Recursively => 1 );
- @ids = ( $args{VALUE}, map { $_->id } @{ $groups->ItemsArrayRef } );
+ push @ids, map { $_->id } @{ $groups->ItemsArrayRef };
}
# Save a left join to Users, if possible
commit a08bc079243e48bafc9bc7b2c66ea4aa90b333f7
Author: sunnavy <sunnavy at bestpractical.com>
Date: Tue Nov 3 14:38:48 2020 +0800
Test ticket search by id/name of the group added in watchers
diff --git a/t/ticket/search_by_watcher_group.t b/t/ticket/search_by_watcher_group.t
index 9c522d5d0b..b02e2cc74a 100644
--- a/t/ticket/search_by_watcher_group.t
+++ b/t/ticket/search_by_watcher_group.t
@@ -20,6 +20,9 @@ my $group;
my $root = RT::Test->load_or_create_user( Name => 'root', MemberOf => $group->id );
ok $root && $root->id;
+my $test_user = RT::Test->load_or_create_user( Name => 'Test' );
+ok $test_user && $test_user->id;
+
RT::Test->create_tickets(
{ Queue => $q, },
{ Subject => '-', },
@@ -27,14 +30,24 @@ RT::Test->create_tickets(
{ Subject => 'r', Requestor => $root->id },
{ Subject => 'c', Cc => $root->id },
{ Subject => 'a', AdminCc => $root->id },
+ { Subject => 'ag', AdminCc => $group->id },
+ { Subject => 'ru', Requestor => $test_user->id },
);
run_tests(
'OwnerGroup = "Test"' => { '-' => 0, o => 1, r => 0, c => 0, a => 0 },
'RequestorGroup = "Test"' => { '-' => 0, o => 0, r => 1, c => 0, a => 0 },
'CCGroup = "Test"' => { '-' => 0, o => 0, r => 0, c => 1, a => 0 },
- 'AdminCCGroup = "Test"' => { '-' => 0, o => 0, r => 0, c => 0, a => 1 },
- 'WatcherGroup = "Test"' => { '-' => 0, o => 1, r => 1, c => 1, a => 1 },
+ 'AdminCCGroup = "Test"' => { '-' => 0, o => 0, r => 0, c => 0, a => 1, ag => 1 },
+ 'WatcherGroup = "Test"' => { '-' => 0, o => 1, r => 1, c => 1, a => 1, ag => 1 },
+ 'Requestor.id = ' . $test_user->Id => { '-' => 0, ru => 1 },
+ 'Requestor.Name = "Test"' => { '-' => 0, ru => 1 },
+ 'AdminCc.id = ' . $group->Id => { '-' => 0, ag => 1 },
+ 'AdminCc = "Test"' => { '-' => 0, ag => 1 },
+ 'AdminCc.Name = "Test"' => { '-' => 0, ag => 1 },
+ 'Watcher.id = ' . $test_user->Id => { '-' => 0, ru => 1 },
+ 'Watcher.id = ' . $group->Id => { '-' => 0, ag => 1 },
+ 'Watcher.Name = "Test"' => { '-' => 0, ru => 1, ag => 1 },
);
warning_like {
-----------------------------------------------------------------------
More information about the rt-commit
mailing list