import rt 3.6.4
[freeside.git] / rt / lib / RT / CustomFields_Overlay.pm
index 97c7cb8..16b86ba 100644 (file)
@@ -1,8 +1,14 @@
-# BEGIN LICENSE BLOCK
+# BEGIN BPS TAGGED BLOCK {{{
 # 
 # 
-# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+# COPYRIGHT:
+#  
+# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC 
+#                                          <jesse@bestpractical.com>
 # 
 # 
-# (Except where explictly superceded by other copyright notices)
+# (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
 # 
 # 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
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 # General Public License for more details.
 # 
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 # General Public License for more details.
 # 
-# Unless otherwise specified, all modifications, corrections or
-# extensions to this work which alter its source code become the
-# property of Best Practical Solutions, LLC when submitted for
-# inclusion in the work.
+# 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.
+# 
+# 
+# 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.)
 # 
 # 
-# END LICENSE BLOCK
+# 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
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+# 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::CustomFields - a collection of RT CustomField objects
 =head1 NAME
 
   RT::CustomFields - a collection of RT CustomField objects
@@ -42,13 +66,31 @@ ok (require RT::CustomFields);
 
 =cut
 
 
 =cut
 
+
+package RT::CustomFields;
+
 use strict;
 no warnings qw(redefine);
 use strict;
 no warnings qw(redefine);
+use DBIx::SearchBuilder::Unique;
+
+
+sub _OCFAlias {
+    my $self = shift;
+    unless ($self->{_sql_ocfalias}) {
+
+        $self->{'_sql_ocfalias'} = $self->NewAlias('ObjectCustomFields');
+    $self->Join( ALIAS1 => 'main',
+                FIELD1 => 'id',
+                ALIAS2 => $self->_OCFAlias,
+                FIELD2 => 'CustomField' );
+    }
+    return($self->{_sql_ocfalias});
+}
 
 
 # {{{ sub LimitToGlobalOrQueue 
 
 
 
 # {{{ sub LimitToGlobalOrQueue 
 
-=item LimitToGlobalOrQueue QUEUEID
+=head2 LimitToGlobalOrQueue QUEUEID
 
 Limits the set of custom fields found to global custom fields or those tied to the queue with ID QUEUEID 
 
 
 Limits the set of custom fields found to global custom fields or those tied to the queue with ID QUEUEID 
 
@@ -57,8 +99,8 @@ Limits the set of custom fields found to global custom fields or those tied to t
 sub LimitToGlobalOrQueue {
     my $self = shift;
     my $queue = shift;
 sub LimitToGlobalOrQueue {
     my $self = shift;
     my $queue = shift;
-    $self->LimitToQueue($queue);
-    $self->LimitToGlobal();
+    $self->LimitToGlobalOrObjectId( $queue );
+    $self->LimitToLookupType( 'RT::Queue-RT::Ticket' );
 }
 
 # }}}
 }
 
 # }}}
@@ -77,11 +119,12 @@ sub LimitToQueue  {
    my $self = shift;
   my $queue = shift;
  
    my $self = shift;
   my $queue = shift;
  
-  $self->Limit (ENTRYAGGREGATOR => 'OR',
-               FIELD => 'Queue',
+  $self->Limit (ALIAS => $self->_OCFAlias,
+                ENTRYAGGREGATOR => 'OR',
+               FIELD => 'ObjectId',
                VALUE => "$queue")
       if defined $queue;
                VALUE => "$queue")
       if defined $queue;
-  
+  $self->LimitToLookupType( 'RT::Queue-RT::Ticket' );
 }
 # }}}
 
 }
 # }}}
 
@@ -99,10 +142,11 @@ another call to this method or LimitToQueue
 sub LimitToGlobal  {
    my $self = shift;
  
 sub LimitToGlobal  {
    my $self = shift;
  
-  $self->Limit (ENTRYAGGREGATOR => 'OR',
-               FIELD => 'Queue',
+  $self->Limit (ALIAS => $self->_OCFAlias,
+                ENTRYAGGREGATOR => 'OR',
+               FIELD => 'ObjectId',
                VALUE => 0);
                VALUE => 0);
-  
+  $self->LimitToLookupType( 'RT::Queue-RT::Ticket' );
 }
 # }}}
 
 }
 # }}}
 
@@ -111,9 +155,9 @@ sub LimitToGlobal  {
 
 =head2 _DoSearch
 
 
 =head2 _DoSearch
 
-  A subclass of DBIx::SearchBuilder::_DoSearch that makes sure that _Disabled ro
-ws never get seen unless
-we're explicitly trying to see them.
+A subclass of DBIx::SearchBuilder::_DoSearch that makes sure that 
+ _Disabled rows never get seen unless we're explicitly trying to see 
+them.
 
 =cut
 
 
 =cut
 
@@ -130,6 +174,91 @@ sub _DoSearch {
 }
 
 # }}}
 }
 
 # }}}
+
+# {{{ sub Next 
+
+=head2 Next
+
+Returns the next custom field that this user can see.
+
+=cut
+  
+sub Next {
+    my $self = shift;
+    
+    
+    my $CF = $self->SUPER::Next();
+    if ((defined($CF)) and (ref($CF))) {
+
+       if ($CF->CurrentUserHasRight('SeeCustomField')) {
+           return($CF);
+       }
+       
+       #If the user doesn't have the right to show this queue
+       else {  
+           return($self->Next());
+       }
+    }
+    #if there never was any queue
+    else {
+       return(undef);
+    }  
+    
+}
+# }}}
+
+sub LimitToLookupType  {
+    my $self = shift;
+    my $lookup = shift;
+    $self->Limit( FIELD => 'LookupType', VALUE => "$lookup" );
+}
+
+sub LimitToChildType  {
+    my $self = shift;
+    my $lookup = shift;
+    $self->Limit( FIELD => 'LookupType', VALUE => "$lookup" );
+    $self->Limit( FIELD => 'LookupType', ENDSWITH => "$lookup" );
+}
+
+sub LimitToParentType  {
+    my $self = shift;
+    my $lookup = shift;
+    $self->Limit( FIELD => 'LookupType', VALUE => "$lookup" );
+    $self->Limit( FIELD => 'LookupType', STARTSWITH => "$lookup" );
+}
+
+sub LimitToGlobalOrObjectId {
+    my $self = shift;
+    my $global_only = 1;
+
+
+    foreach my $id (@_) {
+       $self->Limit( ALIAS           => $self->_OCFAlias,
+                   FIELD           => 'ObjectId',
+                   OPERATOR        => '=',
+                   VALUE           => $id || 0,
+                   ENTRYAGGREGATOR => 'OR' );
+       $global_only = 0 if $id;
+    }
+
+    $self->Limit( ALIAS           => $self->_OCFAlias,
+                 FIELD           => 'ObjectId',
+                 OPERATOR        => '=',
+                 VALUE           => 0,
+                 ENTRYAGGREGATOR => 'OR' ) unless $global_only;
+
+    $self->OrderByCols(
+       { ALIAS => $self->_OCFAlias, FIELD => 'ObjectId' },
+       { ALIAS => $self->_OCFAlias, FIELD => 'SortOrder' },
+    );
+    
+    # This doesn't work on postgres. 
+    #$self->OrderBy( ALIAS => $class_cfs , FIELD => "SortOrder", ORDER => 'ASC');
+
+}
   
 1;
 
   
 1;