diff options
Diffstat (limited to 'FS')
| -rw-r--r-- | FS/FS/Cron/rt_tasks.pm | 37 | ||||
| -rw-r--r-- | FS/FS/TicketSystem.pm | 70 | 
2 files changed, 83 insertions, 24 deletions
| diff --git a/FS/FS/Cron/rt_tasks.pm b/FS/FS/Cron/rt_tasks.pm index 066aeebde..26e305d59 100644 --- a/FS/FS/Cron/rt_tasks.pm +++ b/FS/FS/Cron/rt_tasks.pm @@ -42,6 +42,7 @@ sub rt_escalate {    foreach (qw(      Search::ActiveTicketsInQueue       Action::EscalatePriority +    Action::EscalateQueue      )) {      eval "use RT::$_";      die $@ if $@; @@ -51,7 +52,7 @@ sub rt_escalate {    # Mechanics:    # We're using EscalatePriority, so search in all queues that have a     # priority range defined. Select all active tickets in those queues and -  # LinearEscalate them. +  # EscalatePriority, then EscalateQueue them.    # to make some actions work without complaining    %void = map { $_ => "RT::$_"->new($CurrentUser) } @@ -61,6 +62,8 @@ sub rt_escalate {    # we might want to do, but escalation is the only one we do now.    my $queues = RT::Queues->new($CurrentUser);    $queues->UnLimit; +  my @actions = (); +  my @active_tickets = ();    while (my $queue = $queues->Next) {      if ( $queue->InitialPriority == $queue->FinalPriority ) {        warn "Queue '".$queue->Name."' (skipped)\n" if $DEBUG; @@ -76,8 +79,24 @@ sub rt_escalate {      $search->Prepare;      while (my $ticket = $tickets->Next) {        warn 'Ticket #'.$ticket->Id()."\n" if $DEBUG; -      # We don't need transaction stuff from rt-crontool here -      action($ticket, 'EscalatePriority', "CurrentTime:$time"); +      my @a = ( +        action($ticket, 'EscalatePriority', "CurrentTime:$time"), +        action($ticket, 'EscalateQueue') +      ); +      next if !@a; +      push @actions, @a; +      push @active_tickets, $ticket; # avoid RT's overzealous garbage collector +    } +  } +  foreach (grep {$_} @actions) { +    my ($val, $msg) = $_->Commit; +    if ( $DEBUG ) { +      if ($val) { +        warn "Action committed: ".ref($_)." #".$_->TicketObj->Id."\n"; +      } +      else { +        warn "Action returned $msg: #".$_->TicketObj->Id."\n"; +      }      }    }    return; @@ -98,11 +117,13 @@ sub action {      ScripAction   => $void{'ScripAction'},      CurrentUser   => $CurrentUser,    ); -  return unless $action_obj->Prepare; -  warn "Action prepared: $action\n" if $DEBUG; -  $action_obj->Commit; -  warn "Action committed: $action\n" if $DEBUG; -  return; +  if ( $action_obj->Prepare ) { +    warn "Action prepared: $action\n" if $DEBUG; +    return $action_obj; +  } +  else { +    return; +  }  }  1; diff --git a/FS/FS/TicketSystem.pm b/FS/FS/TicketSystem.pm index d53d2f679..f5c8e7dad 100644 --- a/FS/FS/TicketSystem.pm +++ b/FS/FS/TicketSystem.pm @@ -29,23 +29,61 @@ sub AUTOLOAD {  sub _upgrade_data {    return if $system ne 'RT_Internal'; -    my ($class, %opts) = @_; -  my ($t, $exec, @fields) = map { driver_name =~ /^mysql/i ? $_ : lc($_) } -  (qw( ScripConditions ExecModule -    Name Description ExecModule ApplicableTransTypes -    Creator Created LastUpdatedBy LastUpdated)); -  my $count_sql = "SELECT COUNT(*) FROM $t WHERE $exec = 'CustomFieldChange'"; -  my $sth = dbh->prepare($count_sql) or die dbh->errstr; -  $sth->execute or die $sth->errstr; -  my $total = $sth->fetchrow_arrayref->[0]; -  return if $total > 0; - -  my $insert_sql = "INSERT INTO $t (".join(',',@fields).") VALUES (". -  "'On Custom Field Change', 'When a custom field is changed to some value', -  'CustomFieldChange', 'Any', 1, CURRENT_DATE, 1, CURRENT_DATE )"; -  $sth = dbh->prepare($insert_sql) or die dbh->errstr; -  $sth->execute or die $sth->errstr; + +  # go ahead and use the RT API for this +   +  FS::TicketSystem->init; +  my $session = FS::TicketSystem->session(); +  my $CurrentUser = $session->{'CurrentUser'} +    or die 'freeside-upgrade must run as a valid RT user'; + +  # CustomFieldChange scrip condition +  my $ScripCondition = RT::ScripCondition->new($CurrentUser); +  $ScripCondition->LoadByCols('ExecModule' => 'CustomFieldChange'); +  if (!defined($ScripCondition->Id)) { +    my ($val, $msg) = $ScripCondition->Create( +      'Name' => 'On Custom Field Change', +      'Description' => 'When a custom field is changed to some value', +      'ExecModule' => 'CustomFieldChange', +      'ApplicableTransTypes' => 'Any', +    ); +    die $msg if !$val; +  } + +  # SetPriority scrip action +  my $ScripAction = RT::ScripAction->new($CurrentUser); +  $ScripAction->LoadByCols('ExecModule' => 'SetPriority'); +  if (!defined($ScripAction->Id)) { +    my ($val, $msg) = $ScripAction->Create( +      'Name' => 'Set Priority', +      'Description' => 'Set ticket priority', +      'ExecModule' => 'SetPriority', +      'Argument' => '', +    ); +    die $msg if !$val; +  } + +  # EscalateQueue custom field and friends +  my $CF = RT::CustomField->new($CurrentUser); +  $CF->Load('EscalateQueue'); +  if (!defined($CF->Id)) { +    my ($val, $msg) = $CF->Create( +      'Name' => 'EscalateQueue', +      'Type' => 'Select', +      'MaxValues' => 1, +      'LookupType' => 'RT::Queue', +      'Description' => 'Escalate to Queue', +      'ValuesClass' => 'RT::CustomFieldValues::Queues', #magic! +    ); +    die $msg if !$val; +    my $OCF = RT::ObjectCustomField->new($CurrentUser); +    ($val, $msg) = $OCF->Create( +      'CustomField' => $CF->Id, +      'ObjectId' => 0, +    ); +    die $msg if !$val; +  }    return;  } | 
