[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