7f6f258c9c4a6a4c39cf9236f68622ed07cb7ac7
[freeside.git] / rt / lib / RT / Attachments.pm
1 # BEGIN BPS TAGGED BLOCK {{{
2 #
3 # COPYRIGHT:
4 #
5 # This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
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
51   RT::Attachments - a collection of RT::Attachment objects
52
53 =head1 SYNOPSIS
54
55   use RT::Attachments;
56
57 =head1 DESCRIPTION
58
59 This module should never be called directly by client code. it's an internal module which
60 should only be accessed through exported APIs in Ticket, Queue and other similar objects.
61
62
63 =head1 METHODS
64
65
66
67 =cut
68
69
70 package RT::Attachments;
71 use strict;
72 use warnings;
73
74
75 use RT::Attachment;
76
77 use base 'RT::SearchBuilder';
78
79 sub Table { 'Attachments'}
80
81
82 use RT::Attachment;
83
84 sub _Init   {
85     my $self = shift;
86     $self->{'table'} = "Attachments";
87     $self->{'primary_key'} = "id";
88     $self->OrderBy(
89         FIELD => 'id',
90         ORDER => 'ASC',
91     );
92     return $self->SUPER::_Init( @_ );
93 }
94
95 sub CleanSlate {
96     my $self = shift;
97     delete $self->{_sql_transaction_alias};
98     return $self->SUPER::CleanSlate( @_ );
99 }
100
101
102 =head2 TransactionAlias
103
104 Returns alias for transactions table with applied join condition.
105 Always return the same alias, so if you want to build some complex
106 or recursive joining then you have to create new alias youself.
107
108 =cut
109
110 sub TransactionAlias {
111     my $self = shift;
112     return $self->{'_sql_transaction_alias'}
113         if $self->{'_sql_transaction_alias'};
114
115     my $res = $self->NewAlias('Transactions');
116     $self->Limit(
117         ENTRYAGGREGATOR => 'AND',
118         FIELD           => 'TransactionId',
119         VALUE           => $res . '.id',
120         QUOTEVALUE      => 0,
121     );
122     return $self->{'_sql_transaction_alias'} = $res;
123 }
124
125 =head2 ContentType (VALUE => 'text/plain', ENTRYAGGREGATOR => 'OR', OPERATOR => '=' ) 
126
127 Limit result set to attachments of ContentType 'TYPE'...
128
129 =cut
130
131
132 sub ContentType  {
133     my $self = shift;
134     my %args = (
135         VALUE           => 'text/plain',
136             OPERATOR        => '=',
137             ENTRYAGGREGATOR => 'OR',
138             @_
139     );
140
141     return $self->Limit ( %args, FIELD => 'ContentType' );
142 }
143
144 =head2 ChildrenOf ID
145
146 Limit result set to children of Attachment ID
147
148 =cut
149
150
151 sub ChildrenOf  {
152     my $self = shift;
153     my $attachment = shift;
154     return $self->Limit(
155         FIELD => 'Parent',
156         VALUE => $attachment
157     );
158 }
159
160 =head2 LimitNotEmpty
161
162 Limit result set to attachments with not empty content.
163
164 =cut
165
166 sub LimitNotEmpty {
167     my $self = shift;
168     $self->Limit(
169         ENTRYAGGREGATOR => 'AND',
170         FIELD           => 'Content',
171         OPERATOR        => 'IS NOT',
172         VALUE           => 'NULL',
173         QUOTEVALUE      => 0,
174     );
175
176     # http://rt3.fsck.com/Ticket/Display.html?id=12483
177     if ( RT->Config->Get('DatabaseType') ne 'Oracle' ) {
178         $self->Limit(
179             ENTRYAGGREGATOR => 'AND',
180             FIELD           => 'Content',
181             OPERATOR        => '!=',
182             VALUE           => '',
183         );
184     }
185     return;
186 }
187
188 =head2 LimitByTicket $ticket_id
189
190 Limit result set to attachments of a ticket.
191
192 =cut
193
194 sub LimitByTicket {
195     my $self = shift;
196     my $tid = shift;
197
198     my $transactions = $self->TransactionAlias;
199     $self->Limit(
200         ENTRYAGGREGATOR => 'AND',
201         ALIAS           => $transactions,
202         FIELD           => 'ObjectType',
203         VALUE           => 'RT::Ticket',
204     );
205
206     my $tickets = $self->NewAlias('Tickets');
207     $self->Limit(
208         ENTRYAGGREGATOR => 'AND',
209         ALIAS           => $tickets,
210         FIELD           => 'id',
211         VALUE           => $transactions . '.ObjectId',
212         QUOTEVALUE      => 0,
213     );
214     $self->Limit(
215         ENTRYAGGREGATOR => 'AND',
216         ALIAS           => $tickets,
217         FIELD           => 'EffectiveId',
218         VALUE           => $tid,
219     );
220     return;
221 }
222
223 # {{{ sub Next
224 sub Next {
225     my $self = shift;
226
227     my $Attachment = $self->SUPER::Next;
228     return $Attachment unless $Attachment;
229
230     if ( $Attachment->TransactionObj->CurrentUserCanSee ) {
231         return $Attachment;
232     } else {
233         # If the user doesn't have the right to show this ticket
234         return $self->Next;
235     }
236 }
237
238
239 =head2 NewItem
240
241 Returns an empty new RT::Attachment item
242
243 =cut
244
245 sub NewItem {
246     my $self = shift;
247     return(RT::Attachment->new($self->CurrentUser));
248 }
249
250 RT::Base->_ImportOverlays();
251
252 1;