X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Flib%2FRT%2FAttachments_Overlay.pm;h=d758c76e821b356534bb4e5a15e17931cc1188b0;hb=96a0d937cdfe26d691e59139088e33e0bc3e1184;hp=395cee1b167129113414c336799828f45900a970;hpb=c648976f0b7975f2328ebd7ba8c711fad0ca4195;p=freeside.git diff --git a/rt/lib/RT/Attachments_Overlay.pm b/rt/lib/RT/Attachments_Overlay.pm index 395cee1b1..d758c76e8 100644 --- a/rt/lib/RT/Attachments_Overlay.pm +++ b/rt/lib/RT/Attachments_Overlay.pm @@ -1,40 +1,40 @@ # BEGIN BPS TAGGED BLOCK {{{ -# +# # COPYRIGHT: -# -# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC -# -# +# +# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +# +# # (Except where explicitly superseded by other copyright notices) -# -# +# +# # LICENSE: -# +# # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have # been provided with this software, but in any event can be snarfed # from www.gnu.org. -# +# # This work is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/copyleft/gpl.html. -# -# +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# +# # CONTRIBUTION SUBMISSION POLICY: -# +# # (The following paragraph is not intended to limit the rights granted # to you to modify and distribute this software under the terms of # the GNU General Public License and is only of importance to you if # you choose to contribute your changes and enhancements to the # community by submitting them to Best Practical Solutions, LLC.) -# +# # By intentionally submitting any modifications, corrections or # derivatives to this work, or any other work intended for use with # Request Tracker, to Best Practical Solutions, LLC, you confirm that @@ -43,8 +43,9 @@ # royalty-free, perpetual, license to use, copy, create derivative # works based on those contributions, and sublicense and distribute # those contributions and any derivatives thereof. -# +# # END BPS TAGGED BLOCK }}} + =head1 NAME RT::Attachments - a collection of RT::Attachment objects @@ -62,11 +63,6 @@ should only be accessed through exported APIs in Ticket, Queue and other similar =head1 METHODS -=begin testing - -ok (require RT::Attachments); - -=end testing =cut @@ -76,20 +72,48 @@ package RT::Attachments; use strict; no warnings qw(redefine); -# {{{ sub _Init +use RT::Attachment; + sub _Init { - my $self = shift; - - $self->{'table'} = "Attachments"; - $self->{'primary_key'} = "id"; - $self->OrderBy ( FIELD => 'id', - ORDER => 'ASC'); - return ( $self->SUPER::_Init(@_)); + my $self = shift; + $self->{'table'} = "Attachments"; + $self->{'primary_key'} = "id"; + $self->OrderBy( + FIELD => 'id', + ORDER => 'ASC', + ); + return $self->SUPER::_Init( @_ ); } -# }}} +sub CleanSlate { + my $self = shift; + delete $self->{_sql_transaction_alias}; + return $self->SUPER::CleanSlate( @_ ); +} + + +=head2 TransactionAlias -# {{{ sub ContentType +Returns alias for transactions table with applied join condition. +Always return the same alias, so if you want to build some complex +or recursive joining then you have to create new alias youself. + +=cut + +sub TransactionAlias { + my $self = shift; + return $self->{'_sql_transaction_alias'} + if $self->{'_sql_transaction_alias'}; + + my $res = $self->NewAlias('Transactions'); + $self->Limit( + ENTRYAGGREGATOR => 'AND', + FIELD => 'TransactionId', + VALUE => $res . '.id', + QUOTEVALUE => 0, + ); + return $self->{'_sql_transaction_alias'} = $res; +} =head2 ContentType (VALUE => 'text/plain', ENTRYAGGREGATOR => 'OR', OPERATOR => '=' ) @@ -99,20 +123,16 @@ Limit result set to attachments of ContentType 'TYPE'... sub ContentType { - my $self = shift; - my %args = ( VALUE => 'text/plain', - OPERATOR => '=', - ENTRYAGGREGATOR => 'OR', - @_); - - $self->Limit ( FIELD => 'ContentType', - VALUE => $args{'VALUE'}, - OPERATOR => $args{'OPERATOR'}, - ENTRYAGGREGATOR => $args{'ENTRYAGGREGATOR'}); + my $self = shift; + my %args = ( + VALUE => 'text/plain', + OPERATOR => '=', + ENTRYAGGREGATOR => 'OR', + @_ + ); + + return $self->Limit ( %args, FIELD => 'ContentType' ); } -# }}} - -# {{{ sub ChildrenOf =head2 ChildrenOf ID @@ -122,52 +142,101 @@ Limit result set to children of Attachment ID sub ChildrenOf { - my $self = shift; - my $attachment = shift; - $self->Limit ( FIELD => 'Parent', - VALUE => $attachment); + my $self = shift; + my $attachment = shift; + return $self->Limit( + FIELD => 'Parent', + VALUE => $attachment + ); +} + +=head2 LimitNotEmpty + +Limit result set to attachments with not empty content. + +=cut + +sub LimitNotEmpty { + my $self = shift; + $self->Limit( + ENTRYAGGREGATOR => 'AND', + FIELD => 'Content', + OPERATOR => 'IS NOT', + VALUE => 'NULL', + QUOTEVALUE => 0, + ); + + # http://rt3.fsck.com/Ticket/Display.html?id=12483 + if ( RT->Config->Get('DatabaseType') ne 'Oracle' ) { + $self->Limit( + ENTRYAGGREGATOR => 'AND', + FIELD => 'Content', + OPERATOR => '!=', + VALUE => '', + ); + } + return; +} + +=head2 LimitByTicket $ticket_id + +Limit result set to attachments of a ticket. + +=cut + +sub LimitByTicket { + my $self = shift; + my $tid = shift; + + my $transactions = $self->TransactionAlias; + $self->Limit( + ENTRYAGGREGATOR => 'AND', + ALIAS => $transactions, + FIELD => 'ObjectType', + VALUE => 'RT::Ticket', + ); + + my $tickets = $self->NewAlias('Tickets'); + $self->Limit( + ENTRYAGGREGATOR => 'AND', + ALIAS => $tickets, + FIELD => 'id', + VALUE => $transactions . '.ObjectId', + QUOTEVALUE => 0, + ); + $self->Limit( + ENTRYAGGREGATOR => 'AND', + ALIAS => $tickets, + FIELD => 'EffectiveId', + VALUE => $tid, + ); + return; } -# }}} # {{{ sub NewItem sub NewItem { my $self = shift; - - use RT::Attachment; - my $item = new RT::Attachment($self->CurrentUser); - return($item); + return RT::Attachment->new( $self->CurrentUser ); } # }}} # {{{ sub Next sub Next { my $self = shift; - - my $Attachment = $self->SUPER::Next(); - if ((defined($Attachment)) and (ref($Attachment))) { - if ($Attachment->TransactionObj->__Value('Type') =~ /^Comment/ && - $Attachment->TransactionObj->TicketObj->CurrentUserHasRight('ShowTicketComments')) { - return($Attachment); - } elsif ($Attachment->TransactionObj->__Value('Type') !~ /^Comment/ && - $Attachment->TransactionObj->TicketObj->CurrentUserHasRight('ShowTicket')) { - return($Attachment); - } - - #If the user doesn't have the right to show this ticket - else { - return($self->Next()); - } + + my $Attachment = $self->SUPER::Next; + return $Attachment unless $Attachment; + + my $txn = $Attachment->TransactionObj; + if ( $txn->__Value('Type') eq 'Comment' ) { + return $Attachment if $txn->CurrentUserHasRight('ShowTicketComments'); + } elsif ( $txn->CurrentUserHasRight('ShowTicket') ) { + return $Attachment; } - #if there never was any ticket - else { - return(undef); - } + # If the user doesn't have the right to show this ticket + return $self->Next; } # }}} - 1; - - - - +1;