import rt 3.6.4
[freeside.git] / rt / lib / RT / CustomFields_Overlay.pm
1 # BEGIN BPS TAGGED BLOCK {{{
2
3 # COPYRIGHT:
4 #  
5 # This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC 
6 #                                          <jesse@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/copyleft/gpl.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 =head1 NAME
49
50   RT::CustomFields - a collection of RT CustomField objects
51
52 =head1 SYNOPSIS
53
54   use RT::CustomFields;
55
56 =head1 DESCRIPTION
57
58 =head1 METHODS
59
60
61 =begin testing
62
63 ok (require RT::CustomFields);
64
65 =end testing
66
67 =cut
68
69
70 package RT::CustomFields;
71
72 use strict;
73 no warnings qw(redefine);
74 use DBIx::SearchBuilder::Unique;
75
76
77 sub _OCFAlias {
78     my $self = shift;
79     unless ($self->{_sql_ocfalias}) {
80
81         $self->{'_sql_ocfalias'} = $self->NewAlias('ObjectCustomFields');
82     $self->Join( ALIAS1 => 'main',
83                 FIELD1 => 'id',
84                 ALIAS2 => $self->_OCFAlias,
85                 FIELD2 => 'CustomField' );
86     }
87     return($self->{_sql_ocfalias});
88 }
89
90
91 # {{{ sub LimitToGlobalOrQueue 
92
93 =head2 LimitToGlobalOrQueue QUEUEID
94
95 Limits the set of custom fields found to global custom fields or those tied to the queue with ID QUEUEID 
96
97 =cut
98
99 sub LimitToGlobalOrQueue {
100     my $self = shift;
101     my $queue = shift;
102     $self->LimitToGlobalOrObjectId( $queue );
103     $self->LimitToLookupType( 'RT::Queue-RT::Ticket' );
104 }
105
106 # }}}
107
108 # {{{ sub LimitToQueue 
109
110 =head2 LimitToQueue QUEUEID
111
112 Takes a queue id (numerical) as its only argument. Makes sure that 
113 Scopes it pulls out apply to this queue (or another that you've selected with
114 another call to this method
115
116 =cut
117
118 sub LimitToQueue  {
119    my $self = shift;
120   my $queue = shift;
121  
122   $self->Limit (ALIAS => $self->_OCFAlias,
123                 ENTRYAGGREGATOR => 'OR',
124                 FIELD => 'ObjectId',
125                 VALUE => "$queue")
126       if defined $queue;
127   $self->LimitToLookupType( 'RT::Queue-RT::Ticket' );
128 }
129 # }}}
130
131 # {{{ sub LimitToGlobal
132
133 =head2 LimitToGlobal
134
135 Makes sure that 
136 Scopes it pulls out apply to all queues (or another that you've selected with
137 another call to this method or LimitToQueue
138
139 =cut
140
141
142 sub LimitToGlobal  {
143    my $self = shift;
144  
145   $self->Limit (ALIAS => $self->_OCFAlias,
146                 ENTRYAGGREGATOR => 'OR',
147                 FIELD => 'ObjectId',
148                 VALUE => 0);
149   $self->LimitToLookupType( 'RT::Queue-RT::Ticket' );
150 }
151 # }}}
152
153
154 # {{{ sub _DoSearch 
155
156 =head2 _DoSearch
157
158 A subclass of DBIx::SearchBuilder::_DoSearch that makes sure that 
159  _Disabled rows never get seen unless we're explicitly trying to see 
160 them.
161
162 =cut
163
164 sub _DoSearch {
165     my $self = shift;
166     
167     #unless we really want to find disabled rows, make sure we\'re only finding enabled ones.
168     unless($self->{'find_disabled_rows'}) {
169         $self->LimitToEnabled();
170     }
171     
172     return($self->SUPER::_DoSearch(@_));
173     
174 }
175
176 # }}}
177
178 # {{{ sub Next 
179
180 =head2 Next
181
182 Returns the next custom field that this user can see.
183
184 =cut
185   
186 sub Next {
187     my $self = shift;
188     
189     
190     my $CF = $self->SUPER::Next();
191     if ((defined($CF)) and (ref($CF))) {
192
193         if ($CF->CurrentUserHasRight('SeeCustomField')) {
194             return($CF);
195         }
196         
197         #If the user doesn't have the right to show this queue
198         else {  
199             return($self->Next());
200         }
201     }
202     #if there never was any queue
203     else {
204         return(undef);
205     }   
206     
207 }
208 # }}}
209
210 sub LimitToLookupType  {
211     my $self = shift;
212     my $lookup = shift;
213  
214     $self->Limit( FIELD => 'LookupType', VALUE => "$lookup" );
215 }
216
217 sub LimitToChildType  {
218     my $self = shift;
219     my $lookup = shift;
220  
221     $self->Limit( FIELD => 'LookupType', VALUE => "$lookup" );
222     $self->Limit( FIELD => 'LookupType', ENDSWITH => "$lookup" );
223 }
224
225 sub LimitToParentType  {
226     my $self = shift;
227     my $lookup = shift;
228  
229     $self->Limit( FIELD => 'LookupType', VALUE => "$lookup" );
230     $self->Limit( FIELD => 'LookupType', STARTSWITH => "$lookup" );
231 }
232
233 sub LimitToGlobalOrObjectId {
234     my $self = shift;
235     my $global_only = 1;
236
237
238     foreach my $id (@_) {
239         $self->Limit( ALIAS           => $self->_OCFAlias,
240                     FIELD           => 'ObjectId',
241                     OPERATOR        => '=',
242                     VALUE           => $id || 0,
243                     ENTRYAGGREGATOR => 'OR' );
244         $global_only = 0 if $id;
245     }
246
247     $self->Limit( ALIAS           => $self->_OCFAlias,
248                  FIELD           => 'ObjectId',
249                  OPERATOR        => '=',
250                  VALUE           => 0,
251                  ENTRYAGGREGATOR => 'OR' ) unless $global_only;
252
253     $self->OrderByCols(
254         { ALIAS => $self->_OCFAlias, FIELD => 'ObjectId' },
255         { ALIAS => $self->_OCFAlias, FIELD => 'SortOrder' },
256     );
257     
258     # This doesn't work on postgres. 
259     #$self->OrderBy( ALIAS => $class_cfs , FIELD => "SortOrder", ORDER => 'ASC');
260
261 }
262   
263 1;
264