X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Flib%2FRT%2FScrip.pm;fp=rt%2Flib%2FRT%2FScrip.pm;h=d513e0aa050f30b8f93ab1ca64e9a9c9af6033b8;hb=43a06151e47d2c59b833cbd8c26d97865ee850b6;hp=b430a77e90e1d7c9c38e8534eb3699d94fe86a2d;hpb=6587f6ba7d047ddc1686c080090afe7d53365bd4;p=freeside.git diff --git a/rt/lib/RT/Scrip.pm b/rt/lib/RT/Scrip.pm index b430a77e9..d513e0aa0 100755 --- a/rt/lib/RT/Scrip.pm +++ b/rt/lib/RT/Scrip.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2012 Best Practical Solutions, LLC # # # (Except where explicitly superseded by other copyright notices) @@ -46,108 +46,650 @@ # # 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; - - =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, + + + + +Returns (retval, msg); +retval is 0 for failure or scrip id. msg is a textual description of what happened. + +=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 ); + } +} -use vars qw( @ISA ); -@ISA= qw( RT::Record ); -sub _Init { - my $self = shift; +=head2 Delete - $self->Table('Scrips'); - $self->SUPER::_Init(@_); +Delete this object + +=cut + +sub Delete { + my $self = shift; + + unless ( $self->CurrentUserHasRight('ModifyScrips') ) { + return ( 0, $self->loc('Permission Denied') ); + } + + return ( $self->SUPER::Delete(@_) ); } +=head2 QueueObj + +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'} ); +} -=head2 Create PARAMHASH -Create takes a hash of values and creates a row in the database: +=head2 ActionObj - 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::Action object with this Scrip\'s Action =cut +sub ActionObj { + my $self = shift; + unless ( defined $self->{'ScripActionObj'} ) { + require RT::ScripAction; + $self->{'ScripActionObj'} = RT::ScripAction->new( $self->CurrentUser ); -sub Create { + #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 = ( - 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'}, -); + 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 (length($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') ); + } + } + } + + return $self->__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 }"; + }; + 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).) @@ -156,7 +698,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).) @@ -164,7 +706,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).) @@ -174,7 +716,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).) @@ -182,7 +724,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).) @@ -206,7 +748,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).) @@ -214,7 +756,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).) @@ -238,7 +780,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.) @@ -246,7 +788,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.) @@ -256,7 +798,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.) @@ -264,7 +806,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.) @@ -274,7 +816,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.) @@ -282,7 +824,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.) @@ -292,7 +834,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.) @@ -300,7 +842,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.) @@ -310,7 +852,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.) @@ -318,7 +860,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.) @@ -328,7 +870,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).) @@ -336,7 +878,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).) @@ -346,7 +888,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).) @@ -354,7 +896,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).) @@ -362,23 +904,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).) @@ -386,7 +914,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).) @@ -394,23 +922,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).) @@ -419,7 +933,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.) @@ -428,7 +942,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).) @@ -437,7 +951,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.) @@ -447,38 +961,38 @@ 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 => ''}, } @@ -486,23 +1000,4 @@ sub _CoreAccessible { RT::Base->_ImportOverlays(); -=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 - - 1;