Upgrade to 4.0.13
[usit-rt.git] / lib / RT / SavedSearch.pm
CommitLineData
84fb5b46
MKG
1# BEGIN BPS TAGGED BLOCK {{{
2#
3# COPYRIGHT:
4#
403d7b0b 5# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
84fb5b46
MKG
6# <sales@bestpractical.com>
7#
8# (Except where explicitly superseded by other copyright notices)
9#
10#
11# LICENSE:
12#
13# This work is made available to you under the terms of Version 2 of
14# the GNU General Public License. A copy of that license should have
15# been provided with this software, but in any event can be snarfed
16# from www.gnu.org.
17#
18# This work is distributed in the hope that it will be useful, but
19# WITHOUT ANY WARRANTY; without even the implied warranty of
20# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21# General Public License for more details.
22#
23# You should have received a copy of the GNU General Public License
24# along with this program; if not, write to the Free Software
25# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26# 02110-1301 or visit their web page on the internet at
27# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
28#
29#
30# CONTRIBUTION SUBMISSION POLICY:
31#
32# (The following paragraph is not intended to limit the rights granted
33# to you to modify and distribute this software under the terms of
34# the GNU General Public License and is only of importance to you if
35# you choose to contribute your changes and enhancements to the
36# community by submitting them to Best Practical Solutions, LLC.)
37#
38# By intentionally submitting any modifications, corrections or
39# derivatives to this work, or any other work intended for use with
40# Request Tracker, to Best Practical Solutions, LLC, you confirm that
41# you are the copyright holder for those contributions and you grant
42# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
43# royalty-free, perpetual, license to use, copy, create derivative
44# works based on those contributions, and sublicense and distribute
45# those contributions and any derivatives thereof.
46#
47# END BPS TAGGED BLOCK }}}
48
49=head1 NAME
50
51RT::SavedSearch - an API for saving and retrieving search form values.
52
53=head1 SYNOPSIS
54
55 use RT::SavedSearch
56
57=head1 DESCRIPTION
58
59SavedSearch is an object based on L<RT::SharedSetting> that can belong
60to either an L<RT::User> or an L<RT::Group>. It consists of an ID,
61a description, and a number of search parameters.
62
63=cut
64
65package RT::SavedSearch;
66
67use strict;
68use warnings;
69
70use base qw/RT::SharedSetting/;
71
72=head1 METHODS
73
74=head2 ObjectName
75
76An object of this class is called "search"
77
78=cut
79
5b0d0914 80sub ObjectName { "search" } # loc
84fb5b46
MKG
81
82sub PostLoad {
83 my $self = shift;
84 $self->{'Type'} = $self->{'Attribute'}->SubValue('SearchType');
85}
86
87sub SaveAttribute {
88 my $self = shift;
89 my $object = shift;
90 my $args = shift;
91
92 my $params = $args->{'SearchParams'};
93
94 $params->{'SearchType'} = $args->{'Type'} || 'Ticket';
95
96 return $object->AddAttribute(
97 'Name' => 'SavedSearch',
98 'Description' => $args->{'Name'},
99 'Content' => $params,
100 );
101}
102
103
104sub UpdateAttribute {
105 my $self = shift;
106 my $args = shift;
107 my $params = $args->{'SearchParams'} || {};
108
109 my ($status, $msg) = $self->{'Attribute'}->SetSubValues(%$params);
110
111 if ($status && $args->{'Name'}) {
112 ($status, $msg) = $self->{'Attribute'}->SetDescription($args->{'Name'});
113 }
114
115 return ($status, $msg);
116}
117
403d7b0b
MKG
118=head2 RT::SavedSearch->EscapeDescription STRING
119
120This is a class method because system-level saved searches aren't true
121C<RT::SavedSearch> objects but direct C<RT::Attribute> objects.
122
123Returns C<STRING> with all square brackets except those in C<[_1]> escaped,
124ready for passing as the first argument to C<loc()>.
125
126=cut
127
128sub EscapeDescription {
129 my $self = shift;
130 my $desc = shift;
131 if ($desc) {
132 # We only use [_1] in saved search descriptions, so let's escape other "["
133 # and "]" unless they are escaped already.
134 $desc =~ s/(?<!~)\[(?!_1\])/~[/g;
135 $desc =~ s/(?<!~)(?<!\[_1)\]/~]/g;
136 }
137 return $desc;
138}
139
84fb5b46
MKG
140=head2 Type
141
142Returns the type of this search, e.g. 'Ticket'. Useful for denoting the
143saved searches that are relevant to a particular search page.
144
145=cut
146
147sub Type {
148 my $self = shift;
149 return $self->{'Type'};
150}
151
152### Internal methods
153
154# _PrivacyObjects: returns a list of objects that can be used to load, create,
155# etc. saved searches from. You probably want to use the wrapper methods like
156# ObjectsForLoading, ObjectsForCreating, etc.
157
158sub _PrivacyObjects {
159 my $self = shift;
160 my ($has_attr) = @_;
161 my $CurrentUser = $self->CurrentUser;
162
163 my $groups = RT::Groups->new($CurrentUser);
164 $groups->LimitToUserDefinedGroups;
165 $groups->WithMember( PrincipalId => $CurrentUser->Id,
166 Recursively => 1 );
167 if ($has_attr) {
168 my $attrs = $groups->Join(
169 ALIAS1 => 'main',
170 FIELD1 => 'id',
171 TABLE2 => 'Attributes',
172 FIELD2 => 'ObjectId',
173 );
174 $groups->Limit(
175 ALIAS => $attrs,
176 FIELD => 'ObjectType',
177 VALUE => 'RT::Group',
178 );
179 $groups->Limit(
180 ALIAS => $attrs,
181 FIELD => 'Name',
182 VALUE => $has_attr,
183 );
184 }
185
186 return ( $CurrentUser->UserObj, @{ $groups->ItemsArrayRef() } );
187}
188
189sub ObjectsForLoading {
190 my $self = shift;
191 return grep { $self->CurrentUserCanSee($_) } $self->_PrivacyObjects( "SavedSearch" );
192}
193
194RT::Base->_ImportOverlays();
195
1961;