[Rt-commit] rt branch, 4.4/custom-fields-set-from-rtconfig, created. rt-4.4.3-68-g4e17fef8e

John Waller john at bestpractical.com
Tue Nov 27 19:36:41 EST 2018


The branch, 4.4/custom-fields-set-from-rtconfig has been created
        at  4e17fef8e85461d6dda7e6507ea18fc204dc9c98 (commit)

- Log -----------------------------------------------------------------
commit 4e17fef8e85461d6dda7e6507ea18fc204dc9c98
Author: John Waller <john at bestpractical.com>
Date:   Tue Nov 27 19:36:24 2018 -0500

    Added sample Lifecycle_Config.pm, sample of Lifecycle.pm code ->Datefields method and non-initial/non-resolved block inside Ticket.pm _SetStatus method to handle custom field updates

diff --git a/etc/RT_SiteConfig.d/Lifecycle_Config.pm b/etc/RT_SiteConfig.d/Lifecycle_Config.pm
new file mode 100644
index 000000000..1bd7d809d
--- /dev/null
+++ b/etc/RT_SiteConfig.d/Lifecycle_Config.pm
@@ -0,0 +1,80 @@
+Set(%Lifecycles,
+#    incident_reports => {},
+#    incidents => {},
+#    investigations => {},
+#    countermeasures => {},
+    madrid => {},
+);
+
+Set(%Lifecycles,
+    escalation => {
+        initial         => [qw(new)], # loc_qw
+        active          => [qw(open stalled escalation1)], # loc_qw
+        inactive        => [qw(resolved rejected deleted)], # loc_qw
+
+        defaults => {
+            on_create => 'new',
+            approved  => 'open',
+            denied    => 'rejected',
+            reminder_on_open     => 'open',
+            reminder_on_resolve  => 'resolved',
+        },
+
+        transitions => {
+            ""       => [qw(new open resolved)],
+            # from   => [ to list ],
+            new      => [qw(    open rejected deleted)],
+            open     => [qw(new   escalation1   stalled resolved rejected deleted)],
+            stalled  => [qw(new open         resolved rejected deleted)],
+            resolved => [qw(new open stalled escalation1   rejected deleted)],
+            rejected => [qw(new open stalled resolved       deleted)],
+            deleted  => [qw(new open stalled resolved rejected        )],
+            escalation1  => [qw(open stalled resolved      )],
+        },
+        rights => {
+            '* -> deleted'  => 'DeleteTicket',
+            '* -> *'        => 'ModifyTicket',
+            '* -> escalation1' => 'EscalateTicket',
+        },
+        actions => [
+            'new -> open'      => { label  => 'Open It' }, # loc{label}
+            'new -> resolved'  => { label  => 'Resolve', update => 'Comment' }, # loc{label}
+            'new -> rejected'  => { label  => 'Reject',  update => 'Respond' }, # loc{label}
+            'new -> deleted'   => { label  => 'Delete',                      }, # loc{label}
+            'open -> stalled'  => { label  => 'Stall',   update => 'Comment' }, # loc{label}
+            'open -> resolved' => { label  => 'Resolve', update => 'Comment' }, # loc{label}
+            'open -> rejected' => { label  => 'Reject',  update => 'Respond' }, # loc{label}
+            'stalled -> open'  => { label  => 'Open It',                     }, # loc{label}
+            'resolved -> open' => { label  => 'Re-open', update => 'Comment' }, # loc{label}
+            'rejected -> open' => { label  => 'Re-open', update => 'Comment' }, # loc{label}
+            'deleted -> open'  => { label  => 'Undelete',                    }, # loc{label}
+            'open -> escalation1' => { label => 'Escalate', update => 'Comment' }, # loc{label}
+            'escalation1 -> open' => { label => 'Re-open' }, # loc{label}
+        ],
+		dates => {
+			'Stalled' => 'open -> escalation1',
+			'Setup' => 'open -> escalation1' ,
+		},
+    },
+    '__maps__' => {
+      'escalation -> default' => {
+        new   => 'new',
+        open => 'open',
+        stalled => 'stalled',
+        resolved => 'resolved',
+        deleted => 'deleted',
+        rejected => 'rejected',
+        escalation1 => 'open',
+      },
+      'default -> escalation' => {
+          new   => 'new',
+          open => 'open',
+          stalled => 'stalled',
+          resolved => 'resolved',
+          rejected => 'rejected',
+          deleted => 'deleted',
+      },
+    },
+);
+
+1;
diff --git a/lib/RT/Lifecycle.pm b/lib/RT/Lifecycle.pm
index 0e2934658..d577bda93 100644
--- a/lib/RT/Lifecycle.pm
+++ b/lib/RT/Lifecycle.pm
@@ -49,7 +49,6 @@
 use strict;
 use warnings;
 
-
 package RT::Lifecycle;
 
 our %LIFECYCLES;
@@ -456,6 +455,35 @@ sub CheckRight {
     return $to eq 'deleted' ? 'DeleteTicket' : 'ModifyTicket';
 }
 
+=head3 DateFields [Array]
+
+Takes two statuses (from -> to) and returns the field that should
+be updated on the ticket.
+
+Note: field -> transition is reverse, because field is unique, but transition may not be - multiple fields to update on 
+on ticket is possible this way
+
+=cut
+
+sub DateFields {
+    my $self = shift;
+    my $from = shift;
+    my $to = shift;
+	
+	my $list = $self->{'data'}{'dates'};
+	my @datefields;	
+	my %list = %$list;
+	
+	foreach my $field (keys %list) {
+		my $transition = $list->{$field};
+		if ($transition eq "$from -> $to" || $transition eq "* => *" || $transition eq "* => $to" || $transition eq "$from => *") {
+			push @datefields, $field;	
+		}
+	}
+	return @datefields;
+	
+}
+
 =head3 RightsDescription [TYPE]
 
 Returns hash with description of rights that are defined for
diff --git a/lib/RT/Ticket.pm b/lib/RT/Ticket.pm
index 3335a1c00..e85e6aeee 100644
--- a/lib/RT/Ticket.pm
+++ b/lib/RT/Ticket.pm
@@ -93,6 +93,29 @@ use RT::URI;
 use RT::SLA;
 use MIME::Entity;
 use Devel::GlobalDestruction;
+use Data::Printer {
+  color => {
+     array       => 'bright_white',  # array index numbers
+     number      => 'bright_blue',   # numbers
+     string      => 'bright_yellow', # strings
+     class       => 'bright_green',  # class names
+     method      => 'bright_green',  # method names
+     undef       => 'bright_red',    # the 'undef' value
+     hash        => 'magenta',       # hash keys
+     regex       => 'yellow',        # regular expressions
+     code        => 'green',         # code references
+     glob        => 'bright_cyan',   # globs (usually file handles)
+     vstring     => 'bright_blue',   # version strings (v5.16.0, etc)
+     repeated    => 'white on_red',  # references to seen values
+     caller_info => 'bright_cyan',   # details on what's being printed
+     weak        => 'cyan',          # weak references
+     tainted     => 'red',           # tainted content
+     escaped     => 'bright_red',    # escaped characters (\t, \n, etc)
+ 
+     # potential new Perl datatypes, unknown to Data::Printer
+     unknown     => 'bright_yellow on_blue',
+  },
+};
 
 sub LifecycleColumn { "Queue" }
 
@@ -2510,6 +2533,27 @@ sub _SetStatus {
         );
     }
 
+
+	# When we are in an active status run.
+	if(	$args{Lifecycle}->IsActive($args{Status}) ){
+		my $cnow = RT::Date->new( $self->CurrentUser );
+	    $cnow->SetToNow();
+		my @datefields = $args{Lifecycle}->DateFields($old,$args{Status});	
+		#my @datefields = $self->LifecycleObj->DateField($old, $args{Status})	
+		if(@datefields){
+			foreach my $field (@datefields){ 
+				#Data::Printer::p $field;
+				my ($ok, $e) = $self->AddCustomFieldValue( Field => $field , Value => $cnow->ISO);	
+				if(not $ok){
+					RT::Logger->error("Unable to update $field : $e");
+				}else{
+					warn "Update $field";
+				}
+			}
+		}
+		
+	}
+
     # Actually update the status
     my ($val, $msg)= $self->_Set(
         Field           => 'Status',

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


More information about the rt-commit mailing list