[Rt-commit] rt branch, 4.0/cf-date-parse-in-search, created. rt-4.0.2-119-g3de7dde

? sunnavy sunnavy at bestpractical.com
Tue Sep 27 01:56:19 EDT 2011


The branch, 4.0/cf-date-parse-in-search has been created
        at  3de7dde19c9ec770396f7e0439557f1c0155e776 (commit)

- Log -----------------------------------------------------------------
commit 3de7dde19c9ec770396f7e0439557f1c0155e776
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Tue Sep 27 13:19:56 2011 +0800

    use RT::Date to parse cf date values like "tomorrow" in search

diff --git a/lib/RT/Tickets.pm b/lib/RT/Tickets.pm
index 5401373..cea4e94 100644
--- a/lib/RT/Tickets.pm
+++ b/lib/RT/Tickets.pm
@@ -1514,6 +1514,24 @@ sub _CustomFieldLimit {
         }
     }
 
+    if ( $cf && $cf->Type =~ /^Date(?:Time)?$/ ) {
+        my $date = RT::Date->new( $self->CurrentUser );
+        $date->Set( Format => 'unknown', Value => $value );
+        if ( $date->Unix ) {
+
+            # don't consider tz for Date, use server's all the time.
+            if ( $cf->Type eq 'Date' || $value !~ /:/ ) {
+                $value = $date->Date( Timezone => 'server' );
+            }
+            else {
+                $value = $date->DateTime;
+            }
+        }
+        else {
+            $RT::Logger->warn("$value is not a valid date string");
+        }
+    }
+
     my $single_value = !$cf || !$cfid || $cf->SingleValue;
 
     my $cfkey = $cfid ? $cfid : "$queue.$field";
@@ -1611,52 +1629,41 @@ sub _CustomFieldLimit {
             $cf->Load($field);
 
             # need special treatment for Date
-            if ( $cf->Type eq 'DateTime' && $op eq '=' ) {
+            if ( $cf->Type eq 'DateTime' && $op eq '=' && $value !~ /:/ ) {
 
-                if ( $value =~ /:/ ) {
-                    # there is time speccified.
-                    my $date = RT::Date->new( $self->CurrentUser );
-                    $date->Set( Format => 'unknown', Value => $value );
-                    $self->_SQLLimit(
-                        ALIAS    => $TicketCFs,
-                        FIELD    => 'Content',
-                        OPERATOR => "=",
-                        VALUE    => $date->ISO,
-                        %rest,
-                    );
-                }
-                else {
                 # no time specified, that means we want everything on a
                 # particular day.  in the database, we need to check for >
                 # and < the edges of that day.
-                    my $date = RT::Date->new( $self->CurrentUser );
-                    $date->Set( Format => 'unknown', Value => $value );
-                    $date->SetToMidnight( Timezone => 'server' );
-                    my $daystart = $date->ISO;
-                    $date->AddDay;
-                    my $dayend = $date->ISO;
+                my $date = RT::Date->new( $self->CurrentUser );
+                $date->Set(
+                    Format   => 'unknown',
+                    Value    => $value,
+                    Timezone => 'UTC',
+                );
+                my $daystart = $date->ISO;
+                $date->AddDay;
+                my $dayend = $date->ISO;
 
-                    $self->_OpenParen;
+                $self->_OpenParen;
 
-                    $self->_SQLLimit(
-                        ALIAS    => $TicketCFs,
-                        FIELD    => 'Content',
-                        OPERATOR => ">=",
-                        VALUE    => $daystart,
-                        %rest,
-                    );
+                $self->_SQLLimit(
+                    ALIAS    => $TicketCFs,
+                    FIELD    => 'Content',
+                    OPERATOR => ">=",
+                    VALUE    => $daystart,
+                    %rest,
+                );
 
-                    $self->_SQLLimit(
-                        ALIAS    => $TicketCFs,
-                        FIELD    => 'Content',
-                        OPERATOR => "<=",
-                        VALUE    => $dayend,
-                        %rest,
-                        ENTRYAGGREGATOR => 'AND',
-                    );
+                $self->_SQLLimit(
+                    ALIAS    => $TicketCFs,
+                    FIELD    => 'Content',
+                    OPERATOR => "<=",
+                    VALUE    => $dayend,
+                    %rest,
+                    ENTRYAGGREGATOR => 'AND',
+                );
 
-                    $self->_CloseParen;
-                }
+                $self->_CloseParen;
             }
             elsif ( $op eq '=' || $op eq '!=' || $op eq '<>' ) {
                 if ( length( Encode::encode_utf8($value) ) < 256 ) {

-----------------------------------------------------------------------


More information about the Rt-commit mailing list