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