X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Fetc%2Finitialdata;h=aa2010fd1386fe8ce1f2af720da5479d9068aa3f;hp=3a21ce1f6507ec1de568bfb1d485b1c27775d31a;hb=221ec4469fe66fe3f2a91122d887525b0a49fbe6;hpb=9c68254528b6f2c7d8c1921b452fa56064783782 diff --git a/rt/etc/initialdata b/rt/etc/initialdata index 3a21ce1f6..aa2010fd1 100644 --- a/rt/etc/initialdata +++ b/rt/etc/initialdata @@ -1,69 +1,25 @@ -# Initial data for a fresh RT3 Installation. +# Initial data for a fresh RT 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 => 'Enoch Root', Password => 'password', EmailAddress => "root\@localhost", Comments => 'SuperUser', - Privileged => '1', } ); + 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 => 'General', Description => 'The default queue', CorrespondAddress => "", CommentAddress => "", }, { Name => '___Approvals', + Lifecycle => 'approvals', Description => 'A system-internal queue for the approvals system', Disabled => 2, } ); @@ -102,33 +58,44 @@ Description => 'Sends mail to the administrative Ccs', # loc ExecModule => 'Notify', Argument => 'AdminCc' }, - + { Name => 'Notify Owner and AdminCcs', # loc + Description => 'Sends mail to the Owner and administrative Ccs', # loc + ExecModule => 'Notify', + Argument => 'Owner,AdminCc' }, + { Name => 'Notify Owner or AdminCcs', # loc + Description => 'Sends mail to the Owner if set, otherwise administrative Ccs', # loc + ExecModule => 'NotifyOwnerOrAdminCc', + }, { 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' }, +# deprecated +# { 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 +# not yet deprecated + { Name => 'Notify Owner, Requestors, Ccs and AdminCcs as Comment', # loc + Description => 'Send mail to owner and all watchers as a "comment"', # loc ExecModule => 'NotifyAsComment', Argument => 'All' }, - { Name => 'Notify Requestors, Ccs and AdminCcs', # loc - Description => 'Send mail to all watchers', # loc + { Name => 'Notify Owner, Requestors, Ccs and AdminCcs', # loc + Description => 'Send mail to owner and 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' }, +# deprecated? now default create scrips use it in 4.2 { 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', }, @@ -136,9 +103,37 @@ Description => 'Create new tickets based on this scrip\'s template', # loc ExecModule => 'CreateTickets', }, - { Name => 'Open Tickets', + { Name => 'Open Tickets', # loc Description => 'Open tickets on correspondence', # loc ExecModule => 'AutoOpen' }, + { Name => 'Extract Subject Tag', # loc + Description => 'Extract tags from a Transaction\'s subject and add them to the Ticket\'s subject.', # loc + ExecModule => 'ExtractSubjectTag' }, + { Name => 'Send Forward', # loc + Description => 'Send forwarded message', # loc + ExecModule => 'SendForward', }, + #freeside + { Name => 'Set Priority', + Description => 'Set ticket priority', + ExecModule => 'SetPriority', + Argument => '', + }, + { Name => 'Cancel Scheduled Resolve', + Description => 'Set ticket not to resolve in the future', + ExecModule => 'SetWillResolve', + Argument => '', + }, + { Name => 'Scheduled Resolve', + Description => 'Resolve ticket if its WillResolve date has passed', + ExecModule => 'ScheduledResolve', + Argument => '', + }, +# combine these into a single action so they can see each other in the headers + { Name => 'Notify Requestors, Ccs, and Other Recipients', + Description => 'Send mail to requestors, watchers, and explicit Ccs', + ExecModule => 'Notify', + Argument => 'Requestor,Cc,OtherRecipients', + }, ); @ScripConditions = ( @@ -160,6 +155,27 @@ { + Name => 'On Forward', # loc + Description => 'Whenever a ticket or transaction is forwarded', # loc + ApplicableTransTypes => 'Forward Transaction,Forward Ticket', + ExecModule => 'AnyTransaction', }, + + { + + Name => 'On Forward Ticket', # loc + Description => 'Whenever a ticket is forwarded', # loc + ApplicableTransTypes => 'Forward Ticket', + ExecModule => 'AnyTransaction', }, + + { + + Name => 'On Forward Transaction', # loc + Description => 'Whenever a transaction is forwarded', # loc + ApplicableTransTypes => 'Forward Transaction', + ExecModule => 'AnyTransaction', }, + + { + Name => 'On Comment', # loc Description => 'Whenever comments come in', # loc ApplicableTransTypes => 'Comment', @@ -202,7 +218,13 @@ Argument => 'resolved' }, + { Name => 'On Reject', # loc + Description => 'Whenever a ticket is rejected', # loc + ApplicableTransTypes => 'Status', + ExecModule => 'StatusChange', + Argument => 'rejected' + }, { Name => 'User Defined', # loc Description => 'Whenever a user-defined condition occurs', # loc ApplicableTransTypes => 'Any', @@ -210,6 +232,29 @@ }, + { Name => 'On Close', # loc + Description => 'Whenever a ticket is closed', # loc + ApplicableTransTypes => 'Status,Set', + ExecModule => 'CloseTicket', + }, + { Name => 'On Reopen', # loc + Description => 'Whenever a ticket is reopened', # loc + ApplicableTransTypes => 'Status,Set', + ExecModule => 'ReopenTicket', + }, + + #freeside + #{ Name => 'On Custom Field Transaction', + # Description => 'When a custom field is changed', + # ExecModule => 'CustomFieldTransaction', + # ApplicableTransTypes => 'Any', + #}, + #{ Name => 'On Custom Field Change', + # Description => 'When a custom field is changed to some value', + # ExecModule => 'CustomFieldChange', + # ApplicableTransTypes => 'Any', + #}, + ); @Templates = ( @@ -219,7 +264,7 @@ Content => '', }, { Queue => '0', Name => 'Autoreply', # loc - Description => 'Default Autoresponse template', # loc + Description => 'Plain text Autoresponse template', # loc Content => 'Subject: AutoReply: {$Ticket->Subject} @@ -227,15 +272,15 @@ Greetings, This message has been automatically generated in response to the creation of a trouble ticket regarding: - "{$Ticket->Subject()}", + "{$Ticket->Subject()}", a summary of which appears below. There is no need to reply to this message right now. Your ticket has been -assigned an ID of [{$rtname} #{$Ticket->id()}]. +assigned an ID of { $Ticket->SubjectTag }. Please include the string: - [{$rtname} #{$Ticket->id}] + { $Ticket->SubjectTag } in the subject line of all future correspondence about this issue. To do so, you may reply to this message. @@ -247,63 +292,267 @@ you may reply to this message. {$Transaction->Content()} ' }, + { Queue => '0', + Name => 'Autoreply in HTML', # loc + Description => 'HTML Autoresponse template', # loc + Content => q[Subject: AutoReply: {$Ticket->Subject} +Content-Type: text/html + +

Greetings,

+ +

This message has been automatically generated in response to the +creation of a trouble ticket regarding {$Ticket->Subject()}, +a summary of which appears below.

+ +

There is no need to reply to this message right now. Your ticket has been +assigned an ID of {$Ticket->SubjectTag}.

+

Please include the string {$Ticket->SubjectTag} +in the subject line of all future correspondence about this issue. To do so, +you may reply to this message.

+ +

Thank you,
+{$Ticket->QueueObj->CorrespondAddress()}

+ +
+{$Transaction->Content(Type => 'text/html')} +], + }, + { Queue => '0', + Name => 'AutoreplyOrCorrespondence', # loc + Description => 'Plaintext AutoreplyOrCorrespondence template', # loc + Content => q[{ + use RT::Template; + my $creator_name = $Ticket->CreatorObj->Name; + my $requestors = $Ticket->Requestors->UserMembersObj; + my ( $c_requestor, $r_count ) = ( 0, 0 ); + while ( my $r = $requestors->Next() ) { + if ( $r->Name eq $creator_name ) { + $c_requestor++; + } + else { + $r_count++; + } + } + my $template = new RT::Template($RT::SystemUser); + my $template_name; + + #if the creator is not a requestor or + #there is more than one requestor ( who's not the creator ) + #use the Correspondence template + if ( ! $c_requestor || $r_count ) { + $template_name = 'Correspondence'; + } + else { + #otherwise use the Autoreply template + $template_name = 'Autoreply'; + } + + #Load the Queue Template + $template->LoadQueueTemplate( + Queue => $Ticket->Queue, + Name => $template_name, + ); + #if there's no Queue Template attempt to find a Global one. + unless ( $template->id ) { + $template->LoadGlobalTemplate( $template_name ); + unless ( $template->id ) { + $RT::Logger->error("Could not load template : $template_name") + } + } + #Process embedded fields & expressions of true templates; + #note that we can only meaningfully use the body + my($ret, $msg) = $template->Parse( + TicketObj => $Ticket, + TransactionObj => $Transaction, + ); + $ret ? $template->MIMEObj->stringify : $msg; + } +], + }, + { Queue => '0', + Name => 'AutoreplyOrCorrespondence in HTML', # loc + Description => 'HTML AutoreplyOrCorrespondence template', # loc + Content => q[{ + use RT::Template; + my $creator_name = $Ticket->CreatorObj->Name; + my $requestors = $Ticket->Requestors->UserMembersObj; + my ( $c_requestor, $r_count ) = ( 0, 0 ); + while ( my $r = $requestors->Next() ) { + if ( $r->Name eq $creator_name ) { + $c_requestor++; + } + else { + $r_count++; + } + } + my $template = new RT::Template($RT::SystemUser); + my $template_name; + + #if the creator is not a requestor or + #there is more than one requestor ( who's not the creator ) + #use the Correspondence template + if ( ! $c_requestor || $r_count ) { + $template_name = 'Correspondence in HTML'; + } + else { + #otherwise use the Autoreply in HTML template + $template_name = 'Autoreply in HTML'; + } + + #Load the Queue Template + $template->LoadQueueTemplate( + Queue => $Ticket->Queue, + Name => $template_name, + ); + #if there's no Queue Template attempt to find a Global one. + unless ( $template->id ) { + $template->LoadGlobalTemplate( $template_name ); + unless ( $template->id ) { + $RT::Logger->error("Could not load template : $template_name") + } + } + #Process embedded fields & expressions of true templates; + #note that we can only meaningfully use the body + my($ret, $msg) = $template->Parse( + TicketObj => $Ticket, + TransactionObj => $Transaction, + ); + $ret ? $template->MIMEObj->stringify : $msg; + } +], + }, { Queue => '0', Name => 'Transaction', # loc - Description => 'Default transaction template', # loc + Description => 'Plain text transaction template', # loc Content => 'RT-Attach-Message: yes {$Transaction->CreatedAsString}: Request {$Ticket->id} was acted upon. -Transaction: {$Transaction->Description} + 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} > + Ticket Config->Get(\'WebURL\')}Ticket/Display.html?id={$Ticket->id} > {$Transaction->Content()} ' }, - + { Queue => '0', + Name => 'Transaction in HTML', # loc + Description => 'HTML transaction template', # loc + Content => 'RT-Attach-Message: yes +Content-Type: text/html + +{$Transaction->CreatedAsString}: Request id}">{$Ticket->id} was acted upon by {$Transaction->CreatorObj->Name}. +
+ + + + + + + + +
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 URL:id}">{RT->Config->Get("WebURL")}Ticket/Display.html?id={$Ticket->id}
+
+
+{$Transaction->Content( Type => "text/html")} +' + }, + # Shadow the global templates of the same name to suppress duplicate + # notifications until rules is ripped out. + { Queue => "___Approvals", + Name => "Transaction in HTML", + Content => "", + }, + { Queue => "___Approvals", + Name => "Transaction", + Content => "", + }, { Queue => '0', Name => 'Admin Correspondence', # loc - Description => 'Default admin correspondence template', # loc + Description => 'Plain text admin correspondence template', # loc Content => 'RT-Attach-Message: yes -id} > +Config->Get(\'WebURL\')}Ticket/Display.html?id={$Ticket->id} > {$Transaction->Content()} ' }, + { Queue => '0', + Name => 'Admin Correspondence in HTML', # loc + Description => 'HTML admin correspondence template', # loc + Content => 'RT-Attach-Message: yes +Content-Type: text/html +Ticket URL: id}">{RT->Config->Get("WebURL")}Ticket/Display.html?id={$Ticket->id} +
+
+{$Transaction->Content(Type => "text/html");} +' + }, { Queue => '0', Name => 'Correspondence', # loc - Description => 'Default correspondence template', # loc + Description => 'Plain text correspondence template', # loc Content => 'RT-Attach-Message: yes {$Transaction->Content()} ' }, + { Queue => '0', + Name => 'Correspondence in HTML', # loc + Description => 'HTML correspondence template', # loc + Content => 'RT-Attach-Message: yes +Content-Type: text/html +{$Transaction->Content( Type => "text/html")} +' + }, { Queue => '0', Name => 'Admin Comment', # loc - Description => 'Default admin comment template', # loc + Description => 'Plain text admin comment template', # loc Content => -'Subject: [Comment] {my $s=($Transaction->Subject||$Ticket->Subject); $s =~ s/\\[Comment\\]//g; $comment =~ s/^Re//i; $s;} +'Subject: [Comment] {my $s=($Transaction->Subject||$Ticket->Subject||""); $s =~ s/\\[Comment\\]\\s*//g; $s =~ s/^Re:\\s*//i; $s;} +RT-Attach-Message: yes -{$RT::WebURL}Ticket/Display.html?id={$Ticket->id} +{RT->Config->Get(\'WebURL\')}Ticket/Display.html?id={$Ticket->id} This is a comment. It is not sent to the Requestor(s): {$Transaction->Content()} ' }, + { Queue => '0', + Name => 'Admin Comment in HTML', # loc + Description => 'HTML admin comment template', # loc + Content => +'Subject: [Comment] {my $s=($Transaction->Subject||$Ticket->Subject||""); $s =~ s/\\[Comment\\]\\s*//g; $s =~ s/^Re:\\s*//i; $s;} +RT-Attach-Message: yes +Content-Type: text/html + +

This is a comment about id}">ticket {$Ticket->id}. It is not sent to the Requestor(s):

+ +{$Transaction->Content(Type => "text/html")} +' + }, + { Queue => '0', + Name => 'Reminder', # loc + Description => 'Default reminder template', # loc + Content => +'Subject:{$Ticket->Subject} is due {$Ticket->DueObj->AsString} + +This reminder is for ticket #{$Target = $Ticket->RefersTo->First->TargetObj;$Target->Id}. + +{RT->Config->Get(\'WebURL\')}Ticket/Display.html?id={$Target->Id} +' + }, { Queue => '0', Name => 'Status Change', # loc @@ -311,12 +560,23 @@ This is a comment. It is not sent to the Requestor(s): Content => 'Subject: Status Changed to: {$Transaction->NewValue} -{$RT::WebURL}Ticket/Display.html?id={$Ticket->id} +{RT->Config->Get(\'WebURL\')}Ticket/Display.html?id={$Ticket->id} {$Transaction->Content()} ' }, + { Queue => '0', + Name => 'Status Change in HTML', # loc + Description => 'HTML Ticket status changed', # loc + Content => 'Subject: Status Changed to: {$Transaction->NewValue} +Content-Type: text/html +id}">{RT->Config->Get("WebURL")}Ticket/Display.html?id={$Ticket->id} +
+
+{$Transaction->Content(Type => "text/html")} +' + }, { Queue => '0', @@ -328,6 +588,15 @@ According to our records, your request has been resolved. If you have any further questions or concerns, please respond to this message. ' }, + { Queue => '0', + Name => 'Resolved in HTML', # loc + Description => 'HTML Ticket Resolved', # loc + Content => 'Subject: Resolved: {$Ticket->Subject} +Content-Type: text/html + +

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 => @@ -339,8 +608,8 @@ 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 +Please visit {RT->Config->Get(\'WebURL\')}Approvals/Display.html?id={$Ticket->id} +to approve or reject this ticket, or {RT->Config->Get(\'WebURL\')}Approvals/ to batch-process all your pending approvals. ------------------------------------------------------------------------- @@ -348,26 +617,82 @@ batch-process all your pending approvals. ' }, { Queue => '___Approvals', + Name => "New Pending Approval in HTML", # loc + Description => "Notify Owners and AdminCcs of new items pending their approval", # loc + Content => 'Subject: New Pending Approval: {$Ticket->Subject} +Content-Type: text/html + +

Greetings,

+ +

There is a new item pending your approval: {$Ticket->Subject()}, +a summary of which appears below.

+ +

Please approve +or reject this ticket, or visit the approvals +overview 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 + "Notify Requestor 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 } }. +Your ticket has been approved by { eval { $Approver->Name } }. Other approvals may be pending. + +Approver\'s notes: { $Notes } +' + }, + { Queue => '___Approvals', + Name => "Approval Passed in HTML", # loc + Description => + "Notify Requestor of their ticket has been approved by some approver", # loc + Content => 'Subject: Ticket Approved: {$Ticket->Subject} +Content-Type: text/html + +

Greetings,

+ +

Your ticket has been approved by { eval { $Approver->Name } }. +Other approvals may be pending.

+ +

Approver\'s notes:

+
{ $Notes }
' }, { Queue => '___Approvals', Name => "All Approvals Passed", # loc Description => - "Notify Owner of their ticket has been approved by all approvers", # loc + "Notify Requestor 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. +Your ticket has been approved by { eval { $Approver->Name } }. +Its Owner may now start to act on it. + +Approver\'s notes: { $Notes } +' + }, + { Queue => '___Approvals', + Name => "All Approvals Passed in HTML", # loc + Description => + "Notify Requestor of their ticket has been approved by all approvers", # loc + Content => 'Subject: Ticket Approved: {$Ticket->Subject} +Content-Type: text/html + +

Greetings,

+ +

Your ticket has been approved by { eval { $Approver->Name } }. +Its Owner may now start to act on it.

+ +

Approver\'s notes:

+
{ $Notes }
' }, { Queue => '___Approvals', @@ -378,210 +703,460 @@ Your ticket has been approved. Its Owner may now start to act on it. Greetings, -Your ticket has been rejected by { eval { $Approval->OwnerObj->Name } }. +Your ticket has been rejected by { eval { $Approver->Name } }. + +Approver\'s notes: { $Notes } +' + }, + { Queue => '___Approvals', + Name => "Approval Rejected in HTML", # loc + Description => + "Notify Owner of their rejected ticket", # loc + Content => 'Subject: Ticket Rejected: {$Ticket->Subject} +Content-Type: text/html + +

Greetings,

+ +

Your ticket has been rejected by { eval { $Approver->Name } }.

+ +

Approver\'s notes:

+
{ $Notes }
+' + }, + { Queue => '___Approvals', + Name => "Approval Ready for Owner", # loc + Description => + "Notify Owner of their ticket has been approved and is ready to be acted on", # loc + Content => 'Subject: Ticket Approved: {$Ticket->Subject} + +Greetings, + +The ticket has been approved, you may now start to act on it. + ' }, -); -# }}} + { Queue => '___Approvals', + Name => "Approval Ready for Owner in HTML", # loc + Description => + "Notify Owner of their ticket has been approved and is ready to be acted on", # loc + Content => 'Subject: Ticket Approved: {$Ticket->Subject} +Content-Type: text/html -@Scrips = ( - { ScripCondition => 'On Correspond', - ScripAction => 'Open Tickets', - Template => 'Blank' }, - { ScripCondition => 'On Owner Change', - ScripAction => 'Notify Owner', - Template => 'Transaction' }, - { ScripCondition => 'On Create', - ScripAction => 'AutoReply To Requestors', - Template => 'AutoReply' }, - { ScripCondition => 'On Create', - ScripAction => 'Notify AdminCcs', - Template => 'Transaction' }, - { ScripCondition => 'On Correspond', - ScripAction => 'Notify AdminCcs', - Template => 'Admin Correspondence' }, - { ScripCondition => 'On Correspond', - ScripAction => 'Notify Requestors And Ccs', - Template => 'Correspondence' }, - { ScripCondition => 'On Correspond', - ScripAction => 'Notify Other Recipients', - Template => 'Correspondence' }, - { ScripCondition => 'On Comment', - ScripAction => 'Notify AdminCcs As Comment', - Template => 'Admin Comment' }, - { ScripCondition => 'On Comment', - ScripAction => 'Notify Other Recipients As Comment', - Template => 'Correspondence' }, - { ScripCondition => 'On Resolve', - ScripAction => 'Notify Requestors', - Template => 'Resolved' }, - { 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, - ); - } - } +

Greetings,

+ +

The ticket has been approved, you may now start to act on it.

+ +' + }, + { Queue => 0, + Name => "Forward", # loc + Description => "Forwarded message", # loc + Content => q{ + +{ $ForwardTransaction->Content =~ /\S/ ? $ForwardTransaction->Content : "This is a forward of transaction #".$Transaction->id." of ticket #". $Ticket->id } } + }, + { Queue => 0, + Name => "Forward Ticket", # loc + Description => "Forwarded ticket message", # loc + Content => q{ -$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, - ); - } +{ $ForwardTransaction->Content =~ /\S/ ? $ForwardTransaction->Content : "This is a forward of ticket #". $Ticket->id } } + }, + { Queue => 0, + Name => "Error: unencrypted message", # loc + Description => + "Inform user that their unencrypted mail has been rejected", # loc + Content => q{Subject: RT requires that all incoming mail be encrypted -# 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/; +You received this message because RT received mail from you that was not encrypted. As such, it has been rejected. } + }, + { Queue => 0, + Name => "Error: public key", # loc + Description => + "Inform user that he has problems with public key and couldn't recieve encrypted content", # loc + Content => q{Subject: We have no your public key or it's wrong -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 +You received this message as we have no your public PGP key or we have a problem with your key. Inform the administrator about the problem. } + }, + { Queue => 0, + Name => "Error to RT owner: public key", # loc + Description => + "Inform RT owner that user(s) have problems with public keys", # loc + Content => q{Subject: Some users have problems with public keys -# 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,); - } +You received this message as RT has problems with public keys of the following user: +{ + foreach my $e ( @BadRecipients ) { + $OUT .= "* ". $e->{'Message'} ."\n"; } +}} + }, + { Queue => 0, + Name => "Error: no private key", # loc + Description => + "Inform user that we received an encrypted email and we have no private keys to decrypt", # loc + Content => q{Subject: we received message we cannot decrypt + +You sent an encrypted message with subject '{ $Message->head->get('Subject') }', +but we have no private key it's encrypted to. + +Please, check that you encrypt messages with correct keys +or contact the system administrator.} + }, + { Queue => 0, + Name => "Error: bad encrypted data", # loc + Description => + "Inform user that a message he sent has invalid encryption data", # loc + Content => q{Subject: We received a message we cannot handle + +You sent us a message that we cannot handle due to corrupted signature or encrypted block. we get the following error(s): +{ foreach my $msg ( @Messages ) { + $OUT .= "* $msg\n"; + } +}} + }, + { Queue => 0, + Name => "PasswordChange", # loc + Description => + "Inform user that his password has been reset", # loc + Content => q{Subject: [{RT->Config->Get('rtname')}] Password reset + +Greetings, + +Someone at {$ENV{'REMOTE_ADDR'}} requested a password reset for you on {RT->Config->Get('WebURL')} + +Your new password is: + {$NewPassword} } + }, -# Now magically turn myself into a Requestor Notify object... -require RT::Action::Notify; bless($self, 'RT::Action::Notify'); -$self->{Argument} = 'Requestor'; $self->Prepare; + { Queue => '0', + Name => 'Email Digest', # loc + Description => 'Email template for periodic notification digests', # loc + Content => q[Subject: RT Email Digest -return 0; # ignore $passed; -# ------------------------------------------------------------------- # - ], - CustomCommitCode => '"never needed"', - Template => 'All Approvals Passed', }, +{ $Argument } +], + }, + +{ + Queue => 0, + Name => "Error: Missing dashboard", # loc + Description => + "Inform user that a dashboard he subscribed to is missing", # loc + Content => q{Subject: [{RT->Config->Get('rtname')}] Missing dashboard! + +Greetings, + +You are subscribed to a dashboard that is currently missing. Most likely, the dashboard was deleted. + +RT will remove this subscription as it is no longer useful. Here's the information RT had about your subscription: + +DashboardID: { $SubscriptionObj->SubValue('DashboardId') } +Frequency: { $SubscriptionObj->SubValue('Frequency') } +Hour: { $SubscriptionObj->SubValue('Hour') } +{ + $SubscriptionObj->SubValue('Frequency') eq 'weekly' + ? "Day of week: " . $SubscriptionObj->SubValue('Dow') + : $SubscriptionObj->SubValue('Frequency') eq 'monthly' + ? "Day of month: " . $SubscriptionObj->SubValue('Dom') + : '' +} +} +}, + { Queue => 0, + Name => 'Custom Field Transaction', + Description => 'Custom field value changed', + Content => q[Subject: {$Transaction->BriefDescription()} + +{RT->Config->Get('WebURL')}Ticket/Display.html?id={$Ticket->id} + +{$Transaction->Content()} +], + }, ); -@ACL = ( - { UserId => 'Nobody', # - principalId - Right => 'OwnTicket', }, +@Scrips = ( + { Description => 'On Comment Notify AdminCcs as Comment', + ScripCondition => 'On Comment', + ScripAction => 'Notify AdminCcs As Comment', + Template => 'Admin Comment in HTML' }, + { Description => 'On Comment Notify Other Recipients as Comment', + ScripCondition => 'On Comment', + ScripAction => 'Notify Other Recipients As Comment', + Template => 'Correspondence in HTML' }, + { Description => 'On Correspond Notify Owner and AdminCcs', + ScripCondition => 'On Correspond', + ScripAction => 'Notify Owner and AdminCcs', + Template => 'Admin Correspondence in HTML' }, +# { Description => 'On Correspond Notify Other Recipients', +# ScripCondition => 'On Correspond', +# ScripAction => 'Notify Other Recipients', +# Template => 'Correspondence in HTML' }, +# { Description => 'On Correspond Notify Requestors and Ccs', +# ScripCondition => 'On Correspond', +# ScripAction => 'Notify Requestors And Ccs', +# Template => 'Correspondence in HTML' }, + { Description => 'On Correspond Notify Requestors, Ccs, and Other Recipients', + ScripCondition => 'On Correspond', + ScripAction => 'Notify Requestors, Ccs, and Other Recipients', + Template => 'Correspondence', }, + + { Description => 'On Correspond Open Tickets', + ScripCondition => 'On Correspond', + ScripAction => 'Open Tickets', + Template => 'Blank' }, + { Description => 'On Create Autoreply To Requestors', + ScripCondition => 'On Create', + ScripAction => 'AutoReply To Requestors', + Template => 'AutoReply in HTML' }, + { Description => 'On Create Notify Owner and AdminCcs', + ScripCondition => 'On Create', + ScripAction => 'Notify Owner and AdminCcs', + Template => 'Transaction in HTML' }, + { Description => 'On Create Notify Ccs', + ScripCondition => 'On Create', + ScripAction => 'Notify Ccs', + Template => 'Correspondence in HTML' }, + { Description => 'On Create Notify Other Recipients', + ScripCondition => 'On Create', + ScripAction => 'Notify Other Recipients', + Template => 'Correspondence in HTML' }, + { Description => 'On Owner Change Notify Owner', + ScripCondition => 'On Owner Change', + ScripAction => 'Notify Owner', + Template => 'Transaction in HTML' }, + { Description => 'On Resolve Notify Requestors', + ScripCondition => 'On Resolve', + ScripAction => 'Notify Requestors', + Template => 'Resolved in HTML' }, + { Description => "On transaction, add any tags in the transaction's subject to the ticket's subject", + ScripCondition => 'On Transaction', + ScripAction => 'Extract Subject Tag', + Template => 'Blank' }, + { Description => 'On Forward Transaction Send forwarded message', + ScripCondition => 'On Forward Transaction', + ScripAction => 'Send Forward', + Template => 'Forward' }, + { Description => 'On Forward Ticket Send forwarded message', + ScripCondition => 'On Forward Ticket', + ScripAction => 'Send Forward', + Template => 'Forward Ticket' }, + { Description => 'On Correspond, cancel future resolve', + ScripCondition => 'On Correspond', + ScripAction => 'Cancel Scheduled Resolve', + Template => 'Blank' }, +); +@ACL = ( { UserId => 'root', # - principalid Right => 'SuperUser', }, + { GroupDomain => 'SystemInternal', + GroupType => 'privileged', + Right => 'ShowApprovalsTab', }, + +); + +# Predefined searches + +@Attributes = ( + { Name => 'Search - My Tickets', + Description => '[_1] highest priority tickets I own', # loc + Content => + { Format => q{'__id__/TITLE:#',} + . q{'__Subject__/TITLE:Subject',} + . q{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 => q{'__id__/TITLE:#',} + . q{'__Subject__/TITLE:Subject',} + . q{QueueName, ExtendedStatus, CreatedRelative, } + . q{'__loc(Take)__/TITLE:NBSP'}, + Query => " Owner = 'Nobody' AND ( Status = 'new' OR Status = 'open')", + OrderBy => 'Created', + Order => 'DESC' + }, + }, + { Name => 'Search - Bookmarked Tickets', + Description => 'Bookmarked Tickets', #loc + Content => + { Format => q{'__id__/TITLE:#',} + . q{'__Subject__/TITLE:Subject',} + . q{Priority, QueueName, ExtendedStatus, Bookmark}, + Query => "id = '__Bookmarked__'", + OrderBy => 'LastUpdated', + Order => 'DESC' }, + }, + { + Name => 'HomepageSettings', + Description => 'HomepageSettings', + Content => { + 'body' => # loc_left_pair + [ + { + type => 'system', + name => 'My Tickets', # loc + }, + { + type => 'system', + name => 'Unowned Tickets' # loc + }, + { + type => 'system', + name => 'Bookmarked Tickets' # loc + }, + { + type => 'component', + name => 'QuickCreate' # loc + }, + ], + 'sidebar' => # loc_left_pair + [ + { + type => 'component', + name => 'MyReminders' # loc + }, + { + type => 'component', + name => 'Quicksearch' # loc + }, + { + type => 'component', + name => 'Dashboards' # loc + }, + { + type => 'component', + name => 'RefreshHomepage' # loc + }, + ], + }, + }, ); + +# freeside upgrade +# Obsolete/erroneous scrips +# If +# $Delete_Scrips{conditionname}{actionname}{templatename} +# exists, and the scrip was created by the system user, it +# will be deleted on upgrade. Lowercase all the names here. + +%Delete_Scrips = ( + 'on correspond' => { + 'notify requestors and ccs' => { 'correspondence' => 1 }, + 'notify other recipients' => { 'correspondence' => 1 }, + # RT 4.2 + # superseded by "notify owner and adminccs" + 'notify adminccs' => { 'admin correspondence' => 1 }, + # the new way, but doesn't work right vs. "open tickets" + 'open inactive tickets' => { 'blank' => 1 }, + }, + 'on create' => { + # RT 4.2 + # superseded by "notify owner and adminccs" + 'notify adminccs' => { 'transaction' => 1 }, + }, +); + +# -*- perl -*- + +push @ScripActions, ( + + { Name => 'Extract Custom Field Values', # loc + Description => 'extract cf-values out of a message', # loc + ExecModule => 'ExtractCustomFieldValues' }, + + { Name => 'Extract Custom Field Values With Code in Template', # loc + Description => 'extract cf-values out of a message with a Text::Template template', # loc + ExecModule => 'ExtractCustomFieldValuesWithCodeInTemplate' } + +); + +push @Templates, ( + { Queue => '0', + Name => 'CustomFieldScannerExample', # loc + Description => 'Example Template for ExtractCustomFieldValues', # loc + Content => <<'EOTEXT' +#### Syntax: +# CF Name | Header name or "Body" | MatchString(re) | Postcmd | Options + +#### Allowed Options: + +# q - (quiet) Don't record a transaction for adding the custom field +# value +# * - (wildcard) The MatchString regex should contain _two_ +# capturing groups, the first of which is the CF name, +# the second of which is the value. If this option is +# given, the field is ignored. + +#### Examples: + +# 1. Put the content of the "X-MI-Test" header into the "testcf" +# custom field: +# testcf|X-MI-Test|.* + +# 2. Scan the body for Host:name and put name into the "bodycf" custom +# field: +# bodycf|Body|Host:\s*(\w+) + +# 3. Scan the "X-MI-IP" header for an IP-Adresse and get the hostname +# by reverse-resolving it: +# Hostname|X-MI-IP|\d+\.\d+\.\d+\.\d+|use Socket; ($value) = gethostbyaddr(inet_aton($value),AF_INET); + +# 4. scan the "CC" header for an many email addresses, and add them to +# a custom field named "parsedCCs". If "parsedCCs" is a multivalue +# CF, then this should yield separate values for all email adress +# found. +# parsedCCs|CC|.*|$value =~ s/^\s+//; $value =~ s/\s+$//; + +# 5. Looks for an "Email:" field in the body of the email, then loads +# up that user and makes them privileged The blank first field +# means the automatic CustomField setting is not invoked. +# |Body|Email:\s*(.+)$|my $u = RT::User->new($RT::SystemUser); $u->LoadByEmail($value); $u->SetPrivileged(1)| + +# 6. Looks for any text of the form "Set CF Name: Value" in the body, +# and sets the CF named "CF Name" to the given value, which may be +# multi-line. The '*' option controls the wildcard nature of this +# example. +# Separator=! +# !Body!^Set ([^\n:]*?):\s*((?s).*?)(?:\Z|\n\Z|\n\n)!!* + +# 7. Looks for the regex anywhere in the headers and stores the match +# in the AllHeaderSearch CF +# AllHeaderSearch|Headers|Site:\s*(\w+) + +# 8. If you need to dynamically build your matching, and want to trigger on headers and body +# and invode some arbitrary code like example 5 +# Separator=~~ +# { +# my $action = 'use My::Site; My::Site::SetSiteID( Ticket => $self->TicketObj, Site => $_ );'; +# +# for my $regex (My::Site::ValidRegexps) { +# for my $from ('headers', 'body') { +# $OUT .= join '~~', +# '', # CF name +# $from, +# $regex, +# $action; +# $OUT .= "\n"; +# } +# } +# } + +EOTEXT + } +); + +1;