summaryrefslogtreecommitdiff
path: root/rt/lib/RT/Report
diff options
context:
space:
mode:
authorivan <ivan>2010-05-18 18:49:59 +0000
committerivan <ivan>2010-05-18 18:49:59 +0000
commite70abd21bab68b23488f7ef1ee2e693a3b365691 (patch)
tree75986ffa9ba6ab4f961f9033468a1344e1653408 /rt/lib/RT/Report
parentb4b0c7e72d7eaee2fbfc7022022c9698323203dd (diff)
import rt 3.8.8
Diffstat (limited to 'rt/lib/RT/Report')
-rw-r--r--rt/lib/RT/Report/Tickets.pm64
-rw-r--r--rt/lib/RT/Report/Tickets/Entry.pm27
2 files changed, 75 insertions, 16 deletions
diff --git a/rt/lib/RT/Report/Tickets.pm b/rt/lib/RT/Report/Tickets.pm
index c539ab10e..c34d1cbdd 100644
--- a/rt/lib/RT/Report/Tickets.pm
+++ b/rt/lib/RT/Report/Tickets.pm
@@ -68,14 +68,13 @@ sub Groupings {
);
}
- push @fields, map {$_, $_} qw(
- DueDaily DueMonthly DueAnnually
- ResolvedDaily ResolvedMonthly ResolvedAnnually
- CreatedDaily CreatedMonthly CreatedAnnually
- LastUpdatedDaily LastUpdatedMonthly LastUpdatedAnnually
- StartedDaily StartedMonthly StartedAnnually
- StartsDaily StartsMonthly StartsAnnually
- );
+
+ for my $field (qw(Due Resolved Created LastUpdated Started Starts)) {
+ for my $frequency (qw(Hourly Daily Monthly Annually)) {
+ my $item = $field.$frequency;
+ push @fields, $item, $item;
+ }
+ }
my $queues = $args{'Queues'};
if ( !$queues && $args{'Query'} ) {
@@ -183,20 +182,53 @@ sub _FieldToFunction {
my $field = $args{'FIELD'};
- if ($field =~ /^(.*)(Daily|Monthly|Annually)$/) {
+ if ($field =~ /^(.*)(Hourly|Daily|Monthly|Annually)$/) {
my ($field, $grouping) = ($1, $2);
my $alias = $args{'ALIAS'} || 'main';
+
+ my $func = "$alias.$field";
+
+ my $db_type = RT->Config->Get('DatabaseType');
+ if ( RT->Config->Get('ChartsTimezonesInDB') ) {
+ my $tz = $self->CurrentUser->UserObj->Timezone
+ || RT->Config->Get('Timezone')
+ || 'UTC';
+ if ( lc $tz eq 'utc' ) {
+ # do nothing
+ }
+ elsif ( $db_type eq 'Pg' ) {
+ $func = "timezone('UTC', $func)";
+ $func = "timezone(". $self->_Handle->dbh->quote($tz) .", $func)";
+ }
+ elsif ( $db_type eq 'mysql' ) {
+ $func = "CONVERT_TZ($func, 'UTC', "
+ . $self->_Handle->dbh->quote($tz)
+ .")";
+ }
+ else {
+ $RT::Logger->warning(
+ "ChartsTimezonesInDB config option"
+ ." is not supported on $db_type."
+ );
+ }
+ }
+
# Pg 8.3 requires explicit casting
- $field .= '::text' if RT->Config->Get('DatabaseType') eq 'Pg';
- if ( $grouping =~ /Daily/ ) {
- $args{'FUNCTION'} = "SUBSTR($alias.$field,1,10)";
+ $func .= '::text' if $db_type eq 'Pg';
+
+ if ( $grouping eq 'Hourly' ) {
+ $func = "SUBSTR($func,1,13)";
+ }
+ if ( $grouping eq 'Daily' ) {
+ $func = "SUBSTR($func,1,10)";
}
- elsif ( $grouping =~ /Monthly/ ) {
- $args{'FUNCTION'} = "SUBSTR($alias.$field,1,7)";
+ elsif ( $grouping eq 'Monthly' ) {
+ $func = "SUBSTR($func,1,7)";
}
- elsif ( $grouping =~ /Annually/ ) {
- $args{'FUNCTION'} = "SUBSTR($alias.$field,1,4)";
+ elsif ( $grouping eq 'Annually' ) {
+ $func = "SUBSTR($func,1,4)";
}
+ $args{'FUNCTION'} = $func;
} elsif ( $field =~ /^(?:CF|CustomField)\.{(.*)}$/ ) { #XXX: use CFDecipher method
my $cf_name = $1;
my $cf = RT::CustomField->new( $self->CurrentUser );
diff --git a/rt/lib/RT/Report/Tickets/Entry.pm b/rt/lib/RT/Report/Tickets/Entry.pm
index 49c1a9225..78e4cab22 100644
--- a/rt/lib/RT/Report/Tickets/Entry.pm
+++ b/rt/lib/RT/Report/Tickets/Entry.pm
@@ -52,6 +52,33 @@ use base qw/RT::Record/;
# XXX TODO: how the heck do we acl a report?
sub CurrentUserHasRight {1}
+=head2 LabelValue
+
+If you're pulling a value out of this collection and using it as a label,
+you may want the "cleaned up" version. This includes scrubbing 1970 dates
+and ensuring that dates are in local not DB timezones.
+
+=cut
+
+sub LabelValue {
+ my $self = shift;
+ my $field = shift;
+ my $value = $self->__Value( $field );
+
+ if ( $field =~ /(Daily|Monthly|Annually|Hourly)$/ ) {
+ my $re;
+ # it's not just 1970-01-01 00:00:00 because of timezone shifts
+ # and conversion from UTC to user's TZ
+ $re = qr{19(?:70-01-01|69-12-31) [0-9]{2}} if $field =~ /Hourly$/;
+ $re = qr{19(?:70-01-01|69-12-31)} if $field =~ /Daily$/;
+ $re = qr{19(?:70-01|69-12)} if $field =~ /Monthly$/;
+ $re = qr{19(?:70|69)} if $field =~ /Annually$/;
+ $value =~ s/^$re/Not Set/;
+ }
+
+ return $value;
+}
+
eval "require RT::Report::Tickets::Entry_Vendor";
if ($@ && $@ !~ qr{^Can't locate RT/Report/Tickets/Entry_Vendor.pm}) {
die $@;