diff options
Diffstat (limited to 'rt/lib/RT')
58 files changed, 3220 insertions, 8842 deletions
diff --git a/rt/lib/RT/ACE.pm b/rt/lib/RT/ACE.pm index 0cd12174d..1501a125e 100755 --- a/rt/lib/RT/ACE.pm +++ b/rt/lib/RT/ACE.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: @@ -128,7 +104,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -137,14 +113,14 @@ Returns the current value of id. =cut -=head2 PrincipalType +=item PrincipalType Returns the current value of PrincipalType. (In the database, PrincipalType is stored as varchar(25).) -=head2 SetPrincipalType VALUE +=item SetPrincipalType VALUE Set PrincipalType to VALUE. @@ -155,14 +131,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 PrincipalId +=item PrincipalId Returns the current value of PrincipalId. (In the database, PrincipalId is stored as int(11).) -=head2 SetPrincipalId VALUE +=item SetPrincipalId VALUE Set PrincipalId to VALUE. @@ -173,14 +149,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 RightName +=item RightName Returns the current value of RightName. (In the database, RightName is stored as varchar(25).) -=head2 SetRightName VALUE +=item SetRightName VALUE Set RightName to VALUE. @@ -191,14 +167,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ObjectType +=item ObjectType Returns the current value of ObjectType. (In the database, ObjectType is stored as varchar(25).) -=head2 SetObjectType VALUE +=item SetObjectType VALUE Set ObjectType to VALUE. @@ -209,14 +185,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ObjectId +=item ObjectId Returns the current value of ObjectId. (In the database, ObjectId is stored as int(11).) -=head2 SetObjectId VALUE +=item SetObjectId VALUE Set ObjectId to VALUE. @@ -227,14 +203,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 DelegatedBy +=item DelegatedBy Returns the current value of DelegatedBy. (In the database, DelegatedBy is stored as int(11).) -=head2 SetDelegatedBy VALUE +=item SetDelegatedBy VALUE Set DelegatedBy to VALUE. @@ -245,14 +221,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 DelegatedFrom +=item DelegatedFrom Returns the current value of DelegatedFrom. (In the database, DelegatedFrom is stored as int(11).) -=head2 SetDelegatedFrom VALUE +=item SetDelegatedFrom VALUE Set DelegatedFrom to VALUE. @@ -264,25 +240,25 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, type => 'int(11)', default => ''}, PrincipalType => - {read => 1, write => 1, sql_type => 12, length => 25, is_blob => 0, is_numeric => 0, type => 'varchar(25)', default => ''}, + {read => 1, write => 1, type => 'varchar(25)', default => ''}, PrincipalId => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, RightName => - {read => 1, write => 1, sql_type => 12, length => 25, is_blob => 0, is_numeric => 0, type => 'varchar(25)', default => ''}, + {read => 1, write => 1, type => 'varchar(25)', default => ''}, ObjectType => - {read => 1, write => 1, sql_type => 12, length => 25, is_blob => 0, is_numeric => 0, type => 'varchar(25)', default => ''}, + {read => 1, write => 1, type => 'varchar(25)', default => ''}, ObjectId => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, DelegatedBy => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, DelegatedFrom => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, } }; @@ -314,7 +290,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/ACL.pm b/rt/lib/RT/ACL.pm index 9641292e6..81f59c6d0 100755 --- a/rt/lib/RT/ACL.pm +++ b/rt/lib/RT/ACL.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::ACE item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Action/Autoreply.pm b/rt/lib/RT/Action/Autoreply.pm index ea56b9f5b..81f7bddfa 100755 --- a/rt/lib/RT/Action/Autoreply.pm +++ b/rt/lib/RT/Action/Autoreply.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# CONTRIBUTION SUBMISSION POLICY: # -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -# -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK package RT::Action::Autoreply; require RT::Action::SendEmail; @@ -52,18 +28,6 @@ use strict; use vars qw/@ISA/; @ISA = qw(RT::Action::SendEmail); -=head2 Prepare - -Set up the relevant recipients, then call our parent. - -=cut - - -sub Prepare { - my $self = shift; - $self->SetRecipients(); - $self->SUPER::Prepare(); -} # {{{ sub SetRecipients @@ -110,18 +74,10 @@ sub SetReturnAddress { } unless ($self->TemplateObj->MIMEObj->head->get('From')) { - if ($RT::UseFriendlyFromLine) { - my $friendly_name = $self->TicketObj->QueueObj->Description || - $self->TicketObj->QueueObj->Name; - $friendly_name =~ s/"/\\"/g; - $self->SetHeader( 'From', - sprintf($RT::FriendlyFromLineFormat, - $self->MIMEEncodeString( $friendly_name, $RT::EmailOutputEncoding ), $replyto), - ); - } - else { - $self->SetHeader( 'From', $replyto ); - } + my $friendly_name = $self->TicketObj->QueueObj->Description || + $self->TicketObj->QueueObj->Name; + $friendly_name =~ s/"/\\"/g; + $self->SetHeader('From', "\"$friendly_name\" <$replyto>"); } unless ($self->TemplateObj->MIMEObj->head->get('Reply-To')) { diff --git a/rt/lib/RT/Action/Generic.pm b/rt/lib/RT/Action/Generic.pm index 3232d4898..007d299c7 100755 --- a/rt/lib/RT/Action/Generic.pm +++ b/rt/lib/RT/Action/Generic.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK =head1 NAME RT::Action::Generic - a generic baseclass for RT Actions @@ -68,9 +44,6 @@ ok (require RT::Action::Generic); package RT::Action::Generic; use strict; -use Scalar::Util; - -use base qw/RT::Base/; # {{{ sub new sub new { @@ -83,35 +56,31 @@ sub new { } # }}} +# {{{ sub new +sub loc { + my $self = shift; + return $self->{'ScripObj'}->loc(@_); +} +# }}} + # {{{ sub _Init sub _Init { my $self = shift; - my %args = ( Argument => undef, - CurrentUser => undef, - ScripActionObj => undef, - ScripObj => undef, - TemplateObj => undef, - TicketObj => undef, - TransactionObj => undef, - Type => undef, - - @_ ); - + my %args = ( TransactionObj => undef, + TicketObj => undef, + ScripObj => undef, + TemplateObj => undef, + Argument => undef, + Type => undef, + @_ ); + + $self->{'Argument'} = $args{'Argument'}; - $self->CurrentUser( $args{'CurrentUser'}); - $self->{'ScripActionObj'} = $args{'ScripActionObj'}; $self->{'ScripObj'} = $args{'ScripObj'}; - $self->{'TemplateObj'} = $args{'TemplateObj'}; $self->{'TicketObj'} = $args{'TicketObj'}; $self->{'TransactionObj'} = $args{'TransactionObj'}; + $self->{'TemplateObj'} = $args{'TemplateObj'}; $self->{'Type'} = $args{'Type'}; - - Scalar::Util::weaken($self->{'ScripActionObj'}); - Scalar::Util::weaken($self->{'ScripObj'}); - Scalar::Util::weaken($self->{'TemplateObj'}); - Scalar::Util::weaken($self->{'TicketObj'}); - Scalar::Util::weaken($self->{'TransactionObj'}); - } # }}} @@ -152,13 +121,6 @@ sub ScripObj { } # }}} -# {{{ sub ScripActionObj -sub ScripActionObj { - my $self = shift; - return($self->{'ScripActionObj'}); -} -# }}} - # {{{ sub Type sub Type { my $self = shift; @@ -214,11 +176,13 @@ sub DESTROY { # We need to clean up all the references that might maybe get # oddly circular - $self->{'ScripActionObj'} = undef; - $self->{'ScripObj'} = undef; $self->{'TemplateObj'} =undef $self->{'TicketObj'} = undef; $self->{'TransactionObj'} = undef; + $self->{'ScripObj'} = undef; + + + } # }}} diff --git a/rt/lib/RT/Action/Notify.pm b/rt/lib/RT/Action/Notify.pm index 82cad1e58..1e4e4c073 100755 --- a/rt/lib/RT/Action/Notify.pm +++ b/rt/lib/RT/Action/Notify.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,53 +14,20 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} -# +# END LICENSE BLOCK package RT::Action::Notify; require RT::Action::SendEmail; -use Mail::Address; + use strict; use vars qw/@ISA/; @ISA = qw(RT::Action::SendEmail); - -=head2 Prepare - -Set up the relevant recipients, then call our parent. - -=cut - - -sub Prepare { - my $self = shift; - $self->SetRecipients(); - $self->SUPER::Prepare(); -} - # {{{ sub SetRecipients =head2 SetRecipients @@ -86,18 +47,10 @@ sub SetRecipients { my ( @To, @PseudoTo, @Cc, @Bcc ); - if ( $arg =~ /\bOtherRecipients\b/ ) { - if ( $self->TransactionObj->Attachments->First ) { - my @cc_addresses = Mail::Address->parse($self->TransactionObj->Attachments->First->GetHeader('RT-Send-Cc')); - foreach my $addr (@cc_addresses) { - push @Cc, $addr->address; - } - my @bcc_addresses = Mail::Address->parse($self->TransactionObj->Attachments->First->GetHeader('RT-Send-Bcc')); - - foreach my $addr (@bcc_addresses) { - push @Bcc, $addr->address; - } - + if ($arg =~ /\bOtherRecipients\b/) { + if ($self->TransactionObj->Attachments->First) { + push (@Cc, $self->TransactionObj->Attachments->First->GetHeader('RT-Send-Cc')); + push (@Bcc, $self->TransactionObj->Attachments->First->GetHeader('RT-Send-Bcc')); } } @@ -160,12 +113,12 @@ sub SetRecipients { @{ $self->{'Bcc'} } = @Bcc; } else { - @{ $self->{'To'} } = grep ( lc $_ ne lc $creator, @To ); - @{ $self->{'Cc'} } = grep ( lc $_ ne lc $creator, @Cc ); - @{ $self->{'Bcc'} } = grep ( lc $_ ne lc $creator, @Bcc ); + @{ $self->{'To'} } = grep ( !/^$creator$/, @To ); + @{ $self->{'Cc'} } = grep ( !/^$creator$/, @Cc ); + @{ $self->{'Bcc'} } = grep ( !/^$creator$/, @Bcc ); } @{ $self->{'PseudoTo'} } = @PseudoTo; - + return (1); } diff --git a/rt/lib/RT/Action/NotifyAsComment.pm b/rt/lib/RT/Action/NotifyAsComment.pm index 215f453d3..210e4ab15 100755 --- a/rt/lib/RT/Action/NotifyAsComment.pm +++ b/rt/lib/RT/Action/NotifyAsComment.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK package RT::Action::NotifyAsComment; require RT::Action::Notify; diff --git a/rt/lib/RT/Action/ResolveMembers.pm b/rt/lib/RT/Action/ResolveMembers.pm index fab049b0a..02ff3a58c 100644 --- a/rt/lib/RT/Action/ResolveMembers.pm +++ b/rt/lib/RT/Action/ResolveMembers.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # This Action will resolve all members of a resolved group ticket package RT::Action::ResolveMembers; diff --git a/rt/lib/RT/Action/SendEmail.pm b/rt/lib/RT/Action/SendEmail.pm index ed5ec4fd6..dac8fc8e7 100755 --- a/rt/lib/RT/Action/SendEmail.pm +++ b/rt/lib/RT/Action/SendEmail.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Portions Copyright 2000 Tobias Brox <tobix@cpan.org> package RT::Action::SendEmail; @@ -57,8 +33,6 @@ use vars qw/@ISA/; use MIME::Words qw(encode_mimeword); use RT::EmailParser; -use Mail::Address; -use Date::Format qw(strftime); =head1 NAME @@ -77,6 +51,13 @@ RT::Action::AutoReply is a good example subclass. Basically, you create another module RT::Action::YourAction which ISA RT::Action::SendEmail. +If you want to set the recipients of the mail to something other than +the addresses mentioned in the To, Cc, Bcc and headers in +the template, you should subclass RT::Action::SendEmail and override +either the SetRecipients method or the SetTo, SetCc, etc methods (see +the comments for the SetRecipients sub). + + =begin testing ok (require RT::Action::SendEmail); @@ -96,409 +77,236 @@ perl(1). # {{{ Scrip methods (_Init, Commit, Prepare, IsApplicable) +# {{{ sub _Init +# We use _Init from RT::Action +# }}} # {{{ sub Commit - +#Do what we need to do and send it out. sub Commit { - # DO NOT SHIFT @_ in this subroutine. It breaks Hook::LexWrap's - # ability to pass @_ to a 'post' routine. - my $self = $_[0]; - - my ($ret) = $self->SendMessage( $self->TemplateObj->MIMEObj ); - if ( $ret > 0 ) { - $self->RecordOutgoingMailTransaction( $self->TemplateObj->MIMEObj ) - if ($RT::RecordOutgoingEmail); - } - return (abs $ret); -} - -# }}} - -# {{{ sub Prepare - -sub Prepare { my $self = shift; - my ( $result, $message ) = $self->TemplateObj->Parse( - Argument => $self->Argument, - TicketObj => $self->TicketObj, - TransactionObj => $self->TransactionObj - ); - if ( !$result ) { - return (undef); - } - my $MIMEObj = $self->TemplateObj->MIMEObj; + my $msgid = $MIMEObj->head->get('Message-Id'); + chomp $msgid; + $RT::Logger->info($msgid." #".$self->TicketObj->id."/".$self->TransactionObj->id." - Scrip ". $self->ScripObj->id ." ".$self->ScripObj->Description); + #send the email - # Header - $self->SetRTSpecialHeaders(); + # Weed out any RT addresses. We really don't want to talk to ourselves! + @{$self->{'To'}} = RT::EmailParser::CullRTAddresses("", @{$self->{'To'}}); + @{$self->{'Cc'}} = RT::EmailParser::CullRTAddresses("", @{$self->{'Cc'}}); + @{$self->{'Bcc'}} = RT::EmailParser::CullRTAddresses("", @{$self->{'Bcc'}}); + # If there are no recipients, don't try to send the message. + # If the transaction has content and has the header RT-Squelch-Replies-To + + if ( defined $self->TransactionObj->Attachments->First() ) { - $self->RemoveInappropriateRecipients(); + my $squelch = $self->TransactionObj->Attachments->First->GetHeader( 'RT-Squelch-Replies-To'); - my %seen; - foreach my $type qw(To Cc Bcc) { - @{ $self->{ $type } } = - grep defined && length && !$seen{ lc $_ }++, - @{ $self->{ $type } }; + if ($squelch) { + my @blacklist = split ( /,/, $squelch ); + + # Cycle through the people we're sending to and pull out anyone on the + # system blacklist + + foreach my $person_to_yank (@blacklist) { + $person_to_yank =~ s/\s//g; + @{ $self->{'To'} } = + grep ( !/^$person_to_yank$/, @{ $self->{'To'} } ); + @{ $self->{'Cc'} } = + grep ( !/^$person_to_yank$/, @{ $self->{'Cc'} } ); + @{ $self->{'Bcc'} } = + grep ( !/^$person_to_yank$/, @{ $self->{'Bcc'} } ); + } + } } # Go add all the Tos, Ccs and Bccs that we need to to the message to # make it happy, but only if we actually have values in those arrays. - # TODO: We should be pulling the recipients out of the template and shove them into To, Cc and Bcc + $self->SetHeader( 'To', join ( ',', @{ $self->{'To'} } ) ) + if ( $self->{'To'} && @{ $self->{'To'} } ); + $self->SetHeader( 'Cc', join ( ',', @{ $self->{'Cc'} } ) ) + if ( $self->{'Cc'} && @{ $self->{'Cc'} } ); + $self->SetHeader( 'Bcc', join ( ',', @{ $self->{'Bcc'} } ) ) + if ( $self->{'Cc'} && @{ $self->{'Bcc'} } ); - $self->SetHeader( 'To', join ( ', ', @{ $self->{'To'} } ) ) - if ( ! $MIMEObj->head->get('To') && $self->{'To'} && @{ $self->{'To'} } ); - $self->SetHeader( 'Cc', join ( ', ', @{ $self->{'Cc'} } ) ) - if ( !$MIMEObj->head->get('Cc') && $self->{'Cc'} && @{ $self->{'Cc'} } ); - $self->SetHeader( 'Bcc', join ( ', ', @{ $self->{'Bcc'} } ) ) - if ( !$MIMEObj->head->get('Bcc') && $self->{'Bcc'} && @{ $self->{'Bcc'} } ); - # PseudoTo (fake to headers) shouldn't get matched for message recipients. - # If we don't have any 'To' header (but do have other recipients), drop in - # the pseudo-to header. - $self->SetHeader( 'To', join ( ', ', @{ $self->{'PseudoTo'} } ) ) - if ( $self->{'PseudoTo'} && ( @{ $self->{'PseudoTo'} } ) - and ( !$MIMEObj->head->get('To') ) ) and ( $MIMEObj->head->get('Cc') or $MIMEObj->head->get('Bcc')); + $self->SetHeader('MIME-Version', '1.0'); - # We should never have to set the MIME-Version header - $self->SetHeader( 'MIME-Version', '1.0' ); + # try to convert message body from utf-8 to $RT::EmailOutputEncoding + $self->SetHeader( 'Content-Type', 'text/plain; charset="utf-8"' ); - # fsck.com #5959: Since RT sends 8bit mail, we should say so. - $self->SetHeader( 'Content-Transfer-Encoding','8bit'); + RT::I18N::SetMIMEEntityToEncoding( $MIMEObj, $RT::EmailOutputEncoding, 'mime_words_ok' ); + $self->SetHeader( 'Content-Type', 'text/plain; charset="' . $RT::EmailOutputEncoding . '"' ); - # For security reasons, we only send out textual mails. - my @parts = $MIMEObj; - while (my $part = shift @parts) { - if ($part->is_multipart) { - push @parts, $part->parts; - } - else { - if ( RT::I18N::IsTextualContentType( $part->mime_type ) ) { - $part->head->mime_attr( "Content-Type" => $part->mime_type ) - } else { - $part->head->mime_attr( "Content-Type" => 'text/plain' ); - } - $part->head->mime_attr( "Content-Type.charset" => 'utf-8' ); - } - } + # Build up a MIME::Entity that looks like the original message. - RT::I18N::SetMIMEEntityToEncoding( $MIMEObj, $RT::EmailOutputEncoding, 'mime_words_ok' ); + my $do_attach = $self->TemplateObj->MIMEObj->head->get('RT-Attach-Message'); - # Build up a MIME::Entity that looks like the original message. - $self->AddAttachments() if ( $MIMEObj->head->get('RT-Attach-Message') ); + if ($do_attach) { + $self->TemplateObj->MIMEObj->head->delete('RT-Attach-Message'); - return $result; + my $attachments = RT::Attachments->new($RT::SystemUser); + $attachments->Limit( FIELD => 'TransactionId', + VALUE => $self->TransactionObj->Id ); + $attachments->OrderBy('id'); -} + my $transaction_content_obj = $self->TransactionObj->ContentObj; -# }}} + # attach any of this transaction's attachments + while ( my $attach = $attachments->Next ) { -# }}} + # Don't attach anything blank + next unless ( $attach->ContentLength ); + # We want to make sure that we don't include the attachment that's being sued as the "Content" of this message" + next + if ( $transaction_content_obj + && $transaction_content_obj->Id == $attach->Id + && $transaction_content_obj->ContentType =~ qr{text/plain}i + ); + $MIMEObj->make_multipart('mixed'); + $MIMEObj->attach( Type => $attach->ContentType, + Charset => $attach->OriginalEncoding, + Data => $attach->OriginalContent, + Filename => $self->MIMEEncodeString( $attach->Filename, $RT::EmailOutputEncoding ), + Encoding => '-SUGGEST'); + } + } -=head2 To -Returns an array of Mail::Address objects containing all the To: recipients for this notification + my $retval = $self->SendMessage($MIMEObj); -=cut -sub To { - my $self = shift; - return ($self->_AddressesFromHeader('To')); + return ($retval); } -=head2 Cc - -Returns an array of Mail::Address objects containing all the Cc: recipients for this notification +# }}} -=cut +# {{{ sub Prepare -sub Cc { +sub Prepare { my $self = shift; - return ($self->_AddressesFromHeader('Cc')); -} -=head2 Bcc + # This actually populates the MIME::Entity fields in the Template Object -Returns an array of Mail::Address objects containing all the Bcc: recipients for this notification + unless ( $self->TemplateObj ) { + $RT::Logger->warning("No template object handed to $self\n"); + } -=cut + unless ( $self->TransactionObj ) { + $RT::Logger->warning("No transaction object handed to $self\n"); + } -sub Bcc { - my $self = shift; - return ($self->_AddressesFromHeader('Bcc')); + unless ( $self->TicketObj ) { + $RT::Logger->warning("No ticket object handed to $self\n"); -} + } -sub _AddressesFromHeader { - my $self = shift; - my $field = shift; - my $header = $self->TemplateObj->MIMEObj->head->get($field); - my @addresses = Mail::Address->parse($header); + my ( $result, $message ) = $self->TemplateObj->Parse( + Argument => $self->Argument, + TicketObj => $self->TicketObj, + TransactionObj => $self->TransactionObj + ); + if ($result) { + + # Header + $self->SetSubject(); + $self->SetSubjectToken(); + $self->SetRecipients(); + $self->SetReturnAddress(); + $self->SetRTSpecialHeaders(); + if ($RT::EmailOutputEncoding) { + + # l10n related header + $self->SetHeaderAsEncoding( 'Subject', $RT::EmailOutputEncoding ); + } + } + + return $result; - return (@addresses); } +# }}} -# {{{ SendMessage +# }}} +# {{{ SendMessage =head2 SendMessage MIMEObj sends the message using RT's preferred API. -TODO: Break this out to a separate module +TODO: Break this out to a seperate module =cut sub SendMessage { - # DO NOT SHIFT @_ in this subroutine. It breaks Hook::LexWrap's - # ability to pass @_ to a 'post' routine. - my ( $self, $MIMEObj ) = @_; + my $self = shift; + my $MIMEObj = shift; - my $msgid = $MIMEObj->head->get('Message-ID'); - chomp $msgid; + my $msgid = $MIMEObj->head->get('Message-Id'); - $self->ScripActionObj->{_Message_ID}++; - - $RT::Logger->info( $msgid . " #" - . $self->TicketObj->id . "/" - . $self->TransactionObj->id - . " - Scrip " - . $self->ScripObj->id . " " - . $self->ScripObj->Description ); #If we don't have any recipients to send to, don't send a message; - unless ( $MIMEObj->head->get('To') - || $MIMEObj->head->get('Cc') - || $MIMEObj->head->get('Bcc') ) - { - $RT::Logger->info( $msgid . " No recipients found. Not sending.\n" ); - return (-1); - } - - unless ($MIMEObj->head->get('Date')) { - # We coerce localtime into an array since strftime has a flawed prototype that only accepts - # a list - $MIMEObj->head->replace(Date => strftime('%a, %d %b %Y %H:%M:%S %z', @{[localtime()]})); - } - - return (0) unless ($self->OutputMIMEObject($MIMEObj)); - - my $success = $msgid . " sent "; - foreach( qw(To Cc Bcc) ) { - my $recipients = $MIMEObj->head->get($_); - $success .= " $_: ". $recipients if $recipients; - } - $success =~ s/\n//g; - - $RT::Logger->info($success); - - return (1); -} - - -=head2 OutputMIMEObject MIME::Entity - -Sends C<MIME::Entity> as an email message according to RT's mailer configuration. - -=cut - - - -sub OutputMIMEObject { - my $self = shift; - my $MIMEObj = shift; - - my $msgid = $MIMEObj->head->get('Message-ID'); - chomp $msgid; - - my $SendmailArguments = $RT::SendmailArguments; - if (defined $RT::VERPPrefix && defined $RT::VERPDomain) { - my $EnvelopeFrom = $self->TransactionObj->CreatorObj->EmailAddress; - $EnvelopeFrom =~ s/@/=/g; - $EnvelopeFrom =~ s/\s//g; - $SendmailArguments .= " -f ${RT::VERPPrefix}${EnvelopeFrom}\@${RT::VERPDomain}"; + unless ( $MIMEObj->head->get('To') + || $MIMEObj->head->get('Cc') + || $MIMEObj->head->get('Bcc') ) { + $RT::Logger->info($msgid. " No recipients found. Not sending.\n"); + return (1); } + # PseudoTo (fake to headers) shouldn't get matched for message recipients. + # If we don't have any 'To' header, drop in the pseudo-to header. + $self->SetHeader( 'To', join ( ',', @{ $self->{'PseudoTo'} } ) ) + if ( $self->{'PseudoTo'} && ( @{ $self->{'PseudoTo'} } ) + and ( !$MIMEObj->head->get('To') ) ); if ( $RT::MailCommand eq 'sendmailpipe' ) { eval { - # don't ignore CHLD signal to get proper exit code - local $SIG{'CHLD'} = 'DEFAULT'; - - my $mail; - unless( open $mail, "|$RT::SendmailPath $SendmailArguments" ) { - die "Couldn't run $RT::SendmailPath: $!"; - } - - # if something wrong with $mail->print we will get PIPE signal, handle it - local $SIG{'PIPE'} = sub { die "$RT::SendmailPath closed pipe" }; - $MIMEObj->print($mail); - - unless ( close $mail ) { - die "Close failed: $!" if $!; # system error - # sendmail exit statuses mostly errors with data not software - # TODO: status parsing: core dump, exit on signal or EX_* - $RT::Logger->warning( "$RT::SendmailPath exitted with status $?" ); - } - }; - if ($@) { - $RT::Logger->crit( $msgid . "Could not send mail: " . $@ ); - return 0; + open( MAIL, "|$RT::SendmailPath $RT::SendmailArguments" ); + print MAIL $MIMEObj->as_string; + close(MAIL); + }; + if ($@) { + $RT::Logger->crit($msgid. "Could not send mail. -".$@ ); } } else { - my @mailer_args = ($RT::MailCommand); - my $method = 'send'; - - local $ENV{MAILADDRESS}; + my @mailer_args = ($RT::MailCommand); + local $ENV{MAILADDRESS}; if ( $RT::MailCommand eq 'sendmail' ) { - push @mailer_args, split(/\s+/, $SendmailArguments); + push @mailer_args, $RT::SendmailArguments; } elsif ( $RT::MailCommand eq 'smtp' ) { - $ENV{MAILADDRESS} = $RT::SMTPFrom || $MIMEObj->head->get('From'); - push @mailer_args, ( Host => $RT::SMTPServer ); - push @mailer_args, ( Debug => $RT::SMTPDebug ); - $method = 'smtpsend'; - } - else { - push @mailer_args, $RT::MailParams; + $ENV{MAILADDRESS} = $RT::SMTPFrom || $MIMEObj->head->get('From'); + push @mailer_args, (Server => $RT::SMTPServer); + push @mailer_args, (Debug => $RT::SMTPDebug); } + else { + push @mailer_args, $RT::MailParams; + } - unless ( $MIMEObj->$method(@mailer_args) ) { - $RT::Logger->crit( $msgid . "Could not send mail." ); + unless ( $MIMEObj->send( @mailer_args ) ) { + $RT::Logger->crit($msgid. "Could not send mail." ); return (0); } } - return 1; -} -# }}} - -# {{{ AddAttachments - -=head2 AddAttachments - -Takes any attachments to this transaction and attaches them to the message -we're building. - -=cut - - -sub AddAttachments { - my $self = shift; - my $MIMEObj = $self->TemplateObj->MIMEObj; - - $MIMEObj->head->delete('RT-Attach-Message'); - - my $attachments = RT::Attachments->new($RT::SystemUser); - $attachments->Limit( - FIELD => 'TransactionId', - VALUE => $self->TransactionObj->Id - ); - $attachments->OrderBy( FIELD => 'id'); - - my $transaction_content_obj = $self->TransactionObj->ContentObj; - - # attach any of this transaction's attachments - while ( my $attach = $attachments->Next ) { - - # Don't attach anything blank - next unless ( $attach->ContentLength ); - -# We want to make sure that we don't include the attachment that's being used as the "Content" of this message. - next - if ( $transaction_content_obj - && $transaction_content_obj->Id == $attach->Id - && $transaction_content_obj->ContentType =~ qr{text/plain}i ); - $MIMEObj->make_multipart('mixed'); - $MIMEObj->attach( - Type => $attach->ContentType, - Charset => $attach->OriginalEncoding, - Data => $attach->OriginalContent, - Filename => $self->MIMEEncodeString( $attach->Filename, - $RT::EmailOutputEncoding ), - 'RT-Attachment:' => $self->TicketObj->Id."/".$self->TransactionObj->Id."/".$attach->id, - Encoding => '-SUGGEST' - ); - } + my $success = ($msgid. " sent To: ".$MIMEObj->head->get('To') . " Cc: ".$MIMEObj->head->get('Cc') . " Bcc: ".$MIMEObj->head->get('Bcc')); + $success =~ s/\n//gi; + $RT::Logger->info($success); + return (1); } # }}} -# {{{ RecordOutgoingMailTransaction - -=head2 RecordOutgoingMailTransaction MIMEObj - -Record a transaction in RT with this outgoing message for future record-keeping purposes - -=cut - - - -sub RecordOutgoingMailTransaction { - my $self = shift; - my $MIMEObj = shift; - - - my @parts = $MIMEObj->parts; - my @attachments; - my @keep; - foreach my $part (@parts) { - my $attach = $part->head->get('RT-Attachment'); - if ($attach) { - $RT::Logger->debug("We found an attachment. we want to not record it."); - push @attachments, $attach; - } else { - $RT::Logger->debug("We found a part. we want to record it."); - push @keep, $part; - } - } - $MIMEObj->parts(\@keep); - foreach my $attachment (@attachments) { - $MIMEObj->head->add('RT-Attachment', $attachment); - } - - RT::I18N::SetMIMEEntityToEncoding( $MIMEObj, 'utf-8', 'mime_words_ok' ); - - my $transaction = RT::Transaction->new($self->TransactionObj->CurrentUser); - - # XXX: TODO -> Record attachments as references to things in the attachments table, maybe. - - my $type; - if ($self->TransactionObj->Type eq 'Comment') { - $type = 'CommentEmailRecord'; - } else { - $type = 'EmailRecord'; - } - - my $msgid = $MIMEObj->head->get('Message-ID'); - chomp $msgid; - - my ( $id, $msg ) = $transaction->Create( - Ticket => $self->TicketObj->Id, - Type => $type, - Data => $msgid, - MIMEObj => $MIMEObj, - ActivateScrips => 0 - ); - - if( $id ) { - $self->{'OutgoingMailTransaction'} = $id; - } else { - $RT::Logger->warning( "Could not record outgoing message transaction: $msg" ); - } - return $id; -} - -# }}} -# +# {{{ Deal with message headers (Set* subs, designed for easy overriding) # {{{ sub SetRTSpecialHeaders @@ -512,161 +320,84 @@ that don't matter much to anybody else. sub SetRTSpecialHeaders { my $self = shift; - $self->SetSubject(); - $self->SetSubjectToken(); - $self->SetHeaderAsEncoding( 'Subject', $RT::EmailOutputEncoding ) - if ($RT::EmailOutputEncoding); - $self->SetReturnAddress(); - $self->SetReferencesHeaders(); - - unless ($self->TemplateObj->MIMEObj->head->get('Message-ID')) { - # Get Message-ID for this txn - my $msgid = ""; - $msgid = $self->TransactionObj->Message->First->GetHeader("RT-Message-ID") - || $self->TransactionObj->Message->First->GetHeader("Message-ID") - if $self->TransactionObj->Message && $self->TransactionObj->Message->First; - - # If there is one, and we can parse it, then base our Message-ID on it - if ($msgid - and $msgid =~ s/<(rt-.*?-\d+-\d+)\.(\d+)-\d+-\d+\@\Q$RT::Organization\E>$/ - "<$1." . $self->TicketObj->id - . "-" . $self->ScripObj->id - . "-" . $self->ScripActionObj->{_Message_ID} - . "@" . $RT::Organization . ">"/eg - and $2 == $self->TicketObj->id) { - $self->SetHeader( "Message-ID" => $msgid ); - } else { - $self->SetHeader( 'Message-ID', - "<rt-" - . $RT::VERSION . "-" - . $$ . "-" - . CORE::time() . "-" - . int(rand(2000)) . '.' - . $self->TicketObj->id . "-" - . $self->ScripObj->id . "-" # Scrip - . $self->ScripActionObj->{_Message_ID} . "@" # Email sent - . $RT::Organization - . ">" ); - } - } + $self->SetReferences(); + + $self->SetMessageID(); - $self->SetHeader( 'Precedence', "bulk" ) - unless ( $self->TemplateObj->MIMEObj->head->get("Precedence") ); + $self->SetPrecedence(); $self->SetHeader( 'X-RT-Loop-Prevention', $RT::rtname ); $self->SetHeader( 'RT-Ticket', - $RT::rtname . " #" . $self->TicketObj->id() ); + $RT::rtname . " #" . $self->TicketObj->id() ); $self->SetHeader( 'Managed-by', - "RT $RT::VERSION (http://www.bestpractical.com/rt/)" ); + "RT $RT::VERSION (http://www.bestpractical.com/rt/)" ); $self->SetHeader( 'RT-Originator', - $self->TransactionObj->CreatorObj->EmailAddress ); + $self->TransactionObj->CreatorObj->EmailAddress ); + return (); } -# }}} - - -# }}} - -# {{{ RemoveInappropriateRecipients +# {{{ sub SetReferences -=head2 RemoveInappropriateRecipients - -Remove addresses that are RT addresses or that are on this transaction's blacklist +=head2 SetReferences + + # This routine will set the References: and In-Reply-To headers, +# autopopulating it with all the correspondence on this ticket so +# far. This should make RT responses threadable. =cut -sub RemoveInappropriateRecipients { +sub SetReferences { my $self = shift; - my $msgid = $self->TemplateObj->MIMEObj->head->get ('Message-Id'); - - - - my @blacklist; + # TODO: this one is broken. What is this email really a reply to? + # If it's a reply to an incoming message, we'll need to use the + # actual message-id from the appropriate Attachment object. For + # incoming mails, we would like to preserve the In-Reply-To and/or + # References. - my @types = qw/To Cc Bcc/; + $self->SetHeader( 'In-Reply-To', + "<rt-" . $self->TicketObj->id() . "\@" . $RT::rtname . ">" ); - # Weed out any RT addresses. We really don't want to talk to ourselves! - foreach my $type (@types) { - @{ $self->{$type} } = - RT::EmailParser::CullRTAddresses( "", @{ $self->{$type} } ); - } - - # If there are no recipients, don't try to send the message. - # If the transaction has content and has the header RT-Squelch-Replies-To - - if ( $self->TransactionObj->Attachments->First() ) { - if ( - $self->TransactionObj->Attachments->First->GetHeader( - 'RT-DetectedAutoGenerated') - ) - { - - # What do we want to do with this? It's probably (?) a bounce - # caused by one of the watcher addresses being broken. - # Default ("true") is to redistribute, for historical reasons. - - if ( !$RT::RedistributeAutoGeneratedMessages ) { - - # Don't send to any watchers. - @{ $self->{'To'} } = (); - @{ $self->{'Cc'} } = (); - @{ $self->{'Bcc'} } = (); - - $RT::Logger->info( $msgid . " The incoming message was autogenerated. Not redistributing this message based on site configuration.\n"); - } - elsif ( $RT::RedistributeAutoGeneratedMessages eq 'privileged' ) { - - # Only send to "privileged" watchers. - # - - foreach my $type (@types) { - - foreach my $addr ( @{ $self->{$type} } ) { - my $user = RT::User->new($RT::SystemUser); - $user->LoadByEmail($addr); - @{ $self->{$type} } = - grep ( !/^\Q$addr\E$/, @{ $self->{$type} } ) - if ( !$user->Privileged ); + # TODO We should always add References headers for all message-ids + # of previous messages related to this ticket. +} - } - } - $RT::Logger->info( $msgid . " The incoming message was autogenerated. Not redistributing this message to unprivileged users based on site configuration.\n"); +# }}} - } +# {{{ sub SetMessageID - } +=head2 SetMessageID - my $squelch = - $self->TransactionObj->Attachments->First->GetHeader( - 'RT-Squelch-Replies-To'); +Without this one, threading won't work very nice in email agents. +Anyway, I'm not really sure it's that healthy if we need to send +several separate/different emails about the same transaction. - if ($squelch) { - @blacklist = split( /,/, $squelch ); - } - } - - # Let's grab the SquelchMailTo attribue and push those entries into the @blacklist - my @non_recipients = $self->TicketObj->SquelchMailTo; - foreach my $attribute (@non_recipients) { - push @blacklist, $attribute->Content; - } +=cut - # Cycle through the people we're sending to and pull out anyone on the - # system blacklist +sub SetMessageID { + my $self = shift; - foreach my $person_to_yank (@blacklist) { - $person_to_yank =~ s/\s//g; - foreach my $type (@types) { - @{ $self->{$type} } = - grep ( !/^\Q$person_to_yank\E$/, @{ $self->{$type} } ); - } - } + # TODO this one might be sort of broken. If we have several scrips +++ + # sending several emails to several different persons, we need to + # pull out different message-ids. I'd suggest message ids like + # "rt-ticket#-transaction#-scrip#-receipient#" + + $self->SetHeader( 'Message-ID', + "<rt-" + . $RT::VERSION ."-" + . $self->TicketObj->id() . "-" + . $self->TransactionObj->id() . "." + . rand(20) . "\@" + . $RT::Organization . ">" ) + unless $self->TemplateObj->MIMEObj->head->get('Message-ID'); } # }}} + +# }}} + # {{{ sub SetReturnAddress =head2 SetReturnAddress is_comment => BOOLEAN @@ -678,10 +409,8 @@ Calculate and set From and Reply-To headers based on the is_comment flag. sub SetReturnAddress { my $self = shift; - my %args = ( - is_comment => 0, - @_ - ); + my %args = ( is_comment => 0, + @_ ); # From and Reply-To # $args{is_comment} should be set if the comment address is to be used. @@ -697,27 +426,21 @@ sub SetReturnAddress { } unless ( $self->TemplateObj->MIMEObj->head->get('From') ) { - if ($RT::UseFriendlyFromLine) { - my $friendly_name = $self->TransactionObj->CreatorObj->RealName - || $self->TransactionObj->CreatorObj->Name; - if ( $friendly_name =~ /^"(.*)"$/ ) { # a quoted string - $friendly_name = $1; - } - - $friendly_name =~ s/"/\\"/g; - $self->SetHeader( - 'From', - sprintf( - $RT::FriendlyFromLineFormat, - $self->MIMEEncodeString( $friendly_name, - $RT::EmailOutputEncoding ), - $replyto - ), - ); - } - else { - $self->SetHeader( 'From', $replyto ); - } + if ($RT::UseFriendlyFromLine) { + my $friendly_name = $self->TransactionObj->CreatorObj->RealName; + if ( $friendly_name =~ /^"(.*)"$/ ) { # a quoted string + $friendly_name = $1; + } + + $friendly_name =~ s/"/\\"/g; + $self->SetHeader( 'From', + sprintf($RT::FriendlyFromLineFormat, + $self->MIMEEncodeString( $friendly_name, $RT::EmailOutputEncoding ), $replyto), + ); + } + else { + $self->SetHeader( 'From', $replyto ); + } } unless ( $self->TemplateObj->MIMEObj->head->get('Reply-To') ) { @@ -750,166 +473,155 @@ sub SetHeader { # }}} +# {{{ sub SetRecipients -# {{{ sub SetSubject +=head2 SetRecipients -=head2 SetSubject - -This routine sets the subject. it does not add the rt tag. that gets done elsewhere -If $self->{'Subject'} is already defined, it uses that. otherwise, it tries to get -the transaction's subject. +Dummy method to be overriden by subclasses which want to set the recipients. -=cut +=cut -sub SetSubject { +sub SetRecipients { my $self = shift; - my $subject; + return (); +} - my $message = $self->TransactionObj->Attachments; - if ( $self->TemplateObj->MIMEObj->head->get('Subject') ) { - return (); - } - if ( $self->{'Subject'} ) { - $subject = $self->{'Subject'}; - } - elsif ( ( $message->First() ) && ( $message->First->Headers ) ) { - my $header = $message->First->Headers(); - $header =~ s/\n\s+/ /g; - if ( $header =~ /^Subject: (.*?)$/m ) { - $subject = $1; - } - else { - $subject = $self->TicketObj->Subject(); - } +# }}} - } - else { - $subject = $self->TicketObj->Subject(); - } +# {{{ sub SetTo - $subject =~ s/(\r\n|\n|\s)/ /gi; +=head2 SetTo - chomp $subject; - $self->SetHeader( 'Subject', $subject ); +Takes a string that is the addresses you want to send mail to + +=cut +sub SetTo { + my $self = shift; + my $addresses = shift; + return $self->SetHeader( 'To', $addresses ); } # }}} -# {{{ sub SetSubjectToken +# {{{ sub SetCc -=head2 SetSubjectToken +=head2 SetCc -This routine fixes the RT tag in the subject. It's unlikely that you want to overwrite this. +Takes a string that is the addresses you want to Cc =cut -sub SetSubjectToken { - my $self = shift; - my $sub = $self->TemplateObj->MIMEObj->head->get('Subject'); - my $id = $self->TicketObj->id; - - my $token_re = $RT::EmailSubjectTagRegex; - $token_re = qr/\Q$RT::rtname\E/o unless $token_re; - return if $sub =~ /\[$token_re\s+#$id\]/; +sub SetCc { + my $self = shift; + my $addresses = shift; - $sub =~ s/(\r\n|\n|\s)/ /gi; - chomp $sub; - $self->TemplateObj->MIMEObj->head->replace( - Subject => "[$RT::rtname #$id] $sub", - ); + return $self->SetHeader( 'Cc', $addresses ); } # }}} -=head2 SetReferencesHeaders +# {{{ sub SetBcc + +=head2 SetBcc -Set References and In-Reply-To headers for this message. +Takes a string that is the addresses you want to Bcc =cut -sub SetReferencesHeaders { +sub SetBcc { + my $self = shift; + my $addresses = shift; - my $self = shift; - my ( @in_reply_to, @references, @msgid ); + return $self->SetHeader( 'Bcc', $addresses ); +} - my $attachments = $self->TransactionObj->Message; +# }}} - if ( my $top = $attachments->First() ) { - @in_reply_to = split(/\s+/m, $top->GetHeader('In-Reply-To') || ''); - @references = split(/\s+/m, $top->GetHeader('References') || '' ); - @msgid = split(/\s+/m, $top->GetHeader('Message-ID') || ''); - } - else { - return (undef); - } +# {{{ sub SetPrecedence - # There are two main cases -- this transaction was created with - # the RT Web UI, and hence we want to *not* append its Message-ID - # to the References and In-Reply-To. OR it came from an outside - # source, and we should treat it as per the RFC - if ( "@msgid" =~ /<(rt-.*?-\d+-\d+)\.(\d+-0-0)\@$RT::Organization>/) { - - # Make all references which are internal be to version which we - # have sent out - for (@references, @in_reply_to) { - s/<(rt-.*?-\d+-\d+)\.(\d+-0-0)\@$RT::Organization>$/ - "<$1." . $self->TicketObj->id . - "-" . $self->ScripObj->id . - "-" . $self->ScripActionObj->{_Message_ID} . - "@" . $RT::Organization . ">"/eg - } - - # In reply to whatever the internal message was in reply to - $self->SetHeader( 'In-Reply-To', join( " ", ( @in_reply_to ))); - - # Default the references to whatever we're in reply to - @references = @in_reply_to unless @references; - - # References are unchanged from internal - } else { - # In reply to that message - $self->SetHeader( 'In-Reply-To', join( " ", ( @msgid ))); - - # Default the references to whatever we're in reply to - @references = @in_reply_to unless @references; - - # Push that message onto the end of the references - push @references, @msgid; +sub SetPrecedence { + my $self = shift; + + unless ( $self->TemplateObj->MIMEObj->head->get("Precedence") ) { + $self->SetHeader( 'Precedence', "bulk" ); } +} + +# }}} + +# {{{ sub SetSubject + +=head2 SetSubject + +This routine sets the subject. it does not add the rt tag. that gets done elsewhere +If $self->{'Subject'} is already defined, it uses that. otherwise, it tries to get +the transaction's subject. + +=cut - # Push pseudo-ref to the front - my $pseudo_ref = $self->PseudoReference; - @references = ($pseudo_ref, grep { $_ ne $pseudo_ref } @references); +sub SetSubject { + my $self = shift; + my $subject; + + unless ( $self->TemplateObj->MIMEObj->head->get('Subject') ) { + my $message = $self->TransactionObj->Attachments; + my $ticket = $self->TicketObj->Id; + + if ( $self->{'Subject'} ) { + $subject = $self->{'Subject'}; + } + elsif ( ( $message->First() ) + && ( $message->First->Headers ) ) { + my $header = $message->First->Headers(); + $header =~ s/\n\s+/ /g; + if ( $header =~ /^Subject: (.*?)$/m ) { + $subject = $1; + } + else { + $subject = $self->TicketObj->Subject(); + } + + } + else { + $subject = $self->TicketObj->Subject(); + } - # If there are more than 10 references headers, remove all but the - # first four and the last six (Gotta keep this from growing - # forever) - splice(@references, 4, -6) if ($#references >= 10); + $subject =~ s/(\r\n|\n|\s)/ /gi; - # Add on the references - $self->SetHeader( 'References', join( " ", @references) ); - $self->TemplateObj->MIMEObj->head->fold_length( 'References', 80 ); + chomp $subject; + $self->SetHeader( 'Subject', $subject ); + } + return ($subject); } # }}} -=head2 PseudoReference +# {{{ sub SetSubjectToken -Returns a fake Message-ID: header for the ticket to allow a base level of threading +=head2 SetSubjectToken -=cut +This routine fixes the RT tag in the subject. It's unlikely that you want to overwrite this. -sub PseudoReference { +=cut +sub SetSubjectToken { my $self = shift; - my $pseudo_ref = '<RT-Ticket-'.$self->TicketObj->id .'@'.$RT::Organization .'>'; - return $pseudo_ref; + my $tag = "[$RT::rtname #" . $self->TicketObj->id . "]"; + my $sub = $self->TemplateObj->MIMEObj->head->get('Subject'); + unless ( $sub =~ /\Q$tag\E/ ) { + $sub =~ s/(\r\n|\n|\s)/ /gi; + chomp $sub; + $self->TemplateObj->MIMEObj->head->replace( 'Subject', "$tag $sub" ); + } } +# }}} -# {{{ SetHeadingAsEncoding +# }}} + +# {{{ =head2 SetHeaderAsEncoding($field_name, $charset_encoding) @@ -928,6 +640,10 @@ sub SetHeaderAsEncoding { my $value = $self->TemplateObj->MIMEObj->head->get($field); + # don't bother if it's us-ascii + + # See RT::I18N, 'NOTES: Why Encode::_utf8_off before Encode::from_to' + $value = $self->MIMEEncodeString($value, $enc); $self->TemplateObj->MIMEObj->head->replace( $field, $value ); @@ -936,7 +652,7 @@ sub SetHeaderAsEncoding { } # }}} -# {{{ MIMEEncodeString +# {{{ MIMENcodeString =head2 MIMEEncodeString STRING ENCODING @@ -947,52 +663,15 @@ Takes a string and a possible encoding and returns the string wrapped in MIME go sub MIMEEncodeString { my $self = shift; my $value = shift; - # using RFC2047 notation, sec 2. - # encoded-word = "=?" charset "?" encoding "?" encoded-text "?=" - my $charset = shift; - my $encoding = 'B'; - # An 'encoded-word' may not be more than 75 characters long - # - # MIME encoding increases 4/3*(number of bytes), and always in multiples - # of 4. Thus we have to find the best available value of bytes available - # for each chunk. - # - # First we get the integer max which max*4/3 would fit on space. - # Then we find the greater multiple of 3 lower or equal than $max. - my $max = int(((75-length('=?'.$charset.'?'.$encoding.'?'.'?='))*3)/4); - $max = int($max/3)*3; + my $enc = shift; chomp $value; - - if ( $max <= 0 ) { - # gives an error... - $RT::Logger->crit("Can't encode! Charset or encoding too big.\n"); - return ($value); - } - return ($value) unless $value =~ /[^\x20-\x7e]/; $value =~ s/\s*$//; - - # we need perl string to split thing char by char - Encode::_utf8_on($value) unless Encode::is_utf8( $value ); - - my ($tmp, @chunks) = ('', ()); - while ( length $value ) { - my $char = substr($value, 0, 1, ''); - my $octets = Encode::encode( $charset, $char ); - if ( length($tmp) + length($octets) > $max ) { - push @chunks, $tmp; - $tmp = ''; - } - $tmp .= $octets; - } - push @chunks, $tmp if length $tmp; - - # encode an join chuncks - $value = join "\n ", - map encode_mimeword( $_, $encoding, $charset ), @chunks ; - return($value); + Encode::_utf8_off($value); + my $res = Encode::from_to( $value, "utf-8", $enc ); + $value = encode_mimeword( $value, 'B', $enc ); } # }}} diff --git a/rt/lib/RT/Attachment.pm b/rt/lib/RT/Attachment.pm index f0a19874c..2ed520162 100755 --- a/rt/lib/RT/Attachment.pm +++ b/rt/lib/RT/Attachment.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: @@ -134,7 +110,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -143,14 +119,14 @@ Returns the current value of id. =cut -=head2 TransactionId +=item TransactionId Returns the current value of TransactionId. (In the database, TransactionId is stored as int(11).) -=head2 SetTransactionId VALUE +=item SetTransactionId VALUE Set TransactionId to VALUE. @@ -161,14 +137,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Parent +=item Parent Returns the current value of Parent. (In the database, Parent is stored as int(11).) -=head2 SetParent VALUE +=item SetParent VALUE Set Parent to VALUE. @@ -179,14 +155,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 MessageId +=item MessageId Returns the current value of MessageId. (In the database, MessageId is stored as varchar(160).) -=head2 SetMessageId VALUE +=item SetMessageId VALUE Set MessageId to VALUE. @@ -197,14 +173,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Subject +=item Subject Returns the current value of Subject. (In the database, Subject is stored as varchar(255).) -=head2 SetSubject VALUE +=item SetSubject VALUE Set Subject to VALUE. @@ -215,14 +191,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Filename +=item Filename Returns the current value of Filename. (In the database, Filename is stored as varchar(255).) -=head2 SetFilename VALUE +=item SetFilename VALUE Set Filename to VALUE. @@ -233,14 +209,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ContentType +=item ContentType Returns the current value of ContentType. (In the database, ContentType is stored as varchar(80).) -=head2 SetContentType VALUE +=item SetContentType VALUE Set ContentType to VALUE. @@ -251,14 +227,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ContentEncoding +=item ContentEncoding Returns the current value of ContentEncoding. (In the database, ContentEncoding is stored as varchar(80).) -=head2 SetContentEncoding VALUE +=item SetContentEncoding VALUE Set ContentEncoding to VALUE. @@ -269,14 +245,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Content +=item Content Returns the current value of Content. (In the database, Content is stored as longtext.) -=head2 SetContent VALUE +=item SetContent VALUE Set Content to VALUE. @@ -287,14 +263,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Headers +=item Headers Returns the current value of Headers. (In the database, Headers is stored as longtext.) -=head2 SetHeaders VALUE +=item SetHeaders VALUE Set Headers to VALUE. @@ -305,7 +281,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Creator +=item Creator Returns the current value of Creator. (In the database, Creator is stored as int(11).) @@ -314,7 +290,7 @@ Returns the current value of Creator. =cut -=head2 Created +=item Created Returns the current value of Created. (In the database, Created is stored as datetime.) @@ -324,33 +300,33 @@ Returns the current value of Created. -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, type => 'int(11)', default => ''}, TransactionId => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Parent => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, MessageId => - {read => 1, write => 1, sql_type => 12, length => 160, is_blob => 0, is_numeric => 0, type => 'varchar(160)', default => ''}, + {read => 1, write => 1, type => 'varchar(160)', default => ''}, Subject => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, + {read => 1, write => 1, type => 'varchar(255)', default => ''}, Filename => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, + {read => 1, write => 1, type => 'varchar(255)', default => ''}, ContentType => - {read => 1, write => 1, sql_type => 12, length => 80, is_blob => 0, is_numeric => 0, type => 'varchar(80)', default => ''}, + {read => 1, write => 1, type => 'varchar(80)', default => ''}, ContentEncoding => - {read => 1, write => 1, sql_type => 12, length => 80, is_blob => 0, is_numeric => 0, type => 'varchar(80)', default => ''}, + {read => 1, write => 1, type => 'varchar(80)', default => ''}, Content => - {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'longtext', default => ''}, + {read => 1, write => 1, type => 'longtext', default => ''}, Headers => - {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'longtext', default => ''}, + {read => 1, write => 1, type => 'longtext', default => ''}, Creator => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, Created => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, } }; @@ -382,7 +358,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Attachments.pm b/rt/lib/RT/Attachments.pm index 44115492f..177cdd094 100755 --- a/rt/lib/RT/Attachments.pm +++ b/rt/lib/RT/Attachments.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::Attachment item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Condition/AnyTransaction.pm b/rt/lib/RT/Condition/AnyTransaction.pm index 9b1bb8cfb..4519fcf5a 100644 --- a/rt/lib/RT/Condition/AnyTransaction.pm +++ b/rt/lib/RT/Condition/AnyTransaction.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK package RT::Condition::AnyTransaction; diff --git a/rt/lib/RT/Condition/Generic.pm b/rt/lib/RT/Condition/Generic.pm index da6ec476c..bd269315e 100755 --- a/rt/lib/RT/Condition/Generic.pm +++ b/rt/lib/RT/Condition/Generic.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK =head1 NAME RT::Condition::Generic - ; @@ -52,7 +28,7 @@ =head1 SYNOPSIS use RT::Condition::Generic; - my $foo = RT::Condition::Generic->new( + my $foo = new RT::Condition::IsApplicable( TransactionObj => $tr, TicketObj => $ti, ScripObj => $scr, @@ -81,8 +57,10 @@ ok (require RT::Condition::Generic); package RT::Condition::Generic; +use RT::Base; use strict; -use base qw/RT::Base/; +use vars qw/@ISA/; +@ISA = qw(RT::Base); # {{{ sub new sub new { @@ -104,7 +82,6 @@ sub _Init { TemplateObj => undef, Argument => undef, ApplicableTransTypes => undef, - CurrentUser => undef, @_ ); $self->{'Argument'} = $args{'Argument'}; @@ -112,7 +89,6 @@ sub _Init { $self->{'TicketObj'} = $args{'TicketObj'}; $self->{'TransactionObj'} = $args{'TransactionObj'}; $self->{'ApplicableTransTypes'} = $args{'ApplicableTransTypes'}; - $self->CurrentUser($args{'CurrentUser'}); } # }}} diff --git a/rt/lib/RT/Condition/StatusChange.pm b/rt/lib/RT/Condition/StatusChange.pm index 20da9e728..8afabcda0 100644 --- a/rt/lib/RT/Condition/StatusChange.pm +++ b/rt/lib/RT/Condition/StatusChange.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK diff --git a/rt/lib/RT/CurrentUser.pm b/rt/lib/RT/CurrentUser.pm index 3193034a5..4ca2f9891 100755 --- a/rt/lib/RT/CurrentUser.pm +++ b/rt/lib/RT/CurrentUser.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK =head1 NAME RT::CurrentUser - an RT object representing the current user @@ -75,7 +51,8 @@ use RT::Record; use RT::I18N; use strict; -use base qw/RT::Record/; +use vars qw/@ISA/; +@ISA= qw(RT::Record); # {{{ sub _Init @@ -83,30 +60,17 @@ use base qw/RT::Record/; # to be a CurrentUser object. but that's hard to do when we're trying to load # the CurrentUser object -sub _Init { - my $self = shift; - my $User = shift; - - $self->{'table'} = "Users"; - - if ( defined($User) ) { - - if ( UNIVERSAL::isa( $User, 'RT::User' ) - || UNIVERSAL::isa( $User, 'RT::CurrentUser' ) ) - { - $self->Load( $User->id ); +sub _Init { + my $self = shift; + my $Name = shift; - } - elsif ( ref($User) ) { - $RT::Logger->crit( - "RT::CurrentUser->new() called with a bogus argument: $User"); - } - else { - $self->Load($User); - } - } + $self->{'table'} = "Users"; - $self->_BuildTableAttributes(); + if (defined($Name)) { + $self->Load($Name); + } + + $self->CurrentUser($self); } # }}} @@ -140,13 +104,15 @@ sub Delete { sub UserObj { my $self = shift; + unless ($self->{'UserObj'}) { use RT::User; - my $user = RT::User->new($self); - - unless ($user->Load($self->Id)) { + $self->{'UserObj'} = RT::User->new($self); + unless ($self->{'UserObj'}->Load($self->Id)) { $RT::Logger->err($self->loc("Couldn't load [_1] from the users database.\n", $self->Id)); } - return ($user); + + } + return ($self->{'UserObj'}); } # }}} @@ -187,18 +153,18 @@ sub PrincipalId { # {{{ sub _Accessible - - - sub _CoreAccessible { - { - Name => { 'read' => 1 }, - Gecos => { 'read' => 1 }, - RealName => { 'read' => 1 }, - Lang => { 'read' => 1 }, - Password => { 'read' => 0, 'write' => 0 }, - EmailAddress => { 'read' => 1, 'write' => 0 } - }; - +sub _Accessible { + my $self = shift; + my %Cols = ( + Name => 'read', + Gecos => 'read', + RealName => 'read', + Password => 'neither', + EmailAddress => 'read', + Privileged => 'read', + IsAdministrator => 'read' + ); + return($self->SUPER::_Accessible(@_, %Cols)); } # }}} @@ -246,7 +212,6 @@ sub LoadByGecos { Loads a User into this CurrentUser object. Takes a Name. - =cut sub LoadByName { @@ -276,11 +241,6 @@ sub Load { if ($identifier !~ /\D/) { $self->SUPER::LoadById($identifier); } - - elsif (UNIVERSAL::isa($identifier,"RT::User")) { - # DWIM if they pass a user in - $self->SUPER::LoadById($identifier->Id); - } else { # This is a bit dangerous, we might get false authen if somebody # uses ambigous userids or real names: @@ -353,15 +313,12 @@ specification. but currently doesn't =begin testing ok (my $cu = RT::CurrentUser->new('root')); -ok (my $lh = $cu->LanguageHandle('en-us')); -ok (defined $lh); +ok (my $lh = $cu->LanguageHandle); +ok ($lh != undef); ok ($lh->isa('Locale::Maketext')); -is ($cu->loc('TEST_STRING'), "Concrete Mixer", "Localized TEST_STRING into English"); +ok ($cu->loc('TEST_STRING') eq "Concrete Mixer", "Localized TEST_STRING into English"); ok ($lh = $cu->LanguageHandle('fr')); -SKIP: { - skip "fr locale is not loaded", 1 unless grep $_ eq 'fr', @RT::LexiconLanguages; - is ($cu->loc('Before'), "Avant", "Localized TEST_STRING into Frenc"); -} +ok ($cu->loc('Before') eq "Avant", "Localized TEST_STRING into Frenc"); =end testing @@ -369,24 +326,16 @@ SKIP: { sub LanguageHandle { my $self = shift; - if ( ( !defined $self->{'LangHandle'} ) - || ( !UNIVERSAL::can( $self->{'LangHandle'}, 'maketext' ) ) - || (@_) ) { - if ( !$RT::SystemUser or ($self->id || 0) == $RT::SystemUser->id() ) { - @_ = qw(en-US); - } - - elsif ( $self->Lang ) { - push @_, $self->Lang; - } + if ((!defined $self->{'LangHandle'}) || + (!UNIVERSAL::can($self->{'LangHandle'}, 'maketext')) || + (@_)) { $self->{'LangHandle'} = RT::I18N->get_handle(@_); } - # Fall back to english. - unless ( $self->{'LangHandle'} ) { + unless ($self->{'LangHandle'}) { die "We couldn't get a dictionary. Nye mogu naidti slovar. No puedo encontrar dictionario."; } - return ( $self->{'LangHandle'} ); + return ($self->{'LangHandle'}); } sub loc { @@ -406,7 +355,7 @@ sub loc { sub loc_fuzzy { my $self = shift; - return '' if (!$_[0] || $_[0] eq ''); + return '' if $_[0] eq ''; # XXX: work around perl's deficiency when matching utf8 data return $_[0] if Encode::is_utf8($_[0]); @@ -416,62 +365,6 @@ sub loc_fuzzy { } # }}} - -=head2 CurrentUser - -Return the current currentuser object - -=cut - -sub CurrentUser { - my $self = shift; - return($self); - -} - -=head2 Authenticate - -Takes $password, $created and $nonce, and returns a boolean value -representing whether the authentication succeeded. - -If both $nonce and $created are specified, validate $password against: - - encode_base64(sha1( - $nonce . - $created . - sha1_hex( "$username:$realm:$server_pass" ) - )) - -where $server_pass is the md5_hex(password) digest stored in the -database, $created is in ISO time format, and $nonce is a random -string no longer than 32 bytes. - -=cut - -sub Authenticate { - my ($self, $password, $created, $nonce, $realm) = @_; - - require Digest::MD5; - require Digest::SHA1; - require MIME::Base64; - - my $username = $self->UserObj->Name or return; - my $server_pass = $self->UserObj->__Value('Password') or return; - my $auth_digest = MIME::Base64::encode_base64(Digest::SHA1::sha1( - $nonce . - $created . - Digest::MD5::md5_hex("$username:$realm:$server_pass") - )); - - chomp($password); - chomp($auth_digest); - - return ($password eq $auth_digest); -} - -# }}} - - eval "require RT::CurrentUser_Vendor"; die $@ if ($@ && $@ !~ qr{^Can't locate RT/CurrentUser_Vendor.pm}); eval "require RT::CurrentUser_Local"; diff --git a/rt/lib/RT/Date.pm b/rt/lib/RT/Date.pm index 8e9383fd7..355370ada 100644 --- a/rt/lib/RT/Date.pm +++ b/rt/lib/RT/Date.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK =head1 NAME RT::Date - a simple Object Oriented date. @@ -227,28 +203,23 @@ sub Set { # {{{ sub SetToMidnight -=head2 SetToMidnight [Timezone => 'utc'] +=head2 SetToMidnight -Sets the date to midnight (at the beginning of the day). +Sets the date to midnight (at the beginning of the day) GMT Returns the unixtime at midnight. -Arguments: - -=over 4 - -=item Timezone - Timezone context C<server> or C<UTC> - =cut sub SetToMidnight { my $self = shift; - my %args = ( Timezone => 'UTC', @_ ); - if ( lc $args{'Timezone'} eq 'server' ) { - $self->Unix( Time::Local::timelocal( 0,0,0,(localtime $self->Unix)[3..7] ) ); - } else { - $self->Unix( Time::Local::timegm( 0,0,0,(gmtime $self->Unix)[3..7] ) ); - } + + use Time::Local; + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime($self->Unix); + $self->Unix(timegm (0,0,0,$mday,$mon,$year,$wday,$yday)); + return ($self->Unix); + + } @@ -359,8 +330,7 @@ sub DurationAsString { $s = int( $duration / $YEAR ); $time_unit = $self->loc("years"); } - - if ($negative) { + if (0) { # For now, never display the "AGO" # $negative) { return $self->loc( "[_1] [_2] ago", $s, $time_unit ); } else { @@ -405,7 +375,6 @@ sub AsString { # }}} # {{{ GetWeekday - =head2 GetWeekday DAY Takes an integer day of week and returns a localized string for that day of week @@ -428,7 +397,6 @@ sub GetWeekday { # }}} # {{{ GetMonth - =head2 GetMonth DAY Takes an integer month and returns a localized string for that month @@ -561,65 +529,8 @@ sub ISO { # }}} -# {{{ sub Date - -=head2 Date - -Takes nothing - -Returns the object's date in yyyy-mm-dd format; this is the same as -the ISO format without the time - -=cut - -sub Date { - my $self = shift; - my ($date, $time) = split ' ', $self->ISO; - return $date; -} - -# }}}} - -# {{{ sub Time - -=head2 Time - -Takes nothing - -Returns the object's time in hh:mm:ss format; this is the same as -the ISO format without the date - -=cut - -sub Time { - my $self = shift; - my ($date, $time) = split ' ', $self->ISO; - return $time; -} - -# }}}} - -# {{{ sub W3CDTF - -=head2 W3CDTF - -Takes nothing - -Returns the object's date in W3C DTF format - -=cut - -sub W3CDTF { - my $self = shift; - my $date = $self->ISO . 'Z'; - $date =~ s/ /T/; - return $date; -}; - -# }}} # {{{ sub LocalTimezone - =head2 LocalTimezone Returns the current timezone. For now, draws off a system timezone, RT::Timezone. Eventually, this may diff --git a/rt/lib/RT/Extension/ActivityReports.pm b/rt/lib/RT/Extension/ActivityReports.pm new file mode 100644 index 000000000..52d8ba6ab --- /dev/null +++ b/rt/lib/RT/Extension/ActivityReports.pm @@ -0,0 +1,3 @@ +package RT::Extension::ActivityReports; + +our $VERSION = '0.2'; diff --git a/rt/lib/RT/Group.pm b/rt/lib/RT/Group.pm index 53aa326ff..4dcef3f07 100755 --- a/rt/lib/RT/Group.pm +++ b/rt/lib/RT/Group.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: @@ -93,7 +69,7 @@ Create takes a hash of values and creates a row in the database: varchar(255) 'Description'. varchar(64) 'Domain'. varchar(64) 'Type'. - int(11) 'Instance'. + varchar(64) 'Instance'. =cut @@ -122,7 +98,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -131,14 +107,14 @@ Returns the current value of id. =cut -=head2 Name +=item Name Returns the current value of Name. (In the database, Name is stored as varchar(200).) -=head2 SetName VALUE +=item SetName VALUE Set Name to VALUE. @@ -149,14 +125,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Description +=item Description Returns the current value of Description. (In the database, Description is stored as varchar(255).) -=head2 SetDescription VALUE +=item SetDescription VALUE Set Description to VALUE. @@ -167,14 +143,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Domain +=item Domain Returns the current value of Domain. (In the database, Domain is stored as varchar(64).) -=head2 SetDomain VALUE +=item SetDomain VALUE Set Domain to VALUE. @@ -185,14 +161,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Type +=item Type Returns the current value of Type. (In the database, Type is stored as varchar(64).) -=head2 SetType VALUE +=item SetType VALUE Set Type to VALUE. @@ -203,40 +179,40 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Instance +=item Instance Returns the current value of Instance. -(In the database, Instance is stored as int(11).) +(In the database, Instance is stored as varchar(64).) -=head2 SetInstance VALUE +=item SetInstance VALUE Set Instance to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, Instance will be stored as a int(11).) +(In the database, Instance will be stored as a varchar(64).) =cut -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, type => 'int(11)', default => ''}, Name => - {read => 1, write => 1, sql_type => 12, length => 200, is_blob => 0, is_numeric => 0, type => 'varchar(200)', default => ''}, + {read => 1, write => 1, type => 'varchar(200)', default => ''}, Description => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, + {read => 1, write => 1, type => 'varchar(255)', default => ''}, Domain => - {read => 1, write => 1, sql_type => 12, length => 64, is_blob => 0, is_numeric => 0, type => 'varchar(64)', default => ''}, + {read => 1, write => 1, type => 'varchar(64)', default => ''}, Type => - {read => 1, write => 1, sql_type => 12, length => 64, is_blob => 0, is_numeric => 0, type => 'varchar(64)', default => ''}, + {read => 1, write => 1, type => 'varchar(64)', default => ''}, Instance => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, write => 1, type => 'varchar(64)', default => ''}, } }; @@ -268,7 +244,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/GroupMember.pm b/rt/lib/RT/GroupMember.pm index f943bd927..8de1a73fe 100755 --- a/rt/lib/RT/GroupMember.pm +++ b/rt/lib/RT/GroupMember.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: @@ -113,7 +89,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -122,14 +98,14 @@ Returns the current value of id. =cut -=head2 GroupId +=item GroupId Returns the current value of GroupId. (In the database, GroupId is stored as int(11).) -=head2 SetGroupId VALUE +=item SetGroupId VALUE Set GroupId to VALUE. @@ -140,14 +116,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 MemberId +=item MemberId Returns the current value of MemberId. (In the database, MemberId is stored as int(11).) -=head2 SetMemberId VALUE +=item SetMemberId VALUE Set MemberId to VALUE. @@ -159,15 +135,15 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, type => 'int(11)', default => ''}, GroupId => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, MemberId => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, } }; @@ -199,7 +175,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/GroupMembers.pm b/rt/lib/RT/GroupMembers.pm index 8c4313383..31cb9536f 100755 --- a/rt/lib/RT/GroupMembers.pm +++ b/rt/lib/RT/GroupMembers.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::GroupMember item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Groups.pm b/rt/lib/RT/Groups.pm index 8522aa57c..29f12a5a0 100755 --- a/rt/lib/RT/Groups.pm +++ b/rt/lib/RT/Groups.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::Group item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Groups_Overlay.pm b/rt/lib/RT/Groups_Overlay.pm index 0cbebec04..82e021c16 100644 --- a/rt/lib/RT/Groups_Overlay.pm +++ b/rt/lib/RT/Groups_Overlay.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC # <jesse@bestpractical.com> # # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html. # # # CONTRIBUTION SUBMISSION POLICY: @@ -415,6 +415,7 @@ sub WithRight { $from_group->WithGroupRight( %args ); #XXX: DIRTY HACK + use DBIx::SearchBuilder 1.50; #no version on ::Union :( use DBIx::SearchBuilder::Union; my $union = new DBIx::SearchBuilder::Union; $union->add($from_role); diff --git a/rt/lib/RT/Handle.pm b/rt/lib/RT/Handle.pm index b5f94d814..5cdb65e5b 100644 --- a/rt/lib/RT/Handle.pm +++ b/rt/lib/RT/Handle.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# CONTRIBUTION SUBMISSION POLICY: # -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -# -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK =head1 NAME RT::Handle - RT's database handle @@ -72,13 +48,7 @@ use vars qw/@ISA/; eval "use DBIx::SearchBuilder::Handle::$RT::DatabaseType; \@ISA= qw(DBIx::SearchBuilder::Handle::$RT::DatabaseType);"; - -if ($@) { - die "Unable to load DBIx::SearchBuilder database handle for '$RT::DatabaseType'.". - "\n". - "Perhaps you've picked an invalid database type or spelled it incorrectly.". - "\n". $@; -} +#TODO check for errors here. =head2 Connect @@ -88,41 +58,29 @@ Takes nothing. Calls SUPER::Connect with the needed args =cut sub Connect { - my $self = shift; +my $self=shift; - if ($RT::DatabaseType eq 'Oracle') { - $ENV{'NLS_LANG'} = "AMERICAN_AMERICA.AL32UTF8"; - $ENV{'NLS_NCHAR'} = "AL32UTF8"; - - } +# Unless the database port is a positive integer, we really don't want to pass it. - $self->SUPER::Connect( +$self->SUPER::Connect( User => $RT::DatabaseUser, Password => $RT::DatabasePassword, ); - - $self->dbh->{LongReadLen} = $RT::MaxAttachmentSize; } -=head2 BuildDSN +=item BuildDSN Build the DSN for the RT database. doesn't take any parameters, draws all that from the config file. =cut -use File::Spec; sub BuildDSN { my $self = shift; -# Unless the database port is a positive integer, we really don't want to pass it. $RT::DatabasePort = undef unless (defined $RT::DatabasePort && $RT::DatabasePort =~ /^(\d+)$/); $RT::DatabaseHost = undef unless (defined $RT::DatabaseHost && $RT::DatabaseHost ne ''); -$RT::DatabaseName = File::Spec->catfile($RT::VarPath, $RT::DatabaseName) - if ($RT::DatabaseType eq 'SQLite') and - not File::Spec->file_name_is_absolute($RT::DatabaseName); - $self->SUPER::BuildDSN(Host => $RT::DatabaseHost, Database => $RT::DatabaseName, diff --git a/rt/lib/RT/I18N/en_malkovich.po b/rt/lib/RT/I18N/en_malkovich.po deleted file mode 100644 index 74769f1a3..000000000 --- a/rt/lib/RT/I18N/en_malkovich.po +++ /dev/null @@ -1,3973 +0,0 @@ -msgid "" -msgstr "" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: html/Approvals/Elements/Approve:26 html/Approvals/Elements/ShowDependency:49 html/SelfService/Display.html:24 html/Ticket/Display.html:25 html/Ticket/Display.html:29 -#. ($TicketObj->Id, $TicketObj->Subject) -#. ($Ticket->id, $Ticket->Subject) -#. ($ticket->Id, $ticket->Subject) -#. ($link->BaseObj->Id, $link->BaseObj->Subject) -msgid "#%1: %2" -msgstr "#%1: %2" - -#: html/Search/Elements/SelectPersonType:30 lib/RT/Date.pm:337 -#. ($s, $time_unit) -#. ($option, $subtype) -msgid "%1 %2" -msgstr "%1 %2" - -#: lib/RT/Tickets_Overlay.pm:828 -#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'}) -msgid "%1 %2 %3" -msgstr "%1 %2 %3" - -#: lib/RT/Date.pm:373 -#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900)) -msgid "%1 %2 %3 %4:%5:%6 %7" -msgstr "%1 %2 %3 %4:%5:%6 %7" - -#: lib/RT/Ticket_Overlay.pm:3451 lib/RT/Transaction_Overlay.pm:550 lib/RT/Transaction_Overlay.pm:593 -#. ($cf->Name, $new_value->Content) -#. ($field, $self->NewValue) -#. ($self->Field, $principal->Object->Name) -msgid "%1 %2 added" -msgstr "%1 %2 Malkovich" - -#: lib/RT/Date.pm:334 -#. ($s, $time_unit) -msgid "%1 %2 ago" -msgstr "%1 %2 ago" - -#: lib/RT/Ticket_Overlay.pm:3457 lib/RT/Transaction_Overlay.pm:557 -#. ($cf->Name, $old_value, $new_value->Content) -#. ($field, $self->OldValue, $self->NewValue) -msgid "%1 %2 changed to %3" -msgstr "%1 %2 Malkovich to %3" - -#: lib/RT/Ticket_Overlay.pm:3454 lib/RT/Transaction_Overlay.pm:553 lib/RT/Transaction_Overlay.pm:599 -#. ($cf->Name, $old_value) -#. ($field, $self->OldValue) -#. ($self->Field, $principal->Object->Name) -msgid "%1 %2 deleted" -msgstr "%1 %2 Malkovich" - -#: html/Admin/Elements/EditScrips:43 html/Admin/Elements/ListGlobalScrips:27 html/Ticket/Elements/PreviewScrips:53 -#. ($scrip->ConditionObj->Name, $scrip->ActionObj->Name, $scrip->TemplateObj->Name) -#. (loc($scrip->ConditionObj->Name), loc($scrip->ActionObj->Name), loc($scrip->TemplateObj->Name)) -msgid "%1 %2 with template %3" -msgstr "%1 %2 Malkovich %3" - -#: bin/rt-crontool:165 bin/rt-crontool:172 bin/rt-crontool:178 -#. ("--search-argument", "--search") -#. ("--condition-argument", "--condition") -#. ("--action-argument", "--action") -msgid "%1 - An argument to pass to %2" -msgstr "%1 - A Malkovich to pass to %2" - -#: bin/rt-crontool:181 -#. ("--verbose") -msgid "%1 - Output status updates to STDOUT" -msgstr "%1 - Malkovich Malkovich to MALKOVICH" - -#: bin/rt-crontool:175 -#. ("--action") -msgid "%1 - Specify the action module you want to use" -msgstr "%1 - Malkovich the Malkovich Malkovich to use" - -#: bin/rt-crontool:169 -#. ("--condition") -msgid "%1 - Specify the condition module you want to use" -msgstr "%1 - Malkovich the Malkovich Malkovich to use" - -#: bin/rt-crontool:162 -#. ("--search") -msgid "%1 - Specify the search module you want to use" -msgstr "%1 - Malkovich the Malkovich Malkovich to use" - -#: lib/RT/ScripAction_Overlay.pm:114 -#. ($self->Id) -msgid "%1 ScripAction loaded" -msgstr "%1 Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3484 -#. ($args{'Value'}, $cf->Name) -msgid "%1 added as a value for %2" -msgstr "%1 Malkovich as a Malkovich %2" - -#: lib/RT/Link_Overlay.pm:111 lib/RT/Link_Overlay.pm:118 -#. ($args{'Base'}) -#. ($args{'Target'}) -msgid "%1 appears to be a local object, but can't be found in the database" -msgstr "%1 Malkovich to be a Malkovich, but can't be Malkovich in the Malkovich" - -#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:458 -#. ($self->BriefDescription , $self->CreatorObj->Name) -#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name) -msgid "%1 by %2" -msgstr "%1 by %2" - -#: lib/RT/Transaction_Overlay.pm:512 lib/RT/Transaction_Overlay.pm:688 lib/RT/Transaction_Overlay.pm:697 lib/RT/Transaction_Overlay.pm:700 -#. ($self->Field , ( $self->OldValue || $no_value ) , $self->NewValue) -#. ($self->Field , $q1->Name , $q2->Name) -#. ($self->Field, $t2->AsString, $t1->AsString) -#. ($self->Field, $self->OldValue, $self->NewValue) -msgid "%1 changed from %2 to %3" -msgstr "%1 Malkovich %2 to %3" - -#: lib/RT/Record.pm:739 -msgid "%1 could not be set to %2." -msgstr "%1 Malkovich be set to %2." - -#: lib/RT/Ticket_Overlay.pm:2739 -#. ($self) -msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent." -msgstr "%1 couldn't Malkovich to Malkovich. RT's Malkovich be Malkovich." - -#: NOT FOUND IN SOURCE -msgid "%1 highest priority tickets I own..." -msgstr "%1 Malkovich Malkovich I Malkovich..." - -#: html/Elements/MyTickets:26 -#. ($rows) -msgid "%1 highest priority tickets I requested..." -msgstr "%1 Malkovich Malkovich I Malkovich..." - -#: bin/rt-crontool:157 -#. ($0) -msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron." -msgstr "%1 is a tool to act on Malkovich a Malkovich Malkovich, such as cron." - -#: lib/RT/Queue_Overlay.pm:784 -#. ($principal->Object->Name, $args{'Type'}) -msgid "%1 is no longer a %2 for this queue." -msgstr "%1 is no Malkovich a %2 Malkovich." - -#: lib/RT/Ticket_Overlay.pm:3540 -#. ($args{'Value'}, $cf->Name) -msgid "%1 is no longer a value for custom field %2" -msgstr "%1 is no Malkovich a Malkovich Malkovich %2" - -#: html/Ticket/Create.html:155 html/Ticket/Create.html:156 html/Ticket/Elements/ShowBasics:36 html/Ticket/Elements/ShowBasics:42 html/Ticket/Elements/ShowBasics:47 -#. ('<input size=3 name="TimeWorked" value="'.$ARGS{TimeWorked}.'">') -#. ('<input size=3 name="TimeLeft" value="'.$ARGS{TimeLeft}.'">') -#. ($Ticket->TimeEstimated) -#. ($Ticket->TimeWorked) -#. ($Ticket->TimeLeft) -msgid "%1 min" -msgstr "%1 min" - -#: html/User/Elements/DelegateRights:75 -#. (loc($ObjectType =~ /^RT::(.*)$/)) -msgid "%1 rights" -msgstr "%1 Malkovich" - -#: lib/RT/Action/ResolveMembers.pm:41 -#. (ref $self) -msgid "%1 will resolve all members of a resolved group ticket." -msgstr "%1 Malkovich Malkovich of a Malkovich Malkovich." - -#: lib/RT/Transaction_Overlay.pm:408 -#. ($self) -msgid "%1: no attachment specified" -msgstr "%1: no Malkovich Malkovich" - -#: html/Ticket/Elements/ShowTransactionAttachments:56 -#. ($size) -msgid "%1b" -msgstr "%1b" - -#: html/Ticket/Elements/ShowTransactionAttachments:53 -#. (int( $size / 102.4 ) / 10) -msgid "%1k" -msgstr "%1k" - -#: lib/RT/Ticket_Overlay.pm:1252 -#. ($args{'Status'}) -msgid "'%1' is an invalid value for status" -msgstr "'%1' is a Malkovich Malkovich" - -#: html/Admin/Elements/EditCustomFieldValues:24 html/Admin/Elements/EditQueueWatchers:28 html/Admin/Elements/EditScrips:34 html/Admin/Elements/EditTemplates:35 html/Admin/Groups/Members.html:51 html/Elements/EditLinks:32 html/Ticket/Elements/EditPeople:45 html/User/Groups/Members.html:54 -msgid "(Check box to delete)" -msgstr "(Malkovich to Malkovich)" - -#: html/Ticket/Elements/PreviewScrips:49 -msgid "(Check boxes to disable notifications to the listed recipients)" -msgstr "(Malkovich to Malkovich Malkovich to the Malkovich Malkovich)" - -#: html/Ticket/Elements/PreviewScrips:71 -msgid "(Check boxes to enable notifications to the listed recipients)" -msgstr "(Malkovich to Malkovich Malkovich to the Malkovich Malkovich)" - -#: NOT FOUND IN SOURCE -msgid "(Enter ticket ids or URLs, seperated with spaces)" -msgstr "(Malkovich Malkovich or URLs, Malkovich Malkovich)" - -#: html/Admin/Queues/Modify.html:53 html/Admin/Queues/Modify.html:59 -#. ($RT::CorrespondAddress) -#. ($RT::CommentAddress) -msgid "(If left blank, will default to %1" -msgstr "(If Malkovich, Malkovich to %1" - -#: html/Admin/Elements/EditCustomFields:32 html/Admin/Elements/ListGlobalCustomFields:31 -msgid "(No custom fields)" -msgstr "(No Malkovich)" - -#: html/Admin/Groups/Members.html:49 html/User/Groups/Members.html:52 -msgid "(No members)" -msgstr "(No Malkovich)" - -#: html/Admin/Elements/EditScrips:31 html/Admin/Elements/ListGlobalScrips:31 -msgid "(No scrips)" -msgstr "(No Malkovich)" - -#: html/Admin/Elements/EditTemplates:30 -msgid "(No templates)" -msgstr "(No Malkovich)" - -#: html/Ticket/Update.html:66 -msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)" -msgstr "(Malkovich a Malkovich-copy of Malkovich to a Malkovich-Malkovich of Malkovich. Does <b>not</b> Malkovich Malkovich Malkovich Malkovich.)" - -#: html/Ticket/Create.html:78 -msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)" -msgstr "(Malkovich a Malkovich-copy of Malkovich to a Malkovich-Malkovich of Malkovich Malkovich Malkovich. Malkovich <b>will</b> Malkovich Malkovich.)" - -#: html/Ticket/Update.html:62 -msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)" -msgstr "(Malkovich a Malkovich-copy of Malkovich to a Malkovich-Malkovich of Malkovich. Does <b>not</b> Malkovich Malkovich Malkovich Malkovich.)" - -#: html/Ticket/Create.html:68 -msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)" -msgstr "(Malkovich a Malkovich-copy of Malkovich to a Malkovich-Malkovich of Malkovich. Malkovich <b>will</b> Malkovich Malkovich.)" - -#: html/Admin/Groups/index.html:32 html/User/Groups/index.html:32 -msgid "(empty)" -msgstr "(Malkovich)" - -#: html/Admin/Users/index.html:38 -msgid "(no name listed)" -msgstr "(no Malkovich)" - -#: html/Admin/Elements/SelectRights:47 html/Elements/SelectCustomFieldValue:29 html/Ticket/Elements/EditCustomField:64 html/Ticket/Elements/ShowCustomFields:35 lib/RT/Transaction_Overlay.pm:511 -msgid "(no value)" -msgstr "(no Malkovich)" - -#: html/Elements/EditLinks:105 html/Ticket/Elements/BulkLinks:27 -msgid "(only one ticket)" -msgstr "(Malkovich)" - -#: html/Elements/TicketList:167 -msgid "(pending approval)" -msgstr "(Malkovich Malkovich)" - -#: html/Elements/TicketList:170 -msgid "(pending other Collection)" -msgstr "(Malkovich Malkovich)" - -#: NOT FOUND IN SOURCE -msgid "(pending other tickets)" -msgstr "(Malkovich Malkovich)" - -#: html/Admin/Users/Modify.html:49 -msgid "(required)" -msgstr "(Malkovich)" - -#: html/Ticket/Elements/ShowTransactionAttachments:60 -msgid "(untitled)" -msgstr "(Malkovich)" - -#: NOT FOUND IN SOURCE -msgid "..." -msgstr "..." - -#: html/Ticket/Elements/ShowBasics:31 -msgid "<% $Ticket->Status%>" -msgstr "<% $Ticket->Status %>" - -#: html/Elements/SelectTicketTypes:26 -msgid "<% $_ %>" -msgstr "<% $_ %>" - -#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:25 lib/RT/StyleGuide.pod:767 -#. ($m->scomp('/Elements/SelectNewTicketQueue')) -msgid "<input type=\"submit\" value=\"New ticket in\"> %1" -msgstr "<input type=\"submit\" value=\"Malkovich in\"> %1" - -#: etc/initialdata:218 -msgid "A blank template" -msgstr "A Malkovich" - -#: lib/RT/ACE_Overlay.pm:156 lib/RT/Principal_Overlay.pm:180 -msgid "ACE not found" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:830 -msgid "ACEs can only be created and deleted." -msgstr "Malkovich be Malkovich and Malkovich." - -#: NOT FOUND IN SOURCE -msgid "Aborting to avoid unintended ticket modifications.\\n" -msgstr "Malkovich to Malkovich Malkovich Malkovich Malkovich.\\n" - -#: html/User/Elements/Tabs:31 -msgid "About me" -msgstr "Malkovich me" - -#: html/Admin/Users/Modify.html:79 -msgid "Access control" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrip:49 -msgid "Action" -msgstr "Malkovich" - -#: lib/RT/Scrip_Overlay.pm:148 -#. ($args{'ScripAction'}) -msgid "Action %1 not found" -msgstr "Malkovich %1 Malkovich" - -#: bin/rt-crontool:119 -msgid "Action committed." -msgstr "Malkovich Malkovich." - -#: bin/rt-crontool:115 -msgid "Action prepared..." -msgstr "Malkovich..." - -#: html/Search/Bulk.html:93 -msgid "Add AdminCc" -msgstr "Malkovich" - -#: html/Search/Bulk.html:89 -msgid "Add Cc" -msgstr "Add Cc" - -#: html/Ticket/Create.html:113 html/Ticket/Update.html:81 -msgid "Add More Files" -msgstr "Malkovich" - -#: html/Search/Bulk.html:85 -msgid "Add Requestor" -msgstr "Malkovich" - -#: html/Admin/Elements/AddCustomFieldValue:24 -msgid "Add Value" -msgstr "Malkovich" - -#: html/Admin/Global/Scrip.html:54 -msgid "Add a scrip which will apply to all queues" -msgstr "Add a Malkovich Malkovich to Malkovich" - -#: html/Search/Bulk.html:125 -msgid "Add comments or replies to selected tickets" -msgstr "Malkovich or Malkovich to Malkovich Malkovich" - -#: html/Admin/Groups/Members.html:41 html/User/Groups/Members.html:38 -msgid "Add members" -msgstr "Malkovich" - -#: html/Admin/Queues/People.html:65 html/Ticket/Elements/AddWatchers:27 -msgid "Add new watchers" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:684 -#. ($args{'Type'}) -msgid "Added principal as a %1 for this queue" -msgstr "Malkovich as a %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1547 -#. ($self->loc($args{'Type'})) -msgid "Added principal as a %1 for this ticket" -msgstr "Malkovich as a %1 Malkovich" - -#: html/Admin/Users/Modify.html:119 html/User/Prefs.html:111 -msgid "Address1" -msgstr "Malkovich1" - -#: html/Admin/Users/Modify.html:124 html/User/Prefs.html:115 -msgid "Address2" -msgstr "Malkovich2" - -#: html/Ticket/Create.html:73 -msgid "Admin Cc" -msgstr "Malkovich Cc" - -#: etc/initialdata:295 -msgid "Admin Comment" -msgstr "Malkovich" - -#: etc/initialdata:274 -msgid "Admin Correspondence" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/index.html:24 html/Admin/Queues/index.html:27 -msgid "Admin queues" -msgstr "Malkovich" - -#: html/Admin/Global/index.html:25 html/Admin/Global/index.html:27 -msgid "Admin/Global configuration" -msgstr "Malkovich/Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Admin/Queue/Basics" -msgstr "Malkovich/Malkovich/Malkovich" - -#: etc/initialdata:56 html/Ticket/Elements/ShowPeople:38 lib/RT/ACE_Overlay.pm:88 -msgid "AdminCc" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:73 -msgid "AdminCustomFields" -msgstr "Malkovich Malkovich" - -#: lib/RT/Group_Overlay.pm:146 -msgid "AdminGroup" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:148 -msgid "AdminGroupMembership" -msgstr "Malkovich Malkovich" - -#: lib/RT/System.pm:58 -msgid "AdminOwnPersonalGroups" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:69 -msgid "AdminQueue" -msgstr "Malkovich" - -#: lib/RT/System.pm:59 -msgid "AdminUsers" -msgstr "Malkovich" - -#: html/Admin/Queues/People.html:47 html/Ticket/Elements/EditPeople:53 -msgid "Administrative Cc" -msgstr "Malkovich Cc" - -#: html/Elements/SelectDateRelation:35 -msgid "After" -msgstr "Malkovich" - -#: etc/initialdata:363 -msgid "All Approvals Passed" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/EditCustomFields:94 -msgid "All Custom Fields" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/index.html:52 -msgid "All Queues" -msgstr "Malkovich" - -#: html/Elements/Tabs:58 -msgid "Approval" -msgstr "Malkovich" - -#: html/Approvals/Display.html:45 html/Approvals/Elements/ShowDependency:41 html/Approvals/index.html:64 -#. ($Ticket->Id, $Ticket->Subject) -#. ($ticket->id, $msg) -#. ($link->BaseObj->Id, $link->BaseObj->Subject) -msgid "Approval #%1: %2" -msgstr "Malkovich #%1: %2" - -#: html/Approvals/index.html:53 -#. ($ticket->Id) -msgid "Approval #%1: Notes not recorded due to a system error" -msgstr "Malkovich #%1: Malkovich Malkovich to a Malkovich" - -#: html/Approvals/index.html:51 -#. ($ticket->Id) -msgid "Approval #%1: Notes recorded" -msgstr "Malkovich #%1: Malkovich" - -#: etc/initialdata:351 -msgid "Approval Passed" -msgstr "Malkovich" - -#: etc/initialdata:374 -msgid "Approval Rejected" -msgstr "Malkovich Malkovich" - -#: html/Approvals/Elements/Approve:43 -msgid "Approve" -msgstr "Malkovich" - -#: etc/initialdata:504 -msgid "Approver's notes: %1" -msgstr "Malkovich's Malkovich: %1" - -#: lib/RT/Date.pm:414 -msgid "Apr." -msgstr "Apr." - -#: html/Elements/SelectSortOrder:34 html/Search/Elements/DisplayOptions:52 -msgid "Ascending" -msgstr "Malkovich" - -#: html/Search/Bulk.html:134 html/SelfService/Update.html:47 html/Ticket/ModifyAll.html:82 html/Ticket/Update.html:81 -msgid "Attach" -msgstr "Malkovich" - -#: html/SelfService/Create.html:64 html/Ticket/Create.html:109 -msgid "Attach file" -msgstr "Malkovich" - -#: html/SelfService/Update.html:36 html/Ticket/Create.html:97 html/Ticket/Update.html:70 -msgid "Attached file" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:416 -msgid "Attachment created" -msgstr "Malkovich Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1251 -msgid "Attachment filename" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Elements/ShowAttachments:25 -msgid "Attachments" -msgstr "Malkovich" - -#: lib/RT/Attributes_Overlay.pm:158 -msgid "Attribute Deleted" -msgstr "Malkovich Malkovich" - -#: lib/RT/Date.pm:418 -msgid "Aug." -msgstr "Aug." - -#: NOT FOUND IN SOURCE -msgid "AuthSystem" -msgstr "Malkovich" - -#: etc/initialdata:221 -msgid "Autoreply" -msgstr "Malkovich" - -#: etc/initialdata:72 -msgid "Autoreply To Requestors" -msgstr "Malkovich To Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Bad data in %1" -msgstr "Malkovich in %1" - -#: html/Admin/Elements/GroupTabs:38 html/Admin/Elements/QueueTabs:38 html/Admin/Elements/UserTabs:37 html/Ticket/Elements/Tabs:91 html/User/Elements/GroupTabs:37 -msgid "Basics" -msgstr "Malkovich" - -#: html/Ticket/Update.html:64 -msgid "Bcc" -msgstr "Bcc" - -#: html/Admin/Elements/EditScrip:73 -msgid "Be sure to save your changes" -msgstr "Be sure to Malkovich Malkovich" - -#: html/Elements/SelectDateRelation:33 lib/RT/CurrentUser.pm:336 -msgid "Before" -msgstr "Malkovich" - -#: etc/initialdata:217 -msgid "Blank" -msgstr "Malkovich" - -#: html/Ticket/Elements/ShowHistory:38 html/Ticket/Elements/ShowHistory:44 -msgid "Brief headers" -msgstr "Malkovich" - -#: html/Search/Bulk.html:24 html/Search/Bulk.html:25 -msgid "Bulk ticket update" -msgstr "Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:1533 -msgid "Can not modify system users" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:68 -msgid "Can this principal see this queue" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:211 -msgid "Can't add a custom field value without a name" -msgstr "Can't add a Malkovich Malkovich Malkovich a name" - -#: lib/RT/Link_Overlay.pm:126 -msgid "Can't link a ticket to itself" -msgstr "Can't link a Malkovich to Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2716 -msgid "Can't merge into a merged ticket. You should never get this error" -msgstr "Can't Malkovich a Malkovich. Malkovich Malkovich Malkovich" - -#: lib/RT/Record.pm:1060 lib/RT/Record.pm:1138 -msgid "Can't specifiy both base and target" -msgstr "Can't Malkovich Malkovich and Malkovich" - -#: html/autohandler:132 -#. ($msg) -msgid "Cannot create user: %1" -msgstr "Malkovich Malkovich: %1" - -#: etc/initialdata:50 html/Admin/Queues/People.html:43 html/SelfService/Create.html:48 html/Ticket/Create.html:63 html/Ticket/Elements/EditPeople:50 html/Ticket/Elements/ShowPeople:34 html/Ticket/Update.html:59 lib/RT/ACE_Overlay.pm:87 -msgid "Cc" -msgstr "Cc" - -#: html/SelfService/Prefs.html:30 -msgid "Change password" -msgstr "Malkovich" - -#: html/SelfService/Update.html:39 html/Ticket/Create.html:100 html/Ticket/Update.html:73 -msgid "Check box to delete" -msgstr "Malkovich to Malkovich" - -#: html/Admin/Elements/SelectRights:30 -msgid "Check box to revoke right" -msgstr "Malkovich to Malkovich" - -#: html/Elements/EditLinks:121 html/Elements/EditLinks:63 html/Elements/ShowLinks:56 html/Ticket/Create.html:183 html/Ticket/Elements/BulkLinks:42 -msgid "Children" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:129 html/User/Prefs.html:119 -msgid "City" -msgstr "City" - -#: html/Ticket/Elements/ShowDates:47 -msgid "Closed" -msgstr "Malkovich" - -#: html/SelfService/Closed.html:24 -msgid "Closed Tickets" -msgstr "Malkovich" - -#: html/SelfService/Elements/Tabs:44 -msgid "Closed tickets" -msgstr "Malkovich" - -#: html/Ticket/Elements/ShowTransaction:152 html/Ticket/Elements/Tabs:154 -msgid "Comment" -msgstr "Malkovich" - -#: html/Admin/Queues/Modify.html:57 -msgid "Comment Address" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:88 -msgid "Comment on tickets" -msgstr "Malkovich on Malkovich" - -#: lib/RT/Queue_Overlay.pm:88 -msgid "CommentOnTicket" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Comments" -msgstr "Malkovich" - -#: html/Ticket/ModifyAll.html:69 html/Ticket/Update.html:51 -msgid "Comments (Not sent to requestors)" -msgstr "Malkovich (Malkovich to Malkovich)" - -#: html/Search/Bulk.html:129 -msgid "Comments (not sent to requestors)" -msgstr "Malkovich (Malkovich to Malkovich)" - -#: NOT FOUND IN SOURCE -msgid "Comments about %1" -msgstr "Malkovich %1" - -#: html/Admin/Users/Modify.html:182 html/Ticket/Elements/ShowRequestor:45 -msgid "Comments about this user" -msgstr "Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:537 -msgid "Comments added" -msgstr "Malkovich" - -#: lib/RT/Action/Generic.pm:149 -msgid "Commit Stubbed" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrip:41 -msgid "Condition" -msgstr "Malkovich" - -#: bin/rt-crontool:105 -msgid "Condition matches..." -msgstr "Malkovich Malkovich..." - -#: lib/RT/Scrip_Overlay.pm:164 -msgid "Condition not found" -msgstr "Malkovich Malkovich" - -#: html/Elements/Tabs:52 -msgid "Configuration" -msgstr "Malkovich" - -#: html/SelfService/Prefs.html:32 -msgid "Confirm" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "ContactInfoSystem" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/ModifyTemplate:43 html/Elements/SelectAttachmentField:26 html/Ticket/ModifyAll.html:86 -msgid "Content" -msgstr "Malkovich" - -#: etc/initialdata:286 -msgid "Correspondence" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Correspondence Address" -msgstr "Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:533 -msgid "Correspondence added" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3471 -msgid "Could not add new custom field value for ticket. " -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich. " - -#: lib/RT/Ticket_Overlay.pm:2967 lib/RT/Ticket_Overlay.pm:2975 lib/RT/Ticket_Overlay.pm:2992 -msgid "Could not change owner. " -msgstr "Malkovich Malkovich. " - -#: html/Admin/Elements/EditCustomField:84 html/Admin/Elements/EditCustomFields:164 -#. ($msg) -msgid "Could not create CustomField" -msgstr "Malkovich Malkovich Malkovich" - -#: html/User/Groups/Modify.html:76 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481 -msgid "Could not create group" -msgstr "Malkovich Malkovich" - -#: html/Admin/Global/Template.html:74 html/Admin/Queues/Template.html:71 -#. ($msg) -msgid "Could not create template: %1" -msgstr "Malkovich Malkovich: %1" - -#: lib/RT/Ticket_Overlay.pm:1185 lib/RT/Ticket_Overlay.pm:364 -msgid "Could not create ticket. Queue not set" -msgstr "Malkovich Malkovich. Malkovich" - -#: lib/RT/User_Overlay.pm:226 lib/RT/User_Overlay.pm:240 lib/RT/User_Overlay.pm:249 lib/RT/User_Overlay.pm:258 lib/RT/User_Overlay.pm:267 lib/RT/User_Overlay.pm:281 lib/RT/User_Overlay.pm:291 lib/RT/User_Overlay.pm:462 -msgid "Could not create user" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:662 lib/RT/Ticket_Overlay.pm:1515 -msgid "Could not find or create that user" -msgstr "Malkovich or Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:723 lib/RT/Ticket_Overlay.pm:1596 -msgid "Could not find that principal" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Groups/Members.html:87 html/User/Groups/Members.html:89 html/User/Groups/Modify.html:81 -msgid "Could not load group" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:682 -#. ($args{'Type'}) -msgid "Could not make that principal a %1 for this queue" -msgstr "Malkovich Malkovich Malkovich a %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1536 -#. ($self->loc($args{'Type'})) -msgid "Could not make that principal a %1 for this ticket" -msgstr "Malkovich Malkovich Malkovich a %1 Malkovich" - -#: lib/RT/Queue_Overlay.pm:781 -#. ($args{'Type'}) -msgid "Could not remove that principal as a %1 for this queue" -msgstr "Malkovich Malkovich Malkovich as a %1 Malkovich" - -#: lib/RT/Group_Overlay.pm:977 -msgid "Couldn't add member to group" -msgstr "Couldn't Malkovich to Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3481 lib/RT/Ticket_Overlay.pm:3537 -#. ($Msg) -msgid "Couldn't create a transaction: %1" -msgstr "Couldn't Malkovich a Malkovich: %1" - -#: lib/RT/Record.pm:748 -msgid "Couldn't find row" -msgstr "Couldn't Malkovich" - -#: lib/RT/Group_Overlay.pm:951 -msgid "Couldn't find that principal" -msgstr "Couldn't Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:245 -msgid "Couldn't find that value" -msgstr "Couldn't Malkovich" - -#: lib/RT/CurrentUser.pm:123 -#. ($self->Id) -msgid "Couldn't load %1 from the users database.\\n" -msgstr "Couldn't load %1 from the Malkovich.\\n" - -#: html/Admin/Groups/GroupRights.html:87 html/Admin/Groups/UserRights.html:74 -#. ($id) -msgid "Couldn't load group %1" -msgstr "Couldn't Malkovich %1" - -#: lib/RT/Link_Overlay.pm:169 lib/RT/Link_Overlay.pm:178 lib/RT/Link_Overlay.pm:205 -msgid "Couldn't load link" -msgstr "Couldn't Malkovich" - -#: html/Admin/Elements/EditCustomFields:145 html/Admin/Queues/CustomFields.html:35 html/Admin/Queues/People.html:120 -#. ($id) -msgid "Couldn't load queue" -msgstr "Couldn't Malkovich" - -#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:71 -#. ($id) -msgid "Couldn't load queue %1" -msgstr "Couldn't Malkovich %1" - -#: NOT FOUND IN SOURCE -msgid "Couldn't load that user (%1)" -msgstr "Couldn't Malkovich (%1)" - -#: html/SelfService/Display.html:116 -#. ($id) -msgid "Couldn't load ticket '%1'" -msgstr "Couldn't Malkovich '%1'" - -#: html/Admin/Users/Modify.html:146 html/User/Prefs.html:131 -msgid "Country" -msgstr "Malkovich" - -#: html/Admin/Elements/CreateUserCalled:25 html/Admin/Elements/EditCustomField:62 html/Admin/Elements/EditScrip:110 html/Admin/Groups/Modify.html:55 html/Admin/Queues/Template.html:44 html/Elements/QuickCreate:23 html/Ticket/Create.html:134 html/Ticket/Create.html:195 html/User/Groups/Modify.html:55 -msgid "Create" -msgstr "Malkovich" - -#: etc/initialdata:135 -msgid "Create Tickets" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:74 -msgid "Create a CustomField" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Queues/CustomField.html:47 -#. ($QueueObj->Name()) -msgid "Create a CustomField for queue %1" -msgstr "Malkovich a Malkovich Malkovich %1" - -#: html/Admin/Global/CustomField.html:47 -msgid "Create a CustomField which applies to all queues" -msgstr "Malkovich a Malkovich Malkovich to Malkovich" - -#: html/Admin/Groups/Modify.html:66 html/Admin/Groups/Modify.html:92 -msgid "Create a new group" -msgstr "Malkovich a Malkovich" - -#: html/User/Groups/Modify.html:66 html/User/Groups/Modify.html:91 -msgid "Create a new personal group" -msgstr "Malkovich a Malkovich Malkovich" - -#: html/Ticket/Create.html:24 html/Ticket/Create.html:27 html/Ticket/Create.html:35 -msgid "Create a new ticket" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Users/Modify.html:211 html/Admin/Users/Modify.html:268 -msgid "Create a new user" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Queues/Modify.html:103 -msgid "Create a queue" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Queues/Scrip.html:58 -#. ($QueueObj->Name) -msgid "Create a scrip for queue %1" -msgstr "Malkovich a Malkovich %1" - -#: html/Admin/Global/Template.html:68 html/Admin/Queues/Template.html:64 -msgid "Create a template" -msgstr "Malkovich a Malkovich" - -#: html/SelfService/Create.html:24 -msgid "Create a ticket" -msgstr "Malkovich a Malkovich" - -#: etc/initialdata:137 -msgid "Create new tickets based on this scrip's template" -msgstr "Malkovich Malkovich on Malkovich's Malkovich" - -#: html/SelfService/Create.html:77 -msgid "Create ticket" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:86 -msgid "Create tickets in this queue" -msgstr "Malkovich in Malkovich" - -#: lib/RT/Queue_Overlay.pm:73 -msgid "Create, delete and modify custom fields" -msgstr "Malkovich, Malkovich and Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:69 -msgid "Create, delete and modify queues" -msgstr "Malkovich, Malkovich and Malkovich" - -#: lib/RT/System.pm:58 -msgid "Create, delete and modify the members of personal groups" -msgstr "Malkovich, Malkovich and Malkovich the Malkovich of Malkovich" - -#: lib/RT/System.pm:59 -msgid "Create, delete and modify users" -msgstr "Malkovich, Malkovich and Malkovich" - -#: lib/RT/Queue_Overlay.pm:86 -msgid "CreateTicket" -msgstr "Malkovich" - -#: html/Elements/SelectDateType:25 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1279 -msgid "Created" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:87 -#. ($CustomFieldObj->Name()) -msgid "Created CustomField %1" -msgstr "Malkovich Malkovich %1" - -#: html/Elements/EditLinks:27 -msgid "Current Links" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/EditScrips:29 -msgid "Current Scrips" -msgstr "Malkovich" - -#: html/Admin/Groups/Members.html:38 html/User/Groups/Members.html:41 -msgid "Current members" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectRights:28 -msgid "Current rights" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Current search criteria" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/People.html:40 html/Ticket/Elements/EditPeople:44 -msgid "Current watchers" -msgstr "Malkovich Malkovich" - -#: html/Admin/Global/CustomField.html:54 -#. ($CustomField) -msgid "Custom Field #%1" -msgstr "Malkovich #%1" - -#: html/Admin/Elements/QueueTabs:52 html/Admin/Elements/SystemTabs:39 html/Admin/Global/index.html:49 html/Ticket/Elements/ShowSummary:35 -msgid "Custom Fields" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrip:101 -msgid "Custom action cleanup code" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Elements/EditScrip:93 -msgid "Custom action preparation code" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Elements/EditScrip:85 -msgid "Custom condition" -msgstr "Malkovich Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1693 -#. ($CF->Name , $args{OPERATOR} , $args{VALUE}) -msgid "Custom field %1 %2 %3" -msgstr "Malkovich %1 %2 %3" - -#: lib/RT/Tickets_Overlay.pm:1688 -#. ($CF->Name) -msgid "Custom field %1 has a value." -msgstr "Malkovich %1 has a Malkovich." - -#: lib/RT/Tickets_Overlay.pm:1685 -#. ($CF->Name) -msgid "Custom field %1 has no value." -msgstr "Malkovich %1 has no Malkovich." - -#: lib/RT/Ticket_Overlay.pm:3373 -#. ($args{'Field'}) -msgid "Custom field %1 not found" -msgstr "Malkovich %1 Malkovich" - -#: html/Admin/Elements/EditCustomFields:195 -msgid "Custom field deleted" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3523 -msgid "Custom field not found" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:355 -#. ($args{'Content'}, $self->Name) -msgid "Custom field value %1 could not be found for custom field %2" -msgstr "Malkovich Malkovich %1 Malkovich be Malkovich Malkovich %2" - -#: lib/RT/CustomField_Overlay.pm:255 -msgid "Custom field value could not be deleted" -msgstr "Malkovich Malkovich Malkovich be Malkovich" - -#: lib/RT/CustomField_Overlay.pm:361 -msgid "Custom field value could not be found" -msgstr "Malkovich Malkovich Malkovich be Malkovich" - -#: lib/RT/CustomField_Overlay.pm:253 lib/RT/CustomField_Overlay.pm:363 -msgid "Custom field value deleted" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:541 -msgid "CustomField" -msgstr "Malkovich" - -#: html/SelfService/Display.html:38 html/Ticket/Create.html:160 html/Ticket/Elements/ShowSummary:54 html/Ticket/Elements/Tabs:94 html/Ticket/ModifyAll.html:43 -msgid "Dates" -msgstr "Malkovich" - -#: lib/RT/Date.pm:422 -msgid "Dec." -msgstr "Dec." - -#: etc/initialdata:222 -msgid "Default Autoresponse template" -msgstr "Malkovich Malkovich Malkovich" - -#: etc/initialdata:296 -msgid "Default admin comment template" -msgstr "Malkovich Malkovich Malkovich" - -#: etc/initialdata:287 -msgid "Default correspondence template" -msgstr "Malkovich Malkovich Malkovich" - -#: etc/initialdata:253 -msgid "Default transaction template" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:519 -#. ($type, $self->Field, $self->OldValue, $self->NewValue) -msgid "Default: %1/%2 changed from %3 to %4" -msgstr "Malkovich: %1/%2 Malkovich %3 to %4" - -#: html/User/Delegation.html:24 html/User/Delegation.html:27 -msgid "Delegate rights" -msgstr "Malkovich" - -#: lib/RT/System.pm:62 -msgid "Delegate specific rights which have been granted to you." -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich to you." - -#: lib/RT/System.pm:62 -msgid "DelegateRights" -msgstr "Malkovich" - -#: html/User/Elements/Tabs:37 -msgid "Delegation" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrips:53 html/Search/Elements/EditFormat:66 html/Search/Elements/EditSearches:15 -msgid "Delete" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrips:52 -msgid "Delete selected scrips" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:91 -msgid "Delete tickets" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:91 -msgid "DeleteTicket" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:162 -msgid "Deleting this object could break referential integrity" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:329 -msgid "Deleting this object would break referential integrity" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:478 -msgid "Deleting this object would violate referential integrity" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich Malkovich" - -#: html/Approvals/Elements/Approve:44 -msgid "Deny" -msgstr "Deny" - -#: html/Elements/EditLinks:113 html/Elements/EditLinks:44 html/Elements/ShowLinks:36 html/Ticket/Create.html:181 html/Ticket/Elements/BulkLinks:34 html/Ticket/Elements/ShowDependencies:31 -msgid "Depended on by" -msgstr "Malkovich on by" - -#: lib/RT/Transaction_Overlay.pm:621 -#. ($value) -msgid "Dependency by %1 added" -msgstr "Malkovich by %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:661 -#. ($value) -msgid "Dependency by %1 deleted" -msgstr "Malkovich by %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:618 -#. ($value) -msgid "Dependency on %1 added" -msgstr "Malkovich on %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:658 -#. ($value) -msgid "Dependency on %1 deleted" -msgstr "Malkovich on %1 Malkovich" - -#: html/Elements/EditLinks:109 html/Elements/EditLinks:35 html/Elements/SelectLinkType:26 html/Elements/ShowLinks:26 html/Ticket/Create.html:180 html/Ticket/Elements/BulkLinks:30 html/Ticket/Elements/ShowDependencies:24 -msgid "Depends on" -msgstr "Malkovich on" - -#: html/Elements/SelectSortOrder:34 html/Search/Elements/DisplayOptions:57 -msgid "Descending" -msgstr "Malkovich" - -#: html/SelfService/Create.html:72 html/Ticket/Create.html:118 -msgid "Describe the issue below" -msgstr "Malkovich the Malkovich" - -#: html/Admin/Elements/AddCustomFieldValue:35 html/Admin/Elements/EditCustomField:38 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyTemplate:35 html/Admin/Groups/Modify.html:48 html/Admin/Queues/Modify.html:47 html/Elements/SelectGroups:26 html/Search/Elements/EditSearches:8 html/User/Groups/Modify.html:48 -msgid "Description" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:86 -msgid "Display" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:70 -msgid "Display Access Control List" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:76 -msgid "Display Scrip templates for this queue" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:79 -msgid "Display Scrips for this queue" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Ticket/Elements/ShowHistory:34 -msgid "Display mode" -msgstr "Malkovich" - -#: lib/RT/System.pm:53 -msgid "Do anything and everything" -msgstr "Do Malkovich and Malkovich" - -#: html/Elements/Refresh:29 -msgid "Don't refresh this page." -msgstr "Don't Malkovich Malkovich." - -#: NOT FOUND IN SOURCE -msgid "Don't show search results" -msgstr "Don't Malkovich Malkovich" - -#: html/Ticket/Elements/ShowTransactionAttachments:60 -msgid "Download" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Download all the tickets as a tab delimited file" -msgstr "Malkovich the Malkovich as a Malkovich Malkovich" - -#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:44 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1283 -msgid "Due" -msgstr "Due" - -#: NOT FOUND IN SOURCE -msgid "ERROR: Couldn't load ticket '%1': %2.\\n" -msgstr "MALKOVICH: Couldn't Malkovich '%1': %2.\\n" - -#: html/Admin/Queues/CustomFields.html:45 -#. ($Queue->Name) -msgid "Edit Custom Fields for %1" -msgstr "Malkovich Malkovich %1" - -#: html/Search/Bulk.html:141 html/Ticket/ModifyLinks.html:35 -msgid "Edit Links" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/Templates.html:41 -#. ($QueueObj->Name) -msgid "Edit Templates for queue %1" -msgstr "Malkovich Malkovich %1" - -#: html/Admin/Global/index.html:45 -msgid "Edit system templates" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/Modify.html:118 -#. ($QueueObj->Name) -msgid "Editing Configuration for queue %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: NOT FOUND IN SOURCE -msgid "Editing Configuration for user %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: html/Admin/Elements/EditCustomField:90 -#. ($CustomFieldObj->Name()) -msgid "Editing CustomField %1" -msgstr "Malkovich Malkovich %1" - -#: html/Admin/Groups/Members.html:31 -#. ($Group->Name) -msgid "Editing membership for group %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: html/User/Groups/Members.html:128 -#. ($Group->Name) -msgid "Editing membership for personal group %1" -msgstr "Malkovich Malkovich Malkovich Malkovich %1" - -#: lib/RT/Record.pm:1075 lib/RT/Record.pm:1152 -msgid "Either base or target must be specified" -msgstr "Malkovich or Malkovich be Malkovich" - -#: html/Admin/Users/Modify.html:52 html/Elements/SelectUsers:26 html/Ticket/Elements/AddWatchers:55 html/User/Prefs.html:43 -msgid "Email" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:206 -msgid "Email address in use" -msgstr "Malkovich in use" - -#: NOT FOUND IN SOURCE -msgid "EmailAddress" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "EmailEncoding" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:50 -msgid "Enabled (Unchecking this box disables this custom field)" -msgstr "Malkovich (Malkovich Malkovich Malkovich Malkovich Malkovich)" - -#: html/Admin/Groups/Modify.html:52 html/User/Groups/Modify.html:52 -msgid "Enabled (Unchecking this box disables this group)" -msgstr "Malkovich (Malkovich Malkovich Malkovich Malkovich)" - -#: html/Admin/Queues/Modify.html:83 -msgid "Enabled (Unchecking this box disables this queue)" -msgstr "Malkovich (Malkovich Malkovich Malkovich Malkovich)" - -#: html/Admin/Elements/EditCustomFields:97 -msgid "Enabled Custom Fields" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/index.html:55 -msgid "Enabled Queues" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:106 html/Admin/Groups/Modify.html:116 html/Admin/Queues/Modify.html:140 html/Admin/Users/Modify.html:308 html/User/Groups/Modify.html:116 -#. (loc_fuzzy($msg)) -msgid "Enabled status %1" -msgstr "Malkovich %1" - -#: lib/RT/CustomField_Overlay.pm:433 -msgid "Enter multiple values" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:430 -msgid "Enter one value" -msgstr "Malkovich" - -#: html/Search/Bulk.html:142 -msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces." -msgstr "Malkovich or URIs to Malkovich to. Malkovich Malkovich Malkovich Malkovich." - -#: html/Elements/Login:39 html/SelfService/Error.html:24 html/SelfService/Error.html:25 -msgid "Error" -msgstr "Error" - -#: lib/RT/Queue_Overlay.pm:593 -msgid "Error in parameters to Queue->AddWatcher" -msgstr "Malkovich in Malkovich to Malkovich->Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Error in parameters to Queue->DelWatcher" -msgstr "Malkovich in Malkovich to Malkovich->Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1468 -msgid "Error in parameters to Ticket->AddWatcher" -msgstr "Malkovich in Malkovich to Malkovich->Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Error in parameters to Ticket->DelWatcher" -msgstr "Malkovich in Malkovich to Malkovich->Malkovich" - -#: etc/initialdata:20 -msgid "Everyone" -msgstr "Malkovich" - -#: bin/rt-crontool:190 -msgid "Example:" -msgstr "Malkovich:" - -#: NOT FOUND IN SOURCE -msgid "ExternalAuthId" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "ExternalContactInfoId" -msgstr "Malkovich Malkovich" - -#: html/Admin/Users/Modify.html:72 -msgid "Extra info" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:342 -msgid "Failed to find 'Privileged' users pseudogroup." -msgstr "Malkovich to find 'Malkovich' Malkovich Malkovich." - -#: lib/RT/User_Overlay.pm:349 -msgid "Failed to find 'Unprivileged' users pseudogroup" -msgstr "Malkovich to find 'Malkovich' Malkovich Malkovich" - -#: bin/rt-crontool:134 -#. ($modname, $@) -msgid "Failed to load module %1. (%2)" -msgstr "Malkovich to Malkovich %1. (%2)" - -#: lib/RT/Date.pm:412 -msgid "Feb." -msgstr "Feb." - -#: html/Search/Elements/PickBasics:60 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:57 lib/RT/Tickets_Overlay.pm:1153 -msgid "Final Priority" -msgstr "Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1274 -msgid "FinalPriority" -msgstr "Malkovich" - -#: html/Admin/Queues/People.html:60 html/Ticket/Elements/EditPeople:33 -msgid "Find group whose" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/People.html:56 html/Admin/Users/index.html:45 html/Ticket/Elements/EditPeople:29 -msgid "Find people whose" -msgstr "Malkovich Malkovich" - -#: html/Search/Results.html:72 -msgid "Find tickets" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:59 -msgid "First" -msgstr "Malkovich" - -#: docs/design_docs/string-extraction-guide.txt:33 lib/RT/StyleGuide.pod:746 -msgid "Foo Bar Baz" -msgstr "Malkovich" - -#: docs/design_docs/string-extraction-guide.txt:24 lib/RT/StyleGuide.pod:737 -msgid "Foo!" -msgstr "Foo!" - -#: html/Search/Bulk.html:84 -msgid "Force change" -msgstr "Malkovich" - -#: html/Search/Results.html:70 -#. ($ticketcount) -msgid "Found %quant(%1,ticket)" -msgstr "Malkovich %quant(%1,Malkovich)" - -#: lib/RT/Record.pm:750 -msgid "Found Object" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "FreeformContactInfo" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:37 -msgid "FreeformMultiple" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:36 -msgid "FreeformSingle" -msgstr "Malkovich" - -#: lib/RT/Date.pm:392 -msgid "Fri." -msgstr "Fri." - -#: html/Ticket/Elements/ShowHistory:40 html/Ticket/Elements/ShowHistory:50 -msgid "Full headers" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:587 -#. ($New->Name) -msgid "Given to %1" -msgstr "Malkovich to %1" - -#: html/Admin/Elements/Tabs:40 html/Admin/index.html:37 -msgid "Global" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectTemplate:37 -#. (loc($Template->Name)) -msgid "Global template: %1" -msgstr "Malkovich: %1" - -#: html/Tools/Offline.html:69 -msgid "Go" -msgstr "Go" - -#: html/Admin/Elements/EditCustomFields:73 html/Admin/Groups/index.html:39 html/Admin/Queues/People.html:58 html/Admin/Queues/People.html:62 html/Admin/Queues/index.html:43 html/Admin/Users/index.html:48 html/Ticket/Elements/EditPeople:31 html/Ticket/Elements/EditPeople:35 html/index.html:69 -msgid "Go!" -msgstr "Go!" - -#: html/Elements/GotoTicket:24 html/SelfService/Elements/GotoTicket:24 -msgid "Goto ticket" -msgstr "Malkovich" - -#: html/Ticket/Elements/AddWatchers:45 html/Ticket/Elements/ShowGroupMembers:33 html/User/Elements/DelegateRights:77 -msgid "Group" -msgstr "Malkovich" - -#: html/Admin/Elements/GroupTabs:44 html/Admin/Elements/QueueTabs:56 html/Admin/Elements/SystemTabs:43 html/Admin/Global/index.html:54 -msgid "Group Rights" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:957 -msgid "Group already has member" -msgstr "Malkovich Malkovich" - -#: html/Admin/Groups/Modify.html:76 -#. ($create_msg) -msgid "Group could not be created: %1" -msgstr "Malkovich be Malkovich: %1" - -#: lib/RT/Group_Overlay.pm:497 -msgid "Group created" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:1129 -msgid "Group has no such member" -msgstr "Malkovich no Malkovich" - -#: lib/RT/Group_Overlay.pm:937 lib/RT/Queue_Overlay.pm:669 lib/RT/Queue_Overlay.pm:729 lib/RT/Ticket_Overlay.pm:1522 lib/RT/Ticket_Overlay.pm:1602 -msgid "Group not found" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectNewGroupMembers:34 html/Admin/Elements/Tabs:34 html/Admin/Groups/Members.html:63 html/Admin/Queues/People.html:82 html/Admin/index.html:31 html/User/Groups/Members.html:66 -msgid "Groups" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:963 -msgid "Groups can't be members of their members" -msgstr "Malkovich can't be Malkovich of Malkovich" - -#: lib/RT/Interface/CLI.pm:72 lib/RT/Interface/CLI.pm:72 -msgid "Hello!" -msgstr "Malkovich!" - -#: docs/design_docs/string-extraction-guide.txt:40 lib/RT/StyleGuide.pod:753 -#. ($name) -msgid "Hello, %1" -msgstr "Malkovich, %1" - -#: html/Ticket/Elements/ShowHistory:29 html/Ticket/Elements/Tabs:89 -msgid "History" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "HomePhone" -msgstr "Malkovich" - -#: html/Elements/Tabs:43 -msgid "Homepage" -msgstr "Malkovich" - -#: lib/RT/Base.pm:86 -#. (6) -msgid "I have %quant(%1,concrete mixer)." -msgstr "I have %quant(%1,Malkovich)." - -#: html/Search/Elements/PickBasics:104 html/Ticket/Elements/ShowBasics:26 lib/RT/Tickets_Overlay.pm:1080 -msgid "Id" -msgstr "Id" - -#: html/Admin/Users/Modify.html:43 html/User/Prefs.html:38 -msgid "Identity" -msgstr "Malkovich" - -#: etc/initialdata:429 -msgid "If an approval is rejected, reject the original and delete pending approvals" -msgstr "If a Malkovich is Malkovich, Malkovich the Malkovich and Malkovich Malkovich" - -#: bin/rt-crontool:186 -msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT." -msgstr "If Malkovich Malkovich, a Malkovich Malkovich Malkovich Malkovich to Malkovich Malkovich Malkovich to RT." - -#: html/Admin/Queues/People.html:104 html/Ticket/Modify.html:38 html/Ticket/ModifyAll.html:93 html/Ticket/ModifyPeople.html:37 -msgid "If you've updated anything above, be sure to" -msgstr "If you've Malkovich Malkovich, be sure to" - -#: lib/RT/Record.pm:742 -msgid "Illegal value for %1" -msgstr "Malkovich Malkovich %1" - -#: lib/RT/Record.pm:745 -msgid "Immutable field" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomFields:72 -msgid "Include disabled custom fields in listing." -msgstr "Malkovich Malkovich Malkovich in Malkovich." - -#: html/Admin/Queues/index.html:42 -msgid "Include disabled queues in listing." -msgstr "Malkovich Malkovich in Malkovich." - -#: html/Admin/Users/index.html:46 -msgid "Include disabled users in search." -msgstr "Malkovich Malkovich in Malkovich." - -#: html/Search/Elements/PickBasics:59 lib/RT/Tickets_Overlay.pm:1129 -msgid "Initial Priority" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1273 lib/RT/Ticket_Overlay.pm:1275 -msgid "InitialPriority" -msgstr "Malkovich" - -#: lib/RT/ScripAction_Overlay.pm:97 -msgid "Input error" -msgstr "Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3797 -msgid "Internal Error" -msgstr "Malkovich" - -#: lib/RT/Record.pm:186 -#. ($id->{error_message}) -msgid "Internal Error: %1" -msgstr "Malkovich: %1" - -#: lib/RT/Group_Overlay.pm:644 -msgid "Invalid Group Type" -msgstr "Malkovich Malkovich" - -#: lib/RT/Principal_Overlay.pm:127 -msgid "Invalid Right" -msgstr "Malkovich" - -#: lib/RT/Record.pm:747 -msgid "Invalid data" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Invalid owner. Defaulting to 'nobody'." -msgstr "Malkovich. Malkovich to 'Malkovich'." - -#: lib/RT/Scrip_Overlay.pm:133 lib/RT/Template_Overlay.pm:251 -msgid "Invalid queue" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:243 lib/RT/ACE_Overlay.pm:252 lib/RT/ACE_Overlay.pm:258 lib/RT/ACE_Overlay.pm:269 lib/RT/ACE_Overlay.pm:274 -msgid "Invalid right" -msgstr "Malkovich" - -#: lib/RT/Record.pm:161 -#. ($key) -msgid "Invalid value for %1" -msgstr "Malkovich Malkovich %1" - -#: lib/RT/Ticket_Overlay.pm:3380 -msgid "Invalid value for custom field" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:385 -msgid "Invalid value for status" -msgstr "Malkovich Malkovich" - -#: bin/rt-crontool:187 -msgid "It is incredibly important that nonprivileged users not be allowed to run this tool." -msgstr "It is Malkovich Malkovich Malkovich Malkovich Malkovich be Malkovich to Malkovich." - -#: bin/rt-crontool:188 -msgid "It is suggested that you create a non-privileged unix user with the correct group membership and RT access to run this tool." -msgstr "It is Malkovich Malkovich a non-Malkovich Malkovich the Malkovich Malkovich and RT Malkovich to Malkovich." - -#: bin/rt-crontool:159 -msgid "It takes several arguments:" -msgstr "It Malkovich Malkovich:" - -#: lib/RT/Date.pm:411 -msgid "Jan." -msgstr "Jan." - -#: lib/RT/Group_Overlay.pm:149 -msgid "Join or leave this group" -msgstr "Join or Malkovich Malkovich" - -#: lib/RT/Date.pm:417 -msgid "Jul." -msgstr "Jul." - -#: html/Ticket/Elements/Tabs:100 -msgid "Jumbo" -msgstr "Malkovich" - -#: lib/RT/Date.pm:416 -msgid "Jun." -msgstr "Jun." - -#: NOT FOUND IN SOURCE -msgid "Lang" -msgstr "Lang" - -#: html/User/Prefs.html:54 -msgid "Language" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:74 -msgid "Last" -msgstr "Last" - -#: html/Ticket/Elements/EditDates:37 html/Ticket/Elements/ShowDates:39 -msgid "Last Contact" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Last Contact</a>" -msgstr "Malkovich</a>" - -#: html/Elements/SelectDateType:28 -msgid "Last Contacted" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Last Notified" -msgstr "Malkovich" - -#: html/Elements/SelectDateType:29 -msgid "Last Updated" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:82 -msgid "Let this user access RT" -msgstr "Malkovich Malkovich RT" - -#: html/Admin/Users/Modify.html:86 -msgid "Let this user be granted rights" -msgstr "Malkovich be Malkovich" - -#: lib/RT/Record.pm:1086 -msgid "Link already exists" -msgstr "Malkovich Malkovich" - -#: lib/RT/Record.pm:1100 -msgid "Link could not be created" -msgstr "Malkovich be Malkovich" - -#: lib/RT/Record.pm:1106 -#. ($TransString) -msgid "Link created (%1)" -msgstr "Malkovich (%1)" - -#: lib/RT/Record.pm:1167 -#. ($TransString) -msgid "Link deleted (%1)" -msgstr "Malkovich (%1)" - -#: lib/RT/Record.pm:1173 -msgid "Link not found" -msgstr "Malkovich" - -#: html/Ticket/ModifyLinks.html:24 html/Ticket/ModifyLinks.html:28 -#. ($Ticket->Id) -msgid "Link ticket #%1" -msgstr "Malkovich #%1" - -#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:61 html/Ticket/Elements/Tabs:98 html/Ticket/ModifyAll.html:56 -msgid "Links" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:111 html/User/Prefs.html:104 -msgid "Location" -msgstr "Malkovich" - -#: lib/RT.pm:184 -#. ($RT::LogDir) -msgid "Log directory %1 not found or couldn't be written.\\n RT can't run." -msgstr "Malkovich %1 Malkovich or couldn't be Malkovich.\\n RT can't run." - -#: html/Elements/Header:69 -#. ("<b>".$session{'CurrentUser'}->Name."</b>") -msgid "Logged in as %1" -msgstr "Malkovich in as %1" - -#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:35 html/Elements/Login:44 html/Elements/Login:54 lib/RT/StyleGuide.pod:777 -msgid "Login" -msgstr "Malkovich" - -#: html/Elements/Header:66 -msgid "Logout" -msgstr "Malkovich" - -#: html/Search/Bulk.html:83 -msgid "Make Owner" -msgstr "Malkovich" - -#: html/Search/Bulk.html:107 -msgid "Make Status" -msgstr "Malkovich" - -#: html/Search/Bulk.html:115 -msgid "Make date Due" -msgstr "Malkovich" - -#: html/Search/Bulk.html:117 -msgid "Make date Resolved" -msgstr "Malkovich Malkovich" - -#: html/Search/Bulk.html:111 -msgid "Make date Started" -msgstr "Malkovich Malkovich" - -#: html/Search/Bulk.html:109 -msgid "Make date Starts" -msgstr "Malkovich Malkovich" - -#: html/Search/Bulk.html:113 -msgid "Make date Told" -msgstr "Malkovich" - -#: html/Search/Bulk.html:103 -msgid "Make priority" -msgstr "Malkovich" - -#: html/Search/Bulk.html:105 -msgid "Make queue" -msgstr "Malkovich" - -#: html/Search/Bulk.html:101 -msgid "Make subject" -msgstr "Malkovich" - -#: html/Admin/index.html:32 -msgid "Manage groups and group membership" -msgstr "Malkovich and Malkovich Malkovich" - -#: html/Admin/index.html:38 -msgid "Manage properties and configuration which apply to all queues" -msgstr "Malkovich Malkovich and Malkovich Malkovich to Malkovich" - -#: html/Admin/index.html:35 -msgid "Manage queues and queue-specific properties" -msgstr "Malkovich and Malkovich-Malkovich Malkovich" - -#: html/Admin/index.html:29 -msgid "Manage users and passwords" -msgstr "Malkovich and Malkovich" - -#: lib/RT/Date.pm:413 -msgid "Mar." -msgstr "Mar." - -#: lib/RT/Date.pm:415 -msgid "May." -msgstr "May." - -#: lib/RT/Transaction_Overlay.pm:634 -#. ($value) -msgid "Member %1 added" -msgstr "Malkovich %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:674 -#. ($value) -msgid "Member %1 deleted" -msgstr "Malkovich %1 Malkovich" - -#: lib/RT/Group_Overlay.pm:974 -msgid "Member added" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:1136 -msgid "Member deleted" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:1140 -msgid "Member not deleted" -msgstr "Malkovich Malkovich" - -#: html/Elements/SelectLinkType:25 -msgid "Member of" -msgstr "Malkovich of" - -#: html/Admin/Elements/GroupTabs:41 html/User/Elements/GroupTabs:41 -msgid "Members" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:631 -#. ($value) -msgid "Membership in %1 added" -msgstr "Malkovich in %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:671 -#. ($value) -msgid "Membership in %1 deleted" -msgstr "Malkovich in %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2813 -msgid "Merge Successful" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2733 -msgid "Merge failed. Couldn't set EffectiveId" -msgstr "Malkovich. Couldn't Malkovich" - -#: html/Elements/EditLinks:104 html/Ticket/Elements/BulkLinks:26 -msgid "Merge into" -msgstr "Malkovich" - -#: html/Search/Bulk.html:135 html/Ticket/Update.html:83 -msgid "Message" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Message body not shown because it is too large or is not plain text." -msgstr "Malkovich Malkovich Malkovich it is Malkovich or is Malkovich." - -#: lib/RT/Ticket_Overlay.pm:2514 -msgid "Message could not be recorded" -msgstr "Malkovich Malkovich be Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Message recipients" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2517 -msgid "Message recorded" -msgstr "Malkovich Malkovich" - -#: lib/RT/Record.pm:749 -msgid "Missing a primary key?: %1" -msgstr "Malkovich a Malkovich?: %1" - -#: html/Admin/Users/Modify.html:166 html/User/Prefs.html:71 -msgid "Mobile" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "MobilePhone" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:71 -msgid "Modify Access Control List" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Global/CustomFields.html:43 html/Admin/Global/index.html:50 -msgid "Modify Custom Fields which apply to all queues" -msgstr "Malkovich Malkovich Malkovich to Malkovich" - -#: lib/RT/Queue_Overlay.pm:74 -msgid "Modify Scrip templates for this queue" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:77 -msgid "Modify Scrips for this queue" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Queues/CustomField.html:44 -#. ($QueueObj->Name()) -msgid "Modify a CustomField for queue %1" -msgstr "Malkovich a Malkovich Malkovich %1" - -#: html/Admin/Global/CustomField.html:52 -msgid "Modify a CustomField which applies to all queues" -msgstr "Malkovich a Malkovich Malkovich to Malkovich" - -#: html/Admin/Queues/Scrip.html:53 -#. ($QueueObj->Name) -msgid "Modify a scrip for queue %1" -msgstr "Malkovich a Malkovich %1" - -#: html/Admin/Global/Scrip.html:47 -msgid "Modify a scrip which applies to all queues" -msgstr "Malkovich a Malkovich Malkovich to Malkovich" - -#: html/Ticket/ModifyDates.html:24 html/Ticket/ModifyDates.html:28 -#. ($TicketObj->Id) -msgid "Modify dates for #%1" -msgstr "Malkovich Malkovich #%1" - -#: html/Ticket/ModifyDates.html:34 -#. ($TicketObj->Id) -msgid "Modify dates for ticket # %1" -msgstr "Malkovich Malkovich # %1" - -#: html/Admin/Global/GroupRights.html:24 html/Admin/Global/GroupRights.html:27 html/Admin/Global/index.html:55 -msgid "Modify global group rights" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Global/GroupRights.html:32 -msgid "Modify global group rights." -msgstr "Malkovich Malkovich Malkovich." - -#: html/Admin/Global/UserRights.html:24 html/Admin/Global/UserRights.html:27 html/Admin/Global/index.html:59 -msgid "Modify global user rights" -msgstr "Malkovich Malkovich" - -#: html/Admin/Global/UserRights.html:32 -msgid "Modify global user rights." -msgstr "Malkovich Malkovich." - -#: lib/RT/Group_Overlay.pm:146 -msgid "Modify group metadata or delete group" -msgstr "Malkovich Malkovich or Malkovich" - -#: html/Admin/Groups/GroupRights.html:24 html/Admin/Groups/GroupRights.html:28 html/Admin/Groups/GroupRights.html:34 -#. ($GroupObj->Name) -msgid "Modify group rights for group %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: html/Admin/Queues/GroupRights.html:24 html/Admin/Queues/GroupRights.html:28 -#. ($QueueObj->Name) -msgid "Modify group rights for queue %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: lib/RT/Group_Overlay.pm:148 -msgid "Modify membership roster for this group" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/System.pm:60 -msgid "Modify one's own RT account" -msgstr "Malkovich's own RT Malkovich" - -#: html/Admin/Queues/People.html:24 html/Admin/Queues/People.html:28 -#. ($QueueObj->Name) -msgid "Modify people related to queue %1" -msgstr "Malkovich Malkovich to Malkovich %1" - -#: html/Ticket/ModifyPeople.html:24 html/Ticket/ModifyPeople.html:28 html/Ticket/ModifyPeople.html:34 -#. ($Ticket->id) -#. ($Ticket->Id) -msgid "Modify people related to ticket #%1" -msgstr "Malkovich Malkovich to Malkovich #%1" - -#: html/Admin/Queues/Scrips.html:45 -#. ($QueueObj->Name) -msgid "Modify scrips for queue %1" -msgstr "Malkovich Malkovich %1" - -#: html/Admin/Global/Scrips.html:43 html/Admin/Global/index.html:41 -msgid "Modify scrips which apply to all queues" -msgstr "Malkovich Malkovich to Malkovich" - -#: html/Admin/Global/Template.html:24 html/Admin/Global/Template.html:29 html/Admin/Global/Template.html:80 html/Admin/Queues/Template.html:77 -#. (loc($TemplateObj->Name())) -#. ($TemplateObj->id) -msgid "Modify template %1" -msgstr "Malkovich %1" - -#: html/Admin/Global/Templates.html:43 -msgid "Modify templates which apply to all queues" -msgstr "Malkovich Malkovich Malkovich to Malkovich" - -#: html/Admin/Groups/Modify.html:86 html/User/Groups/Modify.html:85 -#. ($Group->Name) -msgid "Modify the group %1" -msgstr "Malkovich the Malkovich %1" - -#: lib/RT/Queue_Overlay.pm:72 -msgid "Modify the queue watchers" -msgstr "Malkovich the Malkovich" - -#: html/Admin/Users/Modify.html:263 -#. ($UserObj->Name) -msgid "Modify the user %1" -msgstr "Malkovich the user %1" - -#: html/Ticket/ModifyAll.html:36 -#. ($Ticket->Id) -msgid "Modify ticket # %1" -msgstr "Malkovich # %1" - -#: html/Ticket/Modify.html:24 html/Ticket/Modify.html:27 html/Ticket/Modify.html:33 -#. ($TicketObj->Id) -msgid "Modify ticket #%1" -msgstr "Malkovich #%1" - -#: lib/RT/Queue_Overlay.pm:90 -msgid "Modify tickets" -msgstr "Malkovich" - -#: html/Admin/Groups/UserRights.html:24 html/Admin/Groups/UserRights.html:28 html/Admin/Groups/UserRights.html:34 -#. ($GroupObj->Name) -msgid "Modify user rights for group %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: html/Admin/Queues/UserRights.html:24 html/Admin/Queues/UserRights.html:28 -#. ($QueueObj->Name) -msgid "Modify user rights for queue %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: lib/RT/Queue_Overlay.pm:71 -msgid "ModifyACL" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:149 -msgid "ModifyOwnMembership" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:72 -msgid "ModifyQueueWatchers" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:77 -msgid "ModifyScrips" -msgstr "Malkovich" - -#: lib/RT/System.pm:60 -msgid "ModifySelf" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:74 -msgid "ModifyTemplate" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:90 -msgid "ModifyTicket" -msgstr "Malkovich" - -#: lib/RT/Date.pm:388 -msgid "Mon." -msgstr "Mon." - -#: html/Ticket/Elements/ShowRequestor:40 -#. ($name) -msgid "More about %1" -msgstr "Malkovich %1" - -#: html/Admin/Elements/EditCustomFields:60 -msgid "Move down" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectSingleOrMultiple:26 -msgid "Multiple" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:197 -msgid "Must specify 'Name' attribute" -msgstr "Malkovich 'Name' Malkovich" - -#: html/SelfService/Elements/MyRequests:48 -#. ($friendly_status) -msgid "My %1 tickets" -msgstr "My %1 Malkovich" - -#: html/Approvals/index.html:24 html/Approvals/index.html:25 -msgid "My approvals" -msgstr "My Malkovich" - -#: html/Admin/Elements/AddCustomFieldValue:31 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/ModifyTemplate:27 html/Admin/Groups/Modify.html:43 html/Elements/SelectGroups:25 html/Elements/SelectUsers:27 html/User/Groups/Modify.html:43 -msgid "Name" -msgstr "Name" - -#: lib/RT/User_Overlay.pm:204 -msgid "Name in use" -msgstr "Name in use" - -#: html/Ticket/Elements/ShowDates:52 -msgid "Never" -msgstr "Malkovich" - -#: html/Elements/Quicksearch:29 -msgid "New" -msgstr "New" - -#: html/Elements/EditLinks:93 -msgid "New Links" -msgstr "Malkovich Malkovich" - -#: html/Admin/Users/Modify.html:92 html/User/Prefs.html:87 -msgid "New Password" -msgstr "Malkovich" - -#: etc/initialdata:332 -msgid "New Pending Approval" -msgstr "Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "New Search" -msgstr "Malkovich" - -#: html/Admin/Global/CustomField.html:40 html/Admin/Global/CustomFields.html:38 html/Admin/Queues/CustomField.html:51 html/Admin/Queues/CustomFields.html:40 -msgid "New custom field" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/GroupTabs:53 html/User/Elements/GroupTabs:51 -msgid "New group" -msgstr "Malkovich" - -#: html/SelfService/Prefs.html:31 -msgid "New password" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:773 -msgid "New password notification sent" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Elements/QueueTabs:69 -msgid "New queue" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectRights:41 -msgid "New rights" -msgstr "Malkovich" - -#: html/Admin/Global/Scrip.html:39 html/Admin/Global/Scrips.html:38 html/Admin/Queues/Scrip.html:42 html/Admin/Queues/Scrips.html:54 -msgid "New scrip" -msgstr "Malkovich" - -#: html/Admin/Global/Template.html:59 html/Admin/Global/Templates.html:38 html/Admin/Queues/Template.html:57 html/Admin/Queues/Templates.html:49 -msgid "New template" -msgstr "Malkovich" - -#: html/SelfService/Elements/Tabs:47 -msgid "New ticket" -msgstr "Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2700 -msgid "New ticket doesn't exist" -msgstr "Malkovich doesn't Malkovich" - -#: html/Admin/Elements/UserTabs:50 -msgid "New user" -msgstr "Malkovich" - -#: html/Admin/Elements/CreateUserCalled:25 -msgid "New user called" -msgstr "Malkovich" - -#: html/Admin/Queues/People.html:54 html/Ticket/Elements/EditPeople:28 -msgid "New watchers" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "New window setting" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Elements/Tabs:70 -msgid "Next" -msgstr "Next" - -#: NOT FOUND IN SOURCE -msgid "NickName" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:62 html/User/Prefs.html:50 -msgid "Nickname" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:89 html/Admin/Elements/EditCustomFields:103 -msgid "No CustomField" -msgstr "No Malkovich" - -#: html/Admin/Groups/GroupRights.html:83 html/Admin/Groups/UserRights.html:70 -msgid "No Group defined" -msgstr "No Malkovich" - -#: lib/RT/Tickets_Overlay_SQL.pm:452 -msgid "No Query" -msgstr "No Malkovich" - -#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:67 -msgid "No Queue defined" -msgstr "No Malkovich" - -#: bin/rt-crontool:52 -msgid "No RT user found. Please consult your RT administrator.\\n" -msgstr "No RT Malkovich. Malkovich Malkovich RT Malkovich.\\n" - -#: html/Admin/Global/Template.html:78 html/Admin/Queues/Template.html:75 -msgid "No Template" -msgstr "No Malkovich" - -#: NOT FOUND IN SOURCE -msgid "No Ticket specified. Aborting ticket " -msgstr "No Malkovich Malkovich. Malkovich " - -#: html/Approvals/Elements/Approve:45 -msgid "No action" -msgstr "No Malkovich" - -#: lib/RT/Record.pm:744 -msgid "No column specified" -msgstr "No Malkovich Malkovich" - -#: html/Ticket/Elements/ShowRequestor:46 -msgid "No comment entered about this user" -msgstr "No Malkovich Malkovich Malkovich" - -#: lib/RT/Action/Generic.pm:159 lib/RT/Condition/Generic.pm:175 lib/RT/Search/ActiveTicketsInQueue.pm:55 lib/RT/Search/Generic.pm:112 -#. (ref $self) -msgid "No description for %1" -msgstr "No Malkovich %1" - -#: lib/RT/Users_Overlay.pm:159 -msgid "No group specified" -msgstr "No Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2475 -msgid "No message attached" -msgstr "No Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:991 -msgid "No password set" -msgstr "No Malkovich" - -#: lib/RT/Queue_Overlay.pm:296 -msgid "No permission to create queues" -msgstr "No Malkovich to Malkovich" - -#: NOT FOUND IN SOURCE -msgid "No permission to create tickets in the queue '%1'" -msgstr "No Malkovich to Malkovich in the Malkovich '%1'" - -#: lib/RT/User_Overlay.pm:157 -msgid "No permission to create users" -msgstr "No Malkovich to Malkovich" - -#: html/SelfService/Display.html:125 -msgid "No permission to display that ticket" -msgstr "No Malkovich to Malkovich Malkovich" - -#: html/SelfService/Update.html:68 -msgid "No permission to view update ticket" -msgstr "No Malkovich to Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:716 lib/RT/Ticket_Overlay.pm:1581 -msgid "No principal specified" -msgstr "No Malkovich Malkovich" - -#: html/Admin/Queues/People.html:153 html/Admin/Queues/People.html:163 -msgid "No principals selected." -msgstr "No Malkovich Malkovich." - -#: html/Admin/Queues/index.html:34 -msgid "No queues matching search criteria found." -msgstr "No Malkovich Malkovich Malkovich Malkovich." - -#: html/Admin/Elements/SelectRights:81 -msgid "No rights found" -msgstr "No Malkovich" - -#: html/Admin/Elements/SelectRights:32 -msgid "No rights granted." -msgstr "No Malkovich." - -#: html/Search/Bulk.html:162 -msgid "No search to operate on." -msgstr "No Malkovich to Malkovich on." - -#: lib/RT/Transaction_Overlay.pm:455 lib/RT/Transaction_Overlay.pm:493 -msgid "No transaction type specified" -msgstr "No Malkovich Malkovich Malkovich" - -#: html/Admin/Users/index.html:35 -msgid "No users matching search criteria found." -msgstr "No Malkovich Malkovich Malkovich Malkovich." - -#: NOT FOUND IN SOURCE -msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n" -msgstr "No Malkovich RT Malkovich. RT Malkovich Malkovich. Malkovich Malkovich RT Malkovich.\\n" - -#: lib/RT/Record.pm:741 -msgid "No value sent to _Set!\\n" -msgstr "No Malkovich to _Set!\\n" - -#: lib/RT/Record.pm:746 -msgid "Nonexistant field?" -msgstr "Malkovich Malkovich?" - -#: html/Elements/Header:71 -msgid "Not logged in." -msgstr "Malkovich in." - -#: lib/RT/Date.pm:369 -msgid "Not set" -msgstr "Malkovich" - -#: html/NoAuth/Reminder.html:26 -msgid "Not yet implemented." -msgstr "Malkovich Malkovich." - -#: html/Approvals/Elements/Approve:48 -msgid "Notes" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:776 -msgid "Notification could not be sent" -msgstr "Malkovich Malkovich be sent" - -#: etc/initialdata:101 -msgid "Notify AdminCcs" -msgstr "Malkovich" - -#: etc/initialdata:97 -msgid "Notify AdminCcs as Comment" -msgstr "Malkovich as Malkovich" - -#: etc/initialdata:128 -msgid "Notify Other Recipients" -msgstr "Malkovich Malkovich" - -#: etc/initialdata:124 -msgid "Notify Other Recipients as Comment" -msgstr "Malkovich Malkovich as Malkovich" - -#: etc/initialdata:85 -msgid "Notify Owner" -msgstr "Malkovich" - -#: etc/initialdata:81 -msgid "Notify Owner as Comment" -msgstr "Malkovich as Malkovich" - -#: etc/initialdata:376 -msgid "Notify Owner of their rejected ticket" -msgstr "Malkovich of Malkovich Malkovich" - -#: etc/initialdata:365 -msgid "Notify Owner of their ticket has been approved by all approvers" -msgstr "Malkovich of Malkovich Malkovich Malkovich by Malkovich" - -#: etc/initialdata:353 -msgid "Notify Owner of their ticket has been approved by some approver" -msgstr "Malkovich of Malkovich Malkovich Malkovich by Malkovich" - -#: etc/initialdata:334 -msgid "Notify Owners and AdminCcs of new items pending their approval" -msgstr "Malkovich and Malkovich of Malkovich Malkovich Malkovich" - -#: etc/initialdata:77 -msgid "Notify Requestors" -msgstr "Malkovich Malkovich" - -#: etc/initialdata:111 -msgid "Notify Requestors and Ccs" -msgstr "Malkovich Malkovich and Ccs" - -#: etc/initialdata:106 -msgid "Notify Requestors and Ccs as Comment" -msgstr "Malkovich Malkovich and Ccs as Malkovich" - -#: etc/initialdata:120 -msgid "Notify Requestors, Ccs and AdminCcs" -msgstr "Malkovich Malkovich, Ccs and Malkovich" - -#: etc/initialdata:116 -msgid "Notify Requestors, Ccs and AdminCcs as Comment" -msgstr "Malkovich Malkovich, Ccs and Malkovich as Malkovich" - -#: lib/RT/Date.pm:421 -msgid "Nov." -msgstr "Nov." - -#: lib/RT/Record.pm:200 -msgid "Object could not be created" -msgstr "Malkovich Malkovich be Malkovich" - -#: lib/RT/Record.pm:219 -msgid "Object created" -msgstr "Malkovich" - -#: lib/RT/Date.pm:420 -msgid "Oct." -msgstr "Oct." - -#: html/Elements/SelectDateRelation:34 -msgid "On" -msgstr "On" - -#: etc/initialdata:163 -msgid "On Comment" -msgstr "On Malkovich" - -#: etc/initialdata:156 -msgid "On Correspond" -msgstr "On Malkovich" - -#: etc/initialdata:145 -msgid "On Create" -msgstr "On Malkovich" - -#: etc/initialdata:184 -msgid "On Owner Change" -msgstr "On Malkovich" - -#: etc/initialdata:192 -msgid "On Queue Change" -msgstr "On Malkovich" - -#: etc/initialdata:198 -msgid "On Resolve" -msgstr "On Malkovich" - -#: etc/initialdata:169 -msgid "On Status Change" -msgstr "On Malkovich" - -#: etc/initialdata:150 -msgid "On Transaction" -msgstr "On Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:49 -#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>") -msgid "Only show approvals for requests created after %1" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich %1" - -#: html/Approvals/Elements/PendingMyApproval:47 -#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>") -msgid "Only show approvals for requests created before %1" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich %1" - -#: html/Elements/Quicksearch:30 -msgid "Open" -msgstr "Open" - -#: html/Ticket/Elements/Tabs:137 -msgid "Open it" -msgstr "Open it" - -#: html/SelfService/Elements/Tabs:41 -msgid "Open tickets" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Open tickets (from listing) in a new window" -msgstr "Malkovich (Malkovich) in a Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Open tickets (from listing) in another window" -msgstr "Malkovich (Malkovich) in Malkovich" - -#: etc/initialdata:140 -msgid "Open tickets on correspondence" -msgstr "Malkovich on Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Ordering and sorting" -msgstr "Malkovich and Malkovich" - -#: html/Admin/Users/Modify.html:114 html/Elements/SelectUsers:28 html/User/Prefs.html:107 -msgid "Organization" -msgstr "Malkovich" - -#: html/Approvals/Elements/Approve:32 -#. ($approving->Id, $approving->Subject) -msgid "Originating ticket: #%1" -msgstr "Malkovich Malkovich: #%1" - -#: html/Admin/Queues/Modify.html:68 -msgid "Over time, priority moves toward" -msgstr "Malkovich, Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:89 -msgid "Own tickets" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:89 -msgid "OwnTicket" -msgstr "Malkovich" - -#: etc/initialdata:38 html/Elements/QuickCreate:13 html/Search/Elements/PickBasics:114 html/SelfService/Elements/MyRequests:29 html/Ticket/Create.html:47 html/Ticket/Elements/EditPeople:42 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/ShowPeople:26 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:85 lib/RT/Tickets_Overlay.pm:1306 -msgid "Owner" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:575 -#. ($Old->Name , $New->Name) -msgid "Owner forcibly changed from %1 to %2" -msgstr "Malkovich Malkovich Malkovich %1 to %2" - -#: NOT FOUND IN SOURCE -msgid "Owner is" -msgstr "Malkovich is" - -#: html/Admin/Users/Modify.html:171 html/User/Prefs.html:75 -msgid "Pager" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "PagerPhone" -msgstr "Malkovich" - -#: html/Elements/EditLinks:117 html/Elements/EditLinks:54 html/Elements/ShowLinks:46 html/Ticket/Create.html:182 html/Ticket/Elements/BulkLinks:38 -msgid "Parents" -msgstr "Malkovich" - -#: html/Elements/Login:52 html/User/Prefs.html:83 -msgid "Password" -msgstr "Malkovich" - -#: html/NoAuth/Reminder.html:24 -msgid "Password Reminder" -msgstr "Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:185 lib/RT/User_Overlay.pm:994 -msgid "Password too short" -msgstr "Malkovich Malkovich" - -#: html/Admin/Users/Modify.html:316 html/User/Prefs.html:209 -#. (loc_fuzzy($msg)) -msgid "Password: %1" -msgstr "Malkovich: %1" - -#: html/Admin/Users/Modify.html:318 -msgid "Passwords do not match." -msgstr "Malkovich do Malkovich." - -#: html/User/Prefs.html:211 -msgid "Passwords do not match. Your password has not been changed" -msgstr "Malkovich do Malkovich. Malkovich Malkovich Malkovich" - -#: html/Ticket/Elements/ShowSummary:44 html/Ticket/Elements/Tabs:97 html/Ticket/ModifyAll.html:50 -msgid "People" -msgstr "Malkovich" - -#: etc/initialdata:133 -msgid "Perform a user-defined action" -msgstr "Malkovich a user-Malkovich" - -#: lib/RT/ACE_Overlay.pm:230 lib/RT/ACE_Overlay.pm:236 lib/RT/ACE_Overlay.pm:562 lib/RT/ACE_Overlay.pm:572 lib/RT/ACE_Overlay.pm:582 lib/RT/ACE_Overlay.pm:647 lib/RT/Attribute_Overlay.pm:135 lib/RT/Attribute_Overlay.pm:141 lib/RT/Attribute_Overlay.pm:379 lib/RT/Attribute_Overlay.pm:388 lib/RT/Attribute_Overlay.pm:401 lib/RT/CurrentUser.pm:103 lib/RT/CurrentUser.pm:94 lib/RT/CustomField_Overlay.pm:100 lib/RT/CustomField_Overlay.pm:207 lib/RT/CustomField_Overlay.pm:239 lib/RT/CustomField_Overlay.pm:517 lib/RT/CustomField_Overlay.pm:90 lib/RT/Group_Overlay.pm:1091 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1104 lib/RT/Group_Overlay.pm:1155 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1165 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:896 lib/RT/Group_Overlay.pm:900 lib/RT/Group_Overlay.pm:913 lib/RT/Queue_Overlay.pm:117 lib/RT/Queue_Overlay.pm:135 lib/RT/Queue_Overlay.pm:578 lib/RT/Queue_Overlay.pm:588 lib/RT/Queue_Overlay.pm:602 lib/RT/Queue_Overlay.pm:740 lib/RT/Queue_Overlay.pm:749 lib/RT/Queue_Overlay.pm:762 lib/RT/Queue_Overlay.pm:975 lib/RT/Scrip_Overlay.pm:125 lib/RT/Scrip_Overlay.pm:136 lib/RT/Scrip_Overlay.pm:201 lib/RT/Scrip_Overlay.pm:473 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:87 lib/RT/Template_Overlay.pm:93 lib/RT/Ticket_Overlay.pm:1453 lib/RT/Ticket_Overlay.pm:1463 lib/RT/Ticket_Overlay.pm:1477 lib/RT/Ticket_Overlay.pm:1614 lib/RT/Ticket_Overlay.pm:1624 lib/RT/Ticket_Overlay.pm:1638 lib/RT/Ticket_Overlay.pm:1755 lib/RT/Ticket_Overlay.pm:2075 lib/RT/Ticket_Overlay.pm:2213 lib/RT/Ticket_Overlay.pm:2381 lib/RT/Ticket_Overlay.pm:2428 lib/RT/Ticket_Overlay.pm:2582 lib/RT/Ticket_Overlay.pm:2640 lib/RT/Ticket_Overlay.pm:2691 lib/RT/Ticket_Overlay.pm:2706 lib/RT/Ticket_Overlay.pm:2905 lib/RT/Ticket_Overlay.pm:2915 lib/RT/Ticket_Overlay.pm:2920 lib/RT/Ticket_Overlay.pm:3143 lib/RT/Ticket_Overlay.pm:3147 lib/RT/Ticket_Overlay.pm:3350 lib/RT/Ticket_Overlay.pm:3512 lib/RT/Ticket_Overlay.pm:3564 lib/RT/Ticket_Overlay.pm:3791 lib/RT/Transaction_Overlay.pm:443 lib/RT/Transaction_Overlay.pm:450 lib/RT/Transaction_Overlay.pm:479 lib/RT/Transaction_Overlay.pm:486 lib/RT/User_Overlay.pm:1088 lib/RT/User_Overlay.pm:1536 lib/RT/User_Overlay.pm:335 lib/RT/User_Overlay.pm:696 lib/RT/User_Overlay.pm:731 lib/RT/User_Overlay.pm:987 -msgid "Permission Denied" -msgstr "Malkovich Malkovich" - -#: html/User/Elements/Tabs:34 -msgid "Personal Groups" -msgstr "Malkovich" - -#: html/User/Groups/index.html:29 html/User/Groups/index.html:39 -msgid "Personal groups" -msgstr "Malkovich" - -#: html/User/Elements/DelegateRights:36 -msgid "Personal groups:" -msgstr "Malkovich:" - -#: html/Admin/Users/Modify.html:153 html/User/Prefs.html:60 -msgid "Phone numbers" -msgstr "Malkovich" - -#: html/Elements/Header:63 html/Elements/Tabs:55 html/SelfService/Elements/Tabs:50 html/SelfService/Prefs.html:24 html/User/Prefs.html:24 html/User/Prefs.html:27 -msgid "Preferences" -msgstr "Malkovich" - -#: lib/RT/Action/Generic.pm:169 -msgid "Prepare Stubbed" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:62 -msgid "Prev" -msgstr "Prev" - -#: lib/RT/ACE_Overlay.pm:132 lib/RT/ACE_Overlay.pm:207 lib/RT/ACE_Overlay.pm:551 -#. ($args{'PrincipalId'}) -msgid "Principal %1 not found." -msgstr "Malkovich %1 Malkovich." - -#: html/Search/Elements/PickBasics:58 html/Ticket/Create.html:153 html/Ticket/Elements/EditBasics:52 html/Ticket/Elements/ShowBasics:50 lib/RT/Tickets_Overlay.pm:1104 -msgid "Priority" -msgstr "Malkovich" - -#: html/Admin/Queues/Modify.html:64 -msgid "Priority starts at" -msgstr "Malkovich at" - -#: etc/initialdata:25 -msgid "Privileged" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:296 html/User/Prefs.html:200 -#. (loc_fuzzy($msg)) -msgid "Privileged status: %1" -msgstr "Malkovich Malkovich: %1" - -#: html/Admin/Users/index.html:61 -msgid "Privileged users" -msgstr "Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Projects" -msgstr "Malkovich" - -#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59 -msgid "Pseudogroup for internal use" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Elements/QuickCreate:10 html/Elements/Quicksearch:28 html/Search/Elements/PickBasics:94 html/SelfService/Create.html:32 html/Ticket/Create.html:37 html/Ticket/Elements/EditBasics:35 html/Ticket/Elements/ShowBasics:54 html/User/Elements/DelegateRights:79 lib/RT/Tickets_Overlay.pm:945 -msgid "Queue" -msgstr "Malkovich" - -#: html/Admin/Queues/CustomField.html:41 html/Admin/Queues/Scrip.html:49 html/Admin/Queues/Scrips.html:47 html/Admin/Queues/Templates.html:43 -#. ($Queue) -#. ($id) -msgid "Queue %1 not found" -msgstr "Malkovich %1 Malkovich" - -#: html/Admin/Queues/Modify.html:42 -msgid "Queue Name" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:300 -msgid "Queue already exists" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:309 lib/RT/Queue_Overlay.pm:315 -msgid "Queue could not be created" -msgstr "Malkovich not be Malkovich" - -#: html/Ticket/Create.html:208 -msgid "Queue could not be loaded." -msgstr "Malkovich be Malkovich." - -#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:319 lib/RT/StyleGuide.pod:789 -msgid "Queue created" -msgstr "Malkovich" - -#: html/SelfService/Display.html:72 lib/RT/CustomField_Overlay.pm:97 -msgid "Queue not found" -msgstr "Malkovich" - -#: html/Admin/Elements/Tabs:37 html/Admin/index.html:34 -msgid "Queues" -msgstr "Malkovich" - -#: html/Elements/Quicksearch:24 -msgid "Quick search" -msgstr "Malkovich" - -#: html/Elements/Login:44 -#. ($RT::VERSION) -msgid "RT %1" -msgstr "RT %1" - -#: docs/design_docs/string-extraction-guide.txt:70 lib/RT/StyleGuide.pod:776 -#. ($RT::VERSION, $RT::rtname) -msgid "RT %1 for %2" -msgstr "RT %1 for %2" - -#: NOT FOUND IN SOURCE -msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>." -msgstr "RT %1 from <a href=\"http://Malkovich.com\">Malkovich Malkovich, LLC</a>." - -#: html/Admin/index.html:24 html/Admin/index.html:25 -msgid "RT Administration" -msgstr "RT Malkovich" - -#: html/Elements/Error:41 html/SelfService/Error.html:40 -msgid "RT Error" -msgstr "RT Malkovich" - -#: html/index.html:50 html/index.html:53 -msgid "RT at a glance" -msgstr "RT at a Malkovich" - -#: html/Elements/PageLayout:85 -#. ($RT::rtname) -msgid "RT for %1" -msgstr "RT for %1" - -#: NOT FOUND IN SOURCE -msgid "RT is © Copyright 1996-%1 Jesse Vincent <jesse@bestpractical.com>. It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>" -msgstr "RT is © Malkovich 1996-%1 Malkovich <Malkovich@Malkovich.com>. It is Malkovich Malkovich <a href=\"http://www.gnu.org/copyleft/gpl.html\">Malkovich 2 of the Malkovich Malkovich Malkovich.</a>" - -#: html/Admin/Users/Modify.html:57 html/User/Prefs.html:47 -msgid "Real Name" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "RealName" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:628 -#. ($value) -msgid "Reference by %1 added" -msgstr "Malkovich by %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:668 -#. ($value) -msgid "Reference by %1 deleted" -msgstr "Malkovich by %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:625 -#. ($value) -msgid "Reference to %1 added" -msgstr "Malkovich to %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:665 -#. ($value) -msgid "Reference to %1 deleted" -msgstr "Malkovich to %1 Malkovich" - -#: html/Elements/EditLinks:129 html/Elements/EditLinks:81 html/Elements/ShowLinks:70 html/Ticket/Create.html:185 html/Ticket/Elements/BulkLinks:50 -msgid "Referred to by" -msgstr "Malkovich to by" - -#: html/Elements/EditLinks:125 html/Elements/EditLinks:72 html/Elements/SelectLinkType:27 html/Elements/ShowLinks:60 html/Ticket/Create.html:184 html/Ticket/Elements/BulkLinks:46 -msgid "Refers to" -msgstr "Malkovich to" - -#: NOT FOUND IN SOURCE -msgid "Refine search" -msgstr "Malkovich" - -#: html/Elements/Refresh:35 -#. ($value/60) -msgid "Refresh this page every %1 minutes." -msgstr "Malkovich Malkovich %1 Malkovich." - -#: html/Search/Bulk.html:95 -msgid "Remove AdminCc" -msgstr "Malkovich" - -#: html/Search/Bulk.html:91 -msgid "Remove Cc" -msgstr "Malkovich Cc" - -#: html/Search/Bulk.html:87 -msgid "Remove Requestor" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Elements/ShowTransaction:142 html/Ticket/Elements/Tabs:123 -msgid "Reply" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:87 -msgid "Reply to tickets" -msgstr "Malkovich to Malkovich" - -#: lib/RT/Queue_Overlay.pm:87 -msgid "ReplyToTicket" -msgstr "Malkovich" - -#: etc/initialdata:44 lib/RT/ACE_Overlay.pm:86 -msgid "Requestor" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Requestor email address" -msgstr "Malkovich Malkovich" - -#: html/SelfService/Create.html:40 html/Ticket/Create.html:55 html/Ticket/Elements/EditPeople:47 html/Ticket/Elements/ShowPeople:30 -msgid "Requestors" -msgstr "Malkovich" - -#: html/Admin/Queues/Modify.html:74 -msgid "Requests should be due in" -msgstr "Malkovich be due in" - -#: html/Elements/Submit:61 -msgid "Reset" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:63 -msgid "Residence" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:133 -msgid "Resolve" -msgstr "Malkovich" - -#: html/Ticket/Update.html:119 -#. ($TicketObj->id, $TicketObj->Subject) -msgid "Resolve ticket #%1 (%2)" -msgstr "Malkovich #%1 (%2)" - -#: etc/initialdata:323 html/Elements/SelectDateType:27 lib/RT/Ticket_Overlay.pm:1282 -msgid "Resolved" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Response to requestors" -msgstr "Malkovich to Malkovich" - -#: html/Elements/ListActions:25 html/Search/Elements/NewListActions:25 -msgid "Results" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Results per page" -msgstr "Malkovich Malkovich" - -#: html/Admin/Users/Modify.html:99 html/User/Prefs.html:94 -msgid "Retype Password" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:612 -msgid "Right Delegated" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:302 -msgid "Right Granted" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:160 -msgid "Right Loaded" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:677 lib/RT/ACE_Overlay.pm:692 -msgid "Right could not be revoked" -msgstr "Malkovich be Malkovich" - -#: html/User/Delegation.html:63 -msgid "Right not found" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:542 lib/RT/ACE_Overlay.pm:637 -msgid "Right not loaded." -msgstr "Malkovich Malkovich." - -#: lib/RT/ACE_Overlay.pm:688 -msgid "Right revoked" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Rights" -msgstr "Malkovich" - -#: lib/RT/Interface/Web.pm:869 -#. ($object_type) -msgid "Rights could not be granted for %1" -msgstr "Malkovich Malkovich be Malkovich %1" - -#: lib/RT/Interface/Web.pm:899 -#. ($object_type) -msgid "Rights could not be revoked for %1" -msgstr "Malkovich Malkovich be Malkovich %1" - -#: html/Admin/Global/GroupRights.html:50 html/Admin/Queues/GroupRights.html:52 -msgid "Roles" -msgstr "Malkovich" - -#: lib/RT/Date.pm:393 -msgid "Sat." -msgstr "Sat." - -#: html/Admin/Global/Template.html:45 html/Admin/Queues/Modify.html:89 html/Admin/Queues/People.html:104 html/Admin/Users/Modify.html:198 html/SelfService/Prefs.html:36 html/Ticket/Modify.html:38 html/Ticket/ModifyAll.html:93 html/Ticket/ModifyDates.html:38 html/Ticket/ModifyLinks.html:38 html/Ticket/ModifyPeople.html:37 -msgid "Save Changes" -msgstr "Malkovich" - -#: html/Ticket/Elements/PreviewScrips:79 -msgid "Save changes" -msgstr "Malkovich" - -#: html/Admin/Global/Scrip.html:48 html/Admin/Queues/Scrip.html:54 -#. ($id) -#. ($ARGS{'id'}) -msgid "Scrip #%1" -msgstr "Malkovich #%1" - -#: lib/RT/Scrip_Overlay.pm:180 -msgid "Scrip Created" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrips:85 -msgid "Scrip deleted" -msgstr "Malkovich" - -#: html/Admin/Elements/QueueTabs:45 html/Admin/Elements/SystemTabs:32 html/Admin/Global/index.html:40 -msgid "Scrips" -msgstr "Malkovich" - -#: html/Admin/Queues/Scrips.html:33 -msgid "Scrips which apply to all queues" -msgstr "Malkovich Malkovich to Malkovich" - -#: html/Elements/SimpleSearch:26 html/Search/Elements/DisplayOptions:73 -msgid "Search" -msgstr "Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:38 -msgid "Search for approvals" -msgstr "Malkovich Malkovich" - -#: bin/rt-crontool:184 -msgid "Security:" -msgstr "Malkovich:" - -#: lib/RT/Queue_Overlay.pm:68 -msgid "SeeQueue" -msgstr "Malkovich" - -#: html/Admin/Groups/index.html:50 -msgid "Select a group" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Users/index.html:24 html/Admin/Users/index.html:27 -msgid "Select a user" -msgstr "Malkovich a user" - -#: html/Admin/Global/CustomField.html:37 html/Admin/Global/CustomFields.html:35 -msgid "Select custom field" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/GroupTabs:51 html/User/Elements/GroupTabs:49 -msgid "Select group" -msgstr "Malkovich" - -#: lib/RT/CustomField_Overlay.pm:427 -msgid "Select multiple values" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:424 -msgid "Select one value" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/QueueTabs:66 -msgid "Select queue" -msgstr "Malkovich" - -#: html/Admin/Global/Scrip.html:36 html/Admin/Global/Scrips.html:35 html/Admin/Queues/Scrip.html:39 html/Admin/Queues/Scrips.html:51 -msgid "Select scrip" -msgstr "Malkovich" - -#: html/Admin/Global/Template.html:56 html/Admin/Global/Templates.html:35 html/Admin/Queues/Template.html:54 html/Admin/Queues/Templates.html:46 -msgid "Select template" -msgstr "Malkovich" - -#: html/Admin/Elements/UserTabs:46 -msgid "Select user" -msgstr "Malkovich" - -#: lib/RT/CustomField_Overlay.pm:35 -msgid "SelectMultiple" -msgstr "Malkovich" - -#: lib/RT/CustomField_Overlay.pm:34 -msgid "SelectSingle" -msgstr "Malkovich" - -#: etc/initialdata:121 -msgid "Send mail to all watchers" -msgstr "Malkovich to Malkovich" - -#: etc/initialdata:117 -msgid "Send mail to all watchers as a \"comment\"" -msgstr "Malkovich to Malkovich as a \"Malkovich\"" - -#: etc/initialdata:112 -msgid "Send mail to requestors and Ccs" -msgstr "Malkovich to Malkovich and Ccs" - -#: etc/initialdata:107 -msgid "Send mail to requestors and Ccs as a comment" -msgstr "Malkovich to Malkovich and Ccs as a Malkovich" - -#: etc/initialdata:78 -msgid "Sends a message to the requestors" -msgstr "Malkovich a Malkovich to the Malkovich" - -#: etc/initialdata:125 etc/initialdata:129 -msgid "Sends mail to explicitly listed Ccs and Bccs" -msgstr "Malkovich to Malkovich Malkovich and Bccs" - -#: etc/initialdata:102 -msgid "Sends mail to the administrative Ccs" -msgstr "Malkovich to the Malkovich Malkovich" - -#: etc/initialdata:98 -msgid "Sends mail to the administrative Ccs as a comment" -msgstr "Malkovich to the Malkovich Malkovich as a Malkovich" - -#: etc/initialdata:82 etc/initialdata:86 -msgid "Sends mail to the owner" -msgstr "Malkovich to the Malkovich" - -#: lib/RT/Date.pm:419 -msgid "Sep." -msgstr "Sep." - -#: html/Approvals/Elements/PendingMyApproval:43 -msgid "Show approved requests" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Create.html:143 html/Ticket/Create.html:33 -msgid "Show basics" -msgstr "Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:44 -msgid "Show denied requests" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Create.html:143 html/Ticket/Create.html:33 -msgid "Show details" -msgstr "Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:42 -msgid "Show pending requests" -msgstr "Malkovich Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:45 -msgid "Show requests awaiting other approvals" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Show ticket private commentary" -msgstr "Malkovich Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Show ticket summaries" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:70 -msgid "ShowACL" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:79 -msgid "ShowScrips" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:76 -msgid "ShowTemplate" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:80 -msgid "ShowTicket" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:81 -msgid "ShowTicketComments" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:84 -msgid "Sign up as a ticket Requestor or ticket or queue Cc" -msgstr "Sign up as a Malkovich Malkovich or Malkovich or Malkovich Cc" - -#: lib/RT/Queue_Overlay.pm:85 -msgid "Sign up as a ticket or queue AdminCc" -msgstr "Sign up as a Malkovich or Malkovich" - -#: html/Admin/Users/Modify.html:188 html/User/Prefs.html:145 -msgid "Signature" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectSingleOrMultiple:25 -msgid "Single" -msgstr "Malkovich" - -#: html/Elements/Header:62 -msgid "Skip Menu" -msgstr "Malkovich" - -#: html/Admin/Elements/AddCustomFieldValue:27 -msgid "Sort" -msgstr "Sort" - -#: NOT FOUND IN SOURCE -msgid "Sort results by" -msgstr "Malkovich by" - -#: NOT FOUND IN SOURCE -msgid "Squelched message recipients" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Elements/EditScrip:65 -msgid "Stage" -msgstr "Malkovich" - -#: html/Elements/SelectDateType:26 html/Ticket/Elements/EditDates:31 html/Ticket/Elements/ShowDates:35 -msgid "Started" -msgstr "Malkovich" - -#: html/Elements/SelectDateType:30 html/Ticket/Create.html:165 html/Ticket/Elements/EditDates:26 html/Ticket/Elements/ShowDates:31 -msgid "Starts" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:135 html/User/Prefs.html:123 -msgid "State" -msgstr "Malkovich" - -#: html/Search/Elements/PickBasics:77 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:30 html/Ticket/Create.html:41 html/Ticket/Elements/EditBasics:31 html/Ticket/Elements/ShowBasics:30 html/Ticket/Update.html:37 lib/RT/Ticket_Overlay.pm:1276 lib/RT/Tickets_Overlay.pm:970 -msgid "Status" -msgstr "Malkovich" - -#: etc/initialdata:309 -msgid "Status Change" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:505 -#. ($self->loc($self->OldValue), $self->loc($self->NewValue)) -msgid "Status changed from %1 to %2" -msgstr "Malkovich Malkovich %1 to %2" - -#: html/Ticket/Elements/Tabs:148 -msgid "Steal" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:94 -msgid "Steal tickets" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:94 -msgid "StealTicket" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:581 -#. ($Old->Name) -msgid "Stolen from %1 " -msgstr "Malkovich %1 " - -#: html/Elements/QuickCreate:7 html/Elements/SelectAttachmentField:25 html/Search/Bulk.html:133 html/SelfService/Create.html:56 html/SelfService/Elements/MyRequests:27 html/SelfService/Update.html:31 html/Ticket/Create.html:83 html/Ticket/Elements/EditBasics:26 html/Ticket/ModifyAll.html:78 html/Ticket/Update.html:58 lib/RT/Ticket_Overlay.pm:1272 lib/RT/Tickets_Overlay.pm:1049 -msgid "Subject" -msgstr "Malkovich" - -#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/StyleGuide.pod:795 lib/RT/Transaction_Overlay.pm:603 -#. ($self->Data) -msgid "Subject changed to %1" -msgstr "Malkovich to %1" - -#: html/Elements/Submit:58 -msgid "Submit" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:749 -msgid "Succeeded" -msgstr "Malkovich" - -#: lib/RT/Date.pm:394 -msgid "Sun." -msgstr "Sun." - -#: lib/RT/System.pm:53 -msgid "SuperUser" -msgstr "Malkovich" - -#: html/User/Elements/DelegateRights:76 -msgid "System" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectRights:81 lib/RT/ACE_Overlay.pm:566 lib/RT/Interface/Web.pm:868 lib/RT/Interface/Web.pm:898 -msgid "System Error" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:615 -msgid "System error. Right not delegated." -msgstr "Malkovich. Malkovich Malkovich." - -#: lib/RT/ACE_Overlay.pm:145 lib/RT/ACE_Overlay.pm:222 lib/RT/ACE_Overlay.pm:305 lib/RT/ACE_Overlay.pm:897 -msgid "System error. Right not granted." -msgstr "Malkovich. Malkovich Malkovich." - -#: html/Admin/Global/GroupRights.html:34 html/Admin/Groups/GroupRights.html:36 html/Admin/Queues/GroupRights.html:35 -msgid "System groups" -msgstr "Malkovich" - -#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53 -msgid "SystemRolegroup for internal use" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/CurrentUser.pm:334 -msgid "TEST_STRING" -msgstr "TEST_MALKOVICH" - -#: html/Elements/MyRequests:27 html/Ticket/Elements/Tabs:144 -msgid "Take" -msgstr "Take" - -#: lib/RT/Queue_Overlay.pm:92 -msgid "Take tickets" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:92 -msgid "TakeTicket" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:566 -msgid "Taken" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrip:57 html/Tools/Offline.html:56 -msgid "Template" -msgstr "Malkovich" - -#: html/Admin/Global/Template.html:90 html/Admin/Queues/Template.html:89 -#. ($TemplateObj->Id()) -msgid "Template #%1" -msgstr "Malkovich #%1" - -#: html/Admin/Elements/EditTemplates:88 -msgid "Template deleted" -msgstr "Malkovich Malkovich" - -#: lib/RT/Scrip_Overlay.pm:156 -msgid "Template not found" -msgstr "Malkovich Malkovich" - -#: lib/RT/Template_Overlay.pm:348 -msgid "Template parsed" -msgstr "Malkovich" - -#: html/Admin/Elements/QueueTabs:48 html/Admin/Elements/SystemTabs:35 html/Admin/Global/index.html:44 -msgid "Templates" -msgstr "Malkovich" - -#: lib/RT/Record.pm:740 -msgid "That is already the current value" -msgstr "That is Malkovich the Malkovich" - -#: lib/RT/CustomField_Overlay.pm:248 -msgid "That is not a value for this custom field" -msgstr "That is not a Malkovich Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2086 -msgid "That is the same value" -msgstr "That is the Malkovich" - -#: lib/RT/ACE_Overlay.pm:287 lib/RT/ACE_Overlay.pm:596 -msgid "That principal already has that right" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:674 -#. ($args{'Type'}) -msgid "That principal is already a %1 for this queue" -msgstr "Malkovich is Malkovich a %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1527 -#. ($self->loc($args{'Type'})) -msgid "That principal is already a %1 for this ticket" -msgstr "Malkovich is Malkovich a %1 Malkovich" - -#: lib/RT/Queue_Overlay.pm:773 -#. ($args{'Type'}) -msgid "That principal is not a %1 for this queue" -msgstr "That Malkovich is not a %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2082 -msgid "That queue does not exist" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3152 -msgid "That ticket has unresolved dependencies" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2956 -msgid "That user already owns that ticket" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2928 -msgid "That user does not exist" -msgstr "Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:355 -msgid "That user is already privileged" -msgstr "Malkovich is Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:376 -msgid "That user is already unprivileged" -msgstr "Malkovich is Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:368 -msgid "That user is now privileged" -msgstr "Malkovich is Malkovich" - -#: lib/RT/User_Overlay.pm:389 -msgid "That user is now unprivileged" -msgstr "Malkovich is Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2949 -msgid "That user may not own tickets in that queue" -msgstr "Malkovich Malkovich Malkovich in Malkovich" - -#: lib/RT/Link_Overlay.pm:200 -msgid "That's not a numerical id" -msgstr "That's not a Malkovich id" - -#: html/SelfService/Display.html:31 html/Ticket/Create.html:149 html/Ticket/Elements/ShowSummary:27 -msgid "The Basics" -msgstr "The Malkovich" - -#: lib/RT/ACE_Overlay.pm:87 -msgid "The CC of a ticket" -msgstr "The CC of a Malkovich" - -#: lib/RT/ACE_Overlay.pm:88 -msgid "The administrative CC of a ticket" -msgstr "The Malkovich CC of a Malkovich" - -#: bin/rt-crontool:194 -msgid "The following command will find all active tickets in the queue 'general' and set their priority to 99 if they haven't been touched in 4 hours:" -msgstr "The Malkovich Malkovich Malkovich Malkovich Malkovich in the Malkovich 'Malkovich' and Malkovich Malkovich to 99 if they haven't Malkovich in 4 Malkovich:" - -#: NOT FOUND IN SOURCE -msgid "The following commands were not proccessed:\\n\\n" -msgstr "The Malkovich Malkovich Malkovich Malkovich:\\n\\n" - -#: lib/RT/Record.pm:743 -msgid "The new value has been set." -msgstr "The Malkovich Malkovich." - -#: lib/RT/ACE_Overlay.pm:85 -msgid "The owner of a ticket" -msgstr "The Malkovich of a Malkovich" - -#: lib/RT/ACE_Overlay.pm:86 -msgid "The requestor of a ticket" -msgstr "The Malkovich of a Malkovich" - -#: html/Admin/Elements/EditUserComments:25 -msgid "These comments aren't generally visible to the user" -msgstr "Malkovich aren't Malkovich Malkovich to the user" - -#: bin/rt-crontool:185 -msgid "This tool allows the user to run arbitrary perl modules from within RT." -msgstr "Malkovich Malkovich the user to Malkovich Malkovich Malkovich Malkovich RT." - -#: lib/RT/Transaction_Overlay.pm:226 -msgid "This transaction appears to have no content" -msgstr "Malkovich Malkovich to have no Malkovich" - -#: html/Ticket/Elements/ShowRequestor:48 -#. ($rows) -msgid "This user's %1 highest priority tickets" -msgstr "Malkovich's %1 Malkovich Malkovich" - -#: lib/RT/Date.pm:391 -msgid "Thu." -msgstr "Thu." - -#: html/Ticket/ModifyAll.html:24 html/Ticket/ModifyAll.html:28 -#. ($Ticket->Id, $Ticket->Subject) -msgid "Ticket #%1 Jumbo update: %2" -msgstr "Malkovich #%1 Malkovich: %2" - -#: html/Approvals/Elements/ShowDependency:45 -#. ($link->BaseObj->Id, $link->BaseObj->Subject) -msgid "Ticket #%1: %2" -msgstr "Malkovich #%1: %2" - -#: lib/RT/Ticket_Overlay.pm:696 lib/RT/Ticket_Overlay.pm:720 -#. ($self->Id, $QueueObj->Name) -msgid "Ticket %1 created in queue '%2'" -msgstr "Malkovich %1 Malkovich in Malkovich '%2'" - -#: NOT FOUND IN SOURCE -msgid "Ticket %1 loaded\\n" -msgstr "Malkovich %1 Malkovich\\n" - -#: html/Search/Bulk.html:216 -#. ($Ticket->Id,$_) -msgid "Ticket %1: %2" -msgstr "Malkovich %1: %2" - -#: html/Ticket/History.html:24 html/Ticket/History.html:27 -#. ($Ticket->Id, $Ticket->Subject) -msgid "Ticket History # %1 %2" -msgstr "Malkovich # %1 %2" - -#: etc/initialdata:324 -msgid "Ticket Resolved" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Ticket attachment" -msgstr "Malkovich Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1228 -msgid "Ticket content" -msgstr "Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1274 -msgid "Ticket content type" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:565 lib/RT/Ticket_Overlay.pm:579 lib/RT/Ticket_Overlay.pm:590 lib/RT/Ticket_Overlay.pm:707 -msgid "Ticket could not be created due to an internal error" -msgstr "Malkovich Malkovich be Malkovich to a Malkovich" - -#: lib/RT/Transaction_Overlay.pm:497 -msgid "Ticket created" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:502 -msgid "Ticket deleted" -msgstr "Malkovich" - -#: etc/initialdata:310 -msgid "Ticket status changed" -msgstr "Malkovich Malkovich" - -#: html/Elements/Tabs:46 -msgid "Tickets" -msgstr "Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1452 -#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'})) -msgid "Tickets %1 %2" -msgstr "Malkovich %1 %2" - -#: lib/RT/Tickets_Overlay.pm:1410 -#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'})) -msgid "Tickets %1 by %2" -msgstr "Malkovich %1 by %2" - -#: NOT FOUND IN SOURCE -msgid "Tickets from %1" -msgstr "Malkovich %1" - -#: html/Approvals/Elements/ShowDependency:26 -msgid "Tickets which depend on this approval:" -msgstr "Malkovich Malkovich on Malkovich:" - -#: html/Search/Elements/PickBasics:70 html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:47 -msgid "Time Left" -msgstr "Malkovich" - -#: html/Search/Elements/PickBasics:68 html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:43 -msgid "Time Worked" -msgstr "Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1201 -msgid "Time left" -msgstr "Malkovich" - -#: html/Elements/Footer:44 -msgid "Time to display" -msgstr "Time to Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1177 -msgid "Time worked" -msgstr "Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1277 -msgid "TimeWorked" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "To generate a diff of this commit:" -msgstr "To Malkovich a diff of Malkovich:" - -#: NOT FOUND IN SOURCE -msgid "To generate a diff of this commit:\\n" -msgstr "To Malkovich a diff of Malkovich:\\n" - -#: lib/RT/Ticket_Overlay.pm:1280 -msgid "Told" -msgstr "Told" - -#: etc/initialdata:252 -msgid "Transaction" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:705 -#. ($self->Data) -msgid "Transaction %1 purged" -msgstr "Malkovich %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:136 -msgid "Transaction Created" -msgstr "Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:92 -msgid "Transaction->Create couldn't, as you didn't specify a ticket id" -msgstr "Malkovich->Malkovich couldn't, as you didn't Malkovich a Malkovich id" - -#: lib/RT/Transaction_Overlay.pm:760 -msgid "Transactions are immutable" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Date.pm:389 -msgid "Tue." -msgstr "Tue." - -#: html/Admin/Elements/EditCustomField:43 html/Ticket/Elements/AddWatchers:32 html/Ticket/Elements/AddWatchers:43 html/Ticket/Elements/AddWatchers:53 lib/RT/Ticket_Overlay.pm:1278 lib/RT/Tickets_Overlay.pm:1021 -msgid "Type" -msgstr "Type" - -#: lib/RT/ScripCondition_Overlay.pm:103 -msgid "Unimplemented" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:67 -msgid "Unix login" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "UnixUsername" -msgstr "Malkovich" - -#: lib/RT/Attachment_Overlay.pm:233 lib/RT/Attachment_Overlay.pm:265 -#. ($self->ContentEncoding) -msgid "Unknown ContentEncoding %1" -msgstr "Malkovich Malkovich %1" - -#: html/Elements/SelectResultsPerPage:36 -msgid "Unlimited" -msgstr "Malkovich" - -#: etc/initialdata:32 -msgid "Unprivileged" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:562 -msgid "Untaken" -msgstr "Malkovich" - -#: html/Search/Bulk.html:32 -msgid "Update" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Update ID" -msgstr "Malkovich ID" - -#: html/Search/Bulk.html:127 html/Ticket/ModifyAll.html:65 html/Ticket/Update.html:48 -msgid "Update Type" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Update all these tickets at once" -msgstr "Malkovich Malkovich at once" - -#: NOT FOUND IN SOURCE -msgid "Update email" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Update name" -msgstr "Malkovich" - -#: lib/RT/Action/CreateTickets.pm:655 lib/RT/Interface/Web.pm:479 -msgid "Update not recorded." -msgstr "Malkovich Malkovich." - -#: html/Search/Bulk.html:78 -msgid "Update selected tickets" -msgstr "Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Update signature" -msgstr "Malkovich Malkovich" - -#: html/Ticket/ModifyAll.html:62 -msgid "Update ticket" -msgstr "Malkovich" - -#: html/SelfService/Update.html:24 html/SelfService/Update.html:63 -#. ($Ticket->id) -msgid "Update ticket #%1" -msgstr "Malkovich #%1" - -#: html/Ticket/Update.html:121 -#. ($TicketObj->id, $TicketObj->Subject) -msgid "Update ticket #%1 (%2)" -msgstr "Malkovich #%1 (%2)" - -#: lib/RT/Action/CreateTickets.pm:653 lib/RT/Interface/Web.pm:477 -msgid "Update type was neither correspondence nor comment." -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich." - -#: html/Elements/SelectDateType:32 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1281 -msgid "Updated" -msgstr "Malkovich" - -#: etc/initialdata:132 etc/initialdata:206 -msgid "User Defined" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "User ID" -msgstr "User ID" - -#: html/Elements/SelectUsers:25 -msgid "User Id" -msgstr "User Id" - -#: html/Admin/Elements/GroupTabs:46 html/Admin/Elements/QueueTabs:59 html/Admin/Elements/SystemTabs:46 html/Admin/Global/index.html:58 -msgid "User Rights" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:252 -#. ($msg) -msgid "User could not be created: %1" -msgstr "Malkovich be Malkovich: %1" - -#: lib/RT/User_Overlay.pm:296 -msgid "User created" -msgstr "Malkovich" - -#: html/Admin/Global/GroupRights.html:66 html/Admin/Groups/GroupRights.html:53 html/Admin/Queues/GroupRights.html:68 -msgid "User defined groups" -msgstr "Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:558 lib/RT/User_Overlay.pm:575 -msgid "User loaded" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "User view" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:47 html/Elements/Login:51 html/Ticket/Elements/AddWatchers:34 -msgid "Username" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectNewGroupMembers:25 html/Admin/Elements/Tabs:31 html/Admin/Groups/Members.html:54 html/Admin/Queues/People.html:67 html/Admin/index.html:28 html/User/Groups/Members.html:57 -msgid "Users" -msgstr "Malkovich" - -#: html/Admin/Users/index.html:64 -msgid "Users matching search criteria" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Tickets_Overlay_SQL.pm:494 -msgid "Valid Query" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:56 -msgid "Values" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:84 -msgid "Watch" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:85 -msgid "WatchAsAdminCc" -msgstr "Malkovich" - -#: html/Admin/Elements/QueueTabs:41 -msgid "Watchers" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "WebEncoding" -msgstr "Malkovich" - -#: lib/RT/Date.pm:390 -msgid "Wed." -msgstr "Wed." - -#: etc/initialdata:521 -msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket" -msgstr "When a Malkovich Malkovich by Malkovich, Malkovich Malkovich to the Malkovich" - -#: etc/initialdata:485 -msgid "When a ticket has been approved by any approver, add correspondence to the original ticket" -msgstr "When a Malkovich Malkovich by Malkovich, Malkovich Malkovich to the Malkovich" - -#: etc/initialdata:146 -msgid "When a ticket is created" -msgstr "When a Malkovich is Malkovich" - -#: etc/initialdata:418 -msgid "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval" -msgstr "When a Malkovich is Malkovich, Malkovich the Malkovich and Malkovich of the Malkovich Malkovich Malkovich" - -#: etc/initialdata:151 -msgid "When anything happens" -msgstr "Malkovich Malkovich" - -#: etc/initialdata:199 -msgid "Whenever a ticket is resolved" -msgstr "Malkovich a Malkovich is Malkovich" - -#: etc/initialdata:185 -msgid "Whenever a ticket's owner changes" -msgstr "Malkovich a Malkovich's Malkovich" - -#: etc/initialdata:193 -msgid "Whenever a ticket's queue changes" -msgstr "Malkovich a Malkovich's Malkovich" - -#: etc/initialdata:170 -msgid "Whenever a ticket's status changes" -msgstr "Malkovich a Malkovich's Malkovich" - -#: etc/initialdata:207 -msgid "Whenever a user-defined condition occurs" -msgstr "Malkovich a user-Malkovich Malkovich" - -#: etc/initialdata:164 -msgid "Whenever comments come in" -msgstr "Malkovich Malkovich in" - -#: etc/initialdata:157 -msgid "Whenever correspondence comes in" -msgstr "Malkovich Malkovich Malkovich in" - -#: html/Admin/Users/Modify.html:161 html/User/Prefs.html:67 -msgid "Work" -msgstr "Work" - -#: NOT FOUND IN SOURCE -msgid "WorkPhone" -msgstr "Malkovich" - -#: html/Ticket/Elements/ShowBasics:41 html/Ticket/Update.html:42 -msgid "Worked" -msgstr "Malkovich" - -#: html/autohandler:150 -msgid "XXX CHANGEME You are not an authorized user" -msgstr "MALKOVICH Malkovich a Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3059 -msgid "You already own this ticket" -msgstr "Malkovich Malkovich Malkovich" - -#: html/autohandler:142 -msgid "You are not an authorized user" -msgstr "Malkovich a Malkovich" - -#: NOT FOUND IN SOURCE -msgid "You can access it with the Download button on the right." -msgstr "Malkovich it with the Malkovich on the Malkovich." - -#: lib/RT/Ticket_Overlay.pm:2941 -msgid "You can only reassign tickets that you own or that are unowned" -msgstr "Malkovich Malkovich Malkovich Malkovich or Malkovich Malkovich" - -#: docs/design_docs/string-extraction-guide.txt:47 lib/RT/StyleGuide.pod:760 -#. ($num, $queue) -msgid "You found %1 tickets in queue %2" -msgstr "Malkovich %1 Malkovich in Malkovich %2" - -#: html/NoAuth/Logout.html:30 -msgid "You have been logged out of RT." -msgstr "Malkovich Malkovich of RT." - -#: html/SelfService/Display.html:79 -msgid "You have no permission to create tickets in that queue." -msgstr "Malkovich no Malkovich to Malkovich in that Malkovich." - -#: lib/RT/Ticket_Overlay.pm:2095 -msgid "You may not create requests in that queue." -msgstr "Malkovich Malkovich Malkovich in Malkovich." - -#: html/NoAuth/Logout.html:34 -msgid "You're welcome to login again" -msgstr "You're Malkovich to Malkovich" - -#: etc/initialdata:502 -msgid "Your request has been approved by %1. Other approvals may still be pending." -msgstr "Malkovich Malkovich Malkovich by %1. Malkovich Malkovich be Malkovich." - -#: etc/initialdata:540 -msgid "Your request has been approved." -msgstr "Malkovich Malkovich Malkovich." - -#: etc/initialdata:445 -msgid "Your request was rejected." -msgstr "Malkovich Malkovich." - -#: html/autohandler:177 -msgid "Your username or password is incorrect" -msgstr "Malkovich or Malkovich is Malkovich" - -#: html/Admin/Users/Modify.html:141 html/User/Prefs.html:127 -msgid "Zip" -msgstr "Zip" - -#: html/User/Elements/DelegateRights:58 -#. ($right->PrincipalObj->Object->SelfDescription) -msgid "as granted to %1" -msgstr "as Malkovich to %1" - -#: html/SelfService/Closed.html:27 -msgid "closed" -msgstr "Malkovich" - -#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:33 -msgid "contains" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "content" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "content-type" -msgstr "Malkovich-type" - -#: html/Admin/Queues/Modify.html:76 lib/RT/Date.pm:319 -msgid "days" -msgstr "days" - -#: lib/RT/Queue_Overlay.pm:64 -msgid "deleted" -msgstr "Malkovich" - -#: html/Search/Elements/PickBasics:33 -msgid "does not match" -msgstr "Malkovich" - -#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:34 -msgid "doesn't contain" -msgstr "doesn't Malkovich" - -#: html/Elements/SelectEqualityOperator:37 -msgid "equal to" -msgstr "Malkovich to" - -#: NOT FOUND IN SOURCE -msgid "filename" -msgstr "Malkovich" - -#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectEqualityOperator:37 -msgid "greater than" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:196 -#. ($self->Name) -msgid "group '%1'" -msgstr "Malkovich '%1'" - -#: lib/RT/Date.pm:315 -msgid "hours" -msgstr "Malkovich" - -#: html/Elements/SelectBoolean:31 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:35 html/Search/Elements/PickBasics:49 html/Search/Elements/PickBasics:80 html/Search/Elements/PickBasics:97 html/Search/Elements/PickCFs:37 -msgid "is" -msgstr "is" - -#: html/Elements/SelectBoolean:35 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:36 html/Search/Elements/PickBasics:50 html/Search/Elements/PickBasics:81 html/Search/Elements/PickBasics:98 html/Search/Elements/PickCFs:38 -msgid "isn't" -msgstr "isn't" - -#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectEqualityOperator:37 -msgid "less than" -msgstr "Malkovich" - -#: html/Search/Elements/PickBasics:32 -msgid "matches" -msgstr "Malkovich" - -#: lib/RT/Date.pm:311 -msgid "min" -msgstr "min" - -#: html/Ticket/Update.html:42 -msgid "minutes" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "modifications\\n\\n" -msgstr "Malkovich\\n\\n" - -#: lib/RT/Date.pm:327 -msgid "months" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:59 -msgid "new" -msgstr "new" - -#: html/Admin/Elements/EditCustomFields:42 -msgid "no name" -msgstr "no name" - -#: html/Admin/Elements/EditScrips:42 -msgid "no value" -msgstr "no Malkovich" - -#: html/Admin/Elements/EditQueueWatchers:26 html/Ticket/Elements/EditWatchers:27 -msgid "none" -msgstr "none" - -#: html/Elements/SelectEqualityOperator:37 -msgid "not equal to" -msgstr "Malkovich to" - -#: html/SelfService/Elements/MyRequests:61 lib/RT/Queue_Overlay.pm:60 -msgid "open" -msgstr "open" - -#: lib/RT/Group_Overlay.pm:201 -#. ($self->Name, $user->Name) -msgid "personal group '%1' for user '%2'" -msgstr "Malkovich '%1' Malkovich '%2'" - -#: lib/RT/Group_Overlay.pm:209 -#. ($queue->Name, $self->Type) -msgid "queue %1 %2" -msgstr "Malkovich %1 %2" - -#: lib/RT/Queue_Overlay.pm:63 -msgid "rejected" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:62 -msgid "resolved" -msgstr "Malkovich" - -#: lib/RT/Date.pm:307 -msgid "sec" -msgstr "sec" - -#: lib/RT/Queue_Overlay.pm:61 -msgid "stalled" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:204 -#. ($self->Type) -msgid "system %1" -msgstr "Malkovich %1" - -#: lib/RT/Group_Overlay.pm:215 -#. ($self->Type) -msgid "system group '%1'" -msgstr "Malkovich '%1'" - -#: html/Elements/Error:42 html/SelfService/Error.html:41 -msgid "the calling component did not specify why" -msgstr "the Malkovich Malkovich Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "ticket #%1" -msgstr "Malkovich #%1" - -#: lib/RT/Group_Overlay.pm:212 -#. ($self->Instance, $self->Type) -msgid "ticket #%1 %2" -msgstr "Malkovich #%1 %2" - -#: lib/RT/Group_Overlay.pm:218 -#. ($self->Id) -msgid "undescribed group %1" -msgstr "Malkovich Malkovich %1" - -#: lib/RT/Group_Overlay.pm:193 -#. ($user->Object->Name) -msgid "user %1" -msgstr "user %1" - -#: lib/RT/Date.pm:323 -msgid "weeks" -msgstr "Malkovich" - -#: lib/RT/Date.pm:331 -msgid "years" -msgstr "Malkovich" - diff --git a/rt/lib/RT/Interface/CLI.pm b/rt/lib/RT/Interface/CLI.pm index 533150415..ec0e877b4 100644 --- a/rt/lib/RT/Interface/CLI.pm +++ b/rt/lib/RT/Interface/CLI.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK use strict; use RT; @@ -57,7 +33,7 @@ BEGIN { use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); # set the version for version checking - $VERSION = do { my @r = (q$Revision: 1.1.1.7 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker + $VERSION = do { my @r = (q$Revision: 1.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker @ISA = qw(Exporter); diff --git a/rt/lib/RT/Interface/Email.pm b/rt/lib/RT/Interface/Email.pm index 14ae2a058..7eec0502f 100755 --- a/rt/lib/RT/Interface/Email.pm +++ b/rt/lib/RT/Interface/Email.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,70 +14,50 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK package RT::Interface::Email; use strict; use Mail::Address; use MIME::Entity; use RT::EmailParser; -use File::Temp; -use UNIVERSAL::require; + BEGIN { use Exporter (); - use vars qw ( @ISA @EXPORT_OK); - + use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); + # set the version for version checking - our $VERSION = 2.0; - - @ISA = qw(Exporter); - + $VERSION = do { my @r = (q$Revision: 1.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker + + @ISA = qw(Exporter); + # your exported package globals go here, # as well as any optionally exported functions - @EXPORT_OK = qw( - &CreateUser - &GetMessageContent - &CheckForLoops - &CheckForSuspiciousSender - &CheckForAutoGenerated - &CheckForBounce - &MailError - &ParseCcAddressesFromHead - &ParseSenderAddressFromHead - &ParseErrorsToAddressFromHead - &ParseAddressFromHeader - &Gateway); + @EXPORT_OK = qw( + &CreateUser + &GetMessageContent + &CheckForLoops + &CheckForSuspiciousSender + &CheckForAutoGenerated + &MailError + &ParseCcAddressesFromHead + &ParseSenderAddressFromHead + &ParseErrorsToAddressFromHead + &ParseAddressFromHeader + &Gateway); } =head1 NAME - RT::Interface::Email - helper functions for parsing email sent to RT + RT::Interface::CLI - helper functions for creating a commandline RT interface =head1 SYNOPSIS @@ -106,18 +80,19 @@ ok(require RT::Interface::Email); =cut -# {{{ sub CheckForLoops -sub CheckForLoops { - my $head = shift; +# {{{ sub CheckForLoops +sub CheckForLoops { + my $head = shift; + #If this instance of RT sent it our, we don't want to take it in my $RTLoop = $head->get("X-RT-Loop-Prevention") || ""; - chomp($RTLoop); #remove that newline - if ( $RTLoop eq "$RT::rtname" ) { - return (1); + chomp ($RTLoop); #remove that newline + if ($RTLoop eq "$RT::rtname") { + return (1); } - + # TODO: We might not trap the case where RT instance A sends a mail # to RT instance B which sends a mail to ... return (undef); @@ -131,24 +106,23 @@ sub CheckForSuspiciousSender { my $head = shift; #if it's from a postmaster or mailer daemon, it's likely a bounce. - + #TODO: better algorithms needed here - there is no standards for #bounces, so it's very difficult to separate them from anything #else. At the other hand, the Return-To address is only ment to be #used as an error channel, we might want to put up a separate #Return-To address which is treated differently. - + #TODO: search through the whole email and find the right Ticket ID. - my ( $From, $junk ) = ParseSenderAddressFromHead($head); - - if ( ( $From =~ /^mailer-daemon\@/i ) - or ( $From =~ /^postmaster\@/i ) ) - { - return (1); - + my ($From, $junk) = ParseSenderAddressFromHead($head); + + if (($From =~ /^mailer-daemon/i) or + ($From =~ /^postmaster/i)){ + return (1); + } - + return (undef); } @@ -158,126 +132,57 @@ sub CheckForSuspiciousSender { # {{{ sub CheckForAutoGenerated sub CheckForAutoGenerated { my $head = shift; - - my $Precedence = $head->get("Precedence") || ""; - if ( $Precedence =~ /^(bulk|junk)/i ) { - return (1); - } - - # First Class mailer uses this as a clue. - my $FCJunk = $head->get("X-FC-Machinegenerated") || ""; - if ( $FCJunk =~ /^true/i ) { - return (1); + + my $Precedence = $head->get("Precedence") || "" ; + if ($Precedence =~ /^(bulk|junk)/i) { + return (1); } - - return (0); -} - -# }}} - -# {{{ sub CheckForBounce -sub CheckForBounce { - my $head = shift; - - my $ReturnPath = $head->get("Return-path") || ""; - return ( $ReturnPath =~ /<>/ ); -} - -# }}} - -# {{{ IsRTAddress - -=head2 IsRTAddress ADDRESS - -Takes a single parameter, an email address. -Returns true if that address matches the $RTAddressRegexp. -Returns false, otherwise. - -=cut - -sub IsRTAddress { - my $address = shift || ''; - - # Example: the following rule would tell RT not to Cc - # "tickets@noc.example.com" - if ( defined($RT::RTAddressRegexp) - && $address =~ /$RT::RTAddressRegexp/i ) - { - return (1); - } else { - return (undef); + else { + return (0); } } # }}} -# {{{ CullRTAddresses - -=head2 CullRTAddresses ARRAY - -Takes a single argument, an array of email addresses. -Returns the same array with any IsRTAddress()es weeded out. -=cut - -sub CullRTAddresses { - return grep !IsRTAddress($_), @_; -} - -# }}} - -# {{{ sub MailError +# {{{ sub MailError sub MailError { - my %args = ( - To => $RT::OwnerEmail, - Bcc => undef, - From => $RT::CorrespondAddress, - Subject => 'There has been an error', - Explanation => 'Unexplained error', - MIMEObj => undef, - Attach => undef, - LogLevel => 'crit', - @_ - ); - - $RT::Logger->log( - level => $args{'LogLevel'}, - message => $args{'Explanation'} - ); - # the colons are necessary to make ->build include non-standard headers - my $entity = MIME::Entity->build( - Type => "multipart/mixed", - From => $args{'From'}, - Bcc => $args{'Bcc'}, - To => $args{'To'}, - Subject => $args{'Subject'}, - 'Precedence:' => 'bulk', - 'X-RT-Loop-Prevention:' => $RT::rtname, - 'In-Reply-To:' => $args{'MIMEObj'} ? $args{'MIMEObj'}->head->get('Message-Id') : undef - ); - - $entity->attach( Data => $args{'Explanation'} . "\n" ); - + my %args = (To => $RT::OwnerEmail, + Bcc => undef, + From => $RT::CorrespondAddress, + Subject => 'There has been an error', + Explanation => 'Unexplained error', + MIMEObj => undef, + LogLevel => 'crit', + @_); + + + $RT::Logger->log(level => $args{'LogLevel'}, + message => $args{'Explanation'} + ); + my $entity = MIME::Entity->build( Type =>"multipart/mixed", + From => $args{'From'}, + Bcc => $args{'Bcc'}, + To => $args{'To'}, + Subject => $args{'Subject'}, + 'X-RT-Loop-Prevention' => $RT::rtname, + ); + + $entity->attach( Data => $args{'Explanation'}."\n"); + my $mimeobj = $args{'MIMEObj'}; if ($mimeobj) { $mimeobj->sync_headers(); $entity->add_part($mimeobj); } - - if ( $args{'Attach'} ) { - $entity->attach( Data => $args{'Attach'}, Type => 'message/rfc822' ); - - } - - if ( $RT::MailCommand eq 'sendmailpipe' ) { - open( MAIL, - "|$RT::SendmailPath $RT::SendmailBounceArguments $RT::SendmailArguments" - ) - || return (0); + + if ($RT::MailCommand eq 'sendmailpipe') { + open (MAIL, "|$RT::SendmailPath $RT::SendmailArguments") || return(0); print MAIL $entity->as_string; close(MAIL); - } else { - $entity->send( $RT::MailCommand, $RT::MailParams ); + } + else { + $entity->send($RT::MailCommand, $RT::MailParams); } } @@ -286,38 +191,43 @@ sub MailError { # {{{ Create User sub CreateUser { - my ( $Username, $Address, $Name, $ErrorsTo, $entity ) = @_; + my ($Username, $Address, $Name, $ErrorsTo, $entity) = @_; my $NewUser = RT::User->new($RT::SystemUser); - my ( $Val, $Message ) = $NewUser->Create( - Name => ( $Username || $Address ), - EmailAddress => $Address, - RealName => $Name, - Password => undef, - Privileged => 0, - Comments => 'Autocreated on ticket submission' - ); - + # This data is tainted by some Very Broken mailers. + # (Sometimes they send raw ISO 8859-1 data here. fear that. + require Encode; + $Username = Encode::encode(utf8 => $Username, Encode::FB_PERLQQ()) if defined $Username; + $Name = Encode::encode(utf8 => $Name, Encode::FB_PERLQQ()) if defined $Name; + + my ($Val, $Message) = + $NewUser->Create(Name => ($Username || $Address), + EmailAddress => $Address, + RealName => $Name, + Password => undef, + Privileged => 0, + Comments => 'Autocreated on ticket submission' + ); + unless ($Val) { - + # Deal with the race condition of two account creations at once + # if ($Username) { $NewUser->LoadByName($Username); } - - unless ( $NewUser->Id ) { + + unless ($NewUser->Id) { $NewUser->LoadByEmail($Address); } - - unless ( $NewUser->Id ) { - MailError( - To => $ErrorsTo, - Subject => "User could not be created", - Explanation => - "User creation failed in mailgateway: $Message", - MIMEObj => $entity, - LogLevel => 'crit' - ); + + unless ($NewUser->Id) { + MailError( To => $ErrorsTo, + Subject => "User could not be created", + Explanation => "User creation failed in mailgateway: $Message", + MIMEObj => $entity, + LogLevel => 'crit' + ); } } @@ -325,25 +235,20 @@ sub CreateUser { my $CurrentUser = RT::CurrentUser->new(); $CurrentUser->LoadByEmail($Address); - unless ( $CurrentUser->id ) { - $RT::Logger->warning( - "Couldn't load user '$Address'." . "giving up" ); - MailError( - To => $ErrorsTo, - Subject => "User could not be loaded", - Explanation => - "User '$Address' could not be loaded in the mail gateway", - MIMEObj => $entity, - LogLevel => 'crit' - ); + unless ($CurrentUser->id) { + $RT::Logger->warning("Couldn't load user '$Address'.". "giving up"); + MailError( To => $ErrorsTo, + Subject => "User could not be loaded", + Explanation => "User '$Address' could not be loaded in the mail gateway", + MIMEObj => $entity, + LogLevel => 'crit' + ); } return $CurrentUser; } - -# }}} - -# {{{ ParseCcAddressesFromHead +# }}} +# {{{ ParseCcAddressesFromHead =head2 ParseCcAddressesFromHead HASHREF @@ -353,34 +258,32 @@ headers b<except> the current Queue\'s email addresses, the CurrentUser\'s email address and anything that the configuration sub RT::IsRTAddress matches. =cut - + sub ParseCcAddressesFromHead { - my %args = ( - Head => undef, - QueueObj => undef, - CurrentUser => undef, - @_ - ); - + my %args = ( Head => undef, + QueueObj => undef, + CurrentUser => undef, + @_ ); + my (@Addresses); - - my @ToObjs = Mail::Address->parse( $args{'Head'}->get('To') ); - my @CcObjs = Mail::Address->parse( $args{'Head'}->get('Cc') ); - - foreach my $AddrObj ( @ToObjs, @CcObjs ) { - my $Address = $AddrObj->address; - $Address = $args{'CurrentUser'} - ->UserObj->CanonicalizeEmailAddress($Address); - next if ( $args{'CurrentUser'}->EmailAddress =~ /^\Q$Address\E$/i ); - next if ( $args{'QueueObj'}->CorrespondAddress =~ /^\Q$Address\E$/i ); - next if ( $args{'QueueObj'}->CommentAddress =~ /^\Q$Address\E$/i ); - next if ( RT::EmailParser->IsRTAddress($Address) ); - - push( @Addresses, $Address ); + + my @ToObjs = Mail::Address->parse($args{'Head'}->get('To')); + my @CcObjs = Mail::Address->parse($args{'Head'}->get('Cc')); + + foreach my $AddrObj (@ToObjs, @CcObjs) { + my $Address = $AddrObj->address; + $Address = $args{'CurrentUser'}->UserObj->CanonicalizeEmailAddress($Address); + next if ($args{'CurrentUser'}->EmailAddress =~ /^$Address$/i); + next if ($args{'QueueObj'}->CorrespondAddress =~ /^$Address$/i); + next if ($args{'QueueObj'}->CommentAddress =~ /^$Address$/i); + next if (RT::EmailParser::IsRTAddress(undef, $Address)); + + push (@Addresses, $Address); } return (@Addresses); } + # }}} # {{{ ParseSenderAdddressFromHead @@ -394,16 +297,11 @@ of the From (evaluated in order of Reply-To:, From:, Sender) sub ParseSenderAddressFromHead { my $head = shift; - #Figure out who's sending this message. - foreach my $header ('Reply-To', 'From', 'Sender') { - my $From = $head->get($header); - my ($addr, $name) = ParseAddressFromHeader($From); - # only return if the address is not empty - return ($addr, $name) if $addr; - } - - return (undef, undef); + my $From = $head->get('Reply-To') || + $head->get('From') || + $head->get('Sender'); + return (ParseAddressFromHeader($From)); } # }}} @@ -412,29 +310,24 @@ sub ParseSenderAddressFromHead { =head2 ParseErrorsToAddressFromHead Takes a MIME::Header object. Return a single value : user@host -of the From (evaluated in order of Return-path:,Errors-To:,Reply-To:, -From:, Sender) +of the From (evaluated in order of Errors-To:,Reply-To:, From:, Sender) =cut sub ParseErrorsToAddressFromHead { my $head = shift; - #Figure out who's sending this message. - foreach my $header ( 'Errors-To', 'Reply-To', 'From', 'Sender' ) { - - # If there's a header of that name - my $headerobj = $head->get($header); - if ($headerobj) { - my ( $addr, $name ) = ParseAddressFromHeader($headerobj); - - # If it's got actual useful content... - return ($addr) if ($addr); - } + foreach my $header ('Errors-To' , 'Reply-To', 'From', 'Sender' ) { + # If there's a header of that name + my $headerobj = $head->get($header); + if ($headerobj) { + my ($addr, $name ) = ParseAddressFromHeader($headerobj); + # If it's got actual useful content... + return ($addr) if ($addr); + } } } - # }}} # {{{ ParseAddressFromHeader @@ -445,547 +338,311 @@ Takes an address from $head->get('Line') and returns a tuple: user@host, friendl =cut -sub ParseAddressFromHeader { - my $Addr = shift; - # Some broken mailers send: ""Vincent, Jesse"" <jesse@fsck.com>. Hate - $Addr =~ s/\"\"(.*?)\"\"/\"$1\"/g; +sub ParseAddressFromHeader{ + my $Addr = shift; + my @Addresses = Mail::Address->parse($Addr); + + my $AddrObj = $Addresses[0]; - my ($AddrObj) = grep ref $_, @Addresses; - unless ( $AddrObj ) { - return ( undef, undef ); + unless (ref($AddrObj)) { + return(undef,undef); } - - my $Name = ( $AddrObj->phrase || $AddrObj->comment || $AddrObj->address ); - + + my $Name = ($AddrObj->phrase || $AddrObj->comment || $AddrObj->address); + #Lets take the from and load a user object. my $Address = $AddrObj->address; - return ( $Address, $Name ); + return ($Address, $Name); } - # }}} -# {{{ sub ParseTicketId -sub ParseTicketId { - my $Subject = shift; - my $id; - - my $test_name = $RT::EmailSubjectTagRegex || qr/\Q$RT::rtname\E/i; - - if ( $Subject =~ s/\[$test_name\s+\#(\d+)\s*\]//i ) { - my $id = $1; - $RT::Logger->debug("Found a ticket ID. It's $id"); - return ($id); - } else { - return (undef); - } -} - -# }}} - -=head2 Gateway ARGSREF - - -Takes parameters: - - action - queue - message +=head2 Gateway This performs all the "guts" of the mail rt-mailgate program, and is designed to be called from the web interface with a message, user object, and so on. -Can also take an optional 'ticket' parameter; this ticket id overrides -any ticket id found in the subject. - -Returns: - - An array of: - - (status code, message, optional ticket object) - - status code is a numeric value. - - for temporary failures, the status code should be -75 - - for permanent failures which are handled by RT, the status code - should be 0 - - for succces, the status code should be 1 - - - =cut sub Gateway { - my $argsref = shift; - my %args = ( - action => 'correspond', - queue => '1', - ticket => undef, - message => undef, - %$argsref - ); - - my $SystemTicket; - my $Right; + my %args = ( message => undef, + queue => 1, + action => 'correspond', + ticket => undef, + @_ ); # Validate the action - my ( $status, @actions ) = IsCorrectAction( $args{'action'} ); - unless ($status) { - return ( - -75, - "Invalid 'action' parameter " - . $actions[0] - . " for queue " - . $args{'queue'}, - undef - ); + unless ( $args{'action'} =~ /^(comment|correspond|action)$/ ) { + + # Can't safely loc this. What object do we loc around? + return ( 0, "Invalid 'action' parameter", undef ); } my $parser = RT::EmailParser->new(); - $parser->SmartParseMIMEEntityFromScalar( Message => $args{'message'} ); - my $Message = $parser->Entity(); - - unless ($Message) { - MailError( - To => $RT::OwnerEmail, - Subject => "RT Bounce: Unparseable message", - Explanation => "RT couldn't process the message below", - Attach => $args{'message'} - ); - - return ( 0, - "Failed to parse this message. Something is likely badly wrong with the message" - ); - } + $parser->ParseMIMEEntityFromScalar( $args{'message'} ); + my $Message = $parser->Entity(); my $head = $Message->head; + my ( $CurrentUser, $AuthStat, $status, $error ); + my $ErrorsTo = ParseErrorsToAddressFromHead($head); - my $MessageId = $head->get('Message-ID') - || "<no-message-id-" . time . rand(2000) . "\@.$RT::Organization>"; + my $MessageId = $head->get('Message-Id') + || "<no-message-id-" . time . rand(2000) . "\@.$RT::Organization>"; #Pull apart the subject line my $Subject = $head->get('Subject') || ''; chomp $Subject; - - # {{{ Lets check for mail loops of various sorts. - my ($should_store_machine_generated_message, $IsALoop, $result); - ( $should_store_machine_generated_message, $ErrorsTo, $result, $IsALoop ) = - _HandleMachineGeneratedMail( - Message => $Message, - ErrorsTo => $ErrorsTo, - Subject => $Subject, - MessageId => $MessageId - ); - - # Do not pass loop messages to MailPlugins, to make sure the loop - # is broken, unless $RT::StoreLoops is set. - if ($IsALoop && !$should_store_machine_generated_message) { - return ( 0, $result, undef ); - } - $args{'ticket'} ||= ParseTicketId($Subject); - $SystemTicket = RT::Ticket->new($RT::SystemUser); - $SystemTicket->Load( $args{'ticket'} ) if ( $args{'ticket'} ) ; - if ( $SystemTicket->id ) { - $Right = 'ReplyToTicket'; - } else { - $Right = 'CreateTicket'; + $args{'ticket'} ||= $parser->ParseTicketId($Subject); + + my $SystemTicket; + if ($args{'ticket'} ) { + $SystemTicket = RT::Ticket->new($RT::SystemUser); + $SystemTicket->Load($args{'ticket'}); } #Set up a queue object my $SystemQueueObj = RT::Queue->new($RT::SystemUser); $SystemQueueObj->Load( $args{'queue'} ); + # We can safely have no queue of we have a known-good ticket - unless ( $SystemTicket->id || $SystemQueueObj->id ) { - return ( -75, "RT couldn't find the queue: " . $args{'queue'}, undef ); + unless ( $args{'ticket'} || $SystemQueueObj->id ) { + MailError( + To => $RT::OwnerEmail, + Subject => "RT Bounce: $Subject", + Explanation => "RT couldn't find the queue: " . $args{'queue'}, + MIMEObj => $Message ); + return ( 0, "RT couldn't find the queue: " . $args{'queue'}, undef ); } - # Authentication Level ($AuthStat) - # -1 - Get out. this user has been explicitly declined + # Authentication Level + # -1 - Get out. this user has been explicitly declined # 0 - User may not do anything (Not used at the moment) # 1 - Normal user # 2 - User is allowed to specify status updates etc. a la enhanced-mailgate - my ( $CurrentUser, $AuthStat, $error ); - - # Initalize AuthStat so comparisons work correctly - $AuthStat = -9999999; - - push @RT::MailPlugins, "Auth::MailFrom" unless @RT::MailPlugins; - - # if plugin returns AuthStat -2 we skip action - # NOTE: this is experimental API and it would be changed - my %skip_action = (); + push @RT::MailPlugins, "Auth::MailFrom" unless @RT::MailPlugins; # Since this needs loading, no matter what - foreach (@RT::MailPlugins) { - my ($Code, $NewAuthStat); + + for (@RT::MailPlugins) { + my $Code; + my $NewAuthStat; if ( ref($_) eq "CODE" ) { $Code = $_; - } else { - my $Class = $_; - $Class = "RT::Interface::Email::" . $Class - unless $Class =~ /^RT::Interface::Email::/; - $Class->require or - do { $RT::Logger->error("Couldn't load $Class: $@"); next }; - + } + else { + $_ = "RT::Interface::Email::$_" unless /^RT::Interface::Email::/; + eval "require $_;"; + if ($@) { + die ("Couldn't load module $_: $@"); + next; + } no strict 'refs'; - unless ( defined( $Code = *{ $Class . "::GetCurrentUser" }{CODE} ) ) { - $RT::Logger->crit( "No 'GetCurrentUser' function found in '$Class' module"); + if ( !defined( $Code = *{ $_ . "::GetCurrentUser" }{CODE} ) ) { + die ("No GetCurrentUser code found in $_ module"); next; } } - foreach my $action (@actions) { - ( $CurrentUser, $NewAuthStat ) = $Code->( - Message => $Message, - RawMessageRef => \$args{'message'}, - CurrentUser => $CurrentUser, - AuthLevel => $AuthStat, - Action => $action, - Ticket => $SystemTicket, - Queue => $SystemQueueObj - ); - -# You get the highest level of authentication you were assigned, unless you get the magic -1 -# If a module returns a "-1" then we discard the ticket, so. - $AuthStat = $NewAuthStat - if ( $NewAuthStat > $AuthStat or $NewAuthStat == -1 or $NewAuthStat == -2 ); - - last if $AuthStat == -1; - $skip_action{$action}++ if $AuthStat == -2; - } - - # strip actions we should skip - @actions = grep !$skip_action{$_}, @actions if $AuthStat == -2; - last unless @actions; + ( $CurrentUser, $NewAuthStat ) = $Code->( Message => $Message, + CurrentUser => $CurrentUser, + AuthLevel => $AuthStat, + Action => $args{'action'}, + Ticket => $SystemTicket, + Queue => $SystemQueueObj ); + # You get the highest level of authentication you were assigned. last if $AuthStat == -1; + $AuthStat = $NewAuthStat if $NewAuthStat > $AuthStat; } + # {{{ If authentication fails and no new user was created, get out. - if ( !$CurrentUser || !$CurrentUser->id || $AuthStat == -1 ) { + if ( !$CurrentUser or !$CurrentUser->Id or $AuthStat == -1 ) { # If the plugins refused to create one, they lose. - unless ( $AuthStat == -1 ) { - _NoAuthorizedUserFound( - Right => $Right, - Message => $Message, - Requestor => $ErrorsTo, - Queue => $args{'queue'} - ); - - } - return ( 0, "Could not load a valid user", undef ); - } - - # If we got a user, but they don't have the right to say things - if ( $AuthStat == 0 ) { MailError( - To => $ErrorsTo, - Subject => "Permission Denied", - Explanation => - "You do not have permission to communicate with RT", - MIMEObj => $Message - ); - return ( - 0, - "$ErrorsTo tried to submit a message to " - . $args{'Queue'} - . " without permission.", - undef - ); - } + Subject => "Could not load a valid user", + Explanation => <<EOT, +RT could not load a valid user, and RT's configuration does not allow +for the creation of a new user for your email. +Your RT administrator needs to grant 'Everyone' the right 'CreateTicket' +for this queue. - unless ($should_store_machine_generated_message) { - return ( 0, $result, undef ); +EOT + MIMEObj => $Message, + LogLevel => 'error' ) + unless $AuthStat == -1; + return ( 0, "Could not load a valid user", undef ); } - - # if plugin's updated SystemTicket then update arguments - $args{'ticket'} = $SystemTicket->Id if $SystemTicket && $SystemTicket->Id; - my $Ticket = RT::Ticket->new($CurrentUser); + # }}} - if ( !$args{'ticket'} && grep /^(comment|correspond)$/, @actions ) - { + # {{{ Lets check for mail loops of various sorts. + my $IsAutoGenerated = CheckForAutoGenerated($head); - my @Cc; - my @Requestors = ( $CurrentUser->id ); + my $IsSuspiciousSender = CheckForSuspiciousSender($head); - if ($RT::ParseNewMessageForTicketCcs) { - @Cc = ParseCcAddressesFromHead( - Head => $head, - CurrentUser => $CurrentUser, - QueueObj => $SystemQueueObj - ); - } + my $IsALoop = CheckForLoops($head); - my ( $id, $Transaction, $ErrStr ) = $Ticket->Create( - Queue => $SystemQueueObj->Id, - Subject => $Subject, - Requestor => \@Requestors, - Cc => \@Cc, - MIMEObj => $Message - ); - if ( $id == 0 ) { - MailError( - To => $ErrorsTo, - Subject => "Ticket creation failed: $Subject", - Explanation => $ErrStr, - MIMEObj => $Message - ); - return ( 0, "Ticket creation failed: $ErrStr", $Ticket ); - } + my $SquelchReplies = 0; - # strip comments&corresponds from the actions we don't need - # to record them if we've created the ticket just now - @actions = grep !/^(comment|correspond)$/, @actions; - $args{'ticket'} = $id; + #If the message is autogenerated, we need to know, so we can not + # send mail to the sender + if ( $IsSuspiciousSender || $IsAutoGenerated || $IsALoop ) { + $SquelchReplies = 1; + $ErrorsTo = $RT::OwnerEmail; + } - } elsif ( $args{'ticket'} ) { + # }}} - $Ticket->Load( $args{'ticket'} ); - unless ( $Ticket->Id ) { - my $error = "Could not find a ticket with id " . $args{'ticket'}; - MailError( - To => $ErrorsTo, - Subject => "Message not recorded: $Subject", - Explanation => $error, - MIMEObj => $Message - ); - - return ( 0, $error ); - } - $args{'ticket'} = $Ticket->id; - } else { - return ( 1, "Success", $Ticket ); + # {{{ Drop it if it's disallowed + if ( $AuthStat == 0 ) { + MailError( + To => $ErrorsTo, + Subject => "Permission Denied", + Explanation => "You do not have permission to communicate with RT", + MIMEObj => $Message ); } # }}} - foreach my $action (@actions) { - - # If the action is comment, add a comment. - if ( $action =~ /^(?:comment|correspond)$/i ) { - my $method = ucfirst lc $action; - my ( $status, $msg ) = $Ticket->$method( MIMEObj => $Message ); - unless ($status) { - - #Warn the sender that we couldn't actually submit the comment. - MailError( - To => $ErrorsTo, - Subject => "Message not recorded: $Subject", - Explanation => $msg, - MIMEObj => $Message - ); - return ( 0, "Message not recorded: $msg", $Ticket ); - } - } elsif ($RT::UnsafeEmailCommands) { - my ( $status, $msg ) = _RunUnsafeAction( - Action => $action, - ErrorsTo => $ErrorsTo, - Message => $Message, - Ticket => $Ticket, - CurrentUser => $CurrentUser, - ); - return ($status, $msg, $Ticket) unless $status == 1; - } - } - return ( 1, "Success", $Ticket ); -} + # {{{ Warn someone if it's a loop -sub _RunUnsafeAction { - my %args = ( - Action => undef, - ErrorsTo => undef, - Message => undef, - Ticket => undef, - CurrentUser => undef, - @_ - ); - - if ( $args{'Action'} =~ /^take$/i ) { - my ( $status, $msg ) = $args{'Ticket'}->SetOwner( $args{'CurrentUser'}->id ); - unless ($status) { - MailError( - To => $args{'ErrorsTo'}, - Subject => "Ticket not taken", - Explanation => $msg, - MIMEObj => $args{'Message'} - ); - return ( 0, "Ticket not taken" ); - } - } elsif ( $args{'Action'} =~ /^resolve$/i ) { - my ( $status, $msg ) = $args{'Ticket'}->SetStatus('resolved'); - unless ($status) { + # Warn someone if it's a loop, before we drop it on the ground + if ($IsALoop) { + $RT::Logger->crit("RT Recieved mail ($MessageId) from itself."); - #Warn the sender that we couldn't actually submit the comment. - MailError( - To => $args{'ErrorsTo'}, - Subject => "Ticket not resolved", - Explanation => $msg, - MIMEObj => $args{'Message'} - ); - return ( 0, "Ticket not resolved" ); + #Should we mail it to RTOwner? + if ($RT::LoopsToRTOwner) { + MailError( To => $RT::OwnerEmail, + Subject => "RT Bounce: $Subject", + Explanation => "RT thinks this message may be a bounce", + MIMEObj => $Message ); + + #Do we actually want to store it? + return ( 0, "Message Bounced", undef ) unless ($RT::StoreLoops); } - } else { - return ( 0, "Not supported unsafe action $args{'Action'}", $args{'Ticket'} ); } - return ( 1, "Success" ); -} - -=head2 _NoAuthorizedUserFound -Emails the RT Owner and the requestor when the auth plugins return "No auth user found" - -=cut - -sub _NoAuthorizedUserFound { - my %args = ( - Right => undef, - Message => undef, - Requestor => undef, - Queue => undef, - @_ - ); - - # Notify the RT Admin of the failure. - MailError( - To => $RT::OwnerEmail, - Subject => "Could not load a valid user", - Explanation => <<EOT, -RT could not load a valid user, and RT's configuration does not allow -for the creation of a new user for this email (@{[$args{Requestor}]}). + # }}} -You might need to grant 'Everyone' the right '@{[$args{Right}]}' for the -queue @{[$args{'Queue'}]}. + # {{{ Squelch replies if necessary + # Don't let the user stuff the RT-Squelch-Replies-To header. + if ( $head->get('RT-Squelch-Replies-To') ) { + $head->add( 'RT-Relocated-Squelch-Replies-To', + $head->get('RT-Squelch-Replies-To') ); + $head->delete('RT-Squelch-Replies-To'); + } -EOT - MIMEObj => $args{'Message'}, - LogLevel => 'error' - ); - - # Also notify the requestor that his request has been dropped. - if ($args{'Requestor'} ne $RT::OwnerEmail) { - MailError( - To => $args{'Requestor'}, - Subject => "Could not load a valid user", - Explanation => <<EOT, -RT could not load a valid user, and RT's configuration does not allow -for the creation of a new user for your email. + if ($SquelchReplies) { + ## TODO: This is a hack. It should be some other way to + ## indicate that the transaction should be "silent". -EOT - MIMEObj => $args{'Message'}, - LogLevel => 'error' - ); + my ( $Sender, $junk ) = ParseSenderAddressFromHead($head); + $head->add( 'RT-Squelch-Replies-To', $Sender ); } -} -=head2 _HandleMachineGeneratedMail - -Takes named params: - Message - ErrorsTo - Subject + # }}} -Checks the message to see if it's a bounce, if it looks like a loop, if it's autogenerated, etc. -Returns a triple of ("Should we continue (boolean)", "New value for $ErrorsTo", "Status message", -"This message appears to be a loop (boolean)" ); + my $Ticket = RT::Ticket->new($CurrentUser); -=cut + # {{{ If we don't have a ticket Id, we're creating a new ticket + if ( !$args{'ticket'} ) { -sub _HandleMachineGeneratedMail { - my %args = ( Message => undef, ErrorsTo => undef, Subject => undef, MessageId => undef, @_ ); - my $head = $args{'Message'}->head; - my $ErrorsTo = $args{'ErrorsTo'}; + # {{{ Create a new ticket - my $IsBounce = CheckForBounce($head); + my @Cc; + my @Requestors = ( $CurrentUser->id ); - my $IsAutoGenerated = CheckForAutoGenerated($head); + if ($RT::ParseNewMessageForTicketCcs) { + @Cc = ParseCcAddressesFromHead( Head => $head, + CurrentUser => $CurrentUser, + QueueObj => $SystemQueueObj ); + } - my $IsSuspiciousSender = CheckForSuspiciousSender($head); + my ( $id, $Transaction, $ErrStr ) = $Ticket->Create( + Queue => $SystemQueueObj->Id, + Subject => $Subject, + Requestor => \@Requestors, + Cc => \@Cc, + MIMEObj => $Message ); + if ( $id == 0 ) { + MailError( To => $ErrorsTo, + Subject => "Ticket creation failed", + Explanation => $ErrStr, + MIMEObj => $Message ); + $RT::Logger->error("Create failed: $id / $Transaction / $ErrStr "); + return ( 0, "Ticket creation failed", $Ticket ); + } - my $IsALoop = CheckForLoops($head); + # }}} + } - my $SquelchReplies = 0; + # }}} - #If the message is autogenerated, we need to know, so we can not - # send mail to the sender - if ( $IsBounce || $IsSuspiciousSender || $IsAutoGenerated || $IsALoop ) { - $SquelchReplies = 1; - $ErrorsTo = $RT::OwnerEmail; - } + # If the action is comment, add a comment. + elsif ( $args{'action'} =~ /^(comment|correspond)$/i ) { + $Ticket->Load($args{'ticket'}); + unless ( $Ticket->Id ) { + my $message = "Could not find a ticket with id ".$args{'ticket'}; + MailError( To => $ErrorsTo, + Subject => "Message not recorded", + Explanation => $message, + MIMEObj => $Message ); - # Warn someone if it's a loop, before we drop it on the ground - if ($IsALoop) { - $RT::Logger->crit("RT Received mail (".$args{MessageId}.") from itself."); + return ( 0, $message); + } - #Should we mail it to RTOwner? - if ($RT::LoopsToRTOwner) { - MailError( - To => $RT::OwnerEmail, - Subject => "RT Bounce: ".$args{'Subject'}, - Explanation => "RT thinks this message may be a bounce", - MIMEObj => $args{Message} - ); + my ( $status, $msg ); + if ( $args{'action'} =~ /^correspond$/ ) { + ( $status, $msg ) = $Ticket->Correspond( MIMEObj => $Message ); } + else { + ( $status, $msg ) = $Ticket->Comment( MIMEObj => $Message ); + } + unless ($status) { - #Do we actually want to store it? - return ( 0, $ErrorsTo, "Message Bounced", $IsALoop ) unless ($RT::StoreLoops); + #Warn the sender that we couldn't actually submit the comment. + MailError( To => $ErrorsTo, + Subject => "Message not recorded", + Explanation => $msg, + MIMEObj => $Message ); + return ( 0, "Message not recorded", $Ticket ); + } } - # Squelch replies if necessary - # Don't let the user stuff the RT-Squelch-Replies-To header. - if ( $head->get('RT-Squelch-Replies-To') ) { - $head->add( - 'RT-Relocated-Squelch-Replies-To', - $head->get('RT-Squelch-Replies-To') - ); - $head->delete('RT-Squelch-Replies-To'); - } + else { - if ($SquelchReplies) { + #Return mail to the sender with an error + MailError( To => $ErrorsTo, + Subject => "RT Configuration error", + Explanation => "'" + . $args{'action'} + . "' not a recognized action." + . " Your RT administrator has misconfigured " + . "the mail aliases which invoke RT", + MIMEObj => $Message ); + $RT::Logger->crit( $args{'action'} . " type unknown for $MessageId" ); + return ( 0, "Configuration error: " . $args{'action'} . " not a recognized action", $Ticket ); - # Squelch replies to the sender, and also leave a clue to - # allow us to squelch ALL outbound messages. This way we - # can punt the logic of "what to do when we get a bounce" - # to the scrip. We might want to notify nobody. Or just - # the RT Owner. Or maybe all Privileged watchers. - my ( $Sender, $junk ) = ParseSenderAddressFromHead($head); - $head->add( 'RT-Squelch-Replies-To', $Sender ); - $head->add( 'RT-DetectedAutoGenerated', 'true' ); } - return ( 1, $ErrorsTo, "Handled machine detection", $IsALoop ); -} - -=head2 IsCorrectAction -Returns a list of valid actions we've found for this message -=cut - -sub IsCorrectAction { - my $action = shift; - my @actions = grep $_, split /-/, $action; - return ( 0, '(no value)' ) unless @actions; - foreach (@actions) { - return ( 0, $_ ) unless /^(?:comment|correspond|take|resolve)$/; - } - return ( 1, @actions ); +return ( 1, "Success", $Ticket ); } eval "require RT::Interface::Email_Vendor"; -die $@ if ( $@ && $@ !~ qr{^Can't locate RT/Interface/Email_Vendor.pm} ); +die $@ if ($@ && $@ !~ qr{^Can't locate RT/Interface/Email_Vendor.pm}); eval "require RT::Interface::Email_Local"; -die $@ if ( $@ && $@ !~ qr{^Can't locate RT/Interface/Email_Local.pm} ); +die $@ if ($@ && $@ !~ qr{^Can't locate RT/Interface/Email_Local.pm}); 1; diff --git a/rt/lib/RT/Interface/Web.pm b/rt/lib/RT/Interface/Web.pm index 4e5fca151..5097f54a4 100644 --- a/rt/lib/RT/Interface/Web.pm +++ b/rt/lib/RT/Interface/Web.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK ## Portions Copyright 2000 Tobias Brox <tobix@fsck.com> ## This is a library of static subs to be used by the Mason web @@ -64,176 +40,106 @@ use_ok(RT::Interface::Web); =cut -use strict; -use warnings; - package RT::Interface::Web; -use HTTP::Date; -use RT::SavedSearches; -use URI; - -# {{{ EscapeUTF8 - -=head2 EscapeUTF8 SCALARREF - -does a css-busting but minimalist escaping of whatever html you're passing in. - -=cut - -sub EscapeUTF8 { - my $ref = shift; - return unless defined $$ref; - my $val = $$ref; - use bytes; - $val =~ s/&/&/g; - $val =~ s/</</g; - $val =~ s/>/>/g; - $val =~ s/\(/(/g; - $val =~ s/\)/)/g; - $val =~ s/"/"/g; - $val =~ s/'/'/g; - $$ref = $val; - Encode::_utf8_on($$ref); - - -} - -# }}} - -# {{{ EscapeURI - -=head2 EscapeURI SCALARREF +use strict; -Escapes URI component according to RFC2396 -=cut -use Encode qw(); -sub EscapeURI { - my $ref = shift; - $$ref = Encode::encode_utf8( $$ref ); - $$ref =~ s/([^a-zA-Z0-9_.!~*'()-])/uc sprintf("%%%02X", ord($1))/eg; - Encode::_utf8_on( $$ref ); -} -# }}} -# {{{ WebCanonicalizeInfo +# {{{ sub NewApacheHandler -=head2 WebCanonicalizeInfo(); +=head2 NewApacheHandler -Different web servers set different environmental varibles. This -function must return something suitable for REMOTE_USER. By default, -just downcase $ENV{'REMOTE_USER'} + Takes extra options to pass to HTML::Mason::ApacheHandler->new + Returns a new Mason::ApacheHandler object =cut -sub WebCanonicalizeInfo { - my $user; - - if ( defined $ENV{'REMOTE_USER'} ) { - $user = lc ( $ENV{'REMOTE_USER'} ) if( length($ENV{'REMOTE_USER'}) ); - } +sub NewApacheHandler { + require HTML::Mason::ApacheHandler; + my $ah = new HTML::Mason::ApacheHandler( + + comp_root => [ + [ local => $RT::MasonLocalComponentRoot ], + [ standard => $RT::MasonComponentRoot ] + ], + args_method => "CGI", + default_escape_flags => 'h', + allow_globals => [qw(%session)], + data_dir => "$RT::MasonDataDir", + @_ + ); - return $user; + $ah->interp->set_escape( h => \&RT::Interface::Web::EscapeUTF8 ); + + return ($ah); } # }}} -# {{{ WebExternalAutoInfo +# {{{ sub NewCGIHandler -=head2 WebExternalAutoInfo($user); +=head2 NewCGIHandler -Returns a hash of user attributes, used when WebExternalAuto is set. + Returns a new Mason::CGIHandler object =cut -sub WebExternalAutoInfo { - my $user = shift; +sub NewCGIHandler { + my %args = ( + @_ + ); - my %user_info; + my $handler = HTML::Mason::CGIHandler->new( + comp_root => [ + [ local => $RT::MasonLocalComponentRoot ], + [ standard => $RT::MasonComponentRoot ] + ], + data_dir => "$RT::MasonDataDir", + default_escape_flags => 'h', + allow_globals => [qw(%session)] + ); + - # default to making Privileged users, even if they specify - # some other default Attributes - if (!$RT::AutoCreate || - ( ref($RT::AutoCreate) && not exists $RT::AutoCreate->{Privileged})) { - $user_info{'Privileged'} = 1; - } + $handler->interp->set_escape( h => \&RT::Interface::Web::EscapeUTF8 ); - if ($^O !~ /^(?:riscos|MacOS|MSWin32|dos|os2)$/) { - # Populate fields with information from Unix /etc/passwd - my ($comments, $realname) = (getpwnam($user))[5, 6]; - $user_info{'Comments'} = $comments if defined $comments; - $user_info{'RealName'} = $realname if defined $realname; - } - elsif ($^O eq 'MSWin32' and eval 'use Net::AdminMisc; 1') { - # Populate fields with information from NT domain controller - } + return ($handler); - # and return the wad of stuff - return {%user_info}; } - # }}} +# {{{ EscapeUTF8 -=head2 Redirect URL +=head2 EscapeUTF8 SCALARREF -This routine ells the current user's browser to redirect to URL. -Additionally, it unties the user's currently active session, helping to avoid -A bug in Apache::Session 1.81 and earlier which clobbers sessions if we try to use -a cached DBI statement handle twice at the same time. +does a css-busting but minimalist escaping of whatever html you're passing in. =cut +sub EscapeUTF8 { + my $ref = shift; + my $val = $$ref; + use bytes; + $val =~ s/&/&/g; + $val =~ s/</</g; + $val =~ s/>/>/g; + $val =~ s/\(/(/g; + $val =~ s/\)/)/g; + $val =~ s/"/"/g; + $val =~ s/'/'/g; + $$ref = $val; + Encode::_utf8_on($$ref); -sub Redirect { - my $redir_to = shift; - untie $HTML::Mason::Commands::session; - my $uri = URI->new($redir_to); - my $server_uri = URI->new($RT::WebURL); - - # If the user is coming in via a non-canonical - # hostname, don't redirect them to the canonical host, - # it will just upset them (and invalidate their credentials) - if ($uri->host eq $server_uri->host && - $uri->port eq $server_uri->port) { - $uri->host($ENV{'HTTP_HOST'}); - $uri->port($ENV{'SERVER_PORT'}); - } - - $HTML::Mason::Commands::m->redirect($uri->canonical); - $HTML::Mason::Commands::m->abort; } - -=head2 StaticFileHeaders - -Send the browser a few headers to try to get it to (somewhat agressively) -cache RT's static Javascript and CSS files. - -This routine could really use _accurate_ heuristics. (XXX TODO) - -=cut - -sub StaticFileHeaders { - # make cache public - $HTML::Mason::Commands::r->headers_out->{'Cache-Control'} = 'max-age=259200, public'; - - # Expire things in a month. - $HTML::Mason::Commands::r->headers_out->{'Expires'} = HTTP::Date::time2str( time() + 2592000 ); - - # if we set 'Last-Modified' then browser request a comp using 'If-Modified-Since' - # request, but we don't handle it and generate full reply again - # Last modified at server start time - #$HTML::Mason::Commands::r->headers_out->{'Last-Modified'} = HTTP::Date::time2str($^T); - -} +# }}} package HTML::Mason::Commands; +use strict; use vars qw/$r $m %session/; @@ -254,13 +160,10 @@ sub loc { UNIVERSAL::can($session{'CurrentUser'}, 'loc')){ return($session{'CurrentUser'}->loc(@_)); } - elsif ( my $u = eval { RT::CurrentUser->new($RT::SystemUser->Id) } ) { + else { + my $u = RT::CurrentUser->new($RT::SystemUser); return ($u->loc(@_)); } - else { - # pathetic case -- SystemUser is gone. - return $_[0]; - } } # }}} @@ -286,7 +189,7 @@ sub loc_fuzzy { return($session{'CurrentUser'}->loc_fuzzy($msg)); } else { - my $u = RT::CurrentUser->new($RT::SystemUser->Id); + my $u = RT::CurrentUser->new($RT::SystemUser); return ($u->loc_fuzzy($msg)); } } @@ -341,30 +244,23 @@ sub CreateTicket { my $starts = new RT::Date( $session{'CurrentUser'} ); $starts->Set( Format => 'unknown', Value => $ARGS{'Starts'} ); + my @Requestors = split ( /\s*,\s*/, $ARGS{'Requestors'} ); + my @Cc = split ( /\s*,\s*/, $ARGS{'Cc'} ); + my @AdminCc = split ( /\s*,\s*/, $ARGS{'AdminCc'} ); + my $MIMEObj = MakeMIMEEntity( Subject => $ARGS{'Subject'}, From => $ARGS{'From'}, Cc => $ARGS{'Cc'}, Body => $ARGS{'Content'}, - Type => $ARGS{'ContentType'}, ); - if ( $ARGS{'Attachments'} ) { - my $rv = $MIMEObj->make_multipart; - $RT::Logger->error("Couldn't make multipart message") - if !$rv || $rv !~ /^(?:DONE|ALREADY)$/; - - foreach ( values %{$ARGS{'Attachments'}} ) { - unless ( $_ ) { - $RT::Logger->error("Couldn't add empty attachemnt"); - next; - } - $MIMEObj->add_part($_); - } + if ($ARGS{'Attachments'}) { + $MIMEObj->make_multipart; + $MIMEObj->add_part($_) foreach values %{$ARGS{'Attachments'}}; } my %create_args = ( - Type => $ARGS{'Type'} || 'ticket', Queue => $ARGS{'Queue'}, Owner => $ARGS{'Owner'}, InitialPriority => $ARGS{'InitialPriority'}, @@ -372,106 +268,45 @@ sub CreateTicket { TimeLeft => $ARGS{'TimeLeft'}, TimeEstimated => $ARGS{'TimeEstimated'}, TimeWorked => $ARGS{'TimeWorked'}, + Requestor => \@Requestors, + Cc => \@Cc, + AdminCc => \@AdminCc, Subject => $ARGS{'Subject'}, Status => $ARGS{'Status'}, Due => $due->ISO, Starts => $starts->ISO, MIMEObj => $MIMEObj ); - - my @temp_squelch; - foreach my $type (qw(Requestors Cc AdminCc)) { - my @tmp = map { $_->format } grep { $_->address} Mail::Address->parse( $ARGS{ $type } ); - - $create_args{ $type } = [ - grep $_, map { - my $user = RT::User->new( $RT::SystemUser ); - $user->LoadOrCreateByEmail( $_ ); - # convert to ids to avoid work later - $user->id; - } @tmp - ]; - $RT::Logger->debug( - "$type got ".join(',',@{$create_args{ $type }}) ); - - } - # XXX: workaround for name conflict :( - $create_args{'Requestor'} = delete $create_args{'Requestors'}; - - foreach my $arg (keys %ARGS) { - next if $arg =~ /-(?:Magic|Category)$/; - - if ($arg =~ /^Object-RT::Transaction--CustomField-/) { - $create_args{$arg} = $ARGS{$arg}; - } - # Object-RT::Ticket--CustomField-3-Values - elsif ($arg =~ /^Object-RT::Ticket--CustomField-(\d+)(.*?)$/) { - my $cfid = $1; - my $cf = RT::CustomField->new( $session{'CurrentUser'}); - $cf->Load($cfid); - - if ( $cf->Type eq 'Freeform' && ! $cf->SingleValue) { - $ARGS{$arg} =~ s/\r\n/\n/g; - $ARGS{$arg} = [split('\n', $ARGS{$arg})]; - } - - if ( $cf->Type =~ /text/i) { # Catch both Text and Wikitext - $ARGS{$arg} =~ s/\r//g; - } - - if ( $arg =~ /-Upload$/ ) { - $create_args{"CustomField-".$cfid} = _UploadedFile($arg); - } - else { - $create_args{"CustomField-".$cfid} = $ARGS{"$arg"}; - } + foreach my $arg (%ARGS) { + if ($arg =~ /^CustomField-(\d+)(.*?)$/) { + next if ($arg =~ /-Magic$/); + $create_args{"CustomField-".$1} = $ARGS{"$arg"}; } } - - - # XXX TODO This code should be about six lines. and badly needs refactoring. - - # {{{ turn new link lists into arrays, and pass in the proper arguments - my (@dependson, @dependedonby, @parents, @children, @refersto, @referredtoby); - - foreach my $luri ( split ( / /, $ARGS{"new-DependsOn"} ) ) { - $luri =~ s/\s*$//; # Strip trailing whitespace - push @dependson, $luri; - } - $create_args{'DependsOn'} = \@dependson; - - foreach my $luri ( split ( / /, $ARGS{"DependsOn-new"} ) ) { - push @dependedonby, $luri; - } - $create_args{'DependedOnBy'} = \@dependedonby; - - foreach my $luri ( split ( / /, $ARGS{"new-MemberOf"} ) ) { - $luri =~ s/\s*$//; # Strip trailing whitespace - push @parents, $luri; + my ( $id, $Trans, $ErrMsg ) = $Ticket->Create(%create_args); + unless ( $id && $Trans ) { + Abort($ErrMsg); } - $create_args{'Parents'} = \@parents; + my @linktypes = qw( DependsOn MemberOf RefersTo ); - foreach my $luri ( split ( / /, $ARGS{"MemberOf-new"} ) ) { - push @children, $luri; - } - $create_args{'Children'} = \@children; + foreach my $linktype (@linktypes) { + foreach my $luri ( split ( / /, $ARGS{"new-$linktype"} ) ) { + $luri =~ s/\s*$//; # Strip trailing whitespace + my ( $val, $msg ) = $Ticket->AddLink( + Target => $luri, + Type => $linktype + ); + push ( @Actions, $msg ) unless ($val); + } - foreach my $luri ( split ( / /, $ARGS{"new-RefersTo"} ) ) { - $luri =~ s/\s*$//; # Strip trailing whitespace - push @refersto, $luri; - } - $create_args{'RefersTo'} = \@refersto; + foreach my $luri ( split ( / /, $ARGS{"$linktype-new"} ) ) { + my ( $val, $msg ) = $Ticket->AddLink( + Base => $luri, + Type => $linktype + ); - foreach my $luri ( split ( / /, $ARGS{"RefersTo-new"} ) ) { - push @referredtoby, $luri; - } - $create_args{'ReferredToBy'} = \@referredtoby; - # }}} - - - my ( $id, $Trans, $ErrMsg ) = $Ticket->Create(%create_args); - unless ( $id ) { - Abort($ErrMsg); + push ( @Actions, $msg ) unless ($val); + } } push ( @Actions, split("\n", $ErrMsg) ); @@ -530,10 +365,7 @@ sub ProcessUpdateMessage { ); #Make the update content have no 'weird' newlines in it - if ( $args{ARGSRef}->{'UpdateTimeWorked'} - || $args{ARGSRef}->{'UpdateContent'} - || $args{ARGSRef}->{'UpdateAttachments'} ) - { + if ( $args{ARGSRef}->{'UpdateContent'} ) { if ( $args{ARGSRef}->{'UpdateSubject'} eq $args{'TicketObj'}->Subject() ) @@ -542,77 +374,43 @@ sub ProcessUpdateMessage { } my $Message = MakeMIMEEntity( - Subject => $args{ARGSRef}->{'UpdateSubject'}, - Body => $args{ARGSRef}->{'UpdateContent'}, - Type => $args{ARGSRef}->{'UpdateContentType'}, + Subject => $args{ARGSRef}->{'UpdateSubject'}, + Body => $args{ARGSRef}->{'UpdateContent'}, ); - $Message->head->add( 'Message-ID' => - "<rt-" - . $RT::VERSION . "-" - . $$ . "-" - . CORE::time() . "-" - . int(rand(2000)) . "." - . $args{'TicketObj'}->id . "-" - . "0" . "-" # Scrip - . "0" . "@" # Email sent - . $RT::Organization - . ">" ); - my $old_txn = RT::Transaction->new( $session{'CurrentUser'} ); - if ( $args{ARGSRef}->{'QuoteTransaction'} ) { - $old_txn->Load( $args{ARGSRef}->{'QuoteTransaction'} ); - } - else { - $old_txn = $args{TicketObj}->Transactions->First(); + if ($args{ARGSRef}->{'UpdateAttachments'}) { + $Message->make_multipart; + $Message->add_part($_) foreach values %{$args{ARGSRef}->{'UpdateAttachments'}}; } - if ( $old_txn->Message && $old_txn->Message->First ) { - my @in_reply_to = split(/\s+/m, $old_txn->Message->First->GetHeader('In-Reply-To') || ''); - my @references = split(/\s+/m, $old_txn->Message->First->GetHeader('References') || '' ); - my @msgid = split(/\s+/m,$old_txn->Message->First->GetHeader('Message-ID') || ''); - my @rtmsgid = split(/\s+/m,$old_txn->Message->First->GetHeader('RT-Message-ID') || ''); - - $Message->head->replace( 'In-Reply-To', join (' ', @rtmsgid ? @rtmsgid : @msgid)); - $Message->head->replace( 'References', join(' ', @references, @msgid, @rtmsgid)); + ## TODO: Implement public comments + if ( $args{ARGSRef}->{'UpdateType'} =~ /^(private|public)$/ ) { + my ( $Transaction, $Description ) = $args{TicketObj}->Comment( + CcMessageTo => $args{ARGSRef}->{'UpdateCc'}, + BccMessageTo => $args{ARGSRef}->{'UpdateBcc'}, + MIMEObj => $Message, + TimeTaken => $args{ARGSRef}->{'UpdateTimeWorked'} + ); + push ( @{ $args{Actions} }, $Description ); + } + elsif ( $args{ARGSRef}->{'UpdateType'} eq 'response' ) { + my ( $Transaction, $Description ) = $args{TicketObj}->Correspond( + CcMessageTo => $args{ARGSRef}->{'UpdateCc'}, + BccMessageTo => $args{ARGSRef}->{'UpdateBcc'}, + MIMEObj => $Message, + TimeTaken => $args{ARGSRef}->{'UpdateTimeWorked'} + ); + push ( @{ $args{Actions} }, $Description ); + } + else { + push ( @{ $args{'Actions'} }, + loc("Update type was neither correspondence nor comment."). + " ". + loc("Update not recorded.") + ); } - - if ( $args{ARGSRef}->{'UpdateAttachments'} ) { - $Message->make_multipart; - $Message->add_part($_) - foreach values %{ $args{ARGSRef}->{'UpdateAttachments'} }; - } - - ## TODO: Implement public comments - if ( $args{ARGSRef}->{'UpdateType'} =~ /^(private|public)$/ ) { - my ( $Transaction, $Description, $Object ) = $args{TicketObj}->Comment( - CcMessageTo => $args{ARGSRef}->{'UpdateCc'}, - BccMessageTo => $args{ARGSRef}->{'UpdateBcc'}, - MIMEObj => $Message, - TimeTaken => $args{ARGSRef}->{'UpdateTimeWorked'} - ); - push( @{ $args{Actions} }, $Description ); - $Object->UpdateCustomFields( ARGSRef => $args{ARGSRef} ) if $Object; - } - elsif ( $args{ARGSRef}->{'UpdateType'} eq 'response' ) { - my ( $Transaction, $Description, $Object ) = - $args{TicketObj}->Correspond( - CcMessageTo => $args{ARGSRef}->{'UpdateCc'}, - BccMessageTo => $args{ARGSRef}->{'UpdateBcc'}, - MIMEObj => $Message, - TimeTaken => $args{ARGSRef}->{'UpdateTimeWorked'} - ); - push( @{ $args{Actions} }, $Description ); - $Object->UpdateCustomFields( ARGSRef => $args{ARGSRef} ) if $Object; - } - else { - push( - @{ $args{'Actions'} }, - loc("Update type was neither correspondence nor comment.") . " " - . loc("Update not recorded.") - ); } } -} # }}} @@ -622,8 +420,6 @@ sub ProcessUpdateMessage { Takes a paramhash Subject, Body and AttachmentFieldName. -Also takes Form, Cc and Type as optional paramhash keys. - Returns a MIME::Entity. =cut @@ -637,14 +433,12 @@ sub MakeMIMEEntity { Cc => undef, Body => undef, AttachmentFieldName => undef, - Type => undef, -# map Encode::encode_utf8($_), @_, - @_, + map Encode::encode_utf8($_), @_, ); #Make the update content have no 'weird' newlines in it - $args{'Body'} =~ s/\r\n/\n/gs if $args{'Body'}; + $args{'Body'} =~ s/\r\n/\n/gs; my $Message; { # MIME::Head is not happy in utf-8 domain. This only happens @@ -655,8 +449,6 @@ sub MakeMIMEEntity { Subject => $args{'Subject'} || "", From => $args{'From'}, Cc => $args{'Cc'}, - Type => $args{'Type'} || 'text/plain', - 'Charset:' => 'utf8', Data => [ $args{'Body'} ] ); } @@ -671,14 +463,7 @@ sub MakeMIMEEntity { #foreach my $filehandle (@filenames) { - my ( $fh, $temp_file ); - for ( 1 .. 10 ) { - # on NFS and NTFS, it is possible that tempfile() conflicts - # with other processes, causing a race condition. we try to - # accommodate this by pausing and retrying. - last if ($fh, $temp_file) = eval { tempfile( UNLINK => 1) }; - sleep 1; - } + my ( $fh, $temp_file ) = tempfile(); binmode $fh; #thank you, windows my ($buffer); @@ -696,7 +481,7 @@ sub MakeMIMEEntity { $Message->attach( Path => $temp_file, - Filename => Encode::decode_utf8($filename), + Filename => $filename, Type => $uploadinfo->{'Content-Type'}, ); close($fh); @@ -809,13 +594,13 @@ sub ProcessSearchQuery { # }}} # {{{ Limit requestor email - if ( $args{ARGS}->{'ValueOfWatcherRole'} ne '' ) { - $session{'tickets'}->LimitWatcher( - TYPE => $args{ARGS}->{'WatcherRole'}, - VALUE => $args{ARGS}->{'ValueOfWatcherRole'}, - OPERATOR => $args{ARGS}->{'WatcherRoleOp'}, + if ( $args{ARGS}->{'ValueOfRequestor'} ne '' ) { + my $alias = $session{'tickets'}->LimitRequestor( + VALUE => $args{ARGS}->{'ValueOfRequestor'}, + OPERATOR => $args{ARGS}->{'RequestorOp'}, ); + } # }}} @@ -960,6 +745,19 @@ sub ParseDateToISO { # }}} +# {{{ sub Config +# TODO: This might eventually read the cookies, user configuration +# information from the DB, queue configuration information from the +# DB, etc. + +sub Config { + my $args = shift; + my $key = shift; + return $args->{$key} || $RT::WebOptions{$key}; +} + +# }}} + # {{{ sub ProcessACLChanges sub ProcessACLChanges { @@ -982,13 +780,17 @@ sub ProcessACLChanges { my $obj; - if ($object_type eq 'RT::System') { - $obj = $RT::System; - } elsif ($RT::ACE::OBJECT_TYPES{$object_type}) { - $obj = $object_type->new($session{'CurrentUser'}); + if ($object_type eq 'RT::Queue') { + $obj = RT::Queue->new($session{'CurrentUser'}); + $obj->Load($object_id); + } elsif ($object_type eq 'RT::Group') { + $obj = RT::Group->new($session{'CurrentUser'}); $obj->Load($object_id); + + } elsif ($object_type eq 'RT::System') { + $obj = $RT::System; } else { - push (@results, loc("System Error"). ': '. + push (@results, loc("System Error"). loc("Rights could not be granted for [_1]", $object_type)); next; } @@ -1011,13 +813,17 @@ sub ProcessACLChanges { next unless ($right); my $obj; - if ($object_type eq 'RT::System') { - $obj = $RT::System; - } elsif ($RT::ACE::OBJECT_TYPES{$object_type}) { - $obj = $object_type->new($session{'CurrentUser'}); + if ($object_type eq 'RT::Queue') { + $obj = RT::Queue->new($session{'CurrentUser'}); + $obj->Load($object_id); + } elsif ($object_type eq 'RT::Group') { + $obj = RT::Group->new($session{'CurrentUser'}); $obj->Load($object_id); + + } elsif ($object_type eq 'RT::System') { + $obj = $RT::System; } else { - push (@results, loc("System Error"). ': '. + push (@results, loc("System Error"). loc("Rights could not be revoked for [_1]", $object_type)); next; } @@ -1053,12 +859,52 @@ sub UpdateRecordObject { @_ ); - my $Object = $args{'Object'}; - my @results = $Object->Update(AttributesRef => $args{'AttributesRef'}, - ARGSRef => $args{'ARGSRef'}, - AttributePrefix => $args{'AttributePrefix'} - ); + my (@results); + + my $object = $args{'Object'}; + my $attributes = $args{'AttributesRef'}; + my $ARGSRef = $args{'ARGSRef'}; + foreach my $attribute (@$attributes) { + my $value; + if ( defined $ARGSRef->{$attribute} ) { + $value = $ARGSRef->{$attribute}; + } + elsif ( + defined( $args{'AttributePrefix'} ) + && defined( + $ARGSRef->{ $args{'AttributePrefix'} . "-" . $attribute } + ) + ) { + $value = $ARGSRef->{ $args{'AttributePrefix'} . "-" . $attribute }; + + } else { + next; + } + $value =~ s/\r\n/\n/gs; + + if ($value ne $object->$attribute()){ + + my $method = "Set$attribute"; + my ( $code, $msg ) = $object->$method($value); + + push @results, loc($attribute) . ': ' . loc_fuzzy($msg); +=for loc + "[_1] could not be set to [_2].", # loc + "That is already the current value", # loc + "No value sent to _Set!\n", # loc + "Illegal value for [_1]", # loc + "The new value has been set.", # loc + "No column specified", # loc + "Immutable field", # loc + "Nonexistant field?", # loc + "Invalid data", # loc + "Couldn't find row", # loc + "Missing a primary key?: [_1]", # loc + "Found Object", # loc +=cut + }; + } return (@results); } @@ -1107,17 +953,6 @@ sub ProcessCustomFieldUpdates { my ( $err, $msg ) = $Object->DeleteValue($id); push ( @results, $msg ); } - - my $vals = $Object->Values(); - while (my $cfv = $vals->Next()) { - if (my $so = $ARGSRef->{ 'CustomField-' . $Object->Id . '-SortOrder' . $cfv->Id }) { - if ($cfv->SortOrder != $so) { - my ( $err, $msg ) = $cfv->SetSortOrder($so); - push ( @results, $msg ); - } - } - } - return (@results); } @@ -1150,12 +985,10 @@ sub ProcessTicketBasics { TimeEstimated TimeWorked TimeLeft - Type Status Queue ); - if ( $ARGSRef->{'Queue'} and ( $ARGSRef->{'Queue'} !~ /^(\d+)$/ ) ) { my $tempqueue = RT::Queue->new($RT::SystemUser); $tempqueue->Load( $ARGSRef->{'Queue'} ); @@ -1164,11 +997,6 @@ sub ProcessTicketBasics { } } - - # Status isn't a field that can be set to a null value. - # RT core complains if you try - delete $ARGSRef->{'Status'} unless ($ARGSRef->{'Status'}); - my @results = UpdateRecordObject( AttributesRef => \@attribs, Object => $TicketObj, @@ -1197,205 +1025,142 @@ sub ProcessTicketBasics { # }}} -sub ProcessTicketCustomFieldUpdates { - my %args = @_; - $args{'Object'} = delete $args{'TicketObj'}; - my $ARGSRef = { %{ $args{'ARGSRef'} } }; +# {{{ Sub ProcessTicketCustomFieldUpdates - # Build up a list of objects that we want to work with - my %custom_fields_to_mod; - foreach my $arg ( keys %$ARGSRef ) { - if ( $arg =~ /^Ticket-(\d+-.*)/) { - $ARGSRef->{"Object-RT::Ticket-$1"} = delete $ARGSRef->{$arg}; - } - elsif ( $arg =~ /^CustomField-(\d+-.*)/) { - $ARGSRef->{"Object-RT::Ticket--$1"} = delete $ARGSRef->{$arg}; - } - } +sub ProcessTicketCustomFieldUpdates { + my %args = ( + ARGSRef => undef, + @_ + ); - return ProcessObjectCustomFieldUpdates(%args, ARGSRef => $ARGSRef); -} + my @results; -sub ProcessObjectCustomFieldUpdates { - my %args = @_; my $ARGSRef = $args{'ARGSRef'}; - my @results; - # Build up a list of objects that we want to work with + # Build up a list of tickets that we want to work with + my %tickets_to_mod; my %custom_fields_to_mod; - foreach my $arg ( keys %$ARGSRef ) { - # format: Object-<object class>-<object id>-CustomField-<CF id>-<commands> - next unless $arg =~ /^Object-([\w:]+)-(\d*)-CustomField-(\d+)-(.*)$/; - - # For each of those objects, find out what custom fields we want to work with. - $custom_fields_to_mod{ $1 }{ $2 || 0 }{ $3 }{ $4 } = $ARGSRef->{ $arg }; - } - - # For each of those objects - foreach my $class ( keys %custom_fields_to_mod ) { - foreach my $id ( keys %{$custom_fields_to_mod{$class}} ) { - my $Object = $args{'Object'}; - $Object = $class->new( $session{'CurrentUser'} ) - unless $Object && ref $Object eq $class; - - $Object->Load( $id ) unless ($Object->id || 0) == $id; - unless ( $Object->id ) { - $RT::Logger->warning("Couldn't load object $class #$id"); - next; - } + foreach my $arg ( keys %{$ARGSRef} ) { + if ( $arg =~ /^Ticket-(\d+)-CustomField-(\d+)-/ ) { - foreach my $cf ( keys %{ $custom_fields_to_mod{ $class }{ $id } } ) { - my $CustomFieldObj = RT::CustomField->new( $session{'CurrentUser'} ); - $CustomFieldObj->LoadById( $cf ); - unless ( $CustomFieldObj->id ) { - $RT::Logger->warning("Couldn't load custom field #$id"); - next; - } - push @results, _ProcessObjectCustomFieldUpdates( - Prefix => "Object-$class-$id-CustomField-$cf-", - Object => $Object, - CustomField => $CustomFieldObj, - ARGS => $custom_fields_to_mod{$class}{$id}{$cf}, - ); - } + # For each of those tickets, find out what custom fields we want to work with. + $custom_fields_to_mod{$1}{$2} = 1; } } - return @results; -} - -sub _ProcessObjectCustomFieldUpdates { - my %args = @_; - my $cf = $args{'CustomField'}; - my $cf_type = $cf->Type; - - my @results; - foreach my $arg ( keys %{ $args{'ARGS'} } ) { - - next if $arg =~ /Category$/; - # since http won't pass in a form element with a null value, we need - # to fake it - if ( $arg eq 'Values-Magic' ) { - # We don't care about the magic, if there's really a values element; - next if $args{'ARGS'}->{'Value'} || $args{'ARGS'}->{'Values'}; + # For each of those tickets + foreach my $tick ( keys %custom_fields_to_mod ) { + my $Ticket = RT::Ticket->new( $session{'CurrentUser'} ); + $Ticket->Load($tick); - # "Empty" values does not mean anything for Image and Binary fields - next if $cf_type =~ /^(?:Image|Binary)$/; + # For each custom field + foreach my $cf ( keys %{ $custom_fields_to_mod{$tick} } ) { - $arg = 'Values'; - $args{'ARGS'}->{'Values'} = undef; - } + my $CustomFieldObj = RT::CustomField->new($session{'CurrentUser'}); + $CustomFieldObj->LoadById($cf); - my @values = (); - if ( ref $args{'ARGS'}->{ $arg } eq 'ARRAY' ) { - @values = @{ $args{'ARGS'}->{$arg} }; - } elsif ( $cf_type =~ /text/i ) { # Both Text and Wikitext - @values = ($args{'ARGS'}->{$arg}); - } elsif ( defined( $args{'ARGS'}->{ $arg } ) ) { - @values = split /\n/, $args{'ARGS'}->{ $arg }; - } - - if ( ( $cf_type eq 'Freeform' && !$cf->SingleValue ) || $cf_type =~ /text/i ) { - s/\r//g foreach @values; - } - @values = grep defined && $_ ne '', @values; + foreach my $arg ( keys %{$ARGSRef} ) { + # since http won't pass in a form element with a null value, we need + # to fake it + if ($arg =~ /^(.*?)-Values-Magic$/ ) { + # We don't care about the magic, if there's really a values element; + next if (exists $ARGSRef->{$1.'-Values'}) ; - if ( $arg eq 'AddValue' || $arg eq 'Value' ) { - foreach my $value (@values) { - my ( $val, $msg ) = $args{'Object'}->AddCustomFieldValue( - Field => $cf->id, - Value => $value - ); - push ( @results, $msg ); - } - } - elsif ( $arg eq 'Upload' ) { - my $value_hash = _UploadedFile( $args{'Prefix'} . $arg ) or next; - my ( $val, $msg ) = $args{'Object'}->AddCustomFieldValue( - %$value_hash, - Field => $cf, - ); - push ( @results, $msg ); - } - elsif ( $arg eq 'DeleteValues' ) { - foreach my $value ( @values ) { - my ( $val, $msg ) = $args{'Object'}->DeleteCustomFieldValue( - Field => $cf, - Value => $value, - ); - push ( @results, $msg ); - } - } - elsif ( $arg eq 'DeleteValueIds' ) { - foreach my $value ( @values ) { - my ( $val, $msg ) = $args{'Object'}->DeleteCustomFieldValue( - Field => $cf, - ValueId => $value, - ); - push ( @results, $msg ); - } - } - elsif ( $arg eq 'Values' && !$cf->Repeated ) { - my $cf_values = $args{'Object'}->CustomFieldValues( $cf->id ); - - my %values_hash; - foreach my $value ( @values ) { - # build up a hash of values that the new set has - $values_hash{$value} = 1; - next if $cf_values->HasEntry( $value ); - - my ( $val, $msg ) = $args{'Object'}->AddCustomFieldValue( - Field => $cf, - Value => $value - ); - push ( @results, $msg ); - } - - $cf_values->RedoSearch; - while ( my $cf_value = $cf_values->Next ) { - next if $values_hash{ $cf_value->Content }; - - my ( $val, $msg ) = $args{'Object'}->DeleteCustomFieldValue( - Field => $cf, - Value => $cf_value->Content - ); - push ( @results, $msg); - } - } - elsif ( $arg eq 'Values' ) { - my $cf_values = $args{'Object'}->CustomFieldValues( $cf->id ); - - # keep everything up to the point of difference, delete the rest - my $delete_flag; - foreach my $old_cf (@{$cf_values->ItemsArrayRef}) { - if (!$delete_flag and @values and $old_cf->Content eq $values[0]) { - shift @values; - next; + $arg = $1."-Values"; + $ARGSRef->{$1."-Values"} = undef; + + } + next unless ( $arg =~ /^Ticket-$tick-CustomField-$cf-/ ); + my @values = + ( ref( $ARGSRef->{$arg} ) eq 'ARRAY' ) + ? @{ $ARGSRef->{$arg} } + : ( $ARGSRef->{$arg} ); + if ( ( $arg =~ /-AddValue$/ ) || ( $arg =~ /-Value$/ ) ) { + foreach my $value (@values) { + next unless ($value); + my ( $val, $msg ) = $Ticket->AddCustomFieldValue( + Field => $cf, + Value => $value + ); + push ( @results, $msg ); + } + } + elsif ( $arg =~ /-DeleteValues$/ ) { + foreach my $value (@values) { + next unless ($value); + my ( $val, $msg ) = $Ticket->DeleteCustomFieldValue( + Field => $cf, + Value => $value + ); + push ( @results, $msg ); + } + } + elsif ( $arg =~ /-Values$/ and $CustomFieldObj->Type !~ /Entry/) { + my $cf_values = $Ticket->CustomFieldValues($cf); + + my %values_hash; + foreach my $value (@values) { + next unless ($value); + + # build up a hash of values that the new set has + $values_hash{$value} = 1; + + unless ( $cf_values->HasEntry($value) ) { + my ( $val, $msg ) = $Ticket->AddCustomFieldValue( + Field => $cf, + Value => $value + ); + push ( @results, $msg ); + } + + } + while ( my $cf_value = $cf_values->Next ) { + unless ( $values_hash{ $cf_value->Content } == 1 ) { + my ( $val, $msg ) = $Ticket->DeleteCustomFieldValue( + Field => $cf, + Value => $cf_value->Content + ); + push ( @results, $msg); + + } + + } + } + elsif ( $arg =~ /-Values$/ ) { + my $cf_values = $Ticket->CustomFieldValues($cf); + + # keep everything up to the point of difference, delete the rest + my $delete_flag; + foreach my $old_cf (@{$cf_values->ItemsArrayRef}) { + if (!$delete_flag and @values and $old_cf->Content eq $values[0]) { + shift @values; + next; + } + + $delete_flag ||= 1; + $old_cf->Delete; + } + + # now add/replace extra things, if any + foreach my $value (@values) { + my ( $val, $msg ) = $Ticket->AddCustomFieldValue( + Field => $cf, + Value => $value + ); + push ( @results, $msg ); + } + } + else { + push ( @results, "User asked for an unknown update type for custom field " . $cf->Name . " for ticket " . $Ticket->id ); } - - $delete_flag ||= 1; - $old_cf->Delete; - } - - # now add/replace extra things, if any - foreach my $value ( @values ) { - my ( $val, $msg ) = $args{'Object'}->AddCustomFieldValue( - Field => $cf, - Value => $value - ); - push ( @results, $msg ); } } - else { - push ( @results, - loc("User asked for an unknown update type for custom field [_1] for [_2] object #[_3]", - $cf->Name, ref $args{'Object'}, $args{'Object'}->id ) - ); - } + return (@results); } - return @results; } +# }}} + # {{{ sub ProcessTicketWatchers =head2 ProcessTicketWatchers ( TicketObj => $Ticket, ARGSRef => \%ARGS ); @@ -1415,30 +1180,27 @@ sub ProcessTicketWatchers { my $Ticket = $args{'TicketObj'}; my $ARGSRef = $args{'ARGSRef'}; - # Munge watchers + # {{{ Munge watchers foreach my $key ( keys %$ARGSRef ) { - # Delete deletable watchers - if ( ( $key =~ /^Ticket-DeleteWatcher-Type-(.*)-Principal-(\d+)$/ ) ) - { - my ( $code, $msg ) = $Ticket->DeleteWatcher( - PrincipalId => $2, - Type => $1 - ); + # {{{ Delete deletable watchers + if ( ( $key =~ /^Ticket-DelWatcher-Type-(.*)-Principal-(\d+)$/ ) ) { + my ( $code, $msg ) = + $Ticket->DeleteWatcher(PrincipalId => $2, + Type => $1); push @results, $msg; } # Delete watchers in the simple style demanded by the bulk manipulator elsif ( $key =~ /^Delete(Requestor|Cc|AdminCc)$/ ) { - my ( $code, $msg ) = $Ticket->DeleteWatcher( - Email => $ARGSRef->{$key}, - Type => $1 - ); + my ( $code, $msg ) = $Ticket->DeleteWatcher( Type => $ARGSRef->{$key}, PrincipalId => $1 ); push @results, $msg; } - # Add new wathchers by email address + # }}} + + # Add new wathchers by email address elsif ( ( $ARGSRef->{$key} =~ /^(AdminCc|Cc|Requestor)$/ ) and ( $key =~ /^WatcherTypeEmail(\d*)$/ ) ) { @@ -1461,21 +1223,18 @@ sub ProcessTicketWatchers { } # Add new watchers by owner - elsif ( $key =~ /^Ticket-AddWatcher-Principal-(\d*)$/ ) { - my $principal_id = $1; - my $form = $ARGSRef->{$key}; - foreach my $value ( ref($form) ? @{$form} : ($form) ) { - next unless $value =~ /^(?:AdminCc|Cc|Requestor)$/i; + elsif ( ( $ARGSRef->{$key} =~ /^(AdminCc|Cc|Requestor)$/ ) + and ( $key =~ /^Ticket-AddWatcher-Principal-(\d*)$/ ) ) { - my ( $code, $msg ) = $Ticket->AddWatcher( - Type => $value, - PrincipalId => $principal_id - ); - push @results, $msg; - } + #They're in this order because otherwise $1 gets clobbered :/ + my ( $code, $msg ) = + $Ticket->AddWatcher( Type => $ARGSRef->{$key}, PrincipalId => $1 ); + push @results, $msg; } - } + + # }}} + return (@results); } @@ -1517,7 +1276,7 @@ sub ProcessTicketDates { my $DateObj = RT::Date->new( $session{'CurrentUser'} ); #If it's something other than just whitespace - if ( $ARGSRef->{ $field . '_Date' } && ($ARGSRef->{ $field . '_Date' } ne '') ) { + if ( $ARGSRef->{ $field . '_Date' } ne '' ) { $DateObj->Set( Format => 'unknown', Value => $ARGSRef->{ $field . '_Date' } @@ -1555,30 +1314,6 @@ sub ProcessTicketLinks { my $Ticket = $args{'TicketObj'}; my $ARGSRef = $args{'ARGSRef'}; - - my (@results) = ProcessRecordLinks(RecordObj => $Ticket, - ARGSRef => $ARGSRef); - - #Merge if we need to - if ( $ARGSRef->{ $Ticket->Id . "-MergeInto" } ) { - my ( $val, $msg ) = - $Ticket->MergeInto( $ARGSRef->{ $Ticket->Id . "-MergeInto" } ); - push @results, $msg; - } - - return (@results); -} - -# }}} - -sub ProcessRecordLinks { - my %args = ( RecordObj => undef, - ARGSRef => undef, - @_ ); - - my $Record = $args{'RecordObj'}; - my $ARGSRef = $args{'ARGSRef'}; - my (@results); # Delete links that are gone gone gone. @@ -1590,7 +1325,7 @@ sub ProcessRecordLinks { push @results, "Trying to delete: Base: $base Target: $target Type $type"; - my ( $val, $msg ) = $Record->DeleteLink( Base => $base, + my ( $val, $msg ) = $Ticket->DeleteLink( Base => $base, Type => $type, Target => $target ); @@ -1603,18 +1338,18 @@ sub ProcessRecordLinks { my @linktypes = qw( DependsOn MemberOf RefersTo ); foreach my $linktype (@linktypes) { - if ( $ARGSRef->{ $Record->Id . "-$linktype" } ) { - for my $luri ( split ( / /, $ARGSRef->{ $Record->Id . "-$linktype" } ) ) { + if ( $ARGSRef->{ $Ticket->Id . "-$linktype" } ) { + for my $luri ( split ( / /, $ARGSRef->{ $Ticket->Id . "-$linktype" } ) ) { $luri =~ s/\s*$//; # Strip trailing whitespace - my ( $val, $msg ) = $Record->AddLink( Target => $luri, + my ( $val, $msg ) = $Ticket->AddLink( Target => $luri, Type => $linktype ); push @results, $msg; } } - if ( $ARGSRef->{ "$linktype-" . $Record->Id } ) { + if ( $ARGSRef->{ "$linktype-" . $Ticket->Id } ) { - for my $luri ( split ( / /, $ARGSRef->{ "$linktype-" . $Record->Id } ) ) { - my ( $val, $msg ) = $Record->AddLink( Base => $luri, + for my $luri ( split ( / /, $ARGSRef->{ "$linktype-" . $Ticket->Id } ) ) { + my ( $val, $msg ) = $Ticket->AddLink( Base => $luri, Type => $linktype ); push @results, $msg; @@ -1622,68 +1357,18 @@ sub ProcessRecordLinks { } } - return (@results); -} - - -=head2 _UploadedFile ( $arg ); - -Takes a CGI parameter name; if a file is uploaded under that name, -return a hash reference suitable for AddCustomFieldValue's use: -C<( Value => $filename, LargeContent => $content, ContentType => $type )>. - -Returns C<undef> if no files were uploaded in the C<$arg> field. - -=cut - -sub _UploadedFile { - my $arg = shift; - my $cgi_object = $m->cgi_object; - my $fh = $cgi_object->upload($arg) or return undef; - my $upload_info = $cgi_object->uploadInfo($fh); - - my $filename = "$fh"; - $filename =~ s#^.*[\\/]##; - binmode($fh); - - return { - Value => $filename, - LargeContent => do { local $/; scalar <$fh> }, - ContentType => $upload_info->{'Content-Type'}, - }; -} - -=head2 _load_container_object ( $type, $id ); - -Instantiate container object for saving searches. - -=cut - -sub _load_container_object { - my ($obj_type, $obj_id) = @_; - return RT::SavedSearch->new($session{'CurrentUser'})->_load_privacy_object($obj_type, $obj_id); -} - -=head2 _parse_saved_search ( $arg ); - -Given a serialization string for saved search, and returns the -container object and the search id. - -=cut - -sub _parse_saved_search { - my $spec = shift; - return unless $spec; - if ($spec !~ /^(.*?)-(\d+)-SavedSearch-(\d+)$/ ) { - return; + #Merge if we need to + if ( $ARGSRef->{ $Ticket->Id . "-MergeInto" } ) { + my ( $val, $msg ) = + $Ticket->MergeInto( $ARGSRef->{ $Ticket->Id . "-MergeInto" } ); + push @results, $msg; } - my $obj_type = $1; - my $obj_id = $2; - my $search_id = $3; - return (_load_container_object ($obj_type, $obj_id), $search_id); + return (@results); } +# }}} + eval "require RT::Interface::Web_Vendor"; die $@ if ($@ && $@ !~ qr{^Can't locate RT/Interface/Web_Vendor.pm}); eval "require RT::Interface::Web_Local"; diff --git a/rt/lib/RT/Interface/Web_Vendor.pm b/rt/lib/RT/Interface/Web_Vendor.pm new file mode 100644 index 000000000..1999096a7 --- /dev/null +++ b/rt/lib/RT/Interface/Web_Vendor.pm @@ -0,0 +1,201 @@ +# Copyright (c) 2004 Ivan Kohler <ivan-rt@420.am> +# Copyright (c) 2008 Freeside Internet Services, Inc. +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +=head1 NAME + +RT::Interface::Web_Vendor + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +Freeside vendor overlay for RT::Interface::Web. + +=begin testing + +use_ok(RT::Interface::Web_Vendor); + +=end testing + +=cut + +#package RT::Interface::Web; +#use strict; + +package HTML::Mason::Commands; +use strict; + +=head2 ProcessTicketCustomers + +=cut + +sub ProcessTicketCustomers { + my %args = ( + TicketObj => undef, + ARGSRef => undef, + Debug => 0, + @_ + ); + my @results = (); + + my $Ticket = $args{'TicketObj'}; + my $ARGSRef = $args{'ARGSRef'}; + my $Debug = $args{'Debug'}; + my $me = 'ProcessTicketCustomers'; + + ### false laziness w/RT::Interface::Web::ProcessTicketLinks + # Delete links that are gone gone gone. + foreach my $arg ( keys %$ARGSRef ) { + if ( $arg =~ /DeleteLink-(.*?)-(DependsOn|MemberOf|RefersTo)-(.*)$/ ) { + my $base = $1; + my $type = $2; + my $target = $3; + + push @results, + "Trying to delete: Base: $base Target: $target Type $type"; + my ( $val, $msg ) = $Ticket->DeleteLink( Base => $base, + Type => $type, + Target => $target ); + + push @results, $msg; + + } + + } + ### + + ### + #find new customers + ### + + my @custnums = map { /^Ticket-AddCustomer-(\d+)$/; $1 } + grep { /^Ticket-AddCustomer-(\d+)$/ && $ARGSRef->{$_} } + keys %$ARGSRef; + + #my @delete_custnums = + # map { /^Ticket-AddCustomer-(\d+)$/; $1 } + # grep { /^Ticket-AddCustomer-(\d+)$/ && $ARGSRef->{$_} } + # keys %$ARGSRef; + + ### + #figure out if we're going to auto-link requestors, and find them if so + ### + + my $num_cur_cust = $Ticket->Customers->Count; + my $num_new_cust = scalar(@custnums); + warn "$me: $num_cur_cust current customers / $num_new_cust new customers\n" + if $Debug; + + #if we're linking the first ticket to one customer + my $link_requestors = ( $num_cur_cust == 0 && $num_new_cust == 1 ); + warn "$me: adding a single customer to a previously customerless". + " ticket, so linking customers to requestor too\n" + if $Debug && $link_requestors; + + my @Requestors = (); + if ( $link_requestors ) { + + #find any requestors without customers + @Requestors = + grep { ! $_->Customers->Count } + @{ $Ticket->Requestors->UserMembersObj->ItemsArrayRef }; + + warn "$me: found ". scalar(@Requestors). " requestors without". + " customers; linking them\n" + if $Debug; + + } + + ### + #link ticket (and requestors) to customers + ### + + foreach my $custnum ( @custnums ) { + + my @link = ( 'Type' => 'MemberOf', + 'Target' => "freeside://freeside/cust_main/$custnum", + ); + + my( $val, $msg ) = $Ticket->AddLink(@link); + push @results, $msg; + + #add customer links to requestors + foreach my $Requestor ( @Requestors ) { + my( $val, $msg ) = $Requestor->AddLink(@link); + push @results, $msg; + warn "$me: linking requestor to custnum $custnum: $msg\n" + if $Debug > 1; + } + + } + + return @results; + +} + +#false laziness w/above... eventually it should go away in favor of this +sub ProcessObjectCustomers { + my %args = ( + Object => undef, + ARGSRef => undef, + @_ + ); + my @results = (); + + my $Object = $args{'Object'}; + my $ARGSRef = $args{'ARGSRef'}; + + ### false laziness w/RT::Interface::Web::ProcessTicketLinks + # Delete links that are gone gone gone. + foreach my $arg ( keys %$ARGSRef ) { + if ( $arg =~ /DeleteLink-(.*?)-(DependsOn|MemberOf|RefersTo)-(.*)$/ ) { + my $base = $1; + my $type = $2; + my $target = $3; + + push @results, + "Trying to delete: Base: $base Target: $target Type $type"; + my ( $val, $msg ) = $Object->DeleteLink( Base => $base, + Type => $type, + Target => $target ); + + push @results, $msg; + + } + + } + ### + + #my @delete_custnums = + # map { /^Object-AddCustomer-(\d+)$/; $1 } + # grep { /^Object-AddCustomer-(\d+)$/ && $ARGSRef->{$_} } + # keys %$ARGSRef; + + my @custnums = map { /^Object-AddCustomer-(\d+)$/; $1 } + grep { /^Object-AddCustomer-(\d+)$/ && $ARGSRef->{$_} } + keys %$ARGSRef; + + foreach my $custnum ( @custnums ) { + my( $val, $msg ) = + $Object->AddLink( 'Type' => 'MemberOf', + 'Target' => "freeside://freeside/cust_main/$custnum", + ); + push @results, $msg; + } + + return @results; + +} + +1; + diff --git a/rt/lib/RT/Link.pm b/rt/lib/RT/Link.pm index 8737b504e..962c378a8 100644 --- a/rt/lib/RT/Link.pm +++ b/rt/lib/RT/Link.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: @@ -122,7 +98,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -131,14 +107,14 @@ Returns the current value of id. =cut -=head2 Base +=item Base Returns the current value of Base. (In the database, Base is stored as varchar(240).) -=head2 SetBase VALUE +=item SetBase VALUE Set Base to VALUE. @@ -149,14 +125,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Target +=item Target Returns the current value of Target. (In the database, Target is stored as varchar(240).) -=head2 SetTarget VALUE +=item SetTarget VALUE Set Target to VALUE. @@ -167,14 +143,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Type +=item Type Returns the current value of Type. (In the database, Type is stored as varchar(20).) -=head2 SetType VALUE +=item SetType VALUE Set Type to VALUE. @@ -185,14 +161,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 LocalTarget +=item LocalTarget Returns the current value of LocalTarget. (In the database, LocalTarget is stored as int(11).) -=head2 SetLocalTarget VALUE +=item SetLocalTarget VALUE Set LocalTarget to VALUE. @@ -203,14 +179,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 LocalBase +=item LocalBase Returns the current value of LocalBase. (In the database, LocalBase is stored as int(11).) -=head2 SetLocalBase VALUE +=item SetLocalBase VALUE Set LocalBase to VALUE. @@ -221,7 +197,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 LastUpdatedBy +=item LastUpdatedBy Returns the current value of LastUpdatedBy. (In the database, LastUpdatedBy is stored as int(11).) @@ -230,7 +206,7 @@ Returns the current value of LastUpdatedBy. =cut -=head2 LastUpdated +=item LastUpdated Returns the current value of LastUpdated. (In the database, LastUpdated is stored as datetime.) @@ -239,7 +215,7 @@ Returns the current value of LastUpdated. =cut -=head2 Creator +=item Creator Returns the current value of Creator. (In the database, Creator is stored as int(11).) @@ -248,7 +224,7 @@ Returns the current value of Creator. =cut -=head2 Created +=item Created Returns the current value of Created. (In the database, Created is stored as datetime.) @@ -258,29 +234,29 @@ Returns the current value of Created. -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, type => 'int(11)', default => ''}, Base => - {read => 1, write => 1, sql_type => 12, length => 240, is_blob => 0, is_numeric => 0, type => 'varchar(240)', default => ''}, + {read => 1, write => 1, type => 'varchar(240)', default => ''}, Target => - {read => 1, write => 1, sql_type => 12, length => 240, is_blob => 0, is_numeric => 0, type => 'varchar(240)', default => ''}, + {read => 1, write => 1, type => 'varchar(240)', default => ''}, Type => - {read => 1, write => 1, sql_type => 12, length => 20, is_blob => 0, is_numeric => 0, type => 'varchar(20)', default => ''}, + {read => 1, write => 1, type => 'varchar(20)', default => ''}, LocalTarget => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, LocalBase => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, LastUpdatedBy => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, LastUpdated => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, Creator => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, Created => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, } }; @@ -312,7 +288,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Links.pm b/rt/lib/RT/Links.pm index 47d78fc3a..7a1773af9 100644 --- a/rt/lib/RT/Links.pm +++ b/rt/lib/RT/Links.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::Link item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Queue.pm b/rt/lib/RT/Queue.pm index 42fa04c11..b362c9f0d 100755 --- a/rt/lib/RT/Queue.pm +++ b/rt/lib/RT/Queue.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: @@ -131,7 +107,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -140,14 +116,14 @@ Returns the current value of id. =cut -=head2 Name +=item Name Returns the current value of Name. (In the database, Name is stored as varchar(200).) -=head2 SetName VALUE +=item SetName VALUE Set Name to VALUE. @@ -158,14 +134,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Description +=item Description Returns the current value of Description. (In the database, Description is stored as varchar(255).) -=head2 SetDescription VALUE +=item SetDescription VALUE Set Description to VALUE. @@ -176,14 +152,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 CorrespondAddress +=item CorrespondAddress Returns the current value of CorrespondAddress. (In the database, CorrespondAddress is stored as varchar(120).) -=head2 SetCorrespondAddress VALUE +=item SetCorrespondAddress VALUE Set CorrespondAddress to VALUE. @@ -194,14 +170,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 CommentAddress +=item CommentAddress Returns the current value of CommentAddress. (In the database, CommentAddress is stored as varchar(120).) -=head2 SetCommentAddress VALUE +=item SetCommentAddress VALUE Set CommentAddress to VALUE. @@ -212,14 +188,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 InitialPriority +=item InitialPriority Returns the current value of InitialPriority. (In the database, InitialPriority is stored as int(11).) -=head2 SetInitialPriority VALUE +=item SetInitialPriority VALUE Set InitialPriority to VALUE. @@ -230,14 +206,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 FinalPriority +=item FinalPriority Returns the current value of FinalPriority. (In the database, FinalPriority is stored as int(11).) -=head2 SetFinalPriority VALUE +=item SetFinalPriority VALUE Set FinalPriority to VALUE. @@ -248,14 +224,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 DefaultDueIn +=item DefaultDueIn Returns the current value of DefaultDueIn. (In the database, DefaultDueIn is stored as int(11).) -=head2 SetDefaultDueIn VALUE +=item SetDefaultDueIn VALUE Set DefaultDueIn to VALUE. @@ -266,7 +242,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Creator +=item Creator Returns the current value of Creator. (In the database, Creator is stored as int(11).) @@ -275,7 +251,7 @@ Returns the current value of Creator. =cut -=head2 Created +=item Created Returns the current value of Created. (In the database, Created is stored as datetime.) @@ -284,7 +260,7 @@ Returns the current value of Created. =cut -=head2 LastUpdatedBy +=item LastUpdatedBy Returns the current value of LastUpdatedBy. (In the database, LastUpdatedBy is stored as int(11).) @@ -293,7 +269,7 @@ Returns the current value of LastUpdatedBy. =cut -=head2 LastUpdated +=item LastUpdated Returns the current value of LastUpdated. (In the database, LastUpdated is stored as datetime.) @@ -302,14 +278,14 @@ Returns the current value of LastUpdated. =cut -=head2 Disabled +=item Disabled Returns the current value of Disabled. (In the database, Disabled is stored as smallint(6).) -=head2 SetDisabled VALUE +=item SetDisabled VALUE Set Disabled to VALUE. @@ -321,35 +297,35 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, type => 'int(11)', default => ''}, Name => - {read => 1, write => 1, sql_type => 12, length => 200, is_blob => 0, is_numeric => 0, type => 'varchar(200)', default => ''}, + {read => 1, write => 1, type => 'varchar(200)', default => ''}, Description => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, + {read => 1, write => 1, type => 'varchar(255)', default => ''}, CorrespondAddress => - {read => 1, write => 1, sql_type => 12, length => 120, is_blob => 0, is_numeric => 0, type => 'varchar(120)', default => ''}, + {read => 1, write => 1, type => 'varchar(120)', default => ''}, CommentAddress => - {read => 1, write => 1, sql_type => 12, length => 120, is_blob => 0, is_numeric => 0, type => 'varchar(120)', default => ''}, + {read => 1, write => 1, type => 'varchar(120)', default => ''}, InitialPriority => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, FinalPriority => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, DefaultDueIn => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Creator => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, Created => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, LastUpdatedBy => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, LastUpdated => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, Disabled => - {read => 1, write => 1, sql_type => 5, length => 6, is_blob => 0, is_numeric => 1, type => 'smallint(6)', default => '0'}, + {read => 1, write => 1, type => 'smallint(6)', default => '0'}, } }; @@ -381,7 +357,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Queues.pm b/rt/lib/RT/Queues.pm index ccf1e4208..60aec9086 100755 --- a/rt/lib/RT/Queues.pm +++ b/rt/lib/RT/Queues.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::Queue item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Record.pm b/rt/lib/RT/Record.pm index 262bd208a..b32ef5553 100755 --- a/rt/lib/RT/Record.pm +++ b/rt/lib/RT/Record.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC # <jesse@bestpractical.com> # # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html. # # # CONTRIBUTION SUBMISSION POLICY: @@ -74,6 +74,7 @@ our @ISA; use base qw(RT::Base); use RT::Date; +use RT::I18N; use RT::User; use RT::Attributes; use DBIx::SearchBuilder::Record::Cachable; @@ -862,6 +863,7 @@ sub _DecodeLOB { elsif ( $ContentEncoding && $ContentEncoding ne 'none' ) { return ( $self->loc( "Unknown ContentEncoding [_1]", $ContentEncoding ) ); } + if ( RT::I18N::IsTextualContentType($ContentType) ) { $Content = Encode::decode_utf8($Content) unless Encode::is_utf8($Content); } @@ -1231,8 +1233,37 @@ sub DependsOn { # }}} +# {{{ Customers + +=head2 Customers + + This returns an RT::Links object which references all the customers that this object is a member of. + +=cut + +sub Customers { + my( $self, %opt ) = @_; + my $Debug = $opt{'Debug'}; + + unless ( $self->{'Customers'} ) { + $self->{'Customers'} = $self->MemberOf->Clone; + $self->{'Customers'}->Limit( + FIELD => 'Target', + OPERATOR => 'STARTSWITH', + VALUE => 'freeside://freeside/cust_main/', + ); + } + + warn "->Customers method called on $self; returning ". + ref($self->{'Customers'}). ' object' + if $Debug; + + return $self->{'Customers'}; +} + +# }}} # {{{ sub _Links diff --git a/rt/lib/RT/Scrip.pm b/rt/lib/RT/Scrip.pm index 11b8d9455..a69dde04e 100755 --- a/rt/lib/RT/Scrip.pm +++ b/rt/lib/RT/Scrip.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -89,7 +65,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: @@ -144,7 +120,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -153,14 +129,14 @@ Returns the current value of id. =cut -=head2 Description +=item Description Returns the current value of Description. (In the database, Description is stored as varchar(255).) -=head2 SetDescription VALUE +=item SetDescription VALUE Set Description to VALUE. @@ -171,14 +147,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ScripCondition +=item ScripCondition Returns the current value of ScripCondition. (In the database, ScripCondition is stored as int(11).) -=head2 SetScripCondition VALUE +=item SetScripCondition VALUE Set ScripCondition to VALUE. @@ -189,7 +165,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ScripConditionObj +=item ScripConditionObj Returns the ScripCondition Object which has the id returned by ScripCondition @@ -203,14 +179,14 @@ sub ScripConditionObj { return($ScripCondition); } -=head2 ScripAction +=item ScripAction Returns the current value of ScripAction. (In the database, ScripAction is stored as int(11).) -=head2 SetScripAction VALUE +=item SetScripAction VALUE Set ScripAction to VALUE. @@ -221,7 +197,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ScripActionObj +=item ScripActionObj Returns the ScripAction Object which has the id returned by ScripAction @@ -235,14 +211,14 @@ sub ScripActionObj { return($ScripAction); } -=head2 ConditionRules +=item ConditionRules Returns the current value of ConditionRules. (In the database, ConditionRules is stored as text.) -=head2 SetConditionRules VALUE +=item SetConditionRules VALUE Set ConditionRules to VALUE. @@ -253,14 +229,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ActionRules +=item ActionRules Returns the current value of ActionRules. (In the database, ActionRules is stored as text.) -=head2 SetActionRules VALUE +=item SetActionRules VALUE Set ActionRules to VALUE. @@ -271,14 +247,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 CustomIsApplicableCode +=item CustomIsApplicableCode Returns the current value of CustomIsApplicableCode. (In the database, CustomIsApplicableCode is stored as text.) -=head2 SetCustomIsApplicableCode VALUE +=item SetCustomIsApplicableCode VALUE Set CustomIsApplicableCode to VALUE. @@ -289,14 +265,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 CustomPrepareCode +=item CustomPrepareCode Returns the current value of CustomPrepareCode. (In the database, CustomPrepareCode is stored as text.) -=head2 SetCustomPrepareCode VALUE +=item SetCustomPrepareCode VALUE Set CustomPrepareCode to VALUE. @@ -307,14 +283,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 CustomCommitCode +=item CustomCommitCode Returns the current value of CustomCommitCode. (In the database, CustomCommitCode is stored as text.) -=head2 SetCustomCommitCode VALUE +=item SetCustomCommitCode VALUE Set CustomCommitCode to VALUE. @@ -325,14 +301,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Stage +=item Stage Returns the current value of Stage. (In the database, Stage is stored as varchar(32).) -=head2 SetStage VALUE +=item SetStage VALUE Set Stage to VALUE. @@ -343,14 +319,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Queue +=item Queue Returns the current value of Queue. (In the database, Queue is stored as int(11).) -=head2 SetQueue VALUE +=item SetQueue VALUE Set Queue to VALUE. @@ -361,7 +337,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 QueueObj +=item QueueObj Returns the Queue Object which has the id returned by Queue @@ -375,14 +351,14 @@ sub QueueObj { return($Queue); } -=head2 Template +=item Template Returns the current value of Template. (In the database, Template is stored as int(11).) -=head2 SetTemplate VALUE +=item SetTemplate VALUE Set Template to VALUE. @@ -393,7 +369,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 TemplateObj +=item TemplateObj Returns the Template Object which has the id returned by Template @@ -407,7 +383,7 @@ sub TemplateObj { return($Template); } -=head2 Creator +=item Creator Returns the current value of Creator. (In the database, Creator is stored as int(11).) @@ -416,7 +392,7 @@ Returns the current value of Creator. =cut -=head2 Created +=item Created Returns the current value of Created. (In the database, Created is stored as datetime.) @@ -425,7 +401,7 @@ Returns the current value of Created. =cut -=head2 LastUpdatedBy +=item LastUpdatedBy Returns the current value of LastUpdatedBy. (In the database, LastUpdatedBy is stored as int(11).) @@ -434,7 +410,7 @@ Returns the current value of LastUpdatedBy. =cut -=head2 LastUpdated +=item LastUpdated Returns the current value of LastUpdated. (In the database, LastUpdated is stored as datetime.) @@ -444,41 +420,41 @@ Returns the current value of LastUpdated. -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, type => 'int(11)', default => ''}, Description => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, + {read => 1, write => 1, type => 'varchar(255)', default => ''}, ScripCondition => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, ScripAction => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, ConditionRules => - {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'text', default => ''}, + {read => 1, write => 1, type => 'text', default => ''}, ActionRules => - {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'text', default => ''}, + {read => 1, write => 1, type => 'text', default => ''}, CustomIsApplicableCode => - {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'text', default => ''}, + {read => 1, write => 1, type => 'text', default => ''}, CustomPrepareCode => - {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'text', default => ''}, + {read => 1, write => 1, type => 'text', default => ''}, CustomCommitCode => - {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'text', default => ''}, + {read => 1, write => 1, type => 'text', default => ''}, Stage => - {read => 1, write => 1, sql_type => 12, length => 32, is_blob => 0, is_numeric => 0, type => 'varchar(32)', default => ''}, + {read => 1, write => 1, type => 'varchar(32)', default => ''}, Queue => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Template => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Creator => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, Created => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, LastUpdatedBy => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, LastUpdated => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, } }; @@ -510,7 +486,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/ScripAction.pm b/rt/lib/RT/ScripAction.pm index daa74f3d6..26824df5d 100755 --- a/rt/lib/RT/ScripAction.pm +++ b/rt/lib/RT/ScripAction.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: @@ -119,7 +95,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -128,14 +104,14 @@ Returns the current value of id. =cut -=head2 Name +=item Name Returns the current value of Name. (In the database, Name is stored as varchar(200).) -=head2 SetName VALUE +=item SetName VALUE Set Name to VALUE. @@ -146,14 +122,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Description +=item Description Returns the current value of Description. (In the database, Description is stored as varchar(255).) -=head2 SetDescription VALUE +=item SetDescription VALUE Set Description to VALUE. @@ -164,14 +140,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ExecModule +=item ExecModule Returns the current value of ExecModule. (In the database, ExecModule is stored as varchar(60).) -=head2 SetExecModule VALUE +=item SetExecModule VALUE Set ExecModule to VALUE. @@ -182,14 +158,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Argument +=item Argument Returns the current value of Argument. (In the database, Argument is stored as varchar(255).) -=head2 SetArgument VALUE +=item SetArgument VALUE Set Argument to VALUE. @@ -200,7 +176,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Creator +=item Creator Returns the current value of Creator. (In the database, Creator is stored as int(11).) @@ -209,7 +185,7 @@ Returns the current value of Creator. =cut -=head2 Created +=item Created Returns the current value of Created. (In the database, Created is stored as datetime.) @@ -218,7 +194,7 @@ Returns the current value of Created. =cut -=head2 LastUpdatedBy +=item LastUpdatedBy Returns the current value of LastUpdatedBy. (In the database, LastUpdatedBy is stored as int(11).) @@ -227,7 +203,7 @@ Returns the current value of LastUpdatedBy. =cut -=head2 LastUpdated +=item LastUpdated Returns the current value of LastUpdated. (In the database, LastUpdated is stored as datetime.) @@ -237,27 +213,27 @@ Returns the current value of LastUpdated. -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, type => 'int(11)', default => ''}, Name => - {read => 1, write => 1, sql_type => 12, length => 200, is_blob => 0, is_numeric => 0, type => 'varchar(200)', default => ''}, + {read => 1, write => 1, type => 'varchar(200)', default => ''}, Description => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, + {read => 1, write => 1, type => 'varchar(255)', default => ''}, ExecModule => - {read => 1, write => 1, sql_type => 12, length => 60, is_blob => 0, is_numeric => 0, type => 'varchar(60)', default => ''}, + {read => 1, write => 1, type => 'varchar(60)', default => ''}, Argument => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, + {read => 1, write => 1, type => 'varchar(255)', default => ''}, Creator => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, Created => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, LastUpdatedBy => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, LastUpdated => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, } }; @@ -289,7 +265,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/ScripActions.pm b/rt/lib/RT/ScripActions.pm index b186fb857..614ff374f 100755 --- a/rt/lib/RT/ScripActions.pm +++ b/rt/lib/RT/ScripActions.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::ScripAction item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/ScripCondition.pm b/rt/lib/RT/ScripCondition.pm index 3303398d3..fe0aa2d5a 100755 --- a/rt/lib/RT/ScripCondition.pm +++ b/rt/lib/RT/ScripCondition.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: @@ -122,7 +98,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -131,14 +107,14 @@ Returns the current value of id. =cut -=head2 Name +=item Name Returns the current value of Name. (In the database, Name is stored as varchar(200).) -=head2 SetName VALUE +=item SetName VALUE Set Name to VALUE. @@ -149,14 +125,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Description +=item Description Returns the current value of Description. (In the database, Description is stored as varchar(255).) -=head2 SetDescription VALUE +=item SetDescription VALUE Set Description to VALUE. @@ -167,14 +143,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ExecModule +=item ExecModule Returns the current value of ExecModule. (In the database, ExecModule is stored as varchar(60).) -=head2 SetExecModule VALUE +=item SetExecModule VALUE Set ExecModule to VALUE. @@ -185,14 +161,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Argument +=item Argument Returns the current value of Argument. (In the database, Argument is stored as varchar(255).) -=head2 SetArgument VALUE +=item SetArgument VALUE Set Argument to VALUE. @@ -203,14 +179,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ApplicableTransTypes +=item ApplicableTransTypes Returns the current value of ApplicableTransTypes. (In the database, ApplicableTransTypes is stored as varchar(60).) -=head2 SetApplicableTransTypes VALUE +=item SetApplicableTransTypes VALUE Set ApplicableTransTypes to VALUE. @@ -221,7 +197,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Creator +=item Creator Returns the current value of Creator. (In the database, Creator is stored as int(11).) @@ -230,7 +206,7 @@ Returns the current value of Creator. =cut -=head2 Created +=item Created Returns the current value of Created. (In the database, Created is stored as datetime.) @@ -239,7 +215,7 @@ Returns the current value of Created. =cut -=head2 LastUpdatedBy +=item LastUpdatedBy Returns the current value of LastUpdatedBy. (In the database, LastUpdatedBy is stored as int(11).) @@ -248,7 +224,7 @@ Returns the current value of LastUpdatedBy. =cut -=head2 LastUpdated +=item LastUpdated Returns the current value of LastUpdated. (In the database, LastUpdated is stored as datetime.) @@ -258,29 +234,29 @@ Returns the current value of LastUpdated. -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, type => 'int(11)', default => ''}, Name => - {read => 1, write => 1, sql_type => 12, length => 200, is_blob => 0, is_numeric => 0, type => 'varchar(200)', default => ''}, + {read => 1, write => 1, type => 'varchar(200)', default => ''}, Description => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, + {read => 1, write => 1, type => 'varchar(255)', default => ''}, ExecModule => - {read => 1, write => 1, sql_type => 12, length => 60, is_blob => 0, is_numeric => 0, type => 'varchar(60)', default => ''}, + {read => 1, write => 1, type => 'varchar(60)', default => ''}, Argument => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, + {read => 1, write => 1, type => 'varchar(255)', default => ''}, ApplicableTransTypes => - {read => 1, write => 1, sql_type => 12, length => 60, is_blob => 0, is_numeric => 0, type => 'varchar(60)', default => ''}, + {read => 1, write => 1, type => 'varchar(60)', default => ''}, Creator => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, Created => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, LastUpdatedBy => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, LastUpdated => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, } }; @@ -312,7 +288,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/ScripConditions.pm b/rt/lib/RT/ScripConditions.pm index 623ba10c3..34f788d9c 100755 --- a/rt/lib/RT/ScripConditions.pm +++ b/rt/lib/RT/ScripConditions.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::ScripCondition item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Scrips.pm b/rt/lib/RT/Scrips.pm index 684012f10..a39443136 100755 --- a/rt/lib/RT/Scrips.pm +++ b/rt/lib/RT/Scrips.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::Scrip item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/SearchBuilder.pm b/rt/lib/RT/SearchBuilder.pm index 62ae13e70..aa915d433 100644 --- a/rt/lib/RT/SearchBuilder.pm +++ b/rt/lib/RT/SearchBuilder.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC # <jesse@bestpractical.com> # # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html. # # # CONTRIBUTION SUBMISSION POLICY: @@ -69,7 +69,7 @@ ok (require RT::SearchBuilder); package RT::SearchBuilder; use RT::Base; -use DBIx::SearchBuilder "1.40"; +use DBIx::SearchBuilder "1.50"; use strict; use vars qw(@ISA); diff --git a/rt/lib/RT/Template.pm b/rt/lib/RT/Template.pm index a46eef117..f73ea3ed6 100755 --- a/rt/lib/RT/Template.pm +++ b/rt/lib/RT/Template.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -86,7 +62,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: @@ -129,7 +105,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -138,14 +114,14 @@ Returns the current value of id. =cut -=head2 Queue +=item Queue Returns the current value of Queue. (In the database, Queue is stored as int(11).) -=head2 SetQueue VALUE +=item SetQueue VALUE Set Queue to VALUE. @@ -156,7 +132,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 QueueObj +=item QueueObj Returns the Queue Object which has the id returned by Queue @@ -170,14 +146,14 @@ sub QueueObj { return($Queue); } -=head2 Name +=item Name Returns the current value of Name. (In the database, Name is stored as varchar(200).) -=head2 SetName VALUE +=item SetName VALUE Set Name to VALUE. @@ -188,14 +164,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Description +=item Description Returns the current value of Description. (In the database, Description is stored as varchar(255).) -=head2 SetDescription VALUE +=item SetDescription VALUE Set Description to VALUE. @@ -206,14 +182,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Type +=item Type Returns the current value of Type. (In the database, Type is stored as varchar(16).) -=head2 SetType VALUE +=item SetType VALUE Set Type to VALUE. @@ -224,14 +200,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Language +=item Language Returns the current value of Language. (In the database, Language is stored as varchar(16).) -=head2 SetLanguage VALUE +=item SetLanguage VALUE Set Language to VALUE. @@ -242,14 +218,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 TranslationOf +=item TranslationOf Returns the current value of TranslationOf. (In the database, TranslationOf is stored as int(11).) -=head2 SetTranslationOf VALUE +=item SetTranslationOf VALUE Set TranslationOf to VALUE. @@ -260,14 +236,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Content +=item Content Returns the current value of Content. (In the database, Content is stored as blob.) -=head2 SetContent VALUE +=item SetContent VALUE Set Content to VALUE. @@ -278,7 +254,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 LastUpdated +=item LastUpdated Returns the current value of LastUpdated. (In the database, LastUpdated is stored as datetime.) @@ -287,7 +263,7 @@ Returns the current value of LastUpdated. =cut -=head2 LastUpdatedBy +=item LastUpdatedBy Returns the current value of LastUpdatedBy. (In the database, LastUpdatedBy is stored as int(11).) @@ -296,7 +272,7 @@ Returns the current value of LastUpdatedBy. =cut -=head2 Creator +=item Creator Returns the current value of Creator. (In the database, Creator is stored as int(11).) @@ -305,7 +281,7 @@ Returns the current value of Creator. =cut -=head2 Created +=item Created Returns the current value of Created. (In the database, Created is stored as datetime.) @@ -315,33 +291,33 @@ Returns the current value of Created. -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, type => 'int(11)', default => ''}, Queue => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Name => - {read => 1, write => 1, sql_type => 12, length => 200, is_blob => 0, is_numeric => 0, type => 'varchar(200)', default => ''}, + {read => 1, write => 1, type => 'varchar(200)', default => ''}, Description => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, + {read => 1, write => 1, type => 'varchar(255)', default => ''}, Type => - {read => 1, write => 1, sql_type => 12, length => 16, is_blob => 0, is_numeric => 0, type => 'varchar(16)', default => ''}, + {read => 1, write => 1, type => 'varchar(16)', default => ''}, Language => - {read => 1, write => 1, sql_type => 12, length => 16, is_blob => 0, is_numeric => 0, type => 'varchar(16)', default => ''}, + {read => 1, write => 1, type => 'varchar(16)', default => ''}, TranslationOf => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Content => - {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'blob', default => ''}, + {read => 1, write => 1, type => 'blob', default => ''}, LastUpdated => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, LastUpdatedBy => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, Creator => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, Created => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, } }; @@ -373,7 +349,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Templates.pm b/rt/lib/RT/Templates.pm index 9a2acbdc6..37db84086 100755 --- a/rt/lib/RT/Templates.pm +++ b/rt/lib/RT/Templates.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::Template item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Ticket.pm b/rt/lib/RT/Ticket.pm index 81bbbd004..2f075a20c 100755 --- a/rt/lib/RT/Ticket.pm +++ b/rt/lib/RT/Ticket.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -86,7 +62,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: @@ -168,7 +144,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -177,14 +153,14 @@ Returns the current value of id. =cut -=head2 EffectiveId +=item EffectiveId Returns the current value of EffectiveId. (In the database, EffectiveId is stored as int(11).) -=head2 SetEffectiveId VALUE +=item SetEffectiveId VALUE Set EffectiveId to VALUE. @@ -195,14 +171,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Queue +=item Queue Returns the current value of Queue. (In the database, Queue is stored as int(11).) -=head2 SetQueue VALUE +=item SetQueue VALUE Set Queue to VALUE. @@ -213,7 +189,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 QueueObj +=item QueueObj Returns the Queue Object which has the id returned by Queue @@ -227,14 +203,14 @@ sub QueueObj { return($Queue); } -=head2 Type +=item Type Returns the current value of Type. (In the database, Type is stored as varchar(16).) -=head2 SetType VALUE +=item SetType VALUE Set Type to VALUE. @@ -245,14 +221,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 IssueStatement +=item IssueStatement Returns the current value of IssueStatement. (In the database, IssueStatement is stored as int(11).) -=head2 SetIssueStatement VALUE +=item SetIssueStatement VALUE Set IssueStatement to VALUE. @@ -263,14 +239,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Resolution +=item Resolution Returns the current value of Resolution. (In the database, Resolution is stored as int(11).) -=head2 SetResolution VALUE +=item SetResolution VALUE Set Resolution to VALUE. @@ -281,14 +257,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Owner +=item Owner Returns the current value of Owner. (In the database, Owner is stored as int(11).) -=head2 SetOwner VALUE +=item SetOwner VALUE Set Owner to VALUE. @@ -299,14 +275,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Subject +=item Subject Returns the current value of Subject. (In the database, Subject is stored as varchar(200).) -=head2 SetSubject VALUE +=item SetSubject VALUE Set Subject to VALUE. @@ -317,14 +293,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 InitialPriority +=item InitialPriority Returns the current value of InitialPriority. (In the database, InitialPriority is stored as int(11).) -=head2 SetInitialPriority VALUE +=item SetInitialPriority VALUE Set InitialPriority to VALUE. @@ -335,14 +311,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 FinalPriority +=item FinalPriority Returns the current value of FinalPriority. (In the database, FinalPriority is stored as int(11).) -=head2 SetFinalPriority VALUE +=item SetFinalPriority VALUE Set FinalPriority to VALUE. @@ -353,14 +329,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Priority +=item Priority Returns the current value of Priority. (In the database, Priority is stored as int(11).) -=head2 SetPriority VALUE +=item SetPriority VALUE Set Priority to VALUE. @@ -371,14 +347,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 TimeEstimated +=item TimeEstimated Returns the current value of TimeEstimated. (In the database, TimeEstimated is stored as int(11).) -=head2 SetTimeEstimated VALUE +=item SetTimeEstimated VALUE Set TimeEstimated to VALUE. @@ -389,14 +365,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 TimeWorked +=item TimeWorked Returns the current value of TimeWorked. (In the database, TimeWorked is stored as int(11).) -=head2 SetTimeWorked VALUE +=item SetTimeWorked VALUE Set TimeWorked to VALUE. @@ -407,14 +383,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Status +=item Status Returns the current value of Status. (In the database, Status is stored as varchar(10).) -=head2 SetStatus VALUE +=item SetStatus VALUE Set Status to VALUE. @@ -425,14 +401,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 TimeLeft +=item TimeLeft Returns the current value of TimeLeft. (In the database, TimeLeft is stored as int(11).) -=head2 SetTimeLeft VALUE +=item SetTimeLeft VALUE Set TimeLeft to VALUE. @@ -443,14 +419,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Told +=item Told Returns the current value of Told. (In the database, Told is stored as datetime.) -=head2 SetTold VALUE +=item SetTold VALUE Set Told to VALUE. @@ -461,14 +437,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Starts +=item Starts Returns the current value of Starts. (In the database, Starts is stored as datetime.) -=head2 SetStarts VALUE +=item SetStarts VALUE Set Starts to VALUE. @@ -479,14 +455,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Started +=item Started Returns the current value of Started. (In the database, Started is stored as datetime.) -=head2 SetStarted VALUE +=item SetStarted VALUE Set Started to VALUE. @@ -497,14 +473,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Due +=item Due Returns the current value of Due. (In the database, Due is stored as datetime.) -=head2 SetDue VALUE +=item SetDue VALUE Set Due to VALUE. @@ -515,14 +491,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Resolved +=item Resolved Returns the current value of Resolved. (In the database, Resolved is stored as datetime.) -=head2 SetResolved VALUE +=item SetResolved VALUE Set Resolved to VALUE. @@ -533,7 +509,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 LastUpdatedBy +=item LastUpdatedBy Returns the current value of LastUpdatedBy. (In the database, LastUpdatedBy is stored as int(11).) @@ -542,7 +518,7 @@ Returns the current value of LastUpdatedBy. =cut -=head2 LastUpdated +=item LastUpdated Returns the current value of LastUpdated. (In the database, LastUpdated is stored as datetime.) @@ -551,7 +527,7 @@ Returns the current value of LastUpdated. =cut -=head2 Creator +=item Creator Returns the current value of Creator. (In the database, Creator is stored as int(11).) @@ -560,7 +536,7 @@ Returns the current value of Creator. =cut -=head2 Created +=item Created Returns the current value of Created. (In the database, Created is stored as datetime.) @@ -569,14 +545,14 @@ Returns the current value of Created. =cut -=head2 Disabled +=item Disabled Returns the current value of Disabled. (In the database, Disabled is stored as smallint(6).) -=head2 SetDisabled VALUE +=item SetDisabled VALUE Set Disabled to VALUE. @@ -588,59 +564,59 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, type => 'int(11)', default => ''}, EffectiveId => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Queue => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Type => - {read => 1, write => 1, sql_type => 12, length => 16, is_blob => 0, is_numeric => 0, type => 'varchar(16)', default => ''}, + {read => 1, write => 1, type => 'varchar(16)', default => ''}, IssueStatement => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Resolution => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Owner => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Subject => - {read => 1, write => 1, sql_type => 12, length => 200, is_blob => 0, is_numeric => 0, type => 'varchar(200)', default => '[no subject]'}, + {read => 1, write => 1, type => 'varchar(200)', default => '[no subject]'}, InitialPriority => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, FinalPriority => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Priority => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, TimeEstimated => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, TimeWorked => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Status => - {read => 1, write => 1, sql_type => 12, length => 10, is_blob => 0, is_numeric => 0, type => 'varchar(10)', default => ''}, + {read => 1, write => 1, type => 'varchar(10)', default => ''}, TimeLeft => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Told => - {read => 1, write => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, write => 1, type => 'datetime', default => ''}, Starts => - {read => 1, write => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, write => 1, type => 'datetime', default => ''}, Started => - {read => 1, write => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, write => 1, type => 'datetime', default => ''}, Due => - {read => 1, write => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, write => 1, type => 'datetime', default => ''}, Resolved => - {read => 1, write => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, write => 1, type => 'datetime', default => ''}, LastUpdatedBy => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, LastUpdated => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, Creator => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, Created => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, Disabled => - {read => 1, write => 1, sql_type => 5, length => 6, is_blob => 0, is_numeric => 1, type => 'smallint(6)', default => '0'}, + {read => 1, write => 1, type => 'smallint(6)', default => '0'}, } }; @@ -672,7 +648,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/TicketCustomFieldValue.pm b/rt/lib/RT/TicketCustomFieldValue.pm deleted file mode 100644 index 717647266..000000000 --- a/rt/lib/RT/TicketCustomFieldValue.pm +++ /dev/null @@ -1,308 +0,0 @@ -# {{{ BEGIN BPS TAGGED BLOCK -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: -# -# This work is made available to you under the terms of Version 2 of -# the GNU General Public License. A copy of that license should have -# been provided with this software, but in any event can be snarfed -# from www.gnu.org. -# -# This work is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -# -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# }}} END BPS TAGGED BLOCK -# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) -# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. -# -# !! DO NOT EDIT THIS FILE !! -# - -use strict; - - -=head1 NAME - -RT::TicketCustomFieldValue - - -=head1 SYNOPSIS - -=head1 DESCRIPTION - -=head1 METHODS - -=cut - -package RT::TicketCustomFieldValue; -use RT::Record; -use RT::CustomField; -use RT::Ticket; - - -use vars qw( @ISA ); -@ISA= qw( RT::Record ); - -sub _Init { - my $self = shift; - - $self->Table('TicketCustomFieldValues'); - $self->SUPER::_Init(@_); -} - - - - - -=head2 Create PARAMHASH - -Create takes a hash of values and creates a row in the database: - - int(11) 'Ticket'. - int(11) 'CustomField'. - varchar(255) 'Content'. - -=cut - - - - -sub Create { - my $self = shift; - my %args = ( - Ticket => '0', - CustomField => '0', - Content => '', - - @_); - $self->SUPER::Create( - Ticket => $args{'Ticket'}, - CustomField => $args{'CustomField'}, - Content => $args{'Content'}, -); - -} - - - -=head2 id - -Returns the current value of id. -(In the database, id is stored as int(11).) - - -=cut - - -=head2 Ticket - -Returns the current value of Ticket. -(In the database, Ticket is stored as int(11).) - - - -=head2 SetTicket VALUE - - -Set Ticket to VALUE. -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, Ticket will be stored as a int(11).) - - -=cut - - -=head2 TicketObj - -Returns the Ticket Object which has the id returned by Ticket - - -=cut - -sub TicketObj { - my $self = shift; - my $Ticket = RT::Ticket->new($self->CurrentUser); - $Ticket->Load($self->__Value('Ticket')); - return($Ticket); -} - -=head2 CustomField - -Returns the current value of CustomField. -(In the database, CustomField is stored as int(11).) - - - -=head2 SetCustomField VALUE - - -Set CustomField to VALUE. -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, CustomField will be stored as a int(11).) - - -=cut - - -=head2 CustomFieldObj - -Returns the CustomField Object which has the id returned by CustomField - - -=cut - -sub CustomFieldObj { - my $self = shift; - my $CustomField = RT::CustomField->new($self->CurrentUser); - $CustomField->Load($self->__Value('CustomField')); - return($CustomField); -} - -=head2 Content - -Returns the current value of Content. -(In the database, Content is stored as varchar(255).) - - - -=head2 SetContent VALUE - - -Set Content to VALUE. -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, Content will be stored as a varchar(255).) - - -=cut - - -=head2 Creator - -Returns the current value of Creator. -(In the database, Creator is stored as int(11).) - - -=cut - - -=head2 Created - -Returns the current value of Created. -(In the database, Created is stored as datetime.) - - -=cut - - -=head2 LastUpdatedBy - -Returns the current value of LastUpdatedBy. -(In the database, LastUpdatedBy is stored as int(11).) - - -=cut - - -=head2 LastUpdated - -Returns the current value of LastUpdated. -(In the database, LastUpdated is stored as datetime.) - - -=cut - - - -sub _CoreAccessible { - { - - id => - {read => 1, type => 'int(11)', default => ''}, - Ticket => - {read => 1, write => 1, type => 'int(11)', default => '0'}, - CustomField => - {read => 1, write => 1, type => 'int(11)', default => '0'}, - Content => - {read => 1, write => 1, type => 'varchar(255)', default => ''}, - Creator => - {read => 1, auto => 1, type => 'int(11)', default => '0'}, - Created => - {read => 1, auto => 1, type => 'datetime', default => ''}, - LastUpdatedBy => - {read => 1, auto => 1, type => 'int(11)', default => '0'}, - LastUpdated => - {read => 1, auto => 1, type => 'datetime', default => ''}, - - } -}; - - - eval "require RT::TicketCustomFieldValue_Overlay"; - if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValue_Overlay.pm}) { - die $@; - }; - - eval "require RT::TicketCustomFieldValue_Vendor"; - if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValue_Vendor.pm}) { - die $@; - }; - - eval "require RT::TicketCustomFieldValue_Local"; - if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValue_Local.pm}) { - die $@; - }; - - - - -=head1 SEE ALSO - -This class allows "overlay" methods to be placed -into the following files _Overlay is for a System overlay by the original author, -_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations. - -These overlay files can contain new subs or subs to replace existing subs in this module. - -If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line - - no warnings qw(redefine); - -so that perl does not kick and scream when you redefine a subroutine or variable in your overlay. - -RT::TicketCustomFieldValue_Overlay, RT::TicketCustomFieldValue_Vendor, RT::TicketCustomFieldValue_Local - -=cut - - -1; diff --git a/rt/lib/RT/TicketCustomFieldValue_Overlay.pm b/rt/lib/RT/TicketCustomFieldValue_Overlay.pm deleted file mode 100644 index 270c5939a..000000000 --- a/rt/lib/RT/TicketCustomFieldValue_Overlay.pm +++ /dev/null @@ -1,74 +0,0 @@ -# {{{ BEGIN BPS TAGGED BLOCK -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: -# -# This work is made available to you under the terms of Version 2 of -# the GNU General Public License. A copy of that license should have -# been provided with this software, but in any event can be snarfed -# from www.gnu.org. -# -# This work is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -# -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# }}} END BPS TAGGED BLOCK -use strict; -no warnings qw(redefine); - - - -=head2 LoadByTicketContentAndCustomField { Ticket => TICKET, CustomField => CUSTOMFIELD, Content => CONTENT } - -Loads a custom field value by Ticket, Content and which CustomField it's tied to - -=cut - - -sub LoadByTicketContentAndCustomField { - my $self = shift; - my %args = ( Ticket => undef, - CustomField => undef, - Content => undef, - @_ - ); - - - $self->LoadByCols( Content => $args{'Content'}, - CustomField => $args{'CustomField'}, - Ticket => $args{'Ticket'}); - - -} - -1; diff --git a/rt/lib/RT/TicketCustomFieldValues.pm b/rt/lib/RT/TicketCustomFieldValues.pm deleted file mode 100644 index 2174afef3..000000000 --- a/rt/lib/RT/TicketCustomFieldValues.pm +++ /dev/null @@ -1,137 +0,0 @@ -# {{{ BEGIN BPS TAGGED BLOCK -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: -# -# This work is made available to you under the terms of Version 2 of -# the GNU General Public License. A copy of that license should have -# been provided with this software, but in any event can be snarfed -# from www.gnu.org. -# -# This work is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -# -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# }}} END BPS TAGGED BLOCK -# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) -# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. -# -# !! DO NOT EDIT THIS FILE !! -# - -use strict; - - -=head1 NAME - - RT::TicketCustomFieldValues -- Class Description - -=head1 SYNOPSIS - - use RT::TicketCustomFieldValues - -=head1 DESCRIPTION - - -=head1 METHODS - -=cut - -package RT::TicketCustomFieldValues; - -use RT::SearchBuilder; -use RT::TicketCustomFieldValue; - -use vars qw( @ISA ); -@ISA= qw(RT::SearchBuilder); - - -sub _Init { - my $self = shift; - $self->{'table'} = 'TicketCustomFieldValues'; - $self->{'primary_key'} = 'id'; - - - return ( $self->SUPER::_Init(@_) ); -} - - -=head2 NewItem - -Returns an empty new RT::TicketCustomFieldValue item - -=cut - -sub NewItem { - my $self = shift; - return(RT::TicketCustomFieldValue->new($self->CurrentUser)); -} - - eval "require RT::TicketCustomFieldValues_Overlay"; - if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValues_Overlay.pm}) { - die $@; - }; - - eval "require RT::TicketCustomFieldValues_Vendor"; - if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValues_Vendor.pm}) { - die $@; - }; - - eval "require RT::TicketCustomFieldValues_Local"; - if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValues_Local.pm}) { - die $@; - }; - - - - -=head1 SEE ALSO - -This class allows "overlay" methods to be placed -into the following files _Overlay is for a System overlay by the original author, -_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations. - -These overlay files can contain new subs or subs to replace existing subs in this module. - -If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line - - no warnings qw(redefine); - -so that perl does not kick and scream when you redefine a subroutine or variable in your overlay. - -RT::TicketCustomFieldValues_Overlay, RT::TicketCustomFieldValues_Vendor, RT::TicketCustomFieldValues_Local - -=cut - - -1; diff --git a/rt/lib/RT/TicketCustomFieldValues_Overlay.pm b/rt/lib/RT/TicketCustomFieldValues_Overlay.pm deleted file mode 100644 index 8cbaca574..000000000 --- a/rt/lib/RT/TicketCustomFieldValues_Overlay.pm +++ /dev/null @@ -1,108 +0,0 @@ -# {{{ BEGIN BPS TAGGED BLOCK -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: -# -# This work is made available to you under the terms of Version 2 of -# the GNU General Public License. A copy of that license should have -# been provided with this software, but in any event can be snarfed -# from www.gnu.org. -# -# This work is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -# -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# }}} END BPS TAGGED BLOCK -use strict; -no warnings qw(redefine); - -# {{{ sub LimitToCustomField - -=head2 LimitToCustomField FIELD - -Limits the returned set to values for the custom field with Id FIELD - -=cut - -sub LimitToCustomField { - my $self = shift; - my $cf = shift; - return ($self->Limit( FIELD => 'CustomField', - VALUE => $cf, - OPERATOR => '=')); - -} - -# }}} - -# {{{ sub LimitToTicket - -=head2 LimitToTicket TICKETID - -Limits the returned set to values for the ticket with Id TICKETID - -=cut - -sub LimitToTicket { - my $self = shift; - my $ticket = shift; - return ($self->Limit( FIELD => 'Ticket', - VALUE => $ticket, - OPERATOR => '=')); - -} - -# }}} - - -=sub HasEntry VALUE - -Returns true if this CustomFieldValues collection has an entry with content that eq VALUE - -=cut - - -sub HasEntry { - my $self = shift; - my $value = shift; - - #TODO: this could cache and optimize a fair bit. - foreach my $item (@{$self->ItemsArrayRef}) { - return(1) if ($item->Content eq $value); - } - return undef; - -} - -1; - diff --git a/rt/lib/RT/Ticket_Overlay.pm b/rt/lib/RT/Ticket_Overlay.pm index 90f83a8a8..dad94375f 100644 --- a/rt/lib/RT/Ticket_Overlay.pm +++ b/rt/lib/RT/Ticket_Overlay.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC # <jesse@bestpractical.com> # # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html. # # # CONTRIBUTION SUBMISSION POLICY: @@ -716,6 +716,68 @@ sub Create { # }}} + # {{{ Deal with auto-customer association + + #unless we already have (a) customer(s)... + unless ( $self->Customers->Count ) { + + #first find any requestors with emails but *without* customer targets + my @NoCust_Requestors = + grep { $_->EmailAddress && ! $_->Customers->Count } + @{ $self->_Requestors->UserMembersObj->ItemsArrayRef }; + + for my $Requestor (@NoCust_Requestors) { + + #perhaps the stuff in here should be in a User method?? + my @Customers = + &RT::URI::freeside::email_search( email=>$Requestor->EmailAddress ); + + foreach my $custnum ( map $_->{'custnum'}, @Customers ) { + + ## false laziness w/RT/Interface/Web_Vendor.pm + my @link = ( 'Type' => 'MemberOf', + 'Target' => "freeside://freeside/cust_main/$custnum", + ); + + my( $val, $msg ) = $Requestor->_AddLink(@link); + #XXX should do something with $msg# push @non_fatal_errors, $msg; + + } + + } + + #find any requestors with customer targets + + my %cust_target = (); + + my @Requestors = + grep { $_->Customers->Count } + @{ $self->_Requestors->UserMembersObj->ItemsArrayRef }; + + foreach my $Requestor ( @Requestors ) { + foreach my $cust_link ( @{ $Requestor->Customers->ItemsArrayRef } ) { + $cust_target{ $cust_link->Target } = 1; + } + } + + #and then auto-associate this ticket with those customers + + foreach my $cust_target ( keys %cust_target ) { + + my @link = ( 'Type' => 'MemberOf', + #'Target' => "freeside://freeside/cust_main/$custnum", + 'Target' => $cust_target, + ); + + my( $val, $msg ) = $self->_AddLink(@link); + push @non_fatal_errors, $msg; + + } + + } + + # }}} + # {{{ Add all the custom fields foreach my $arg ( keys %args ) { @@ -1341,43 +1403,52 @@ sub AddWatcher { @_ ); - return ( 0, "No principal specified" ) - unless $args{'Email'} or $args{'PrincipalId'}; - - if ( !$args{'PrincipalId'} and $args{'Email'} ) { - my $user = RT::User->new( $self->CurrentUser ); - $user->LoadByEmail( $args{'Email'} ); - if ( $user->id ) { - $args{'PrincipalId'} = $user->PrincipalId; - delete $args{'Email'}; - } - } + # XXX, FIXME, BUG: if only email is provided then we only check + # for ModifyTicket right, but must try to get PrincipalId and + # check Watch* rights too if user exist # {{{ Check ACLS - # ModifyTicket allow you to add any watcher - return $self->_AddWatcher(%args) - if $self->CurrentUserHasRight('ModifyTicket'); - #If the watcher we're trying to add is for the current user - if ( $self->CurrentUser->PrincipalId == ($args{'PrincipalId'} || 0) ) { - # If it's an AdminCc and they have 'WatchAsAdminCc' + if ( $self->CurrentUser->PrincipalId == ($args{'PrincipalId'} || 0) + or lc( $self->CurrentUser->UserObj->EmailAddress ) + eq lc( RT::User->CanonicalizeEmailAddress( $args{'Email'} ) || '' ) ) + { + # If it's an AdminCc and they don't have + # 'WatchAsAdminCc' or 'ModifyTicket', bail if ( $args{'Type'} eq 'AdminCc' ) { - return $self->_AddWatcher( %args ) - if $self->CurrentUserHasRight('WatchAsAdminCc'); + unless ( $self->CurrentUserHasRight('ModifyTicket') + or $self->CurrentUserHasRight('WatchAsAdminCc') ) { + return ( 0, $self->loc('Permission Denied')) + } } - # If it's a Requestor or Cc and they have 'Watch' - elsif ( $args{'Type'} eq 'Cc' || $args{'Type'} eq 'Requestor' ) { - return $self->_AddWatcher( %args ) - if $self->CurrentUserHasRight('Watch'); + # If it's a Requestor or Cc and they don't have + # 'Watch' or 'ModifyTicket', bail + elsif ( ( $args{'Type'} eq 'Cc' ) or ( $args{'Type'} eq 'Requestor' ) ) { + + unless ( $self->CurrentUserHasRight('ModifyTicket') + or $self->CurrentUserHasRight('Watch') ) { + return ( 0, $self->loc('Permission Denied')) + } } else { - $RT::Logger->warning( "AddWatcher got passed a bogus type" ); + $RT::Logger->warning( "$self -> AddWatcher got passed a bogus type"); return ( 0, $self->loc('Error in parameters to Ticket->AddWatcher') ); } } - return ( 0, $self->loc("Permission Denied") ); + # If the watcher isn't the current user + # and the current user doesn't have 'ModifyTicket' + # bail + else { + unless ( $self->CurrentUserHasRight('ModifyTicket') ) { + return ( 0, $self->loc("Permission Denied") ); + } + } + + # }}} + + return ( $self->_AddWatcher(%args) ); } #This contains the meat of AddWatcher. but can be called from a routine like @@ -1740,6 +1811,25 @@ sub Requestors { # }}} +# {{{ sub _Requestors + +=head2 _Requestors + +Private non-ACLed variant of Reqeustors so that we can look them up for the +purposes of customer auto-association during create. + +=cut + +sub _Requestors { + my $self = shift; + + my $group = RT::Group->new($RT::SystemUser); + $group->LoadTicketRoleGroup(Type => 'Requestor', Ticket => $self->Id); + return ($group); +} + +# }}} + # {{{ sub Cc =head2 Cc @@ -2418,7 +2508,7 @@ sub _RecordNote { unless ( ($args{'MIMEObj'}->head->get('Message-ID') || '') =~ /<(rt-.*?-\d+-\d+)\.(\d+-0-0)\@\Q$RT::Organization>/ ) { - $args{'MIMEObj'}->head->replace( 'RT-Message-ID', + $args{'MIMEObj'}->head->set( 'RT-Message-ID', "<rt-" . $RT::VERSION . "-" . $$ . "-" @@ -2464,7 +2554,13 @@ sub _Links { unless ( $self->{"$field$type"} ) { $self->{"$field$type"} = new RT::Links( $self->CurrentUser ); - if ( $self->CurrentUserHasRight('ShowTicket') ) { + + #not sure what this ACL was supposed to do... but returning the + # bare (unlimited) RT::Links certainly seems wrong, it causes the + # $Ticket->Customers method during creation to return results for every + # ticket... + #if ( $self->CurrentUserHasRight('ShowTicket') ) { + # Maybe this ticket is a merged ticket my $Tickets = new RT::Tickets( $self->CurrentUser ); # at least to myself @@ -2481,7 +2577,7 @@ sub _Links { $self->{"$field$type"}->Limit( FIELD => 'Type', VALUE => $type ) if ($type); - } + #} } return ( $self->{"$field$type"} ); } @@ -3773,21 +3869,18 @@ See L<RT::Record> sub CustomFieldValues { my $self = shift; my $field = shift; - - return $self->SUPER::CustomFieldValues( $field ) - if !$field || $field =~ /^\d+$/; - - my $cf = RT::CustomField->new( $self->CurrentUser ); - $cf->LoadByNameAndQueue( Name => $field, Queue => $self->Queue ); - unless ( $cf->id ) { - $cf->LoadByNameAndQueue( Name => $field, Queue => 0 ); + if ( $field and $field !~ /^\d+$/ ) { + my $cf = RT::CustomField->new( $self->CurrentUser ); + $cf->LoadByNameAndQueue( Name => $field, Queue => $self->Queue ); + unless ( $cf->id ) { + $cf->LoadByNameAndQueue( Name => $field, Queue => 0 ); + } + unless ( $cf->id ) { + # If we didn't find a valid cfid, give up. + return RT::CustomFieldValues->new($self->CurrentUser); + } } - - # If we didn't find a valid cfid, give up. - return RT::ObjectCustomFieldValues->new( $self->CurrentUser ) - unless $cf->id; - - return $self->SUPER::CustomFieldValues( $cf->id ); + return $self->SUPER::CustomFieldValues($field); } # }}} diff --git a/rt/lib/RT/Tickets.pm b/rt/lib/RT/Tickets.pm index 2d98b1ed5..b6b349144 100755 --- a/rt/lib/RT/Tickets.pm +++ b/rt/lib/RT/Tickets.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::Ticket item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Transaction.pm b/rt/lib/RT/Transaction.pm index 7757b6a0a..ca491a6c7 100755 --- a/rt/lib/RT/Transaction.pm +++ b/rt/lib/RT/Transaction.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# CONTRIBUTION SUBMISSION POLICY: # -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -# -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -69,6 +45,7 @@ RT::Transaction package RT::Transaction; use RT::Record; +use RT::Ticket; use vars qw( @ISA ); @@ -85,21 +62,18 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: - varchar(64) 'ObjectType'. - int(11) 'ObjectId'. + int(11) 'EffectiveTicket'. + int(11) 'Ticket'. int(11) 'TimeTaken'. varchar(20) 'Type'. varchar(40) 'Field'. varchar(255) 'OldValue'. varchar(255) 'NewValue'. - varchar(255) 'ReferenceType'. - int(11) 'OldReference'. - int(11) 'NewReference'. - varchar(255) 'Data'. + varchar(100) 'Data'. =cut @@ -109,30 +83,24 @@ Create takes a hash of values and creates a row in the database: sub Create { my $self = shift; my %args = ( - ObjectType => '', - ObjectId => '0', + EffectiveTicket => '0', + Ticket => '0', TimeTaken => '0', Type => '', Field => '', OldValue => '', NewValue => '', - ReferenceType => '', - OldReference => '', - NewReference => '', Data => '', @_); $self->SUPER::Create( - ObjectType => $args{'ObjectType'}, - ObjectId => $args{'ObjectId'}, + EffectiveTicket => $args{'EffectiveTicket'}, + Ticket => $args{'Ticket'}, TimeTaken => $args{'TimeTaken'}, Type => $args{'Type'}, Field => $args{'Field'}, OldValue => $args{'OldValue'}, NewValue => $args{'NewValue'}, - ReferenceType => $args{'ReferenceType'}, - OldReference => $args{'OldReference'}, - NewReference => $args{'NewReference'}, Data => $args{'Data'}, ); @@ -140,7 +108,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -149,50 +117,64 @@ Returns the current value of id. =cut -=head2 ObjectType +=item EffectiveTicket -Returns the current value of ObjectType. -(In the database, ObjectType is stored as varchar(64).) +Returns the current value of EffectiveTicket. +(In the database, EffectiveTicket is stored as int(11).) -=head2 SetObjectType VALUE +=item SetEffectiveTicket VALUE -Set ObjectType to VALUE. +Set EffectiveTicket to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, ObjectType will be stored as a varchar(64).) +(In the database, EffectiveTicket will be stored as a int(11).) =cut -=head2 ObjectId +=item Ticket -Returns the current value of ObjectId. -(In the database, ObjectId is stored as int(11).) +Returns the current value of Ticket. +(In the database, Ticket is stored as int(11).) -=head2 SetObjectId VALUE +=item SetTicket VALUE -Set ObjectId to VALUE. +Set Ticket to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, ObjectId will be stored as a int(11).) +(In the database, Ticket will be stored as a int(11).) + + +=cut + + +=item TicketObj + +Returns the Ticket Object which has the id returned by Ticket =cut +sub TicketObj { + my $self = shift; + my $Ticket = RT::Ticket->new($self->CurrentUser); + $Ticket->Load($self->__Value('Ticket')); + return($Ticket); +} -=head2 TimeTaken +=item TimeTaken Returns the current value of TimeTaken. (In the database, TimeTaken is stored as int(11).) -=head2 SetTimeTaken VALUE +=item SetTimeTaken VALUE Set TimeTaken to VALUE. @@ -203,14 +185,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Type +=item Type Returns the current value of Type. (In the database, Type is stored as varchar(20).) -=head2 SetType VALUE +=item SetType VALUE Set Type to VALUE. @@ -221,14 +203,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Field +=item Field Returns the current value of Field. (In the database, Field is stored as varchar(40).) -=head2 SetField VALUE +=item SetField VALUE Set Field to VALUE. @@ -239,14 +221,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 OldValue +=item OldValue Returns the current value of OldValue. (In the database, OldValue is stored as varchar(255).) -=head2 SetOldValue VALUE +=item SetOldValue VALUE Set OldValue to VALUE. @@ -257,14 +239,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 NewValue +=item NewValue Returns the current value of NewValue. (In the database, NewValue is stored as varchar(255).) -=head2 SetNewValue VALUE +=item SetNewValue VALUE Set NewValue to VALUE. @@ -275,79 +257,25 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ReferenceType - -Returns the current value of ReferenceType. -(In the database, ReferenceType is stored as varchar(255).) - - - -=head2 SetReferenceType VALUE - - -Set ReferenceType to VALUE. -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, ReferenceType will be stored as a varchar(255).) - - -=cut - - -=head2 OldReference - -Returns the current value of OldReference. -(In the database, OldReference is stored as int(11).) - - - -=head2 SetOldReference VALUE - - -Set OldReference to VALUE. -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, OldReference will be stored as a int(11).) - - -=cut - - -=head2 NewReference - -Returns the current value of NewReference. -(In the database, NewReference is stored as int(11).) - - - -=head2 SetNewReference VALUE - - -Set NewReference to VALUE. -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, NewReference will be stored as a int(11).) - - -=cut - - -=head2 Data +=item Data Returns the current value of Data. -(In the database, Data is stored as varchar(255).) +(In the database, Data is stored as varchar(100).) -=head2 SetData VALUE +=item SetData VALUE Set Data to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, Data will be stored as a varchar(255).) +(In the database, Data will be stored as a varchar(100).) =cut -=head2 Creator +=item Creator Returns the current value of Creator. (In the database, Creator is stored as int(11).) @@ -356,7 +284,7 @@ Returns the current value of Creator. =cut -=head2 Created +=item Created Returns the current value of Created. (In the database, Created is stored as datetime.) @@ -366,37 +294,31 @@ Returns the current value of Created. -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, - ObjectType => - {read => 1, write => 1, sql_type => 12, length => 64, is_blob => 0, is_numeric => 0, type => 'varchar(64)', default => ''}, - ObjectId => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, type => 'int(11)', default => ''}, + EffectiveTicket => + {read => 1, write => 1, type => 'int(11)', default => '0'}, + Ticket => + {read => 1, write => 1, type => 'int(11)', default => '0'}, TimeTaken => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, type => 'int(11)', default => '0'}, Type => - {read => 1, write => 1, sql_type => 12, length => 20, is_blob => 0, is_numeric => 0, type => 'varchar(20)', default => ''}, + {read => 1, write => 1, type => 'varchar(20)', default => ''}, Field => - {read => 1, write => 1, sql_type => 12, length => 40, is_blob => 0, is_numeric => 0, type => 'varchar(40)', default => ''}, + {read => 1, write => 1, type => 'varchar(40)', default => ''}, OldValue => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, + {read => 1, write => 1, type => 'varchar(255)', default => ''}, NewValue => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, - ReferenceType => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, - OldReference => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, - NewReference => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, write => 1, type => 'varchar(255)', default => ''}, Data => - {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, + {read => 1, write => 1, type => 'varchar(100)', default => ''}, Creator => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, Created => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, } }; @@ -428,7 +350,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Transaction_Overlay.pm b/rt/lib/RT/Transaction_Overlay.pm index 5716d6643..dd1887e33 100644 --- a/rt/lib/RT/Transaction_Overlay.pm +++ b/rt/lib/RT/Transaction_Overlay.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC # <jesse@bestpractical.com> # # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html. # # # CONTRIBUTION SUBMISSION POLICY: @@ -276,7 +276,7 @@ textual part (as defined in RT::I18N::IsTextualContentType). Otherwise, returns undef. Takes a paramhash. If the $args{'Quote'} parameter is set, wraps this message -at $args{'Wrap'}. $args{'Wrap'} defaults to 70. +at $args{'Wrap'}. $args{'Wrap'} defaults to $RT::MessageBoxWidth - 2 or 70. If $args{'Type'} is set to C<text/html>, plain texts are upgraded to HTML. Otherwise, HTML texts are downgraded to plain text. If $args{'Type'} is @@ -290,6 +290,7 @@ sub Content { Type => $PreferredContentType, Quote => 0, Wrap => 70, + Wrap => ( $RT::MessageBoxWidth || 72 ) - 2, @_ ); @@ -335,7 +336,7 @@ sub Content { $max = length if ( length > $max ); } - if ( $max > 76 ) { + if ( $max > $args{'Wrap'}+6 ) { # 76 ) { require Text::Wrapper; my $wrapper = new Text::Wrapper( columns => $args{'Wrap'}, diff --git a/rt/lib/RT/Transactions.pm b/rt/lib/RT/Transactions.pm index 447ab1abc..23a475ac6 100755 --- a/rt/lib/RT/Transactions.pm +++ b/rt/lib/RT/Transactions.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::Transaction item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/URI/freeside.pm b/rt/lib/RT/URI/freeside.pm new file mode 100644 index 000000000..d73dbacad --- /dev/null +++ b/rt/lib/RT/URI/freeside.pm @@ -0,0 +1,285 @@ +# BEGIN LICENSE BLOCK +# +# Copyright (c) 2004 Kristian Hoffmann <khoff@fire2wire.com> +# Based on the original RT::URI::base and RT::URI::fsck_com_rt. +# +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK +package RT::URI::freeside; + +use RT::URI::base; +use strict; +use vars qw(@ISA $IntegrationType $URL); +@ISA = qw/RT::URI::base/; + + +=head1 NAME + +RT::URI::freeside + +=head1 DESCRIPTION + +URI handler for Freeside URIs. See http://www.freeside.biz/ for more +information on Freeside. + + +=head1 Public subroutines + +=over 4 + +=item FreesideGetConfig CONFKEY + +Subroutine that returns the freeside's configuration value(s) for CONFKEY +as a scalar or list. + +=cut + +sub FreesideGetConfig { return undef; } + + +=item FreesideURL + +Returns the URL for freeside's web interface. + +=cut + +sub FreesideURL { return $URL; } + + +=item FreesideVersion + +Returns a string describing the freeside version being used. + +=cut + +sub FreesideVersion { return undef; } + + +=item smart_search + +A wrapper for the FS::cust_main::smart_search subroutine. + +=cut + +sub smart_search { return undef; } + + +=item small_custview + +A wrapper for the FS::CGI::small_custview subroutine. + +=cut + +sub small_custview { return 'Freeside integration error!</A>'; } + + +=back + +=head1 Private methods + +=over 4 + +=item _FreesideGetRecord + +Method returns a hashref of the freeside record referenced in the URI. +Must be called after ParseURI. + +=cut + +sub _FreesideGetRecord { return undef; } + + +=item _FreesideURIPrefix + +Method that returns the URI prefix for freeside URIs. + +=cut + +sub _FreesideURIPrefix { + + my $self = shift; + return($self->Scheme . '://freeside'); + +} + +=item _FreesideURILabel + +Method that returns a short string describing the customer referenced +in the URI. + +=cut + +sub _FreesideURILabel { + + my $self = shift; + + $RT::Logger->debug("Called _FreesideURILabel()"); + + return unless (exists($self->{'fstable'}) and + exists($self->{'fspkey'})); + + my $label; + my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); + + if ($table ne 'cust_main') { + warn "FS::${table} not currently supported"; + return; + } + + my $rec = $self->_FreesideGetRecord(); + + if (ref($rec) eq 'HASH' and $table eq 'cust_main') { + my $name = $rec->{'last'} . ', ' . $rec->{'first'}; + $name = $rec->{'company'} . " ($name)" if $rec->{'company'}; + $label = "$pkey: $name"; + } else { + $label = "$pkey: $table"; + } + + if ($label and !$@) { + return($label); + } else { + return; + } + +} + +=item _FreesideURILabelLong + +Method that returns a longer string describing the customer referenced +in the URI. + +=cut + +sub _FreesideURILabelLong { + + my $self = shift; + + return $self->_FreesideURILabel(); + +} + +=back + +=head1 Public methods + +=over 4 + +=cut + +sub ParseURI { + my $self = shift; + my $uri = shift; + my ($table, $pkey); + + my $uriprefix = $self->_FreesideURIPrefix; + if ($uri =~ /^$uriprefix\/(\w+)\/(\d+)$/) { + $table = $1; + $pkey = $2; + $self->{'scheme'} = $self->Scheme; + } else { + return(undef); + } + + $self->{'uri'} = "${uriprefix}/${table}/${pkey}"; + $self->{'fstable'} = $table; + $self->{'fspkey'} = $pkey; + + + my $url = $self->FreesideURL(); + + if ($url ne '') { + $self->{'href'} = "${url}/view/${table}.cgi?${pkey}"; + } else { + $self->{'href'} = $self->{'uri'}; + } + + $self->{'uri'}; + +} + +sub Scheme { + my $self = shift; + return('freeside'); + +} + +sub HREF { + my $self = shift; + return($self->{'href'} || $self->{'uri'}); +} + +sub IsLocal { + my $self = shift; + return undef; +} + +=item AsString + +Return a "pretty" string representing the URI object. + +This is meant to be used like this: + + % $re = $uri->Resolver; + <A HREF="<% $re->HREF %>"><% $re->AsString %></A> + +=cut + +sub AsString { + my $self = shift; + my $prettystring; + if ($prettystring = $self->_FreesideURILabel) { + return $prettystring; + } else { + return $self->URI; + } +} + +=item AsStringLong + +Return a longer (HTML) string representing the URI object. + +=cut + +sub AsStringLong { + my $self = shift; + my $prettystring; + if ($prettystring = $self->_FreesideURILabelLong || $self->_FreesideURILabel){ + return $prettystring; + } else { + return $self->URI; + } +} + +$IntegrationType ||= 'Internal'; +eval "require RT::URI::freeside::${RT::URI::freeside::IntegrationType}"; +warn $@ if $@; +if ($@ && + $@ !~ qr(^Can't locate RT/URI/freeside/${RT::URI::freeside::IntegrationType}.pm)) { + die $@; +}; + +=back + +=cut + +1; diff --git a/rt/lib/RT/URI/freeside/Internal.pm b/rt/lib/RT/URI/freeside/Internal.pm new file mode 100644 index 000000000..bd7c42ccf --- /dev/null +++ b/rt/lib/RT/URI/freeside/Internal.pm @@ -0,0 +1,145 @@ +# BEGIN LICENSE BLOCK +# +# Copyright (c) 2004 Kristian Hoffmann <khoff@fire2wire.com> +# Based on the original RT::URI::base and RT::URI::fsck_com_rt. +# +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK +# +use strict; +no warnings qw(redefine); + +#use vars qw($conf); + +use FS; +use FS::UID qw(dbh); +use FS::CGI qw(popurl); +use FS::UI::Web::small_custview qw(small_custview); +use FS::Conf; +use FS::Record qw(qsearchs qsearch dbdef); +use FS::cust_main; +use FS::cust_svc; + +=head1 NAME + +RT::URI::freeside::Internal + +=head1 DESCRIPTION + +Overlay for the RT::URI::freeside URI handler implementing the Internal integration type. + +See L<RT::URI::freeside> for public/private interface documentation. + +=cut + + + +sub _FreesideGetRecord { + + my $self = shift; + my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); + + $RT::Logger->debug("Called _FreesideGetRecord()"); + + #eval "use FS::$table;"; + + my $dbdef = dbdef; + unless ($dbdef) { + $RT::Logger->error("Using Internal freeside integration type, ". + "but it doesn't look like we're running under ". + "freeside's Mason handler."); + return; + } + + my $pkeyfield = $dbdef->table($table)->primary_key; + unless ($pkeyfield) { + $RT::Logger->error("No primary key for freeside table '$table'"); + return; + } + + my $fsrec = qsearchs($table, { $pkeyfield => $pkey }); + unless ($fsrec) { + $RT::Logger->error("Record with '$pkeyfield' == '$pkey' does " . + "not exist in table $table"); + return; + } + + return { $fsrec->hash, '_object' => $fsrec }; + +} + +sub FreesideVersion { + + return $FS::VERSION; + +} + +sub FreesideGetConfig { + + #$conf = new FS::Conf unless ref($conf); + my $conf = new FS::Conf; + + return scalar($conf->config(@_)); + +} + +sub smart_search { #Subroutine + + return map { { $_->hash } } &FS::cust_main::smart_search(@_); + +} + +sub email_search { #Subroutine + + return map { { $_->hash } } &FS::cust_main::email_search(@_); + +} + +sub small_custview { + + return &FS::UI::Web::small_custview::small_custview(@_); + +} + +sub _FreesideURILabelLong { + + my $self = shift; + + my $table = $self->{'fstable'}; + + if ( $table eq 'cust_main' ) { + + my $rec = $self->_FreesideGetRecord(); + return small_custview( $rec->{'_object'}, + scalar(FS::Conf->new->config('countrydefault')), + 1 #nobalance + ); + + } else { + + return $self->_FreesideURILabel(); + + } + +} + +1; diff --git a/rt/lib/RT/URI/freeside/XMLRPC.pm b/rt/lib/RT/URI/freeside/XMLRPC.pm new file mode 100644 index 000000000..916c20d7b --- /dev/null +++ b/rt/lib/RT/URI/freeside/XMLRPC.pm @@ -0,0 +1,122 @@ +# BEGIN LICENSE BLOCK +# +# Copyright (c) 2004 Kristian Hoffmann <khoff@fire2wire.com> +# Based on the original RT::URI::base and RT::URI::fsck_com_rt. +# +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> +# +# (Except where explictly superceded by other copyright notices) +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. +# +# +# END LICENSE BLOCK + +use strict; +no warnings qw(redefine); + +use vars qw($XMLRPC_URL $_FS_VERSION); + +use Frontier::Client; + +=head1 NAME + +RT::URI::freeside::XMLRPC + +=head1 DESCRIPTION + +Overlay for the RT::URI::freeside URI handler implementing the XMLRPC integration type. + +See L<RT::URI::freeside> for public/private interface documentation. + +=cut + + +sub _XMLRPCRequest { #Subroutine + + my $method = shift; + my @args = @_; + + my $result; + eval { + my $server = new Frontier::Client ( url => $XMLRPC_URL ); + $result = $server->call($method, @args); + }; + + if (not $@ and ref($result) eq 'ARRAY') { + return (scalar(@$result) == 1) ? @$result[0] : @$result; + } else { + $RT::Logger->debug("Freeside XMLRPC: " . $result || $@); + return (); + } + +} + +sub _FreesideGetRecord { + + my $self = shift; + my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); + my $record; + + $RT::Logger->debug("Called XMLRPC::_FreesideGetRecord()"); + + #FIXME: Need a better way to get primary keys. + # Maybe create a method for it and cache them like version? + my %table_pkeys = ( + cust_main => 'custnum', + ); + + my $method = 'Record.qsearchs'; + my @args = ($table, { $table_pkeys{$table} => $pkey }); + my ($record) = &_XMLRPCRequest($method, @args); + + return $record; + +} + + +sub FreesideGetConfig { + + return _XMLRPCRequest('Conf.config', @_); + +} + + +sub FreesideVersion { + + return $_FS_VERSION if ($_FS_VERSION =~ /^\d+\.\d+\.\d+/); + + $RT::Logger->debug("Requesting freeside version..."); + ($_FS_VERSION) = &_XMLRPCRequest('version'); + $RT::Logger->debug("Cached freeside version: ${_FS_VERSION}"); + + return $_FS_VERSION; + +} + +sub smart_search { #Subroutine + + return _XMLRPCRequest('cust_main.smart_search', @_); + +} + +sub small_custview { + + return _XMLRPCRequest('Web.UI.small_custview.small_custview', @_); + +} + +1; diff --git a/rt/lib/RT/User.pm b/rt/lib/RT/User.pm index 5c5eb7f2a..cbc10f5b4 100755 --- a/rt/lib/RT/User.pm +++ b/rt/lib/RT/User.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -85,7 +61,7 @@ sub _Init { -=head2 Create PARAMHASH +=item Create PARAMHASH Create takes a hash of values and creates a row in the database: @@ -194,7 +170,7 @@ sub Create { -=head2 id +=item id Returns the current value of id. (In the database, id is stored as int(11).) @@ -203,14 +179,14 @@ Returns the current value of id. =cut -=head2 Name +=item Name Returns the current value of Name. (In the database, Name is stored as varchar(200).) -=head2 SetName VALUE +=item SetName VALUE Set Name to VALUE. @@ -221,14 +197,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Password +=item Password Returns the current value of Password. (In the database, Password is stored as varchar(40).) -=head2 SetPassword VALUE +=item SetPassword VALUE Set Password to VALUE. @@ -239,14 +215,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Comments +=item Comments Returns the current value of Comments. (In the database, Comments is stored as blob.) -=head2 SetComments VALUE +=item SetComments VALUE Set Comments to VALUE. @@ -257,14 +233,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Signature +=item Signature Returns the current value of Signature. (In the database, Signature is stored as blob.) -=head2 SetSignature VALUE +=item SetSignature VALUE Set Signature to VALUE. @@ -275,14 +251,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 EmailAddress +=item EmailAddress Returns the current value of EmailAddress. (In the database, EmailAddress is stored as varchar(120).) -=head2 SetEmailAddress VALUE +=item SetEmailAddress VALUE Set EmailAddress to VALUE. @@ -293,14 +269,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 FreeformContactInfo +=item FreeformContactInfo Returns the current value of FreeformContactInfo. (In the database, FreeformContactInfo is stored as blob.) -=head2 SetFreeformContactInfo VALUE +=item SetFreeformContactInfo VALUE Set FreeformContactInfo to VALUE. @@ -311,14 +287,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Organization +=item Organization Returns the current value of Organization. (In the database, Organization is stored as varchar(200).) -=head2 SetOrganization VALUE +=item SetOrganization VALUE Set Organization to VALUE. @@ -329,14 +305,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 RealName +=item RealName Returns the current value of RealName. (In the database, RealName is stored as varchar(120).) -=head2 SetRealName VALUE +=item SetRealName VALUE Set RealName to VALUE. @@ -347,14 +323,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 NickName +=item NickName Returns the current value of NickName. (In the database, NickName is stored as varchar(16).) -=head2 SetNickName VALUE +=item SetNickName VALUE Set NickName to VALUE. @@ -365,14 +341,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Lang +=item Lang Returns the current value of Lang. (In the database, Lang is stored as varchar(16).) -=head2 SetLang VALUE +=item SetLang VALUE Set Lang to VALUE. @@ -383,14 +359,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 EmailEncoding +=item EmailEncoding Returns the current value of EmailEncoding. (In the database, EmailEncoding is stored as varchar(16).) -=head2 SetEmailEncoding VALUE +=item SetEmailEncoding VALUE Set EmailEncoding to VALUE. @@ -401,14 +377,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 WebEncoding +=item WebEncoding Returns the current value of WebEncoding. (In the database, WebEncoding is stored as varchar(16).) -=head2 SetWebEncoding VALUE +=item SetWebEncoding VALUE Set WebEncoding to VALUE. @@ -419,14 +395,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ExternalContactInfoId +=item ExternalContactInfoId Returns the current value of ExternalContactInfoId. (In the database, ExternalContactInfoId is stored as varchar(100).) -=head2 SetExternalContactInfoId VALUE +=item SetExternalContactInfoId VALUE Set ExternalContactInfoId to VALUE. @@ -437,14 +413,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ContactInfoSystem +=item ContactInfoSystem Returns the current value of ContactInfoSystem. (In the database, ContactInfoSystem is stored as varchar(30).) -=head2 SetContactInfoSystem VALUE +=item SetContactInfoSystem VALUE Set ContactInfoSystem to VALUE. @@ -455,14 +431,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 ExternalAuthId +=item ExternalAuthId Returns the current value of ExternalAuthId. (In the database, ExternalAuthId is stored as varchar(100).) -=head2 SetExternalAuthId VALUE +=item SetExternalAuthId VALUE Set ExternalAuthId to VALUE. @@ -473,14 +449,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 AuthSystem +=item AuthSystem Returns the current value of AuthSystem. (In the database, AuthSystem is stored as varchar(30).) -=head2 SetAuthSystem VALUE +=item SetAuthSystem VALUE Set AuthSystem to VALUE. @@ -491,14 +467,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Gecos +=item Gecos Returns the current value of Gecos. (In the database, Gecos is stored as varchar(16).) -=head2 SetGecos VALUE +=item SetGecos VALUE Set Gecos to VALUE. @@ -509,14 +485,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 HomePhone +=item HomePhone Returns the current value of HomePhone. (In the database, HomePhone is stored as varchar(30).) -=head2 SetHomePhone VALUE +=item SetHomePhone VALUE Set HomePhone to VALUE. @@ -527,14 +503,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 WorkPhone +=item WorkPhone Returns the current value of WorkPhone. (In the database, WorkPhone is stored as varchar(30).) -=head2 SetWorkPhone VALUE +=item SetWorkPhone VALUE Set WorkPhone to VALUE. @@ -545,14 +521,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 MobilePhone +=item MobilePhone Returns the current value of MobilePhone. (In the database, MobilePhone is stored as varchar(30).) -=head2 SetMobilePhone VALUE +=item SetMobilePhone VALUE Set MobilePhone to VALUE. @@ -563,14 +539,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 PagerPhone +=item PagerPhone Returns the current value of PagerPhone. (In the database, PagerPhone is stored as varchar(30).) -=head2 SetPagerPhone VALUE +=item SetPagerPhone VALUE Set PagerPhone to VALUE. @@ -581,14 +557,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Address1 +=item Address1 Returns the current value of Address1. (In the database, Address1 is stored as varchar(200).) -=head2 SetAddress1 VALUE +=item SetAddress1 VALUE Set Address1 to VALUE. @@ -599,14 +575,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Address2 +=item Address2 Returns the current value of Address2. (In the database, Address2 is stored as varchar(200).) -=head2 SetAddress2 VALUE +=item SetAddress2 VALUE Set Address2 to VALUE. @@ -617,14 +593,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 City +=item City Returns the current value of City. (In the database, City is stored as varchar(100).) -=head2 SetCity VALUE +=item SetCity VALUE Set City to VALUE. @@ -635,14 +611,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 State +=item State Returns the current value of State. (In the database, State is stored as varchar(100).) -=head2 SetState VALUE +=item SetState VALUE Set State to VALUE. @@ -653,14 +629,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Zip +=item Zip Returns the current value of Zip. (In the database, Zip is stored as varchar(16).) -=head2 SetZip VALUE +=item SetZip VALUE Set Zip to VALUE. @@ -671,14 +647,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Country +=item Country Returns the current value of Country. (In the database, Country is stored as varchar(50).) -=head2 SetCountry VALUE +=item SetCountry VALUE Set Country to VALUE. @@ -689,14 +665,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Timezone +=item Timezone Returns the current value of Timezone. (In the database, Timezone is stored as varchar(50).) -=head2 SetTimezone VALUE +=item SetTimezone VALUE Set Timezone to VALUE. @@ -707,14 +683,14 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 PGPKey +=item PGPKey Returns the current value of PGPKey. (In the database, PGPKey is stored as text.) -=head2 SetPGPKey VALUE +=item SetPGPKey VALUE Set PGPKey to VALUE. @@ -725,7 +701,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 Creator +=item Creator Returns the current value of Creator. (In the database, Creator is stored as int(11).) @@ -734,7 +710,7 @@ Returns the current value of Creator. =cut -=head2 Created +=item Created Returns the current value of Created. (In the database, Created is stored as datetime.) @@ -743,7 +719,7 @@ Returns the current value of Created. =cut -=head2 LastUpdatedBy +=item LastUpdatedBy Returns the current value of LastUpdatedBy. (In the database, LastUpdatedBy is stored as int(11).) @@ -752,7 +728,7 @@ Returns the current value of LastUpdatedBy. =cut -=head2 LastUpdated +=item LastUpdated Returns the current value of LastUpdated. (In the database, LastUpdated is stored as datetime.) @@ -762,77 +738,77 @@ Returns the current value of LastUpdated. -sub _CoreAccessible { +sub _ClassAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, type => 'int(11)', default => ''}, Name => - {read => 1, write => 1, sql_type => 12, length => 200, is_blob => 0, is_numeric => 0, type => 'varchar(200)', default => ''}, + {read => 1, write => 1, type => 'varchar(200)', default => ''}, Password => - {read => 1, write => 1, sql_type => 12, length => 40, is_blob => 0, is_numeric => 0, type => 'varchar(40)', default => ''}, + {read => 1, write => 1, type => 'varchar(40)', default => ''}, Comments => - {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'blob', default => ''}, + {read => 1, write => 1, type => 'blob', default => ''}, Signature => - {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'blob', default => ''}, + {read => 1, write => 1, type => 'blob', default => ''}, EmailAddress => - {read => 1, write => 1, sql_type => 12, length => 120, is_blob => 0, is_numeric => 0, type => 'varchar(120)', default => ''}, + {read => 1, write => 1, type => 'varchar(120)', default => ''}, FreeformContactInfo => - {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'blob', default => ''}, + {read => 1, write => 1, type => 'blob', default => ''}, Organization => - {read => 1, write => 1, sql_type => 12, length => 200, is_blob => 0, is_numeric => 0, type => 'varchar(200)', default => ''}, + {read => 1, write => 1, type => 'varchar(200)', default => ''}, RealName => - {read => 1, write => 1, sql_type => 12, length => 120, is_blob => 0, is_numeric => 0, type => 'varchar(120)', default => ''}, + {read => 1, write => 1, type => 'varchar(120)', default => ''}, NickName => - {read => 1, write => 1, sql_type => 12, length => 16, is_blob => 0, is_numeric => 0, type => 'varchar(16)', default => ''}, + {read => 1, write => 1, type => 'varchar(16)', default => ''}, Lang => - {read => 1, write => 1, sql_type => 12, length => 16, is_blob => 0, is_numeric => 0, type => 'varchar(16)', default => ''}, + {read => 1, write => 1, type => 'varchar(16)', default => ''}, EmailEncoding => - {read => 1, write => 1, sql_type => 12, length => 16, is_blob => 0, is_numeric => 0, type => 'varchar(16)', default => ''}, + {read => 1, write => 1, type => 'varchar(16)', default => ''}, WebEncoding => - {read => 1, write => 1, sql_type => 12, length => 16, is_blob => 0, is_numeric => 0, type => 'varchar(16)', default => ''}, + {read => 1, write => 1, type => 'varchar(16)', default => ''}, ExternalContactInfoId => - {read => 1, write => 1, sql_type => 12, length => 100, is_blob => 0, is_numeric => 0, type => 'varchar(100)', default => ''}, + {read => 1, write => 1, type => 'varchar(100)', default => ''}, ContactInfoSystem => - {read => 1, write => 1, sql_type => 12, length => 30, is_blob => 0, is_numeric => 0, type => 'varchar(30)', default => ''}, + {read => 1, write => 1, type => 'varchar(30)', default => ''}, ExternalAuthId => - {read => 1, write => 1, sql_type => 12, length => 100, is_blob => 0, is_numeric => 0, type => 'varchar(100)', default => ''}, + {read => 1, write => 1, type => 'varchar(100)', default => ''}, AuthSystem => - {read => 1, write => 1, sql_type => 12, length => 30, is_blob => 0, is_numeric => 0, type => 'varchar(30)', default => ''}, + {read => 1, write => 1, type => 'varchar(30)', default => ''}, Gecos => - {read => 1, write => 1, sql_type => 12, length => 16, is_blob => 0, is_numeric => 0, type => 'varchar(16)', default => ''}, + {read => 1, write => 1, type => 'varchar(16)', default => ''}, HomePhone => - {read => 1, write => 1, sql_type => 12, length => 30, is_blob => 0, is_numeric => 0, type => 'varchar(30)', default => ''}, + {read => 1, write => 1, type => 'varchar(30)', default => ''}, WorkPhone => - {read => 1, write => 1, sql_type => 12, length => 30, is_blob => 0, is_numeric => 0, type => 'varchar(30)', default => ''}, + {read => 1, write => 1, type => 'varchar(30)', default => ''}, MobilePhone => - {read => 1, write => 1, sql_type => 12, length => 30, is_blob => 0, is_numeric => 0, type => 'varchar(30)', default => ''}, + {read => 1, write => 1, type => 'varchar(30)', default => ''}, PagerPhone => - {read => 1, write => 1, sql_type => 12, length => 30, is_blob => 0, is_numeric => 0, type => 'varchar(30)', default => ''}, + {read => 1, write => 1, type => 'varchar(30)', default => ''}, Address1 => - {read => 1, write => 1, sql_type => 12, length => 200, is_blob => 0, is_numeric => 0, type => 'varchar(200)', default => ''}, + {read => 1, write => 1, type => 'varchar(200)', default => ''}, Address2 => - {read => 1, write => 1, sql_type => 12, length => 200, is_blob => 0, is_numeric => 0, type => 'varchar(200)', default => ''}, + {read => 1, write => 1, type => 'varchar(200)', default => ''}, City => - {read => 1, write => 1, sql_type => 12, length => 100, is_blob => 0, is_numeric => 0, type => 'varchar(100)', default => ''}, + {read => 1, write => 1, type => 'varchar(100)', default => ''}, State => - {read => 1, write => 1, sql_type => 12, length => 100, is_blob => 0, is_numeric => 0, type => 'varchar(100)', default => ''}, + {read => 1, write => 1, type => 'varchar(100)', default => ''}, Zip => - {read => 1, write => 1, sql_type => 12, length => 16, is_blob => 0, is_numeric => 0, type => 'varchar(16)', default => ''}, + {read => 1, write => 1, type => 'varchar(16)', default => ''}, Country => - {read => 1, write => 1, sql_type => 12, length => 50, is_blob => 0, is_numeric => 0, type => 'varchar(50)', default => ''}, + {read => 1, write => 1, type => 'varchar(50)', default => ''}, Timezone => - {read => 1, write => 1, sql_type => 12, length => 50, is_blob => 0, is_numeric => 0, type => 'varchar(50)', default => ''}, + {read => 1, write => 1, type => 'varchar(50)', default => ''}, PGPKey => - {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'text', default => ''}, + {read => 1, write => 1, type => 'text', default => ''}, Creator => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, Created => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, LastUpdatedBy => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, type => 'int(11)', default => '0'}, LastUpdated => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, type => 'datetime', default => ''}, } }; @@ -864,7 +840,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/User_Overlay.pm b/rt/lib/RT/User_Overlay.pm index fd83630d5..8f4df467d 100644 --- a/rt/lib/RT/User_Overlay.pm +++ b/rt/lib/RT/User_Overlay.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC # <jesse@bestpractical.com> # # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html. # # # CONTRIBUTION SUBMISSION POLICY: @@ -1308,6 +1308,267 @@ sub OwnGroups { # }}} +# {{{ Links + +#much false laziness w/Ticket_Overlay.pm + +# A helper table for links mapping to make it easier +# to build and parse links between tickets + +use vars '%LINKDIRMAP'; + +%LINKDIRMAP = ( + MemberOf => { Base => 'MemberOf', + Target => 'HasMember', }, + RefersTo => { Base => 'RefersTo', + Target => 'ReferredToBy', }, + DependsOn => { Base => 'DependsOn', + Target => 'DependedOnBy', }, + MergedInto => { Base => 'MergedInto', + Target => 'MergedInto', }, + +); + +sub LINKDIRMAP { return \%LINKDIRMAP } + +#sub _Links { +# my $self = shift; +# +# #TODO: Field isn't the right thing here. but I ahave no idea what mnemonic --- +# #tobias meant by $f +# my $field = shift; +# my $type = shift || ""; +# +# unless ( $self->{"$field$type"} ) { +# $self->{"$field$type"} = new RT::Links( $self->CurrentUser ); +# if ( $self->CurrentUserHasRight('ShowTicket') ) { +# # Maybe this ticket is a merged ticket +# my $Tickets = new RT::Tickets( $self->CurrentUser ); +# # at least to myself +# $self->{"$field$type"}->Limit( FIELD => $field, +# VALUE => $self->URI, +# ENTRYAGGREGATOR => 'OR' ); +# $Tickets->Limit( FIELD => 'EffectiveId', +# VALUE => $self->EffectiveId ); +# while (my $Ticket = $Tickets->Next) { +# $self->{"$field$type"}->Limit( FIELD => $field, +# VALUE => $Ticket->URI, +# ENTRYAGGREGATOR => 'OR' ); +# } +# $self->{"$field$type"}->Limit( FIELD => 'Type', +# VALUE => $type ) +# if ($type); +# } +# } +# return ( $self->{"$field$type"} ); +#} + +=head2 DeleteLink + +Delete a link. takes a paramhash of Base, Target and Type. +Either Base or Target must be null. The null value will +be replaced with this ticket\'s id + +=cut + +sub DeleteLink { + my $self = shift; + my %args = ( + Base => undef, + Target => undef, + Type => undef, + @_ + ); + + unless ( $args{'Target'} || $args{'Base'} ) { + $RT::Logger->error("Base or Target must be specified\n"); + return ( 0, $self->loc('Either base or target must be specified') ); + } + + #check acls + my $right = 0; + $right++ if $self->CurrentUserHasRight('ModifyUser'); + if ( !$right && $RT::StrictLinkACL ) { + return ( 0, $self->loc("Permission Denied") ); + } + +# # If the other URI is an RT::Ticket, we want to make sure the user +# # can modify it too... +# my ($status, $msg, $other_ticket) = $self->__GetTicketFromURI( URI => $args{'Target'} || $args{'Base'} ); +# return (0, $msg) unless $status; +# if ( !$other_ticket || $other_ticket->CurrentUserHasRight('ModifyTicket') ) { +# $right++; +# } +# if ( ( !$RT::StrictLinkACL && $right == 0 ) || +# ( $RT::StrictLinkACL && $right < 2 ) ) +# { +# return ( 0, $self->loc("Permission Denied") ); +# } + + my ($val, $Msg) = $self->SUPER::_DeleteLink(%args); + + if ( !$val ) { + $RT::Logger->debug("Couldn't find that link\n"); + return ( 0, $Msg ); + } + + my ($direction, $remote_link); + + if ( $args{'Base'} ) { + $remote_link = $args{'Base'}; + $direction = 'Target'; + } + elsif ( $args{'Target'} ) { + $remote_link = $args{'Target'}; + $direction='Base'; + } + + if ( $args{'Silent'} ) { + return ( $val, $Msg ); + } + else { + my $remote_uri = RT::URI->new( $self->CurrentUser ); + $remote_uri->FromURI( $remote_link ); + + my ( $Trans, $Msg, $TransObj ) = $self->_NewTransaction( + Type => 'DeleteLink', + Field => $LINKDIRMAP{$args{'Type'}}->{$direction}, + OldValue => $remote_uri->URI || $remote_link, + TimeTaken => 0 + ); + + if ( $remote_uri->IsLocal ) { + + my $OtherObj = $remote_uri->Object; + my ( $val, $Msg ) = $OtherObj->_NewTransaction(Type => 'DeleteLink', + Field => $direction eq 'Target' ? $LINKDIRMAP{$args{'Type'}}->{Base} + : $LINKDIRMAP{$args{'Type'}}->{Target}, + OldValue => $self->URI, + ActivateScrips => ! $RT::LinkTransactionsRun1Scrip, + TimeTaken => 0 ); + } + + return ( $Trans, $Msg ); + } +} + +sub AddLink { + my $self = shift; + my %args = ( Target => '', + Base => '', + Type => '', + Silent => undef, + @_ ); + + unless ( $args{'Target'} || $args{'Base'} ) { + $RT::Logger->error("Base or Target must be specified\n"); + return ( 0, $self->loc('Either base or target must be specified') ); + } + + my $right = 0; + $right++ if $self->CurrentUserHasRight('ModifyUser'); + if ( !$right && $RT::StrictLinkACL ) { + return ( 0, $self->loc("Permission Denied") ); + } + +# # If the other URI is an RT::Ticket, we want to make sure the user +# # can modify it too... +# my ($status, $msg, $other_ticket) = $self->__GetTicketFromURI( URI => $args{'Target'} || $args{'Base'} ); +# return (0, $msg) unless $status; +# if ( !$other_ticket || $other_ticket->CurrentUserHasRight('ModifyTicket') ) { +# $right++; +# } +# if ( ( !$RT::StrictLinkACL && $right == 0 ) || +# ( $RT::StrictLinkACL && $right < 2 ) ) +# { +# return ( 0, $self->loc("Permission Denied") ); +# } + + return $self->_AddLink(%args); +} + +#sub __GetTicketFromURI { +# my $self = shift; +# my %args = ( URI => '', @_ ); +# +# # If the other URI is an RT::Ticket, we want to make sure the user +# # can modify it too... +# my $uri_obj = RT::URI->new( $self->CurrentUser ); +# $uri_obj->FromURI( $args{'URI'} ); +# +# unless ( $uri_obj->Resolver && $uri_obj->Scheme ) { +# my $msg = $self->loc( "Couldn't resolve '[_1]' into a URI.", $args{'URI'} ); +# $RT::Logger->warning( "$msg\n" ); +# return( 0, $msg ); +# } +# my $obj = $uri_obj->Resolver->Object; +# unless ( UNIVERSAL::isa($obj, 'RT::Ticket') && $obj->id ) { +# return (1, 'Found not a ticket', undef); +# } +# return (1, 'Found ticket', $obj); +#} + +=head2 _AddLink + +Private non-acled variant of AddLink so that links can be added during create. + +=cut + +sub _AddLink { + my $self = shift; + my %args = ( Target => '', + Base => '', + Type => '', + Silent => undef, + @_ ); + + my ($val, $msg, $exist) = $self->SUPER::_AddLink(%args); + return ($val, $msg) if !$val || $exist; + + my ($direction, $remote_link); + if ( $args{'Target'} ) { + $remote_link = $args{'Target'}; + $direction = 'Base'; + } elsif ( $args{'Base'} ) { + $remote_link = $args{'Base'}; + $direction = 'Target'; + } + + # Don't write the transaction if we're doing this on create + if ( $args{'Silent'} ) { + return ( $val, $msg ); + } + else { + my $remote_uri = RT::URI->new( $self->CurrentUser ); + $remote_uri->FromURI( $remote_link ); + + #Write the transaction + my ( $Trans, $Msg, $TransObj ) = + $self->_NewTransaction(Type => 'AddLink', + Field => $LINKDIRMAP{$args{'Type'}}->{$direction}, + NewValue => $remote_uri->URI || $remote_link, + TimeTaken => 0 ); + + if ( $remote_uri->IsLocal ) { + + my $OtherObj = $remote_uri->Object; + my ( $val, $Msg ) = $OtherObj->_NewTransaction(Type => 'AddLink', + Field => $direction eq 'Target' ? $LINKDIRMAP{$args{'Type'}}->{Base} + : $LINKDIRMAP{$args{'Type'}}->{Target}, + NewValue => $self->URI, + ActivateScrips => ! $RT::LinkTransactionsRun1Scrip, + TimeTaken => 0 ); + } + return ( $val, $Msg ); + } + +} + + + +# }}} + + # {{{ sub Rights testing =head1 Rights testing diff --git a/rt/lib/RT/Users.pm b/rt/lib/RT/Users.pm index 8d574849d..d58f69653 100755 --- a/rt/lib/RT/Users.pm +++ b/rt/lib/RT/Users.pm @@ -1,14 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# BEGIN LICENSE BLOCK # -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> +# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> # -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: +# (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have @@ -20,31 +14,13 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) +# Unless otherwise specified, all modifications, corrections or +# extensions to this work which alter its source code become the +# property of Best Practical Solutions, LLC when submitted for +# inclusion in the work. # -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# END LICENSE BLOCK # Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) # WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. # @@ -88,7 +64,7 @@ sub _Init { } -=head2 NewItem +=item NewItem Returns an empty new RT::User item @@ -125,7 +101,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line no warnings qw(redefine); diff --git a/rt/lib/RT/Users_Overlay.pm b/rt/lib/RT/Users_Overlay.pm index 96621e388..809fa6707 100644 --- a/rt/lib/RT/Users_Overlay.pm +++ b/rt/lib/RT/Users_Overlay.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC # <jesse@bestpractical.com> # # (Except where explicitly superseded by other copyright notices) @@ -24,7 +24,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# http://www.gnu.org/copyleft/gpl.html. # # # CONTRIBUTION SUBMISSION POLICY: @@ -440,6 +440,7 @@ sub WhoHaveRight { $from_group->WhoHaveGroupRight( %args ); #XXX: DIRTY HACK + use DBIx::SearchBuilder 1.50; #no version on ::Union :( use DBIx::SearchBuilder::Union; my $union = new DBIx::SearchBuilder::Union; $union->add( $_ ) foreach @from_role; |