[Rt-commit] rt branch, 4.4/total-time-left, created. rt-4.4.3-26-g51ff94acd

? sunnavy sunnavy at bestpractical.com
Fri Jul 27 14:44:07 EDT 2018


The branch, 4.4/total-time-left has been created
        at  51ff94acd818718beaf9c9737fc2798c538e3153 (commit)

- Log -----------------------------------------------------------------
commit 3361d4bbbd52dc86aaf4a48988a5f970ab001c2c
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Sat Jul 28 01:44:42 2018 +0800

    Add "Total Time Left" feature
    
    It's quite similar to the feature of "Total Time Worked"

diff --git a/etc/RT_Config.pm.in b/etc/RT_Config.pm.in
index 6fe7bc7a2..3f73d1070 100644
--- a/etc/RT_Config.pm.in
+++ b/etc/RT_Config.pm.in
@@ -1733,6 +1733,17 @@ Set this to 1 to hide unset fields.
 
 Set($HideUnsetFieldsOnDisplay, 0);
 
+=item C<$DisplayTotalTimeLeft>
+
+This determines if we should show "Total Time Left" on ticket display/search
+pages.
+
+Set this to 1 to show it.
+
+=cut
+
+Set($DisplayTotalTimeLeft, 0);
+
 =back
 
 =head2 Self Service Interface
diff --git a/lib/RT/Ticket.pm b/lib/RT/Ticket.pm
index 3335a1c00..c3bc108a8 100644
--- a/lib/RT/Ticket.pm
+++ b/lib/RT/Ticket.pm
@@ -1523,6 +1523,39 @@ sub TotalTimeWorkedPerUser {
     return $time;
 }
 
+=head2 TotalTimeLeft
+
+Returns the amount of time left on this ticket and all child tickets
+
+=cut
+
+sub TotalTimeLeft {
+    my $self  = shift;
+    my $seen  = shift || {};
+    my $time  = $self->TimeLeft;
+    my $links = $self->Members;
+    while ( my $link = $links->Next ) {
+        my $obj = $link->BaseObj;
+        next unless $obj && UNIVERSAL::isa( $obj, 'RT::Ticket' );
+        next if $seen->{ $obj->id };
+        $seen->{ $obj->id } = 1;
+        $time += $obj->TotalTimeLeft( $seen );
+    }
+    return $time;
+}
+
+=head2 TotalTimeLeftAsString
+
+Returns the amount of time left on this ticket and all its children as a
+formatted duration string
+
+=cut
+
+sub TotalTimeLeftAsString {
+    my $self = shift;
+    return $self->_DurationAsString( $self->TotalTimeLeft );
+}
+
 =head2 Comment
 
 Comment on this ticket.
diff --git a/share/html/Elements/RT__Ticket/ColumnMap b/share/html/Elements/RT__Ticket/ColumnMap
index f2e6aa8e4..0d4c43148 100644
--- a/share/html/Elements/RT__Ticket/ColumnMap
+++ b/share/html/Elements/RT__Ticket/ColumnMap
@@ -352,6 +352,16 @@ if(RT->Config->Get('DisplayTotalTimeWorked')) {
     }
 }
 
+if ( RT->Config->Get( 'DisplayTotalTimeLeft' ) ) {
+    $COLUMN_MAP->{TotalTimeLeft} = {
+        attribute => 'TotalTimeLeft',
+        title     => 'Total Time Left', # loc
+        value     => sub {
+            return $_[ 0 ]->TotalTimeLeftAsString;
+        },
+    };
+}
+
 $m->callback( GenericMap => $GenericMap, COLUMN_MAP => $COLUMN_MAP, CallbackName => 'Once', CallbackOnce => 1 );
 return GetColumnMapEntry( Map => $COLUMN_MAP, Name => $Name, Attribute => $Attr );
 </%init>
diff --git a/share/html/Search/Elements/BuildFormatString b/share/html/Search/Elements/BuildFormatString
index 9e7559e38..7ae700dc9 100644
--- a/share/html/Search/Elements/BuildFormatString
+++ b/share/html/Search/Elements/BuildFormatString
@@ -104,6 +104,7 @@ my @fields = qw(
 # Total time worked is an optional ColumnMap enabled for rolling up child
 # TimeWorked
 push @fields, 'TotalTimeWorked' if (RT->Config->Get('DisplayTotalTimeWorked'));
+push @fields, 'TotalTimeLeft' if RT->Config->Get('DisplayTotalTimeLeft');
 
 my $CustomFields = RT::CustomFields->new( $session{'CurrentUser'});
 foreach my $id (keys %queues) {
diff --git a/share/html/Ticket/Elements/ShowBasics b/share/html/Ticket/Elements/ShowBasics
index da47c78b6..568a7936c 100644
--- a/share/html/Ticket/Elements/ShowBasics
+++ b/share/html/Ticket/Elements/ShowBasics
@@ -103,6 +103,14 @@
     <td class="value"><& ShowTime, minutes => $Ticket->TimeLeft &></td>
   </tr>
 % }
+% if ( RT->Config->Get('DisplayTotalTimeLeft') ) {
+%   if ( my $total_time_left = $Ticket->TotalTimeLeft ) {
+      <tr class="total time left sum">
+        <td class="label"><&|/l&>Total Time Left</&>:</td>
+        <td class="value"><& ShowTime, minutes => $total_time_left &></td>
+      </tr>
+%   }
+% }
 % }
 % $m->callback( %ARGS, CallbackName => 'AfterTimeLeft', TicketObj => $Ticket );
   <tr class="priority">

commit 51ff94acd818718beaf9c9737fc2798c538e3153
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Sat Jul 28 01:54:30 2018 +0800

    Add TotalTimeLeft tests
    
    It's generally copied from total-time-worked.t with tweaked variable names.

diff --git a/t/api/total-time-left.t b/t/api/total-time-left.t
new file mode 100644
index 000000000..7ad1fd35e
--- /dev/null
+++ b/t/api/total-time-left.t
@@ -0,0 +1,178 @@
+use strict;
+use warnings;
+use RT;
+use RT::Test tests => undef;
+
+diag( "Test tickets total time left" );
+{
+    my $parent = RT::Ticket->new( RT->SystemUser );
+    my ( $ok, $msg ) = $parent->Create(
+        Queue   => 'general',
+        Subject => 'total time left test parent',
+    );
+    ok( $ok, "Created parent ticket $msg" );
+
+    my $child = RT::Ticket->new( RT->SystemUser );
+    ( $ok, $msg ) = $child->Create(
+        Queue   => 'general',
+        Subject => 'total time left test child',
+    );
+    ok( $ok, "Created child ticket $msg" );
+
+    my $grandchild = RT::Ticket->new( RT->SystemUser );
+    ( $ok, $msg ) = $grandchild->Create(
+        Queue   => 'general',
+        Subject => 'total time left test child child',
+    );
+    ok( $ok, "Created grandchild ticket $msg" );
+
+    ( $ok, $msg ) = $parent->AddLink(
+        Type => 'MemberOf',
+        Base => $child->id,
+    );
+    ok( $ok, "Created parent -> child link $msg" );
+
+    ( $ok, $msg ) = $child->AddLink(
+        Type => 'MemberOf',
+        Base => $grandchild->id,
+    );
+    ok( $ok, "Created child -> grandchild link $msg" );
+
+    my $grandchild2 = RT::Ticket->new( RT->SystemUser );
+    ( $ok, $msg ) = $grandchild2->Create(
+        Queue   => 'general',
+        Subject => 'total time left test other child child',
+    );
+    ok( $ok, "Create second grandchild $msg" );
+
+    ( $ok, $msg ) = $child->AddLink(
+        Type => 'MemberOf',
+        Base => $grandchild2->id,
+    );
+    ok( $ok, "Create child -> second grandchild link $msg" );
+
+    $parent->SetTimeLeft( 10 );
+    $child->SetTimeLeft( 20 );
+    $grandchild->SetTimeLeft( 40 );
+    $grandchild2->SetTimeLeft( 50 );
+
+    is $grandchild2->TimeLeft, 50, 'check other child child time left';
+    is $grandchild->TimeLeft,  40, 'check child child time left';
+    is $child->TimeLeft,       20, 'check child time left';
+    is $parent->TimeLeft,      10, 'check parent time left';
+
+    is $parent->TotalTimeLeft,      120, 'check parent total time left';
+    is $child->TotalTimeLeft,       110, 'check child total time left';
+    is $grandchild->TotalTimeLeft,  40,  'check child child total time left';
+    is $grandchild2->TotalTimeLeft, 50,  'check other child child total time left';
+
+    is $parent->TotalTimeLeftAsString,     '2 hours (120 minutes)', 'check parent total time left as string';
+    is $grandchild->TotalTimeLeftAsString, '40 minutes',            'check child child total time workd as string';
+}
+
+diag( "Test multiple inheritance total time left" );
+{
+    my $parent = RT::Ticket->new( RT->SystemUser );
+    my ( $ok, $msg ) = $parent->Create(
+        Queue   => 'general',
+        Subject => 'total time left test parent',
+    );
+    ok $ok, "created parent ticket $msg";
+
+    my $child = RT::Ticket->new( RT->SystemUser );
+    ( $ok, $msg ) = $child->Create(
+        Queue   => 'general',
+        Subject => 'total time left test child',
+    );
+    ok $ok, "created child ticket $msg";
+
+    my $grandchild = RT::Ticket->new( RT->SystemUser );
+    ( $ok, $msg ) = $grandchild->Create(
+        Queue   => 'general',
+        Subject => 'total time left test child child, and test child',
+    );
+    ok $ok, "created grandchild ticket $msg";
+
+    $parent->SetTimeLeft( 10 );
+    $child->SetTimeLeft( 20 );
+    $grandchild->SetTimeLeft( 40 );
+
+    ( $ok, $msg ) = $parent->AddLink(
+        Type => 'MemberOf',
+        Base => $child->id,
+    );
+    ok $ok, "Create parent -> child link $msg";
+
+    ( $ok, $msg ) = $child->AddLink(
+        Type => 'MemberOf',
+        Base => $grandchild->id,
+    );
+    ok $ok, "Create child -> grandchild link $msg";
+
+    ( $ok, $msg ) = $parent->AddLink(
+        Type => 'MemberOf',
+        Base => $grandchild->id,
+    );
+    ok $ok, "Created parent -> grandchild link $msg";
+
+    is $parent->TotalTimeLeft,     70, 'check parent total time left';
+    is $child->TotalTimeLeft,      60, 'check child total time left';
+    is $grandchild->TotalTimeLeft, 40, 'check child child total time left';
+
+}
+
+diag( "Test inheritance total time left" );
+{
+    my @warnings;
+
+    my $parent = RT::Ticket->new( RT->SystemUser );
+    my ( $ok, $msg ) = $parent->Create(
+        Queue   => 'general',
+        Subject => 'total time left test parent',
+    );
+    ok $ok, "created parent ticket $msg";
+
+    my $child = RT::Ticket->new( RT->SystemUser );
+    ( $ok, $msg ) = $child->Create(
+        Queue   => 'general',
+        Subject => 'total time left test child',
+    );
+    ok $ok, "created child ticket $msg";
+
+    {
+        local $SIG{__WARN__} = sub {
+            push @warnings, @_;
+        };
+
+        my ( $ok, $msg ) = $parent->AddLink(
+            Type => 'MemberOf',
+            Base => $child->id,
+        );
+        ok $ok, "Created parent -> child link $msg";
+        ( $ok, $msg ) = $parent->AddLink(
+            Type => 'MemberOf',
+            Base => 'http://bestpractical.com',
+        );
+        ok $ok, "Create parent -> url link $msg";
+
+        ( $ok, $msg ) = $child->AddLink(
+            Type => 'MemberOf',
+            Base => 'http://docs.bestpractical.com/',
+        );
+        ok $ok, "Created child -> url link $msg";
+
+    }
+
+    $parent->SetTimeLeft( 10 );
+    $child->SetTimeLeft( 20 );
+
+    is $parent->TotalTimeLeft, 30, 'check parent total time left';
+    is $child->TotalTimeLeft,  20, 'check child total time left';
+
+  TODO: {
+        local $TODO = "this warns because of the unrelated I#31399";
+        is( @warnings, 0, "no warnings" );
+    }
+}
+
+done_testing;

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


More information about the rt-commit mailing list