X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Flib%2FRT%2FScrip.pm;h=71080a00cff92dc145c9ab02bb825f81d1ebcc32;hp=85fe6a820e31017c8147c8369ad86224752e46f2;hb=e9e0cf0989259b94d9758eceff448666a2e5a5cc;hpb=d4d0590bef31071e8809ec046717444b95b3f30a diff --git a/rt/lib/RT/Scrip.pm b/rt/lib/RT/Scrip.pm index 85fe6a820..71080a00c 100755 --- a/rt/lib/RT/Scrip.pm +++ b/rt/lib/RT/Scrip.pm @@ -1,38 +1,40 @@ # BEGIN BPS TAGGED BLOCK {{{ -# +# # COPYRIGHT: -# -# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC -# -# +# +# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC +# +# # (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. -# -# +# 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.) -# +# # 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 @@ -41,110 +43,675 @@ # 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 ) -# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. -# -# !! DO NOT EDIT THIS FILE !! # - -use strict; - +# END BPS TAGGED BLOCK }}} =head1 NAME -RT::Scrip - + RT::Scrip - an RT Scrip object =head1 SYNOPSIS + use RT::Scrip; + =head1 DESCRIPTION + =head1 METHODS + =cut + package RT::Scrip; -use RT::Record; + +use strict; +use warnings; + + use RT::Queue; use RT::Template; use RT::ScripCondition; use RT::ScripAction; +use base 'RT::Record'; + +sub Table {'Scrips'} + +# {{{ sub Create + +=head2 Create + +Creates a new entry in the Scrips table. Takes a paramhash with: + + Queue => 0, + Description => undef, + Template => undef, + ScripAction => undef, + ScripCondition => undef, + CustomPrepareCode => undef, + CustomCommitCode => undef, + CustomIsApplicableCode => undef, + -use vars qw( @ISA ); -@ISA= qw( RT::Record ); -sub _Init { - my $self = shift; +Returns (retval, msg); +retval is 0 for failure or scrip id. msg is a textual description of what happened. - $self->Table('Scrips'); - $self->SUPER::_Init(@_); +=cut + +sub Create { + my $self = shift; + my %args = ( + Queue => 0, + Template => 0, # name or id + ScripAction => 0, # name or id + ScripCondition => 0, # name or id + Stage => 'TransactionCreate', + Description => undef, + CustomPrepareCode => undef, + CustomCommitCode => undef, + CustomIsApplicableCode => undef, + ConditionRules => undef, + ActionRules => undef, + @_ + ); + + if ($args{CustomPrepareCode} || $args{CustomCommitCode} || $args{CustomIsApplicableCode}) { + unless ( $self->CurrentUser->HasRight( Object => $RT::System, + Right => 'ExecuteCode' ) ) + { + return ( 0, $self->loc('Permission Denied') ); + } + } + + unless ( $args{'Queue'} ) { + unless ( $self->CurrentUser->HasRight( Object => $RT::System, + Right => 'ModifyScrips' ) ) + { + return ( 0, $self->loc('Permission Denied') ); + } + $args{'Queue'} = 0; # avoid undef sneaking in + } + else { + my $QueueObj = RT::Queue->new( $self->CurrentUser ); + $QueueObj->Load( $args{'Queue'} ); + unless ( $QueueObj->id ) { + return ( 0, $self->loc('Invalid queue') ); + } + unless ( $QueueObj->CurrentUserHasRight('ModifyScrips') ) { + return ( 0, $self->loc('Permission Denied') ); + } + $args{'Queue'} = $QueueObj->id; + } + + #TODO +++ validate input + + require RT::ScripAction; + return ( 0, $self->loc("Action is mandatory argument") ) + unless $args{'ScripAction'}; + my $action = RT::ScripAction->new( $self->CurrentUser ); + $action->Load( $args{'ScripAction'} ); + return ( 0, $self->loc( "Action '[_1]' not found", $args{'ScripAction'} ) ) + unless $action->Id; + + require RT::Template; + return ( 0, $self->loc("Template is mandatory argument") ) + unless $args{'Template'}; + my $template = RT::Template->new( $self->CurrentUser ); + $template->Load( $args{'Template'} ); + return ( 0, $self->loc( "Template '[_1]' not found", $args{'Template'} ) ) + unless $template->Id; + + require RT::ScripCondition; + return ( 0, $self->loc("Condition is mandatory argument") ) + unless $args{'ScripCondition'}; + my $condition = RT::ScripCondition->new( $self->CurrentUser ); + $condition->Load( $args{'ScripCondition'} ); + return ( 0, $self->loc( "Condition '[_1]' not found", $args{'ScripCondition'} ) ) + unless $condition->Id; + + my ( $id, $msg ) = $self->SUPER::Create( + Queue => $args{'Queue'}, + Template => $template->Id, + ScripCondition => $condition->id, + Stage => $args{'Stage'}, + ScripAction => $action->Id, + Description => $args{'Description'}, + CustomPrepareCode => $args{'CustomPrepareCode'}, + CustomCommitCode => $args{'CustomCommitCode'}, + CustomIsApplicableCode => $args{'CustomIsApplicableCode'}, + ConditionRules => $args{'ConditionRules'}, + ActionRules => $args{'ActionRules'}, + ); + if ( $id ) { + return ( $id, $self->loc('Scrip Created') ); + } + else { + return ( $id, $msg ); + } } +=head2 Delete + +Delete this object + +=cut + +sub Delete { + my $self = shift; + + unless ( $self->CurrentUserHasRight('ModifyScrips') ) { + return ( 0, $self->loc('Permission Denied') ); + } + + return ( $self->SUPER::Delete(@_) ); +} -=head2 Create PARAMHASH -Create takes a hash of values and creates a row in the database: +=head2 QueueObj - varchar(255) 'Description'. - int(11) 'ScripCondition'. - int(11) 'ScripAction'. - text 'ConditionRules'. - text 'ActionRules'. - text 'CustomIsApplicableCode'. - text 'CustomPrepareCode'. - text 'CustomCommitCode'. - varchar(32) 'Stage'. - int(11) 'Queue'. - int(11) 'Template'. +Retuns an RT::Queue object with this Scrip's queue =cut +sub QueueObj { + my $self = shift; + + if ( !$self->{'QueueObj'} ) { + require RT::Queue; + $self->{'QueueObj'} = RT::Queue->new( $self->CurrentUser ); + $self->{'QueueObj'}->Load( $self->__Value('Queue') ); + } + return ( $self->{'QueueObj'} ); +} -sub Create { +=head2 ActionObj + +Retuns an RT::Action object with this Scrip's Action + +=cut + +sub ActionObj { my $self = shift; - my %args = ( - Description => '', - ScripCondition => '0', - ScripAction => '0', - ConditionRules => '', - ActionRules => '', - CustomIsApplicableCode => '', - CustomPrepareCode => '', - CustomCommitCode => '', - Stage => '', - Queue => '0', - Template => '0', - - @_); - $self->SUPER::Create( - Description => $args{'Description'}, - ScripCondition => $args{'ScripCondition'}, - ScripAction => $args{'ScripAction'}, - ConditionRules => $args{'ConditionRules'}, - ActionRules => $args{'ActionRules'}, - CustomIsApplicableCode => $args{'CustomIsApplicableCode'}, - CustomPrepareCode => $args{'CustomPrepareCode'}, - CustomCommitCode => $args{'CustomCommitCode'}, - Stage => $args{'Stage'}, - Queue => $args{'Queue'}, - Template => $args{'Template'}, -); + unless ( defined $self->{'ScripActionObj'} ) { + require RT::ScripAction; + + $self->{'ScripActionObj'} = RT::ScripAction->new( $self->CurrentUser ); + + #TODO: why are we loading Actions with templates like this. + # two separate methods might make more sense + $self->{'ScripActionObj'}->Load( $self->ScripAction, $self->Template ); + } + return ( $self->{'ScripActionObj'} ); } +=head2 ConditionObj + +Retuns an L object with this Scrip's IsApplicable + +=cut + +sub ConditionObj { + my $self = shift; + + my $res = RT::ScripCondition->new( $self->CurrentUser ); + $res->Load( $self->ScripCondition ); + return $res; +} + + +=head2 LoadModules + +Loads scrip's condition and action modules. + +=cut + +sub LoadModules { + my $self = shift; + + $self->ConditionObj->LoadCondition; + $self->ActionObj->LoadAction; +} + + +=head2 TemplateObj + +Retuns an RT::Template object with this Scrip's Template + +=cut + +sub TemplateObj { + my $self = shift; + + unless ( defined $self->{'TemplateObj'} ) { + require RT::Template; + $self->{'TemplateObj'} = RT::Template->new( $self->CurrentUser ); + $self->{'TemplateObj'}->Load( $self->Template ); + } + return ( $self->{'TemplateObj'} ); +} + + + + +=head2 Apply { TicketObj => undef, TransactionObj => undef} + +This method instantiates the ScripCondition and ScripAction objects for a +single execution of this scrip. it then calls the IsApplicable method of the +ScripCondition. +If that succeeds, it calls the Prepare method of the +ScripAction. If that succeeds, it calls the Commit method of the ScripAction. + +Usually, the ticket and transaction objects passed to this method +should be loaded by the SuperUser role + +=cut + + +# XXX TODO : This code appears to be obsoleted in favor of similar code in Scrips->Apply. +# Why is this here? Is it still called? + +sub Apply { + my $self = shift; + my %args = ( TicketObj => undef, + TransactionObj => undef, + @_ ); + + $RT::Logger->debug("Now applying scrip ".$self->Id . " for transaction ".$args{'TransactionObj'}->id); + + my $ApplicableTransactionObj = $self->IsApplicable( TicketObj => $args{'TicketObj'}, + TransactionObj => $args{'TransactionObj'} ); + unless ( $ApplicableTransactionObj ) { + return undef; + } + + if ( $ApplicableTransactionObj->id != $args{'TransactionObj'}->id ) { + $RT::Logger->debug("Found an applicable transaction ".$ApplicableTransactionObj->Id . " in the same batch with transaction ".$args{'TransactionObj'}->id); + } + + #If it's applicable, prepare and commit it + $RT::Logger->debug("Now preparing scrip ".$self->Id . " for transaction ".$ApplicableTransactionObj->id); + unless ( $self->Prepare( TicketObj => $args{'TicketObj'}, + TransactionObj => $ApplicableTransactionObj ) + ) { + return undef; + } + + $RT::Logger->debug("Now commiting scrip ".$self->Id . " for transaction ".$ApplicableTransactionObj->id); + unless ( $self->Commit( TicketObj => $args{'TicketObj'}, + TransactionObj => $ApplicableTransactionObj) + ) { + return undef; + } + + $RT::Logger->debug("We actually finished scrip ".$self->Id . " for transaction ".$ApplicableTransactionObj->id); + return (1); + +} + + + +=head2 IsApplicable + +Calls the Condition object's IsApplicable method + +Upon success, returns the applicable Transaction object. +Otherwise, undef is returned. + +If the Scrip is in the TransactionCreate Stage (the usual case), only test +the associated Transaction object to see if it is applicable. + +For Scrips in the TransactionBatch Stage, test all Transaction objects +created during the Ticket object's lifetime, and returns the first one +that is applicable. + +=cut + +sub IsApplicable { + my $self = shift; + my %args = ( TicketObj => undef, + TransactionObj => undef, + @_ ); + + my $return; + eval { + + my @Transactions; + + if ( $self->Stage eq 'TransactionCreate') { + # Only look at our current Transaction + @Transactions = ( $args{'TransactionObj'} ); + } + elsif ( $self->Stage eq 'TransactionBatch') { + # Look at all Transactions in this Batch + @Transactions = @{ $args{'TicketObj'}->TransactionBatch || [] }; + } + else { + $RT::Logger->error( "Unknown Scrip stage:" . $self->Stage ); + return (undef); + } + my $ConditionObj = $self->ConditionObj; + foreach my $TransactionObj ( @Transactions ) { + # in TxnBatch stage we can select scrips that are not applicable to all txns + my $txn_type = $TransactionObj->Type; + next unless( $ConditionObj->ApplicableTransTypes =~ /(?:^|,)(?:Any|\Q$txn_type\E)(?:,|$)/i ); + # Load the scrip's Condition object + $ConditionObj->LoadCondition( + ScripObj => $self, + TicketObj => $args{'TicketObj'}, + TransactionObj => $TransactionObj, + ); + + if ( $ConditionObj->IsApplicable() ) { + # We found an application Transaction -- return it + $return = $TransactionObj; + last; + } + } + }; + + if ($@) { + $RT::Logger->error( "Scrip IsApplicable " . $self->Id . " died. - " . $@ ); + return (undef); + } + + return ($return); + +} + + + +=head2 Prepare + +Calls the action object's prepare method + +=cut + +sub Prepare { + my $self = shift; + my %args = ( TicketObj => undef, + TransactionObj => undef, + @_ ); + + my $return; + eval { + $self->ActionObj->LoadAction( ScripObj => $self, + TicketObj => $args{'TicketObj'}, + TransactionObj => $args{'TransactionObj'}, + ); + + $return = $self->ActionObj->Prepare(); + }; + if ($@) { + $RT::Logger->error( "Scrip Prepare " . $self->Id . " died. - " . $@ ); + return (undef); + } + unless ($return) { + } + return ($return); +} + + + +=head2 Commit + +Calls the action object's commit method + +=cut + +sub Commit { + my $self = shift; + my %args = ( TicketObj => undef, + TransactionObj => undef, + @_ ); + + my $return; + eval { + $return = $self->ActionObj->Commit(); + }; + +#Searchbuilder caching isn't perfectly coherent. got to reload the ticket object, since it +# may have changed + $args{'TicketObj'}->Load( $args{'TicketObj'}->Id ); + + if ($@) { + $RT::Logger->error( "Scrip Commit " . $self->Id . " died. - " . $@ ); + return (undef); + } + + # Not destroying or weakening hte Action and Condition here could cause a + # leak + + return ($return); +} + + + + + +# does an acl check and then passes off the call +sub _Set { + my $self = shift; + my %args = ( + Field => undef, + Value => undef, + @_, + ); + + unless ( $self->CurrentUserHasRight('ModifyScrips') ) { + $RT::Logger->debug( + "CurrentUser can't modify Scrips for " . $self->Queue . "\n" ); + return ( 0, $self->loc('Permission Denied') ); + } + + + if (exists $args{Value}) { + if ($args{Field} eq 'CustomIsApplicableCode' || $args{Field} eq 'CustomPrepareCode' || $args{Field} eq 'CustomCommitCode') { + unless ( $self->CurrentUser->HasRight( Object => $RT::System, + Right => 'ExecuteCode' ) ) { + return ( 0, $self->loc('Permission Denied') ); + } + } + elsif ($args{Field} eq 'Queue') { + if ($args{Value}) { + # moving to another queue + my $queue = RT::Queue->new( $self->CurrentUser ); + $queue->Load($args{Value}); + unless ($queue->Id and $queue->CurrentUserHasRight('ModifyScrips')) { + return ( 0, $self->loc('Permission Denied') ); + } + } else { + # moving to global + unless ($self->CurrentUser->HasRight( Object => RT->System, Right => 'ModifyScrips' )) { + return ( 0, $self->loc('Permission Denied') ); + } + } + } + elsif ($args{Field} eq 'Template') { + my $template = RT::Template->new( $self->CurrentUser ); + $template->Load($args{Value}); + unless ($template->Id and $template->CurrentUserCanRead) { + return ( 0, $self->loc('Permission Denied') ); + } + } + } + + return $self->SUPER::_Set(@_); +} + + +# does an acl check and then passes off the call +sub _Value { + my $self = shift; + + unless ( $self->CurrentUserHasRight('ShowScrips') ) { + $RT::Logger->debug( "CurrentUser can't modify Scrips for " + . $self->__Value('Queue') + . "\n" ); + return (undef); + } + + return $self->__Value(@_); +} + + + +=head2 CurrentUserHasRight + +Helper menthod for HasRight. Presets Principal to CurrentUser then +calls HasRight. + +=cut + +sub CurrentUserHasRight { + my $self = shift; + my $right = shift; + return ( $self->HasRight( Principal => $self->CurrentUser->UserObj, + Right => $right ) ); + +} + + + +=head2 HasRight + +Takes a param-hash consisting of "Right" and "Principal" Principal is +an RT::User object or an RT::CurrentUser object. "Right" is a textual +Right string that applies to Scrips. + +=cut + +sub HasRight { + my $self = shift; + my %args = ( Right => undef, + Principal => undef, + @_ ); + + if ( $self->SUPER::_Value('Queue') ) { + return $args{'Principal'}->HasRight( + Right => $args{'Right'}, + Object => $self->QueueObj + ); + } + else { + return $args{'Principal'}->HasRight( + Object => $RT::System, + Right => $args{'Right'}, + ); + } +} + + + +=head2 CompileCheck + +This routine compile-checks the custom prepare, commit, and is-applicable code +to see if they are syntactically valid Perl. We eval them in a codeblock to +avoid actually executing the code. + +If one of the fields has a compile error, only the first is reported. + +Returns an (ok, message) pair. + +=cut + +sub CompileCheck { + my $self = shift; + + for my $method (qw/CustomPrepareCode CustomCommitCode CustomIsApplicableCode/) { + my $code = $self->$method; + next if !defined($code); + + do { + no strict 'vars'; + eval "sub { $code \n }"; + }; + next if !$@; + + my $error = $@; + return (0, $self->loc("Couldn't compile [_1] codeblock '[_2]': [_3]", $method, $code, $error)); + } +} + + +=head2 SetScripAction + +=cut + +sub SetScripAction { + my $self = shift; + my $value = shift; + + return ( 0, $self->loc("Action is mandatory argument") ) unless $value; + + require RT::ScripAction; + my $action = RT::ScripAction->new( $self->CurrentUser ); + $action->Load($value); + return ( 0, $self->loc( "Action '[_1]' not found", $value ) ) + unless $action->Id; + + return $self->_Set( Field => 'ScripAction', Value => $action->Id ); +} + +=head2 SetScripCondition + +=cut + +sub SetScripCondition { + my $self = shift; + my $value = shift; + + return ( 0, $self->loc("Condition is mandatory argument") ) + unless $value; + + require RT::ScripCondition; + my $condition = RT::ScripCondition->new( $self->CurrentUser ); + $condition->Load($value); + + return ( 0, $self->loc( "Condition '[_1]' not found", $value ) ) + unless $condition->Id; + + return $self->_Set( Field => 'ScripCondition', Value => $condition->Id ); +} + +=head2 SetTemplate + +=cut + +sub SetTemplate { + my $self = shift; + my $value = shift; + + return ( 0, $self->loc("Template is mandatory argument") ) unless $value; + + require RT::Template; + my $template = RT::Template->new( $self->CurrentUser ); + $template->Load($value); + return ( 0, $self->loc( "Template '[_1]' not found", $value ) ) + unless $template->Id; + + return $self->_Set( Field => 'Template', Value => $template->Id ); +} + +1; + + + + + + =head2 id -Returns the current value of id. +Returns the current value of id. (In the database, id is stored as int(11).) @@ -153,7 +720,7 @@ Returns the current value of id. =head2 Description -Returns the current value of Description. +Returns the current value of Description. (In the database, Description is stored as varchar(255).) @@ -161,7 +728,7 @@ Returns the current value of Description. =head2 SetDescription VALUE -Set Description to VALUE. +Set Description to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. (In the database, Description will be stored as a varchar(255).) @@ -171,7 +738,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =head2 ScripCondition -Returns the current value of ScripCondition. +Returns the current value of ScripCondition. (In the database, ScripCondition is stored as int(11).) @@ -179,7 +746,7 @@ Returns the current value of ScripCondition. =head2 SetScripCondition VALUE -Set ScripCondition to VALUE. +Set ScripCondition to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. (In the database, ScripCondition will be stored as a int(11).) @@ -203,7 +770,7 @@ sub ScripConditionObj { =head2 ScripAction -Returns the current value of ScripAction. +Returns the current value of ScripAction. (In the database, ScripAction is stored as int(11).) @@ -211,7 +778,7 @@ Returns the current value of ScripAction. =head2 SetScripAction VALUE -Set ScripAction to VALUE. +Set ScripAction to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. (In the database, ScripAction will be stored as a int(11).) @@ -235,7 +802,7 @@ sub ScripActionObj { =head2 ConditionRules -Returns the current value of ConditionRules. +Returns the current value of ConditionRules. (In the database, ConditionRules is stored as text.) @@ -243,7 +810,7 @@ Returns the current value of ConditionRules. =head2 SetConditionRules VALUE -Set ConditionRules to VALUE. +Set ConditionRules to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. (In the database, ConditionRules will be stored as a text.) @@ -253,7 +820,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =head2 ActionRules -Returns the current value of ActionRules. +Returns the current value of ActionRules. (In the database, ActionRules is stored as text.) @@ -261,7 +828,7 @@ Returns the current value of ActionRules. =head2 SetActionRules VALUE -Set ActionRules to VALUE. +Set ActionRules to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. (In the database, ActionRules will be stored as a text.) @@ -271,7 +838,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =head2 CustomIsApplicableCode -Returns the current value of CustomIsApplicableCode. +Returns the current value of CustomIsApplicableCode. (In the database, CustomIsApplicableCode is stored as text.) @@ -279,7 +846,7 @@ Returns the current value of CustomIsApplicableCode. =head2 SetCustomIsApplicableCode VALUE -Set CustomIsApplicableCode to VALUE. +Set CustomIsApplicableCode to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. (In the database, CustomIsApplicableCode will be stored as a text.) @@ -289,7 +856,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =head2 CustomPrepareCode -Returns the current value of CustomPrepareCode. +Returns the current value of CustomPrepareCode. (In the database, CustomPrepareCode is stored as text.) @@ -297,7 +864,7 @@ Returns the current value of CustomPrepareCode. =head2 SetCustomPrepareCode VALUE -Set CustomPrepareCode to VALUE. +Set CustomPrepareCode to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. (In the database, CustomPrepareCode will be stored as a text.) @@ -307,7 +874,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =head2 CustomCommitCode -Returns the current value of CustomCommitCode. +Returns the current value of CustomCommitCode. (In the database, CustomCommitCode is stored as text.) @@ -315,7 +882,7 @@ Returns the current value of CustomCommitCode. =head2 SetCustomCommitCode VALUE -Set CustomCommitCode to VALUE. +Set CustomCommitCode to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. (In the database, CustomCommitCode will be stored as a text.) @@ -325,7 +892,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =head2 Stage -Returns the current value of Stage. +Returns the current value of Stage. (In the database, Stage is stored as varchar(32).) @@ -333,7 +900,7 @@ Returns the current value of Stage. =head2 SetStage VALUE -Set Stage to VALUE. +Set Stage to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. (In the database, Stage will be stored as a varchar(32).) @@ -343,7 +910,7 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =head2 Queue -Returns the current value of Queue. +Returns the current value of Queue. (In the database, Queue is stored as int(11).) @@ -351,7 +918,7 @@ Returns the current value of Queue. =head2 SetQueue VALUE -Set Queue to VALUE. +Set Queue to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. (In the database, Queue will be stored as a int(11).) @@ -359,23 +926,9 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 QueueObj - -Returns the Queue Object which has the id returned by Queue - - -=cut - -sub QueueObj { - my $self = shift; - my $Queue = RT::Queue->new($self->CurrentUser); - $Queue->Load($self->__Value('Queue')); - return($Queue); -} - =head2 Template -Returns the current value of Template. +Returns the current value of Template. (In the database, Template is stored as int(11).) @@ -383,7 +936,7 @@ Returns the current value of Template. =head2 SetTemplate VALUE -Set Template to VALUE. +Set Template to VALUE. Returns (1, 'Status message') on success and (0, 'Error Message') on failure. (In the database, Template will be stored as a int(11).) @@ -391,23 +944,9 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure. =cut -=head2 TemplateObj - -Returns the Template Object which has the id returned by Template - - -=cut - -sub TemplateObj { - my $self = shift; - my $Template = RT::Template->new($self->CurrentUser); - $Template->Load($self->__Value('Template')); - return($Template); -} - =head2 Creator -Returns the current value of Creator. +Returns the current value of Creator. (In the database, Creator is stored as int(11).) @@ -416,7 +955,7 @@ Returns the current value of Creator. =head2 Created -Returns the current value of Created. +Returns the current value of Created. (In the database, Created is stored as datetime.) @@ -425,7 +964,7 @@ Returns the current value of Created. =head2 LastUpdatedBy -Returns the current value of LastUpdatedBy. +Returns the current value of LastUpdatedBy. (In the database, LastUpdatedBy is stored as int(11).) @@ -434,7 +973,7 @@ Returns the current value of LastUpdatedBy. =head2 LastUpdated -Returns the current value of LastUpdated. +Returns the current value of LastUpdated. (In the database, LastUpdated is stored as datetime.) @@ -444,79 +983,43 @@ Returns the current value of LastUpdated. sub _CoreAccessible { { - + id => {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, - Description => + Description => {read => 1, write => 1, sql_type => 12, length => 255, is_blob => 0, is_numeric => 0, type => 'varchar(255)', default => ''}, - ScripCondition => + ScripCondition => {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, - ScripAction => + ScripAction => {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, - ConditionRules => + ConditionRules => {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'text', default => ''}, - ActionRules => + ActionRules => {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'text', default => ''}, - CustomIsApplicableCode => + CustomIsApplicableCode => {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'text', default => ''}, - CustomPrepareCode => + CustomPrepareCode => {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'text', default => ''}, - CustomCommitCode => + CustomCommitCode => {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'text', default => ''}, - Stage => + Stage => {read => 1, write => 1, sql_type => 12, length => 32, is_blob => 0, is_numeric => 0, type => 'varchar(32)', default => ''}, - Queue => + Queue => {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, - Template => + Template => {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, - Creator => + Creator => {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, - Created => + Created => {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, - LastUpdatedBy => + LastUpdatedBy => {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, - LastUpdated => + LastUpdated => {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, } }; - - eval "require RT::Scrip_Overlay"; - if ($@ && $@ !~ qr{^Can't locate RT/Scrip_Overlay.pm}) { - die $@; - }; - - eval "require RT::Scrip_Vendor"; - if ($@ && $@ !~ qr{^Can't locate RT/Scrip_Vendor.pm}) { - die $@; - }; - - eval "require RT::Scrip_Local"; - if ($@ && $@ !~ qr{^Can't locate RT/Scrip_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. - -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::Scrip_Overlay, RT::Scrip_Vendor, RT::Scrip_Local - -=cut - +RT::Base->_ImportOverlays(); 1;