[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