diff options
author | ivan <ivan> | 2010-07-20 00:59:02 +0000 |
---|---|---|
committer | ivan <ivan> | 2010-07-20 00:59:02 +0000 |
commit | 25591d52b441b5bfa34f0ffef1095098e1d2f1b2 (patch) | |
tree | 3f2881729adba24830ac73690523a1c5e64987b7 /rt/lib/RT/Tickets_Overlay.pm | |
parent | 1a62d4a284a58919716f076baa594f02dda2472d (diff) |
RT custom fields patch, RT#8449
Diffstat (limited to 'rt/lib/RT/Tickets_Overlay.pm')
-rw-r--r-- | rt/lib/RT/Tickets_Overlay.pm | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/rt/lib/RT/Tickets_Overlay.pm b/rt/lib/RT/Tickets_Overlay.pm index e8d350dea..0d3264c4b 100644 --- a/rt/lib/RT/Tickets_Overlay.pm +++ b/rt/lib/RT/Tickets_Overlay.pm @@ -136,6 +136,7 @@ our %FIELD_METADATA = ( QueueAdminCc => [ 'WATCHERFIELD' => 'AdminCc' => 'Queue', ], #loc_left_pair QueueWatcher => [ 'WATCHERFIELD' => undef => 'Queue', ], #loc_left_pair CustomFieldValue => [ 'CUSTOMFIELD', ], #loc_left_pair + DateCustomFieldValue => [ 'DATECUSTOMFIELD', ], CustomField => [ 'CUSTOMFIELD', ], #loc_left_pair CF => [ 'CUSTOMFIELD', ], #loc_left_pair Updated => [ 'TRANSDATE', ], #loc_left_pair @@ -160,6 +161,7 @@ our %dispatch = ( WATCHERFIELD => \&_WatcherLimit, MEMBERSHIPFIELD => \&_WatcherMembershipLimit, CUSTOMFIELD => \&_CustomFieldLimit, + DATECUSTOMFIELD => \&_DateCustomFieldLimit, HASATTRIBUTE => \&_HasAttributeLimit, ); our %can_bundle = ();# WATCHERFIELD => "yes", ); @@ -1340,6 +1342,101 @@ sub _CustomFieldJoin { return ($TicketCFs, $CFs); } +=head2 _DateCustomFieldLimit + +Limit based on CustomFields of type Date + +Meta Data: + none + +=cut + +sub _DateCustomFieldLimit { + my ( $self, $_field, $op, $value, %rest ) = @_; + + my $field = $rest{'SUBKEY'} || die "No field specified"; + + # For our sanity, we can only limit on one queue at a time + + my ($queue, $cfid, $column); + ($queue, $field, $cfid, $column) = $self->_CustomFieldDecipher( $field ); + +# If we're trying to find custom fields that don't match something, we +# want tickets where the custom field has no value at all. Note that +# we explicitly don't include the "IS NULL" case, since we would +# otherwise end up with a redundant clause. + + my $null_columns_ok; + if ( ( $op =~ /^NOT LIKE$/i ) or ( $op eq '!=' ) ) { + $null_columns_ok = 1; + } + + my $cfkey = $cfid ? $cfid : "$queue.$field"; + my ($TicketCFs, $CFs) = $self->_CustomFieldJoin( $cfkey, $cfid, $field ); + + $self->_OpenParen; + + if ( $CFs && !$cfid ) { + $self->SUPER::Limit( + ALIAS => $CFs, + FIELD => 'Name', + VALUE => $field, + ENTRYAGGREGATOR => 'AND', + ); + } + + $self->_OpenParen if $null_columns_ok; + + my $date = RT::Date->new( $self->CurrentUser ); + $date->Set( Format => 'unknown', Value => $value ); + + if ( $op eq "=" ) { + + # if we're specifying =, that means we want everything on a + # particular single day. in the database, we need to check for > + # and < the edges of that day. + + $date->SetToMidnight( Timezone => 'server' ); + my $daystart = $date->ISO; + $date->AddDay; + my $dayend = $date->ISO; + + $self->_OpenParen; + + $self->_SQLLimit( + ALIAS => $TicketCFs, + FIELD => 'Content', + OPERATOR => ">=", + VALUE => $daystart, + %rest, + ); + + $self->_SQLLimit( + ALIAS => $TicketCFs, + FIELD => 'Content', + OPERATOR => "<=", + VALUE => $dayend, + %rest, + ENTRYAGGREGATOR => 'AND', + ); + + $self->_CloseParen; + + } + else { + $self->_SQLLimit( + ALIAS => $TicketCFs, + FIELD => 'Content', + OPERATOR => $op, + VALUE => $date->ISO, + %rest, + ); + } + + $self->_CloseParen; + +} + =head2 _CustomFieldLimit Limit based on CustomFields @@ -2667,6 +2764,11 @@ sub LimitCustomField { $args{CUSTOMFIELD} = $CF->Id; } + # Handle special customfields types + if ($CF->Type eq 'Date') { + $args{FIELD} = 'DateCustomFieldValue'; + } + #If we are looking to compare with a null value. if ( $args{'OPERATOR'} =~ /^is$/i ) { $args{'DESCRIPTION'} |