#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
use strict;
use warnings;
+
use base qw/RT::SharedSetting/;
=head1 METHODS
=cut
-sub ObjectName { "search" }
+sub ObjectName { "search" } # loc
sub PostLoad {
my $self = shift;
return ($status, $msg);
}
+=head2 RT::SavedSearch->EscapeDescription STRING
+
+This is a class method because system-level saved searches aren't true
+C<RT::SavedSearch> objects but direct C<RT::Attribute> objects.
+
+Returns C<STRING> with all square brackets except those in C<[_1]> escaped,
+ready for passing as the first argument to C<loc()>.
+
+=cut
+
+sub EscapeDescription {
+ my $self = shift;
+ my $desc = shift;
+ if ($desc) {
+ # We only use [_1] in saved search descriptions, so let's escape other "["
+ # and "]" unless they are escaped already.
+ $desc =~ s/(?<!~)\[(?!_1\])/~[/g;
+ $desc =~ s/(?<!~)(?<!\[_1)\]/~]/g;
+ }
+ return $desc;
+}
+
=head2 Type
Returns the type of this search, e.g. 'Ticket'. Useful for denoting the
return $self->{'Type'};
}
+### Internal methods
+
+# _PrivacyObjects: returns a list of objects that can be used to load, create,
+# etc. saved searches from. You probably want to use the wrapper methods like
+# ObjectsForLoading, ObjectsForCreating, etc.
+
+sub _PrivacyObjects {
+ my $self = shift;
+ my ($has_attr) = @_;
+ my $CurrentUser = $self->CurrentUser;
+
+ my $groups = RT::Groups->new($CurrentUser);
+ $groups->LimitToUserDefinedGroups;
+ $groups->WithCurrentUser;
+ if ($has_attr) {
+ my $attrs = $groups->Join(
+ ALIAS1 => 'main',
+ FIELD1 => 'id',
+ TABLE2 => 'Attributes',
+ FIELD2 => 'ObjectId',
+ );
+ $groups->Limit(
+ ALIAS => $attrs,
+ FIELD => 'ObjectType',
+ VALUE => 'RT::Group',
+ );
+ $groups->Limit(
+ ALIAS => $attrs,
+ FIELD => 'Name',
+ VALUE => $has_attr,
+ );
+ }
+
+ return ( $CurrentUser->UserObj, @{ $groups->ItemsArrayRef() } );
+}
+
+sub ObjectsForLoading {
+ my $self = shift;
+ return grep { $self->CurrentUserCanSee($_) } $self->_PrivacyObjects( "SavedSearch" );
+}
+
RT::Base->_ImportOverlays();
1;