Prevent resolution of Ticket that owner is 'Nobody'

Hi all,

I’m using RT 4.2.8 and would like to prevent ticket resolution in which
the owner is “Nobody”.
For that I’m doing two steps:

    • Change the custom condition of scrip “On Resolve Notify
      Requestors” to not notify requesters if Owner is ‘Nobody’:*

Description: On Resolve Notify Requestors
Condition: User Defined
Action: Notify Requestors
Template: resolved in HTML

Custom condition:
if((
($self->TransactionObj->Type eq ‘Status’) or
($self->TransactionObj->Type eq ‘Set’ and
$self->TransactionObj->Field eq ‘Status’)
) and
$self->TransactionObj->NewValue eq ‘resolved’
) {
if($self->TicketObj->Owner == $RT::Nobody->id) {
$RT::Logger->debug(“Do not notify requestors if Owner
is Nobody”);
return 0;
} else {
return 1;
}
}

     return 0;
  • Create scrip to change status from resolved to it’s old value:

Description: On Resolve Check Owner
Condition: On Resolve
Action: User Defined
Template: Blank

  •   Custom action commits code:*
       # get actor ID
       my $Actor = $self->TransactionObj->Creator;
    
       # if actor is RT_SystemUser then get out of here
       return 1 if $Actor == $RT::SystemUser->id;
    
       return 1 unless $self->TicketObj->Owner == $RT::Nobody->id;
    
       my ($status, $msg) = 
    

$self->TicketObj->SetStatus($self->TransactionObj->OldValue);
unless($status) {
$RT::Logger->error(“Error when setting new status: $msg”);
return undef;
}

     $RT::Logger->debug("Status changed");

     return 1;

/(The scrips above are divided just for separation of concerns purposes)/

It works, but the message that appears confuses the user: “Status
changed from ‘open’ to ‘resolved’”. But in fact, the status of the
ticket is “open” (setted in scrip above).

Actually I would like to “lock” the screen, warning the user that it is
necessary to assign an owner before resolving the ticket.

Someone suggests a better solution? How could I lock the screen and
display a message to the user?

I tried using the plugin “MandatoryOnTransition” for this purpose, but
does not work because it just considers empty fields, and the owner is
set to “Nobody”, not empty:
Set (% MandatoryOnTransition,
’ => {
-> Resolved’ => [‘TimeWorked’, ‘Owner’],
},
);

Please help me.

Thanks in advance.

Murillo Azambuja Gonçalves

Hi,

I didn’t read everything in your email. :slight_smile:

Have you considered a lifecycle where only the Owner is granted the
right to resolve the ticket?

-mOn Thu, Jul 16, 2015 at 9:34 AM, Murillo Azambuja Gonçalves murillo@ifi.unicamp.br wrote:

Hi all,

I’m using RT 4.2.8 and would like to prevent ticket resolution in which the
owner is “Nobody”.
For that I’m doing two steps:

Change the custom condition of scrip “On Resolve Notify Requestors” to not
notify requesters if Owner is ‘Nobody’:

    Description: On Resolve Notify Requestors
    Condition: User Defined
    Action: Notify Requestors
    Template: resolved in HTML

    Custom condition:
    if((
            ($self->TransactionObj->Type eq 'Status') or
            ($self->TransactionObj->Type eq 'Set' and

$self->TransactionObj->Field eq ‘Status’)
) and
$self->TransactionObj->NewValue eq ‘resolved’
) {
if($self->TicketObj->Owner == $RT::Nobody->id) {
$RT::Logger->debug(“Do not notify requestors if Owner is
Nobody”);
return 0;
} else {
return 1;
}
}

    return 0;

Create scrip to change status from resolved to it’s old value:

    Description: On Resolve Check Owner
    Condition: On Resolve
    Action: User Defined
    Template: Blank

   Custom action commits code:
    # get actor ID
    my $Actor = $self->TransactionObj->Creator;

    # if actor is RT_SystemUser then get out of here
    return 1 if $Actor == $RT::SystemUser->id;

    return 1 unless $self->TicketObj->Owner == $RT::Nobody->id;

    my ($status, $msg) =

$self->TicketObj->SetStatus($self->TransactionObj->OldValue);
unless($status) {
$RT::Logger->error(“Error when setting new status: $msg”);
return undef;
}

    $RT::Logger->debug("Status changed");

    return 1;

(The scrips above are divided just for separation of concerns purposes)

It works, but the message that appears confuses the user: “Status changed
from ‘open’ to ‘resolved’”. But in fact, the status of the ticket is “open”
(setted in scrip above).

Actually I would like to “lock” the screen, warning the user that it is
necessary to assign an owner before resolving the ticket.

Someone suggests a better solution? How could I lock the screen and display
a message to the user?

I tried using the plugin “MandatoryOnTransition” for this purpose, but does
not work because it just considers empty fields, and the owner is set to
“Nobody”, not empty:
Set (% MandatoryOnTransition,
’ => {
→ Resolved’ => [‘TimeWorked’, ‘Owner’],
},
);

Please help me.

Thanks in advance.


Murillo Azambuja Gonçalves

This can not be done here.
In some queues those responsible for sending transactions (including
tickets resolution) are not directly involved in the work of tickets.

Even I used the scrip “AutoSetOwner
http://requesttracker.wikia.com/wiki/AutoSetOwner” as a basis to
create mine.

Anyway thanks for your answer.
Would have another suggestion?

Murillo Azambuja GonçalvesOn 07/16/2015 11:37 AM, Matt Zagrabelny wrote:

Hi,

I didn’t read everything in your email. :slight_smile:

Have you considered a lifecycle where only the Owner is granted the
right to resolve the ticket?

-m

On Thu, Jul 16, 2015 at 9:34 AM, Murillo Azambuja Gonçalves murillo@ifi.unicamp.br wrote:

Hi all,

I’m using RT 4.2.8 and would like to prevent ticket resolution in which the
owner is “Nobody”.
For that I’m doing two steps:

Change the custom condition of scrip “On Resolve Notify Requestors” to not
notify requesters if Owner is ‘Nobody’:

     Description: On Resolve Notify Requestors
     Condition: User Defined
     Action: Notify Requestors
     Template: resolved in HTML

     Custom condition:
     if((
             ($self->TransactionObj->Type eq 'Status') or
             ($self->TransactionObj->Type eq 'Set' and

$self->TransactionObj->Field eq ‘Status’)
) and
$self->TransactionObj->NewValue eq ‘resolved’
) {
if($self->TicketObj->Owner == $RT::Nobody->id) {
$RT::Logger->debug(“Do not notify requestors if Owner is
Nobody”);
return 0;
} else {
return 1;
}
}

     return 0;

Create scrip to change status from resolved to it’s old value:

     Description: On Resolve Check Owner
     Condition: On Resolve
     Action: User Defined
     Template: Blank

    Custom action commits code:
     # get actor ID
     my $Actor = $self->TransactionObj->Creator;

     # if actor is RT_SystemUser then get out of here
     return 1 if $Actor == $RT::SystemUser->id;

     return 1 unless $self->TicketObj->Owner == $RT::Nobody->id;

     my ($status, $msg) =

$self->TicketObj->SetStatus($self->TransactionObj->OldValue);
unless($status) {
$RT::Logger->error(“Error when setting new status: $msg”);
return undef;
}

     $RT::Logger->debug("Status changed");

     return 1;

(The scrips above are divided just for separation of concerns purposes)

It works, but the message that appears confuses the user: “Status changed
from ‘open’ to ‘resolved’”. But in fact, the status of the ticket is “open”
(setted in scrip above).

Actually I would like to “lock” the screen, warning the user that it is
necessary to assign an owner before resolving the ticket.

Someone suggests a better solution? How could I lock the screen and display
a message to the user?

I tried using the plugin “MandatoryOnTransition” for this purpose, but does
not work because it just considers empty fields, and the owner is set to
“Nobody”, not empty:
Set (% MandatoryOnTransition,
’ => {
→ Resolved’ => [‘TimeWorked’, ‘Owner’],
},
);

Please help me.

Thanks in advance.


Murillo Azambuja Gonçalves

This can not be done here.
In some queues those responsible for sending transactions (including tickets
resolution) are not directly involved in the work of tickets.

Even I used the scrip “AutoSetOwner” as a basis to create mine.

Anyway thanks for your answer.
Would have another suggestion?

Attach some JS to the Create form and test before posting?

-m

I resolved that issue editing the plugin file “MandatoryOnTransition.pm”
(v. 0.09), by doing it accept the Owner field:

line 206
line 207

our @CORE_SUPPORTED = qw(Content TimeWorked TimeTaken Owner);
our @CORE_TICKET = qw(TimeWorked Owner);
our %CORE_FOR_UPDATE = (
TimeWorked => ‘UpdateTimeWorked’,
TimeTaken => ‘UpdateTimeWorked’,
Content => ‘UpdateContent’,
Owner => ‘Owner’,
);
our %CORE_FOR_CREATE = (
TimeWorked => ‘TimeWorked’,
Content => ‘Content’,
Owner => ‘Owner’,
);

line 221

line 338

# Check core fields, after canonicalization for update
for my $field (@$core) {

         # Will we have a value on update/create?
         my $arg = $args{'Ticket'}
             ? $CORE_FOR_UPDATE{$field}
             : $CORE_FOR_CREATE{$field};
         next unless $arg;
         next if defined $ARGSRef->{$arg} and length $ARGSRef->{$arg};

if($field eq ‘Owner’ and $args{‘Ticket’}->$field() == $RT::Nobody->id) {*
** push @errors,**
** $CurrentUser->loc(“[_1] is required when changing the
status to [_2]”,**
** $field, $ARGSRef->{Status});**
** }*

         # Do we have a value currently?
         # In Create the ticket hasn't been created yet.
         next if grep { $_ eq $field } @CORE_TICKET
           and ($args{'Ticket'} && $args{'Ticket'}->$field());

         (my $label = $field) =~ s/(?<=[a-z])(?=[A-Z])/ /g; # /
         push @errors,
           $CurrentUser->loc("[_1] is required when changing the 

status to [_2]",
$label, $ARGSRef->{Status});
}
line 365

I wanted to do it without changes in the source code, but i couldn’t
find a way until this moment.
If anybody has a better idea or knows how to do it without changes in
the code please tell me.

Anyway here’s how I solved that.

Regards,

Murillo Azambuja GonçalvesOn 07/16/2015 12:05 PM, Murillo Azambuja Gonçalves wrote:

This can not be done here.
In some queues those responsible for sending transactions (including
tickets resolution) are not directly involved in the work of tickets.

Even I used the scrip “AutoSetOwner
http://requesttracker.wikia.com/wiki/AutoSetOwner” as a basis to
create mine.

Anyway thanks for your answer.
Would have another suggestion?
Murillo Azambuja Gonçalves


On 07/16/2015 11:37 AM, Matt Zagrabelny wrote:

Hi,

I didn’t read everything in your email. :slight_smile:

Have you considered a lifecycle where only the Owner is granted the
right to resolve the ticket?

-m

On Thu, Jul 16, 2015 at 9:34 AM, Murillo Azambuja Gonçalves murillo@ifi.unicamp.br wrote:

Hi all,

I’m using RT 4.2.8 and would like to prevent ticket resolution in which the
owner is “Nobody”.
For that I’m doing two steps:

Change the custom condition of scrip “On Resolve Notify Requestors” to not
notify requesters if Owner is ‘Nobody’:

     Description: On Resolve Notify Requestors
     Condition: User Defined
     Action: Notify Requestors
     Template: resolved in HTML

     Custom condition:
     if((
             ($self->TransactionObj->Type eq 'Status') or
             ($self->TransactionObj->Type eq 'Set' and

$self->TransactionObj->Field eq ‘Status’)
) and
$self->TransactionObj->NewValue eq ‘resolved’
) {
if($self->TicketObj->Owner == $RT::Nobody->id) {
$RT::Logger->debug(“Do not notify requestors if Owner is
Nobody”);
return 0;
} else {
return 1;
}
}

     return 0;

Create scrip to change status from resolved to it’s old value:

     Description: On Resolve Check Owner
     Condition: On Resolve
     Action: User Defined
     Template: Blank

    Custom action commits code:
     # get actor ID
     my $Actor = $self->TransactionObj->Creator;

     # if actor is RT_SystemUser then get out of here
     return 1 if $Actor == $RT::SystemUser->id;

     return 1 unless $self->TicketObj->Owner == $RT::Nobody->id;

     my ($status, $msg) =

$self->TicketObj->SetStatus($self->TransactionObj->OldValue);
unless($status) {
$RT::Logger->error(“Error when setting new status: $msg”);
return undef;
}

     $RT::Logger->debug("Status changed");

     return 1;

(The scrips above are divided just for separation of concerns purposes)

It works, but the message that appears confuses the user: “Status changed
from ‘open’ to ‘resolved’”. But in fact, the status of the ticket is “open”
(setted in scrip above).

Actually I would like to “lock” the screen, warning the user that it is
necessary to assign an owner before resolving the ticket.

Someone suggests a better solution? How could I lock the screen and display
a message to the user?

I tried using the plugin “MandatoryOnTransition” for this purpose, but does
not work because it just considers empty fields, and the owner is set to
“Nobody”, not empty:
Set (% MandatoryOnTransition,
’ => {
→ Resolved’ => [‘TimeWorked’, ‘Owner’],
},
);

Please help me.

Thanks in advance.


Murillo Azambuja Gonçalves