# Initial data for a fresh RT3 Installation. @Users = ( { Name => 'Nobody', RealName => 'Nobody in particular', Comments => 'Do not delete or modify this user. It is integral ' . 'to RT\'s internal data structures', Privileged => '0', }, { Name => 'root', Gecos => 'root', RealName => 'RT Admin', Password => 'password', EmailAddress => "root\@localhost", Comments => 'SuperUser', Privileged => '1', } ); @Groups = ( { Name => '', Type => 'Everyone', # loc Domain => 'SystemInternal', Instance => '', Description => 'Pseudogroup for internal use', # loc }, { Type => 'Privileged', # loc Domain => 'SystemInternal', Instance => '', Name => '', Description => 'Pseudogroup for internal use', # loc }, { Name => '', Type => 'Unprivileged', # loc Domain => 'SystemInternal', Instance => '', Description => 'Pseudogroup for internal use', # loc }, { Name => '', Type => 'Owner', # loc Domain => 'RT::System-Role', Instance => '', Description => 'SystemRolegroup for internal use', # loc }, { Name => '', Type => 'Requestor', # loc Domain => 'RT::System-Role', Instance => '', Description => 'SystemRolegroup for internal use', # loc }, { Name => '', Type => 'Cc', # loc Domain => 'RT::System-Role', Instance => '', Description => 'SystemRolegroup for internal use', # loc }, { Name => '', Type => 'AdminCc', # loc Domain => 'RT::System-Role', Instance => '', Description => 'Pseudogroup for internal use', # loc }, ); @Queues = ({ Name => 'support', Description => 'Support', CorrespondAddress => 'support@PLC_RT_HOSTNAME', CommentAddress => '', }, { Name => '___Approvals', Description => 'A system-internal queue for the approvals system', Disabled => 2, } ); @ScripActions = ( { Name => 'Autoreply To Requestors', # loc Description => 'Always sends a message to the requestors independent of message sender' , # loc ExecModule => 'Autoreply', Argument => 'Requestor' }, { Name => 'Notify Requestors', # loc Description => 'Sends a message to the requestors', # loc ExecModule => 'Notify', Argument => 'Requestor' }, { Name => 'Notify Owner as Comment', # loc Description => 'Sends mail to the owner', # loc ExecModule => 'NotifyAsComment', Argument => 'Owner' }, { Name => 'Notify Owner', # loc Description => 'Sends mail to the owner', # loc ExecModule => 'Notify', Argument => 'Owner' }, { Name => 'Notify Ccs as Comment', # loc Description => 'Sends mail to the Ccs as a comment', # loc ExecModule => 'NotifyAsComment', Argument => 'Cc' }, { Name => 'Notify Ccs', # loc Description => 'Sends mail to the Ccs', # loc ExecModule => 'Notify', Argument => 'Cc' }, { Name => 'Notify AdminCcs as Comment', # loc Description => 'Sends mail to the administrative Ccs as a comment', # loc ExecModule => 'NotifyAsComment', Argument => 'AdminCc' }, { Name => 'Notify AdminCcs', # loc Description => 'Sends mail to the administrative Ccs', # loc ExecModule => 'Notify', Argument => 'AdminCc' }, { Name => 'Notify Requestors and Ccs as Comment', # loc Description => 'Send mail to requestors and Ccs as a comment', # loc ExecModule => 'NotifyAsComment', Argument => 'Requestor,Cc' }, { Name => 'Notify Requestors and Ccs', # loc Description => 'Send mail to requestors and Ccs', # loc ExecModule => 'Notify', Argument => 'Requestor,Cc' }, { Name => 'Notify Requestors, Ccs and AdminCcs as Comment', # loc Description => 'Send mail to all watchers as a "comment"', # loc ExecModule => 'NotifyAsComment', Argument => 'All' }, { Name => 'Notify Requestors, Ccs and AdminCcs', # loc Description => 'Send mail to all watchers', # loc ExecModule => 'Notify', Argument => 'All' }, { Name => 'Notify Other Recipients as Comment', # loc Description => 'Sends mail to explicitly listed Ccs and Bccs', # loc ExecModule => 'NotifyAsComment', Argument => 'OtherRecipients' }, { Name => 'Notify Other Recipients', # loc Description => 'Sends mail to explicitly listed Ccs and Bccs', # loc ExecModule => 'Notify', Argument => 'OtherRecipients' }, { Name => 'User Defined', # loc Description => 'Perform a user-defined action', # loc ExecModule => 'UserDefined', }, { Name => 'Create Tickets', # loc Description => 'Create new tickets based on this scrip\'s template', # loc ExecModule => 'CreateTickets', }, { Name => 'Open Tickets', Description => 'Open tickets on correspondence', # loc ExecModule => 'AutoOpen' }, ); @ScripConditions = ( { Name => 'On Create', # loc Description => 'When a ticket is created', # loc ApplicableTransTypes => 'Create', ExecModule => 'AnyTransaction', }, { Name => 'On Transaction', # loc Description => 'When anything happens', # loc ApplicableTransTypes => 'Any', ExecModule => 'AnyTransaction', }, { Name => 'On Correspond', # loc Description => 'Whenever correspondence comes in', # loc ApplicableTransTypes => 'Correspond', ExecModule => 'AnyTransaction', }, { Name => 'On Comment', # loc Description => 'Whenever comments come in', # loc ApplicableTransTypes => 'Comment', ExecModule => 'AnyTransaction' }, { Name => 'On Status Change', # loc Description => 'Whenever a ticket\'s status changes', # loc ApplicableTransTypes => 'Status', ExecModule => 'AnyTransaction', }, { Name => 'On Priority Change', # loc Description => 'Whenever a ticket\'s priority changes', # loc ApplicableTransTypes => 'Set', ExecModule => 'PriorityChange', }, { Name => 'On Owner Change', # loc Description => 'Whenever a ticket\'s owner changes', # loc ApplicableTransTypes => 'Any', ExecModule => 'OwnerChange', }, { Name => 'On Queue Change', # loc Description => 'Whenever a ticket\'s queue changes', # loc ApplicableTransTypes => 'Set', ExecModule => 'QueueChange', }, { Name => 'On Resolve', # loc Description => 'Whenever a ticket is resolved', # loc ApplicableTransTypes => 'Status', ExecModule => 'StatusChange', Argument => 'resolved' }, { Name => 'User Defined', # loc Description => 'Whenever a user-defined condition occurs', # loc ApplicableTransTypes => 'Any', ExecModule => 'UserDefined' }, ); @Templates = ( { Queue => '0', Name => 'Blank', # loc Description => 'A blank template', # loc Content => '', }, { Queue => '0', Name => 'Transaction', # loc Description => 'Default transaction template', # loc Content => 'RT-Attach-Message: yes {$Transaction->CreatedAsString}: Request {$Ticket->id} was acted upon. Transaction: {$Transaction->Description} Queue: {$Ticket->QueueObj->Name} Subject: {$Transaction->Subject || $Ticket->Subject || "(No subject given)"} Owner: {$Ticket->OwnerObj->Name} Requestors: {$Ticket->RequestorAddresses} Status: {$Ticket->Status} Ticket id} > {$Transaction->Content()} ' }, { Queue => '0', Name => 'Admin Correspondence', # loc Description => 'Default admin correspondence template', # loc Content => 'RT-Attach-Message: yes id} > {$Transaction->Content()} ' }, { Queue => '0', Name => 'Correspondence', # loc Description => 'Default correspondence template', # loc Content => 'RT-Attach-Message: yes {$Transaction->Content()} ' }, { Queue => '0', Name => 'Admin Comment', # loc Description => 'Default admin comment template', # loc Content => 'Subject: [Comment] {my $s=($Transaction->Subject||$Ticket->Subject); $s =~ s/\\[Comment\\]//g; $comment =~ s/^Re//i; $s;} {$RT::WebURL}Ticket/Display.html?id={$Ticket->id} This is a comment. It is not sent to the Requestor(s): {$Transaction->Content()} ' }, { Queue => '0', Name => 'Status Change', # loc Description => 'Ticket status changed', # loc Content => 'Subject: Status Changed to: {$Transaction->NewValue} {$RT::WebURL}Ticket/Display.html?id={$Ticket->id} {$Transaction->Content()} ' }, { Queue => '0', Name => 'Resolved', # loc Description => 'Ticket Resolved', # loc Content => 'Subject: Resolved: {$Ticket->Subject} According to our records, your request has been resolved. If you have any further questions or concerns, please respond to this message. ' }, { Queue => '___Approvals', Name => "New Pending Approval", # loc Description => "Notify Owners and AdminCcs of new items pending their approval", # loc Content => 'Subject: New Pending Approval: {$Ticket->Subject} Greetings, There is a new item pending your approval: "{$Ticket->Subject()}", a summary of which appears below. Please visit {$RT::WebURL}Approvals/Display.html?id={$Ticket->id} to approve or reject this ticket, or {$RT::WebURL}Approvals/ to batch-process all your pending approvals. ------------------------------------------------------------------------- {$Transaction->Content()} ' }, { Queue => '___Approvals', Name => "Approval Passed", # loc Description => "Notify Owner of their ticket has been approved by some approver", # loc Content => 'Subject: Ticket Approved: {$Ticket->Subject} Greetings, Your ticket has been approved by { eval { $Approval->OwnerObj->Name } }. Other approvals may be pending. ' }, { Queue => '___Approvals', Name => "All Approvals Passed", # loc Description => "Notify Owner of their ticket has been approved by all approvers", # loc Content => 'Subject: Ticket Approved: {$Ticket->Subject} Greetings, Your ticket has been approved. Its Owner may now start to act on it. ' }, { Queue => '___Approvals', Name => "Approval Rejected", # loc Description => "Notify Owner of their rejected ticket", # loc Content => 'Subject: Ticket Rejected: {$Ticket->Subject} Greetings, Your ticket has been rejected by { eval { $Approval->OwnerObj->Name } }. ' }, ); # }}} @Scrips = ( { ScripCondition => 'On Correspond', ScripAction => 'Open Tickets', Template => 'Blank' }, { ScripCondition => 'On Owner Change', ScripAction => 'Notify Owner', Template => 'Transaction' }, { ScripCondition => 'On Correspond', ScripAction => 'Notify Other Recipients', Template => 'Correspondence' }, { Description => "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval", # loc Queue => '___Approvals', ScripCondition => 'User Defined', CustomIsApplicableCode => q[ $self->TicketObj->Type eq 'approval' and $self->TransactionObj->Field eq 'Status' and $self->TransactionObj->NewValue eq 'open' and eval { $T::Approving = ($self->TicketObj->AllDependedOnBy( Type => 'ticket' ))[0] } ], ScripAction => 'Notify Owner', Template => 'New Pending Approval' }, { Description => "If an approval is rejected, reject the original and delete pending approvals", # loc Queue => '___Approvals', ScripCondition => 'On Status Change', ScripAction => 'User Defined', CustomPrepareCode => q[ # ------------------------------------------------------------------- # return(0) unless ( lc($self->TransactionObj->NewValue) eq "rejected" or lc($self->TransactionObj->NewValue) eq "deleted" ); my $rejected = 0; my $links = $self->TicketObj->DependedOnBy; foreach my $link (@{ $links->ItemsArrayRef }) { my $obj = $link->BaseObj; if ($obj->QueueObj->IsActiveStatus($obj->Status)) { if ($obj->Type eq 'ticket') { $obj->Comment( Content => $self->loc("Your request was rejected."), ); $obj->SetStatus( Status => 'rejected', Force => 1, ); $T::Approval = $self->TicketObj; # so we can access it inside templates $self->{TicketObj} = $obj; # we want the original id in the token line $rejected = 1; } else { $obj->SetStatus( Status => 'deleted', Force => 1, ); } } } $links = $self->TicketObj->DependsOn; foreach my $link (@{ $links->ItemsArrayRef }) { my $obj = $link->TargetObj; if ($obj->QueueObj->IsActiveStatus($obj->Status)) { $obj->SetStatus( Status => 'deleted', Force => 1, ); } } # Now magically turn myself into a Requestor Notify object... require RT::Action::Notify; bless($self, 'RT::Action::Notify'); $self->{Argument} = 'Requestor'; $self->Prepare; return $rejected; # ------------------------------------------------------------------- # ], CustomCommitCode => '"never needed"', Template => 'Approval Rejected', }, { Description => "When a ticket has been approved by any approver, add correspondence to the original ticket", # loc Queue => '___Approvals', ScripCondition => 'On Resolve', ScripAction => 'User Defined', CustomPrepareCode => q[ # ------------------------------------------------------------------- # return(0) unless ($self->TicketObj->Type eq 'approval'); my $note; my $t = $self->TicketObj->Transactions; while (my $o = $t->Next) { $note .= $o->Content . "\n" if $o->ContentObj and $o->Content !~ /Default Approval/; } foreach my $obj ($self->TicketObj->AllDependedOnBy( Type => 'ticket' )) { $obj->Comment( Content => $self->loc( "Your request has been approved by [_1]. Other approvals may still be pending.", # loc $self->TransactionObj->CreatorObj->Name, ) . "\n" . $self->loc( "Approver's notes: [_1]", # loc $note ), ); $T::Approval = $self->TicketObj; # so we can access it inside templates $self->{TicketObj} = $obj; # we want the original id in the token line } # Now magically turn myself into a Requestor Notify object... require RT::Action::Notify; bless($self, 'RT::Action::Notify'); $self->{Argument} = 'Requestor'; $self->Prepare; return 1; # ------------------------------------------------------------------- # ], CustomCommitCode => '"never needed"', Template => 'Approval Passed' }, { Description => "When a ticket has been approved by all approvers, add correspondence to the original ticket", # loc Queue => '___Approvals', ScripCondition => 'On Resolve', ScripAction => 'User Defined', CustomPrepareCode => q[ # ------------------------------------------------------------------- # # Find all the tickets that depend on this (that this is approving) my $Ticket = $self->TicketObj; my @TOP = $Ticket->AllDependedOnBy( Type => 'ticket' ); my $links = $Ticket->DependedOnBy; my $passed = 0; while (my $link = $links->Next) { my $obj = $link->BaseObj; next if ($obj->HasUnresolvedDependencies( Type => 'approval' )); if ($obj->Type eq 'ticket') { $obj->Comment( Content => $self->loc("Your request has been approved."), ); $T::Approval = $Ticket; # so we can access it inside templates $self->{TicketObj} = $obj; # we want the original id in the token line $passed = 1; } elsif ($obj->Type eq 'approval') { $obj->SetStatus( Status => 'open', Force => 1 ); } elsif ($RT::UseCodeTickets and $obj->Type eq 'code') { my $code = $obj->Transactions->First->Content; my $rv; foreach my $TOP (@TOP) { local $@; $rv++ if eval $code; $RT::Logger->error("Cannot eval code: $@") if $@; } if ($rv or !@TOP) { $obj->SetStatus( Status => 'resolved', Force => 1,); } else { $obj->SetStatus( Status => 'rejected', Force => 1,); } } } # Now magically turn myself into a Requestor Notify object... require RT::Action::Notify; bless($self, 'RT::Action::Notify'); $self->{Argument} = 'Requestor'; $self->Prepare; return 0; # ignore $passed; # ------------------------------------------------------------------- # ], CustomCommitCode => '"never needed"', Template => 'All Approvals Passed', }, ); @ACL = ( { UserId => 'Nobody', # - principalId Right => 'OwnTicket', }, { UserId => 'root', # - principalid Right => 'SuperUser', }, ); # Predefined searches @Attributes = ( { Name => 'Search - My Tickets', Description => '[_1] highest priority tickets I own', # loc Content => { Format => "'__id__/TITLE:#', '__Subject__/TITLE:Subject', Priority, QueueName, ExtendedStatus", Query => " Owner = '__CurrentUser__' AND ( Status = 'new' OR Status = 'open')", OrderBy => 'Priority', Order => 'DESC' }, }, { Name => 'Search - Unowned Tickets', Description => '[_1] newest unowned tickets', # loc Content => # 'Take' #loc { Format => "'__id__/TITLE:#', '__Subject__/TITLE:Subject', QueueName, ExtendedStatus, CreatedRelative, '__loc(Take)__/TITLE: ' ", Query => " Owner = 'Nobody' AND ( Status = 'new' OR Status = 'open')", OrderBy => 'Created', Order => 'DESC' }, }, { Name => 'HomepageSettings', Description => 'HomepageSettings', Content => { 'body' => # loc [ { type => 'system', name => 'My Tickets' }, { type => 'system', name => 'Unowned Tickets' }, { type => 'component', name => 'QuickCreate'}, ], 'summary' => # loc [ { type => 'component', name => 'MyReminders' }, { type => 'component', name => 'Quicksearch' }, { type => 'component', name => 'RefreshHomepage' }, ] }, } );