[Rt-commit] rt branch, 4.4/timeworked-per-user, created. rt-4.2.11-130-g3ba0df4

Todd Wade todd at bestpractical.com
Wed Jul 8 21:36:22 EDT 2015


The branch, 4.4/timeworked-per-user has been created
        at  3ba0df44c3c92d53f82f5d7a240bb257896ae69f (commit)

- Log -----------------------------------------------------------------
commit c7d13c77151d836078b1f205ab2a15bab3c001e0
Author: Todd Wade <todd at bestpractical.com>
Date:   Wed Jul 8 01:01:12 2015 -0400

    add a way for to get ticket pages besides the display page

diff --git a/lib/RT/Test/Web.pm b/lib/RT/Test/Web.pm
index 1f44d3c..718744d 100644
--- a/lib/RT/Test/Web.pm
+++ b/lib/RT/Test/Web.pm
@@ -159,13 +159,14 @@ sub logout {
 sub goto_ticket {
     my $self = shift;
     my $id   = shift;
+    my $view = shift || 'Display';
     unless ( $id && int $id ) {
         Test::More::diag( "error: wrong id ". defined $id? $id : '(undef)' );
         return 0;
     }
 
     my $url = $self->rt_base_url;
-    $url .= "Ticket/Display.html?id=$id";
+    $url .= "Ticket/${ view }.html?id=$id";
     $self->get($url);
     unless ( $self->status == 200 ) {
         Test::More::diag( "error: status is ". $self->status );

commit 3ba0df44c3c92d53f82f5d7a240bb257896ae69f
Author: Todd Wade <todd at bestpractical.com>
Date:   Wed Jul 8 01:02:45 2015 -0400

    Automatically update the timeworked field of a ticket's parent tickets
    
    Increment parent tickets TimeWorked field when a child ticket TimeWorked
    is set or upated via scrip.
    
    For new installs, default to the behavior enabled. For upgrades, install
    the scrip disabled.

diff --git a/etc/initialdata b/etc/initialdata
index dd1daf5..981c955 100644
--- a/etc/initialdata
+++ b/etc/initialdata
@@ -886,3 +886,34 @@ Hour:         { $SubscriptionObj->SubValue('Hour') }
         },
     },
 );
+
+# timeworked related functionality that was cored from extensions
+
+push @ScripActions => (
+    {
+        Name        => 'Update Parent TimeWorked',    # loc
+        Description => 'Update Parent TimeWorked',    # loc
+        ExecModule  => 'UpdateParentTimeWorked',
+    },
+);
+
+
+push @ScripConditions => (
+    {
+        Name                 => 'On TimeWorked Change',        # loc
+        Description          => 'When TimeWorked Change',    # loc
+        ApplicableTransTypes => 'Any',
+        ExecModule           => 'TimeWorkedChange',
+    },
+);
+
+push @Scrips => (
+    {
+        Description    => 'On TimeWorked Change Update Parent TimeWorked',
+        ScripCondition => 'On TimeWorked Change',
+        ScripAction    => 'Update Parent TimeWorked',
+        Template       => 'Blank',
+    },
+);
+
+1;
diff --git a/etc/upgrade/4.4.0rc1/content b/etc/upgrade/4.4.0rc1/content
new file mode 100644
index 0000000..c06c83f
--- /dev/null
+++ b/etc/upgrade/4.4.0rc1/content
@@ -0,0 +1,29 @@
+ at ScripActions = (
+    {
+        Name        => 'Update Parent TimeWorked',    # loc
+        Description => 'Update Parent TimeWorked',    # loc
+        ExecModule  => 'UpdateParentTimeWorked',
+    },
+);
+
+
+ at ScripConditions = (
+    {
+        Name                 => 'On TimeWorked Change',        # loc
+        Description          => 'When TimeWorked Change',    # loc
+        ApplicableTransTypes => 'Any',
+        ExecModule           => 'TimeWorkedChange',
+    },
+);
+
+ at Scrips = (
+    {
+        Description    => 'On TimeWorked Change Update Parent TimeWorked',
+        ScripCondition => 'On TimeWorked Change',
+        ScripAction    => 'Update Parent TimeWorked',
+        Template       => 'Blank',
+        Disabled       => 1,
+    },
+);
+
+1;
diff --git a/lib/RT/Action/UpdateParentTimeWorked.pm b/lib/RT/Action/UpdateParentTimeWorked.pm
new file mode 100644
index 0000000..e91479a
--- /dev/null
+++ b/lib/RT/Action/UpdateParentTimeWorked.pm
@@ -0,0 +1,43 @@
+use strict;
+use warnings;
+
+package RT::Action::UpdateParentTimeWorked;
+use base 'RT::Action';
+
+sub Prepare {
+    my $self = shift;
+    my $ticket = $self->TicketObj;
+    return 0 unless $ticket->MemberOf->Count;
+    return 1;
+}
+
+sub Commit {
+    my $self   = shift;
+    my $ticket = $self->TicketObj;
+    my $txn    = $self->TransactionObj;
+
+    my $parents     = $ticket->MemberOf;
+    my $time_worked = $txn->TimeTaken
+      || ( $txn->NewValue - $txn->OldValue );
+
+    while ( my $parent = $parents->Next ) {
+        my $parent_ticket = $parent->TargetObj;
+        my $original_actor = RT::CurrentUser->new( $txn->Creator );
+        my $actor_parent_ticket = RT::Ticket->new( $original_actor );
+        $actor_parent_ticket->Load( $parent_ticket->Id );
+        unless ( $actor_parent_ticket->Id ) {
+            RT->Logger->error("Unable to load ".$parent_ticket->Id." as ".$txn->Creator->Name);
+            return 0;
+        }
+        my ( $ret, $msg ) = $actor_parent_ticket->_Set(
+            Field   => 'TimeWorked',
+            Value   => $parent_ticket->TimeWorked + $time_worked,
+        );
+        unless ($ret) {
+            RT->Logger->error(
+                "Failed to update parent ticket's TimeWorked: $msg");
+        }
+    }
+}
+
+1;
diff --git a/lib/RT/Condition/TimeWorkedChange.pm b/lib/RT/Condition/TimeWorkedChange.pm
new file mode 100644
index 0000000..f6d9322
--- /dev/null
+++ b/lib/RT/Condition/TimeWorkedChange.pm
@@ -0,0 +1,19 @@
+use strict;
+use warnings;
+
+package RT::Condition::TimeWorkedChange;
+use base 'RT::Condition';
+
+sub IsApplicable {
+    my $self = shift;
+    my $txn = $self->TransactionObj;
+    return 1 if $txn->TimeTaken;
+    return 1
+      if $txn->Type eq 'Set'
+          && $txn->Field eq 'TimeWorked'
+          && ( $txn->NewValue - $txn->OldValue );
+    return 0;
+}
+
+
+1;
diff --git a/t/web/ticket_timeworked.t b/t/web/ticket_timeworked.t
new file mode 100644
index 0000000..91cccdc
--- /dev/null
+++ b/t/web/ticket_timeworked.t
@@ -0,0 +1,76 @@
+use strict;
+use warnings;
+use RT::Test tests => undef;
+
+my ( $baseurl, $m ) = RT::Test->started_ok;
+ok( $m->login, "Logged in" );
+
+my $queue = RT::Test->load_or_create_queue( Name => 'General' );
+ok( $queue->id, "loaded the General queue" );
+
+my ( $child1, $child2 ) = RT::Test->create_tickets(
+    { Queue   => 'General' },
+    { Subject => 'child ticket 1', },
+    { Subject => 'child ticket 2', },
+);
+
+my ( $child1_id, $child2_id ) = ( $child1->id, $child2->id );
+my $parent_id; # id of the parent ticket
+
+diag "add ticket links of type MemberOf base"; {
+    my $ticket = RT::Test->create_ticket(
+        Queue   => 'General',
+        Subject => "timeworked parent",
+    );
+    my $id = $parent_id = $ticket->id;
+
+    $m->goto_ticket($id);
+    $m->follow_link_ok( { text => 'Links' }, "Followed link to Links" );
+
+    ok( $m->form_with_fields("MemberOf-$id"), "found the form" );
+    $m->field( "MemberOf-$id", "$child1_id $child2_id" );
+
+    $m->submit;
+
+    $m->content_like(
+        qr{"DeleteLink-.*?ticket/$child1_id-MemberOf-"},
+        "base for MemberOf: has child1 ticket",
+    );
+    $m->content_like(
+        qr{"DeleteLink-.*?ticket/$child2_id-MemberOf-"},
+        "base for MemberOf: has child2 ticket",
+    );
+
+    $m->goto_ticket($id);
+    $m->content_like( qr{$child1_id:.*?\[new\]}, "has active ticket", );
+}
+
+my @updates = ({
+    id => $child1_id,
+    view => 'Modify',
+    field => 'TimeWorked',
+    form => 'TicketModify',
+    title => "Modify ticket #$child1_id",
+}, {
+    id => $child2_id,
+    view => 'Update',
+    field => 'UpdateTimeWorked',
+    form => 'TicketUpdate',
+    title => "Update ticket #$child2_id (child ticket 2)",
+});
+
+
+foreach my $update ( @updates ) {
+    $m->goto_ticket( $update->{id}, $update->{view} );
+    $m->title_is( $update->{title}, 'have child ticket page' );
+    ok( $m->form_name( $update->{form} ), 'found the form' );
+    $m->field( $update->{field}, 90 );
+    $m->submit_form( button => 'SubmitTicket' );
+}
+
+$m->goto_ticket( $parent_id );
+$m->title_is( "#$parent_id: timeworked parent");
+$m->content_like( qr{180 minutes}, "found expected minutes in parent ticket" );
+
+undef $m;
+done_testing();
\ No newline at end of file

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


More information about the rt-commit mailing list